handler.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. package main
  2. import (
  3. "crypto/sha256"
  4. "crypto/tls"
  5. "database/sql"
  6. "encoding/json"
  7. "fmt"
  8. "io/ioutil"
  9. "net/http"
  10. "net/url"
  11. "strconv"
  12. "strings"
  13. "sync"
  14. "time"
  15. "github.com/dchest/uniuri"
  16. "github.com/dgrijalva/jwt-go"
  17. "github.com/labstack/echo"
  18. )
  19. type handler struct{}
  20. type userInfo struct {
  21. Result struct {
  22. Result struct {
  23. Sshpubkeyfp []string `json:"sshpubkeyfp"`
  24. HasKeytab bool `json:"has_keytab"`
  25. Ipasshpubkey []string `json:"ipasshpubkey"`
  26. Cn []string `json:"cn"`
  27. Krbcanonicalname []string `json:"krbcanonicalname"`
  28. Krbticketflags []string `json:"krbticketflags"`
  29. MemberofGroup []string `json:"memberof_group"`
  30. HasPassword bool `json:"has_password"`
  31. Homedirectory []string `json:"homedirectory"`
  32. Nsaccountlock bool `json:"nsaccountlock"`
  33. UID []string `json:"uid"`
  34. Title []string `json:"title"`
  35. Loginshell []string `json:"loginshell"`
  36. Uidnumber []string `json:"uidnumber"`
  37. Preserved bool `json:"preserved"`
  38. Krbextradata []struct {
  39. Base64 string `json:"__base64__"`
  40. } `json:"krbextradata"`
  41. Mail []string `json:"mail"`
  42. MemberofindirectHbacrule []string `json:"memberofindirect_hbacrule"`
  43. Dn string `json:"dn"`
  44. Displayname []string `json:"displayname"`
  45. Mepmanagedentry []string `json:"mepmanagedentry"`
  46. Ipauniqueid []string `json:"ipauniqueid"`
  47. Krbloginfailedcount []string `json:"krbloginfailedcount"`
  48. Krbpwdpolicyreference []string `json:"krbpwdpolicyreference"`
  49. Krbprincipalname []string `json:"krbprincipalname"`
  50. Givenname []string `json:"givenname"`
  51. Krblastadminunlock []struct {
  52. Datetime string `json:"__datetime__"`
  53. } `json:"krblastadminunlock"`
  54. Krbpasswordexpiration []struct {
  55. Datetime string `json:"__datetime__"`
  56. } `json:"krbpasswordexpiration"`
  57. Krblastfailedauth []struct {
  58. Datetime string `json:"__datetime__"`
  59. } `json:"krblastfailedauth"`
  60. Objectclass []string `json:"objectclass"`
  61. Gidnumber []string `json:"gidnumber"`
  62. Gecos []string `json:"gecos"`
  63. Sn []string `json:"sn"`
  64. MemberofSudorule []string `json:"memberof_sudorule"`
  65. Krblastpwdchange []struct {
  66. Datetime string `json:"__datetime__"`
  67. } `json:"krblastpwdchange"`
  68. Initials []string `json:"initials"`
  69. } `json:"result"`
  70. Value string `json:"value"`
  71. Summary interface{} `json:"summary"`
  72. } `json:"result"`
  73. Version string `json:"version"`
  74. Error interface{} `json:"error"`
  75. ID int `json:"id"`
  76. Principal string `json:"principal"`
  77. }
  78. type ServiceList struct {
  79. TotalCount string `json:"TotalCount,omitempty"`
  80. ActiveCount string `json:"ActiveCount,omitempty"`
  81. ActiveVMCount string `json:"ActiveVMCount,omitempty"`
  82. TotalVMCount string `json:"TotalVMCount,omitempty"`
  83. }
  84. type user_findResult struct {
  85. Error interface{} `json:"error"`
  86. ID int `json:"id"`
  87. Principal string `json:"principal"`
  88. Result struct {
  89. Count int `json:"count"`
  90. Result []struct {
  91. Dn string `json:"dn"`
  92. Gidnumber []string `json:"gidnumber"`
  93. Givenname []string `json:"givenname"`
  94. Homedirectory []string `json:"homedirectory"`
  95. Krbcanonicalname []string `json:"krbcanonicalname"`
  96. Krbprincipalname []string `json:"krbprincipalname"`
  97. Loginshell []string `json:"loginshell"`
  98. Mail []string `json:"mail"`
  99. Nsaccountlock bool `json:"nsaccountlock"`
  100. Sn []string `json:"sn"`
  101. Telephonenumber []string `json:"telephonenumber"`
  102. UID []string `json:"uid"`
  103. Uidnumber []string `json:"uidnumber"`
  104. } `json:"result"`
  105. Summary string `json:"summary"`
  106. Truncated bool `json:"truncated"`
  107. } `json:"result"`
  108. Version string `json:"version"`
  109. }
  110. var User = userInfo{}
  111. func (h *handler) login(c echo.Context) error {
  112. username := c.FormValue("username")
  113. password := c.FormValue("password")
  114. _url := URL + "/ipa/session/login_password"
  115. method := "POST"
  116. params := url.Values{}
  117. params.Add("user", username)
  118. params.Add("password", password)
  119. payload := strings.NewReader(params.Encode())
  120. tr := &http.Transport{
  121. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  122. }
  123. client := &http.Client{Transport: tr}
  124. req, err := http.NewRequest(method, _url, payload)
  125. audit("Recieved Login request from: " + RealIP)
  126. if err != nil {
  127. fmt.Println(err)
  128. }
  129. req.Header.Add("Referer", URL+"/ipa")
  130. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  131. req.Header.Add("Accept", "text/plain")
  132. res, err := client.Do(req)
  133. cockie := res.Cookies()
  134. token := cockie[0].Raw
  135. ba := basicAuth(username, password)
  136. token = token + "Basic " + ba + ";"
  137. //fmt.Println("Token:", token)
  138. defer res.Body.Close()
  139. //fmt.Println(res.StatusCode)
  140. if res.StatusCode == 200 {
  141. User = getUserInfo(token, username)
  142. //fmt.Println(user.Result)
  143. tokens, err := generateTokenPair(User, token)
  144. if err != nil {
  145. return err
  146. }
  147. return c.JSON(http.StatusOK, tokens)
  148. }
  149. return echo.ErrUnauthorized
  150. }
  151. func getUserInfo(token string, username string) userInfo {
  152. //fmt.Println("Checking for User: ", username)
  153. url := URL + "/ipa/session/json"
  154. method := "POST"
  155. _json := fmt.Sprintf(`
  156. {
  157. "method": "user_show",
  158. "params": [
  159. [
  160. "%s"
  161. ],
  162. {
  163. "all": true,
  164. "version": "2.215"
  165. }
  166. ],
  167. "id": 0
  168. }
  169. `, username)
  170. payload := strings.NewReader(_json)
  171. tr := &http.Transport{
  172. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  173. }
  174. client := &http.Client{Transport: tr}
  175. req, err := http.NewRequest(method, url, payload)
  176. if err != nil {
  177. fmt.Println(err)
  178. }
  179. req.Header.Add("Referer", URL+"/ipa")
  180. req.Header.Add("Content-Type", "application/json")
  181. req.Header.Add("Accept", "text/plain")
  182. req.Header.Add("Cookie", token)
  183. res, err := client.Do(req)
  184. defer res.Body.Close()
  185. body, err := ioutil.ReadAll(res.Body)
  186. //fmt.Println("Getting Data for Response: ", body)
  187. user := userInfo{}
  188. json.Unmarshal(body, &user)
  189. //fmt.Println("Getting Data for User: ", user.Result.Result.Uidnumber)
  190. return user
  191. }
  192. func (h *handler) uuidgen(c echo.Context) error {
  193. resource := c.FormValue("resource")
  194. id, code := uuidgen(resource)
  195. resp := _response{
  196. Origin: "uuidgen",
  197. Message: id,
  198. Code: code,
  199. }
  200. //b, _ := json.MarshalIndent(resp, "", " ")
  201. //return c.String(http.StatusOK, string(b))
  202. return c.JSON(http.StatusOK, resp)
  203. }
  204. func (h *handler) addUser(c echo.Context) error {
  205. type apiErr struct {
  206. Result interface{} `json:"result"`
  207. Error struct {
  208. Code int `json:"code"`
  209. Message string `json:"message"`
  210. Data struct {
  211. } `json:"data"`
  212. Name string `json:"name"`
  213. } `json:"error"`
  214. ID int `json:"id"`
  215. Principal string `json:"principal"`
  216. Version string `json:"version"`
  217. }
  218. type addUser struct {
  219. Result struct {
  220. Result struct {
  221. Displayname []string `json:"displayname"`
  222. UID []string `json:"uid"`
  223. Uidnumber []string `json:"uidnumber"`
  224. Objectclass []string `json:"objectclass"`
  225. Sn []string `json:"sn"`
  226. Telephonenumber []string `json:"telephonenumber"`
  227. Cn []string `json:"cn"`
  228. Krbpasswordexpiration []struct {
  229. Datetime string `json:"__datetime__"`
  230. } `json:"krbpasswordexpiration"`
  231. Mobile []string `json:"mobile"`
  232. Krbprincipalname []string `json:"krbprincipalname"`
  233. Ipauniqueid []string `json:"ipauniqueid"`
  234. Givenname []string `json:"givenname"`
  235. Gidnumber []string `json:"gidnumber"`
  236. Krbcanonicalname []string `json:"krbcanonicalname"`
  237. Mail []string `json:"mail"`
  238. Initials []string `json:"initials"`
  239. Homedirectory []string `json:"homedirectory"`
  240. Loginshell []string `json:"loginshell"`
  241. Gecos []string `json:"gecos"`
  242. Randompassword string `json:"randompassword"`
  243. HasPassword bool `json:"has_password"`
  244. HasKeytab bool `json:"has_keytab"`
  245. MemberofGroup []string `json:"memberof_group"`
  246. Dn string `json:"dn"`
  247. } `json:"result"`
  248. Value string `json:"value"`
  249. Summary string `json:"summary"`
  250. } `json:"result"`
  251. Error string `json:"error"`
  252. ID int `json:"id"`
  253. Principal string `json:"principal"`
  254. Version string `json:"version"`
  255. }
  256. user := c.Get("user").(*jwt.Token)
  257. claims := user.Claims.(jwt.MapClaims)
  258. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  259. var hashChannel_ = make(chan []byte, 1)
  260. hashChannel_ <- _sha256[:]
  261. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  262. b, err := json.Marshal(claims)
  263. if err != nil {
  264. fmt.Println("err:", err)
  265. }
  266. //fmt.Println("AddUser Claims: ", claims)
  267. //fmt.Println("AddUser token: ", token)
  268. username := c.FormValue("Username")
  269. sha256 := sha256.Sum256([]byte(username))
  270. var hashChannel = make(chan []byte, 1)
  271. hashChannel <- sha256[:]
  272. ciphertext := encrypt(<-hashChannel, string(b))
  273. //fmt.Println("B: ", string(b))
  274. //fmt.Println("Ciphere: ", ciphertext)
  275. sn := c.FormValue("Lname")
  276. cn := c.FormValue("FullName")
  277. givenname := c.FormValue("Fname")
  278. displayname := c.FormValue("displayname")
  279. krbpasswordexpiration := c.FormValue("krbpasswordexpiration")
  280. mail := c.FormValue("mail")
  281. telephonenumber := c.FormValue("telephonenumber")
  282. mobile := c.FormValue("mobile")
  283. _url := URL + "/ipa/session/json"
  284. method := "POST"
  285. _json := fmt.Sprintf(`
  286. {
  287. "id": 0,
  288. "method": "user_add/1",
  289. "params": [
  290. [
  291. "%s"
  292. ],
  293. {
  294. "givenname": "%s",
  295. "sn": "%s",
  296. "cn":"%s",
  297. "displayname":"%s",
  298. "loginshell":"/usr/sbin/nologin",
  299. "krbpasswordexpiration":"%s",
  300. "mail":"%s",
  301. "random":"true",
  302. "gidnumber":"599200001",
  303. "telephonenumber":"%s",
  304. "mobile":"%s",
  305. "version": "2.235"
  306. }
  307. ]
  308. }
  309. `, username, givenname, sn, cn, displayname, krbpasswordexpiration, mail, telephonenumber, mobile)
  310. __json := fmt.Sprintf(`
  311. {
  312. "id": 0,
  313. "method": "group_add_member/1",
  314. "params": [
  315. [
  316. "svcaccounts"
  317. ],
  318. {
  319. "user": [
  320. "%s"
  321. ],
  322. "version": "2.235"
  323. }
  324. ]
  325. }
  326. `, username)
  327. payload := strings.NewReader(_json)
  328. _payload := strings.NewReader(__json)
  329. tr := &http.Transport{
  330. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  331. }
  332. client := &http.Client{Transport: tr}
  333. req, err := http.NewRequest(method, _url, payload)
  334. if err != nil {
  335. fmt.Println(err)
  336. }
  337. req.Header.Add("Referer", URL+"/ipa")
  338. req.Header.Add("Content-Type", "application/json")
  339. req.Header.Add("Accept", "text/plain")
  340. req.Header.Add("Cookie", token)
  341. res, err := client.Do(req)
  342. _req, _ := http.NewRequest(method, _url, _payload)
  343. _req.Header.Add("Referer", URL+"/ipa")
  344. _req.Header.Add("Content-Type", "application/json")
  345. _req.Header.Add("Accept", "text/plain")
  346. _req.Header.Add("Cookie", token)
  347. client.Do(_req)
  348. defer res.Body.Close()
  349. body, err := ioutil.ReadAll(res.Body)
  350. result := addUser{}
  351. _err := json.Unmarshal(body, &result)
  352. // fmt.Println(result)
  353. if _err != nil {
  354. _apiErr := apiErr{}
  355. __err := json.Unmarshal(body, &_apiErr)
  356. if __err != nil {
  357. return c.String(http.StatusBadRequest, "Error of error!!")
  358. }
  359. //res2B, _ := json.Marshal(_apiErr)
  360. //return c.String(http.StatusBadRequest, string(res2B))
  361. resp := _response{
  362. Origin: "AddUser",
  363. Message: _apiErr.Error.Name + ": " + _apiErr.Error.Message,
  364. Code: _apiErr.Error.Code,
  365. }
  366. return c.JSON(http.StatusNotFound, resp)
  367. //return c.JSON(http.StatusBadRequest, _apiErr)
  368. }
  369. shortLink := setResetKey(ciphertext, username)
  370. go sendMail("Welcome to ZiCloud\r\n Your temporary link is :\r\n http://zi-cloud.ir/reset/"+url.QueryEscape(shortLink), "Welcome to ZiCloud", mail)
  371. //go sendMail("Welcome to ZiCloud\r\n Your temporary link is :\r\n https://zicloud.com/reset/"+url.QueryEscape(ciphertext), "Welcome to ZiCloud", mail)
  372. resp := _response{
  373. Origin: "addUser",
  374. Message: "Done, Reset Link was sent to your email",
  375. Code: 1000,
  376. }
  377. //b, _ = json.MarshalIndent(resp, "", " ")
  378. //return c.String(http.StatusOK, string(b))
  379. return c.JSON(http.StatusOK, resp)
  380. }
  381. func (h *handler) disableUser(c echo.Context) error {
  382. user := c.Get("user").(*jwt.Token)
  383. claims := user.Claims.(jwt.MapClaims)
  384. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  385. var hashChannel_ = make(chan []byte, 1)
  386. hashChannel_ <- _sha256[:]
  387. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  388. username := c.FormValue("Username")
  389. url := URL + "/ipa/session/json"
  390. method := "POST"
  391. _json := fmt.Sprintf(`
  392. {
  393. "id": 0,
  394. "method": "user_disable/1",
  395. "params": [
  396. [
  397. "%s"
  398. ],
  399. {
  400. "version": "2.235"
  401. }
  402. ]
  403. }
  404. `, username)
  405. payload := strings.NewReader(_json)
  406. tr := &http.Transport{
  407. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  408. }
  409. client := &http.Client{Transport: tr}
  410. req, err := http.NewRequest(method, url, payload)
  411. if err != nil {
  412. fmt.Println(err)
  413. }
  414. req.Header.Add("Referer", URL+"/ipa")
  415. req.Header.Add("Content-Type", "application/json")
  416. req.Header.Add("Accept", "text/plain")
  417. req.Header.Add("Cookie", token)
  418. res, err := client.Do(req)
  419. if err != nil {
  420. //return c.String(http.StatusBadRequest, "Error"+err.Error())
  421. return c.JSON(http.StatusOK, "Error"+err.Error())
  422. }
  423. defer res.Body.Close()
  424. resp := _response{
  425. Origin: "disableUser",
  426. Message: "Done",
  427. Code: 1000,
  428. }
  429. //b, _ := json.MarshalIndent(resp, "", " ")
  430. return c.JSON(http.StatusOK, resp)
  431. //return c.String(http.StatusOK, string(b))
  432. }
  433. func (h *handler) resetUser(c echo.Context) error {
  434. type keyJson struct {
  435. IPAToken string `json:"IPAToken"`
  436. Admin bool `json:"admin"`
  437. Exp int `json:"exp"`
  438. Memberof []string `json:"memberof"`
  439. Name string `json:"name"`
  440. Sub int `json:"sub"`
  441. }
  442. t := time.Now() //%Y%m%d%H%M%SZ
  443. t = t.Add(time.Hour * 24 * 60)
  444. //username := c.FormValue("Username")
  445. password := c.FormValue("Password")
  446. short := c.FormValue("key")
  447. key, username := getResetKey(short)
  448. if len(key) < 5 {
  449. resp := _response{
  450. Origin: "resetUser",
  451. Message: "Link has been expired",
  452. Code: 1001,
  453. }
  454. //b, _ := json.MarshalIndent(resp, "", " ")
  455. return c.JSON(http.StatusOK, resp)
  456. }
  457. //key, _ = url.QueryUnescape(key)
  458. _sha256 := sha256.Sum256([]byte(username))
  459. var hashChannel = make(chan []byte, 1)
  460. hashChannel <- _sha256[:]
  461. plainkey := decrypt(<-hashChannel, key)
  462. _plainkey := keyJson{}
  463. json.Unmarshal([]byte(plainkey), &_plainkey)
  464. _name := _plainkey.Name
  465. //_sha256 := sha256.Sum256([]byte(string("")))
  466. var hashChannel_ = make(chan []byte, 1)
  467. __sha256 := sha256.Sum256([]byte(_name))
  468. hashChannel_ <- __sha256[:]
  469. token := decrypt(<-hashChannel_, string(_plainkey.IPAToken))
  470. // token := _plainkey.IPAToken
  471. _url := URL + "/ipa/session/json"
  472. method := "POST"
  473. _json := fmt.Sprintf(`
  474. {
  475. "id": 0,
  476. "method": "user_mod/1",
  477. "params": [
  478. [
  479. "%s"
  480. ],
  481. {
  482. "userpassword":"%s",
  483. "version": "2.235"
  484. }
  485. ]
  486. }
  487. `, username, password)
  488. payload := strings.NewReader(_json)
  489. tr := &http.Transport{
  490. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  491. }
  492. client := &http.Client{Transport: tr}
  493. req, err := http.NewRequest(method, _url, payload)
  494. if err != nil {
  495. fmt.Println(err)
  496. }
  497. req.Header.Add("Referer", URL+"/ipa")
  498. req.Header.Add("Content-Type", "application/json")
  499. req.Header.Add("Accept", "text/plain")
  500. req.Header.Add("Cookie", token)
  501. res, err := client.Do(req)
  502. //fmt.Println(token)
  503. //fmt.Println(_json)
  504. //fmt.Println(req)
  505. //fmt.Println(res)
  506. _json = fmt.Sprintf(`
  507. {
  508. "id": 0,
  509. "method": "user_mod/1",
  510. "params": [
  511. [
  512. "%s"
  513. ],
  514. {
  515. "krbpasswordexpiration":"%s",
  516. "version": "2.235"
  517. }
  518. ]
  519. }
  520. `, username, t.Format("2006-01-02")+"Z")
  521. payload = strings.NewReader(_json)
  522. req, err = http.NewRequest(method, _url, payload)
  523. if err != nil {
  524. fmt.Println(err)
  525. }
  526. req.Header.Add("Referer", URL+"/ipa")
  527. req.Header.Add("Content-Type", "application/json")
  528. req.Header.Add("Accept", "text/plain")
  529. req.Header.Add("Cookie", token)
  530. err = nil
  531. res, err = client.Do(req)
  532. //fmt.Println(token)
  533. //fmt.Println(_json)
  534. //fmt.Println(req)
  535. //fmt.Println(res)
  536. if err != nil {
  537. //return c.String(http.StatusBadRequest, "Error"+err.Error())
  538. return c.JSON(http.StatusBadRequest, "Error"+err.Error())
  539. }
  540. defer res.Body.Close()
  541. resp := _response{
  542. Origin: "resetUser",
  543. Message: "Done",
  544. Code: 1000,
  545. }
  546. expireResetKey(username)
  547. //b, _ := json.MarshalIndent(resp, "", " ")
  548. return c.JSON(http.StatusOK, resp)
  549. //return c.String(http.StatusOK, string(b))
  550. }
  551. func (h *handler) dnsrecordadd(c echo.Context) error {
  552. user := c.Get("user").(*jwt.Token)
  553. claims := user.Claims.(jwt.MapClaims)
  554. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  555. var hashChannel_ = make(chan []byte, 1)
  556. hashChannel_ <- _sha256[:]
  557. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  558. recordName := c.FormValue("recordName")
  559. record := c.FormValue("record")
  560. url := URL + "/ipa/session/json"
  561. method := "POST"
  562. _json := fmt.Sprintf(`
  563. {
  564. "id": 0,
  565. "method": "dnsrecord_add/1",
  566. "params": [
  567. [
  568. "ZI-TEL.COM",
  569. {
  570. "__dns_name__": "%s"
  571. }
  572. ],
  573. {
  574. "a_part_ip_address": "%s",
  575. "raw": true,
  576. "version": "2.235"
  577. }
  578. ]
  579. }
  580. `, recordName, record)
  581. payload := strings.NewReader(_json)
  582. tr := &http.Transport{
  583. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  584. }
  585. client := &http.Client{Transport: tr}
  586. req, err := http.NewRequest(method, url, payload)
  587. if err != nil {
  588. fmt.Println(err)
  589. }
  590. req.Header.Add("Referer", URL+"/ipa")
  591. req.Header.Add("Content-Type", "application/json")
  592. req.Header.Add("Accept", "text/plain")
  593. req.Header.Add("Cookie", token)
  594. res, err := client.Do(req)
  595. if err != nil {
  596. //return c.String(http.StatusBadRequest, "Error"+err.Error())
  597. return c.JSON(http.StatusBadRequest, "Error"+err.Error())
  598. }
  599. //body, err := ioutil.ReadAll(res.Body)
  600. //_res:=result{}
  601. //json.Unmarshal(body, &_res)
  602. //fmt.Println(_res)
  603. defer res.Body.Close()
  604. resp := _response{
  605. Origin: "dnsrecordadd",
  606. Message: "Done",
  607. Code: 1000,
  608. }
  609. //b, _ := json.MarshalIndent(resp, "", " ")
  610. return c.JSON(http.StatusOK, resp)
  611. //return c.String(http.StatusOK, string(b))
  612. }
  613. func (h *handler) token(c echo.Context) error {
  614. user := c.Get("user").(*jwt.Token)
  615. claims := user.Claims.(jwt.MapClaims)
  616. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  617. var hashChannel_ = make(chan []byte, 1)
  618. hashChannel_ <- _sha256[:]
  619. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  620. username := claims["name"].(string)
  621. //fmt.Println("User: ",username)
  622. //fmt.Println("Token : ",token)
  623. _user := getUserInfo(token, username)
  624. //fmt.Println(_user.Result)
  625. newtokens, err := generateTokenPair(_user, token)
  626. if err != nil {
  627. return err
  628. }
  629. return c.JSON(http.StatusOK, newtokens)
  630. }
  631. func (h *handler) verifyUser(c echo.Context) error {
  632. name := c.FormValue("Username")
  633. //fmt.Println("Name: ", name)
  634. if name == "" {
  635. return c.JSON(http.StatusNotFound, "User NOT Found")
  636. }
  637. username := "admin"
  638. password := "h?_QJp5^&9FNc9w="
  639. _url := URL + "/ipa/session/login_password"
  640. method := "POST"
  641. params := url.Values{}
  642. params.Add("user", username)
  643. params.Add("password", password)
  644. payload := strings.NewReader(params.Encode())
  645. tr := &http.Transport{
  646. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  647. }
  648. client := &http.Client{Transport: tr}
  649. req, err := http.NewRequest(method, _url, payload)
  650. audit("Recieved Login request from: " + RealIP)
  651. if err != nil {
  652. fmt.Println(err)
  653. }
  654. req.Header.Add("Referer", URL+"/ipa")
  655. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  656. req.Header.Add("Accept", "text/plain")
  657. res, err := client.Do(req)
  658. cockie := res.Cookies()
  659. token := cockie[0].Raw
  660. defer res.Body.Close()
  661. //fmt.Println(token)
  662. if res.StatusCode == 200 {
  663. user := getUserInfo(token, name)
  664. if user.Result.Value != name {
  665. resp := _response{
  666. Origin: "VerifyUser",
  667. Message: "User Not Found",
  668. Code: 1000,
  669. }
  670. //b, _errr := json.MarshalIndent(resp, "", " ")
  671. //b, _= json.Marshal(resp)
  672. //if _errr != nil {
  673. // fmt.Println(_errr)
  674. //}
  675. //fmt.Print(string(b))
  676. return c.JSON(http.StatusOK, resp)
  677. }
  678. }
  679. resp := _response{
  680. Origin: "VerifyUser",
  681. Message: "User Found",
  682. Code: 1001,
  683. }
  684. //b, _ := json.MarshalIndent(resp, "", " ")
  685. return c.JSON(http.StatusNotFound, resp)
  686. }
  687. func (h *handler) forgetpassword(c echo.Context) error {
  688. user := c.Get("user").(*jwt.Token)
  689. claims := user.Claims.(jwt.MapClaims)
  690. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  691. var hashChannel_ = make(chan []byte, 1)
  692. hashChannel_ <- _sha256[:]
  693. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  694. _type := c.FormValue("type")
  695. _data := c.FormValue("data")
  696. url := URL + "/ipa/session/json"
  697. method := "POST"
  698. __type, _ := strconv.Atoi(_type)
  699. _json := ""
  700. if __type == 1 {
  701. // email
  702. _json = fmt.Sprintf(`
  703. {
  704. "id": 0,
  705. "method": "user_find/1",
  706. "params": [
  707. [],
  708. {
  709. "mail": [
  710. "%s"
  711. ],
  712. "version": "2.235"
  713. }
  714. ]
  715. }
  716. `, _data)
  717. } else if __type == 2 {
  718. // username
  719. _json = fmt.Sprintf(`
  720. {
  721. "id": 0,
  722. "method": "user_find/1",
  723. "params": [
  724. [
  725. "%s"
  726. ],
  727. {
  728. "version": "2.235"
  729. }
  730. ]
  731. }
  732. `, _data)
  733. } else if __type == 3 {
  734. //mobile
  735. _json = fmt.Sprintf(`
  736. {
  737. "id": 0,
  738. "method": "user_find/1",
  739. "params": [
  740. [],
  741. {
  742. "mobile": [
  743. "%s"
  744. ],
  745. "version": "2.235"
  746. }
  747. ]
  748. }
  749. `, _data)
  750. } else {
  751. resp := _response{
  752. Origin: "forgetpassword",
  753. Message: "unknown requested type",
  754. Code: 1001,
  755. }
  756. return c.JSON(http.StatusNotFound, resp)
  757. }
  758. //fmt.Println(_json)
  759. payload := strings.NewReader(_json)
  760. tr := &http.Transport{
  761. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  762. }
  763. client := &http.Client{Transport: tr}
  764. req, err := http.NewRequest(method, url, payload)
  765. if err != nil {
  766. fmt.Println(err)
  767. }
  768. req.Header.Add("Referer", URL+"/ipa")
  769. req.Header.Add("Content-Type", "application/json")
  770. req.Header.Add("Accept", "text/plain")
  771. req.Header.Add("Cookie", token)
  772. res, err := client.Do(req)
  773. defer res.Body.Close()
  774. body, err := ioutil.ReadAll(res.Body)
  775. //fmt.Println("Getting Data for Response: ", body)
  776. _user := user_findResult{}
  777. json.Unmarshal(body, &_user)
  778. fmt.Println("find in forgetpass : ", _user.Result.Count)
  779. if _user.Result.Count != 1 {
  780. resp := _response{
  781. Origin: "forgetpassword",
  782. Message: "Something goes wrong",
  783. Code: 1001,
  784. }
  785. return c.JSON(http.StatusNotFound, resp)
  786. }
  787. b, err := json.Marshal(claims)
  788. if err != nil {
  789. fmt.Println("err:", err)
  790. }
  791. //fmt.Println("AddUser Claims: ", claims)
  792. //fmt.Println("AddUser token: ", token)
  793. username := _user.Result.Result[0].UID[0]
  794. sha256 := sha256.Sum256([]byte(username))
  795. var hashChannel = make(chan []byte, 1)
  796. hashChannel <- sha256[:]
  797. ciphertext := encrypt(<-hashChannel, string(b))
  798. shortLink := setResetKey(ciphertext, username)
  799. key, _ := getResetKey(username)
  800. if len(key) > 5 {
  801. resp := _response{
  802. Origin: "forgetpassword",
  803. Message: "A resetLink request with this email already exists",
  804. Code: 1003,
  805. }
  806. return c.JSON(http.StatusNotFound, resp)
  807. }
  808. go sendMail("Your temporary link is :\r\n https://zicloud.com/reset/"+shortLink, "ResetPassword Link", _user.Result.Result[0].Mail[0])
  809. resp := _response{
  810. Origin: "forgetpassword",
  811. Message: "You will receive an email with a link to reset your password",
  812. Code: 1000,
  813. }
  814. return c.JSON(http.StatusNotFound, resp)
  815. }
  816. func setResetKey(key string, username string) string {
  817. short := uniuri.NewLen(32)
  818. db, err := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  819. if err != nil {
  820. return ""
  821. }
  822. defer db.Close()
  823. insert, err := db.Query("INSERT INTO url_shortener VALUES ( '" + short + "'," +
  824. "'" + key + "'," +
  825. "NOW() + INTERVAL 1 HOUR" + "," +
  826. "'" + "setResetKey" + "'," +
  827. "'" + username + "'," +
  828. "1" +
  829. " )")
  830. defer insert.Close()
  831. return short
  832. }
  833. func getResetKey(short string) (string, string) {
  834. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  835. results, _ := db.Query("SELECT `long` as `long`, related_obj as username FROM url_shortener where active=1 and short='" + short + "' and expiration > NOW()")
  836. var key, username string
  837. for results.Next() {
  838. err := results.Scan(&key, &username)
  839. if err != nil {
  840. return "ERR", "ERR"
  841. }
  842. }
  843. return key, username
  844. }
  845. func expireResetKey(username string) {
  846. db, err := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  847. if err != nil {
  848. return
  849. }
  850. update, err := db.Query("update url_shortener set active='0' where related_obj='" + username + "'")
  851. defer db.Close()
  852. defer update.Close()
  853. }
  854. func (h *handler) ListServices(c echo.Context) error {
  855. user := c.Get("user").(*jwt.Token)
  856. claims := user.Claims.(jwt.MapClaims)
  857. //IPAUid:=claims["IPAUid"]
  858. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  859. var hashChannel_ = make(chan []byte, 1)
  860. hashChannel_ <- _sha256[:]
  861. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  862. _BA := strings.Split(token, ";")
  863. BA := _BA[len(_BA)-2]
  864. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  865. results, _ := db.Query("SELECT `type` as `type`, uuid as Service_uuid , active , objectName FROM service_profile where uid=" + claims["IPAUid"].(string) + " and active!='-1'")
  866. activeCount := 0
  867. totalCount := 0
  868. activeVMCount := 0
  869. totalVMCount := 0
  870. var cpu, mem float64
  871. var _type, service_uuid, active, objectName string
  872. ///TODO: too SLOW
  873. var wg sync.WaitGroup
  874. for results.Next() {
  875. err := results.Scan(&_type, &service_uuid, &active, &objectName)
  876. if err != nil {
  877. resp := _response{
  878. Origin: "ListServices",
  879. Message: "Listing Error",
  880. Code: 1001,
  881. }
  882. //b, _ := json.MarshalIndent(resp, "", " ")
  883. return c.JSON(http.StatusInternalServerError, resp)
  884. }
  885. if _type == "VM" {
  886. if active == "1" {
  887. wg.Add(1)
  888. go func(activeCount *int, activeVMCount *int, cpu *float64, mem *float64 ,totalCount *int, totalVMCount *int,suid string) {
  889. _, _cpu, _mem, err := vmStatistics(BA, suid)
  890. defer wg.Done()
  891. //fmt.Println("Service UUID: ",suid)
  892. if err != nil {
  893. //fmt.Println("Error in vmDetails : ", err)
  894. //continue
  895. *totalVMCount--
  896. *totalCount--
  897. return
  898. }
  899. *activeCount++
  900. *activeVMCount++
  901. *cpu += _cpu
  902. *mem += _mem
  903. }(&activeCount, &activeVMCount, &cpu, &mem,&totalCount,&totalVMCount,service_uuid)
  904. //_, _cpu, _mem, err := vmStatistics(BA, service_uuid)
  905. //if err != nil {
  906. // fmt.Println("Error in vmDetails : ", err)
  907. // continue
  908. //}
  909. //activeCount++
  910. //fmt.Println("activeCount:", activeCount)
  911. //fmt.Println(vmStatistics(BA,service_uuid))
  912. //activeVMCount++
  913. //cpu += _cpu
  914. //mem += _mem
  915. }
  916. totalCount++
  917. totalVMCount++
  918. }
  919. }
  920. wg.Wait()
  921. //fmt.Println(activeVMCount)
  922. //fmt.Println(activeCount)
  923. //fmt.Println(totalCount)
  924. //fmt.Println(totalVMCount)
  925. //SL := ServiceList{
  926. // TotalCount: string(totalCount),
  927. // ActiveCount: string(activeCount),
  928. // ActiveVMCount: string(activeVMCount),
  929. // TotalVMCount: string(totalVMCount),
  930. //}
  931. type AutoGenerated struct {
  932. Message struct {
  933. TotalCount string `json:"TotalCount"`
  934. ActiveCount string `json:"ActiveCount"`
  935. ActiveVMCount string `json:"ActiveVMCount"`
  936. TotalVMCount string `json:"TotalVMCount"`
  937. TotalCPUUsage string `json:"TotalCPUUsage"`
  938. TotalMemUsage string `json:"TotalMemUsage"`
  939. } `json:"message"`
  940. Origin string `json:"origin"`
  941. Code int `json:"code"`
  942. }
  943. resp := AutoGenerated{
  944. Message: struct {
  945. TotalCount string `json:"TotalCount"`
  946. ActiveCount string `json:"ActiveCount"`
  947. ActiveVMCount string `json:"ActiveVMCount"`
  948. TotalVMCount string `json:"TotalVMCount"`
  949. TotalCPUUsage string `json:"TotalCPUUsage"`
  950. TotalMemUsage string `json:"TotalMemUsage"`
  951. }{
  952. TotalCount: strconv.Itoa(totalCount),
  953. ActiveCount: strconv.Itoa(activeCount),
  954. ActiveVMCount: strconv.Itoa(activeVMCount),
  955. TotalVMCount: strconv.Itoa(totalVMCount),
  956. TotalCPUUsage: fmt.Sprintf("%f", 100*cpu/float64(activeVMCount)),
  957. TotalMemUsage: fmt.Sprintf("%f", 100*mem/float64(activeVMCount)),
  958. },
  959. Origin: "ListServices",
  960. Code: 1000,
  961. }
  962. return c.JSON(http.StatusOK, resp)
  963. }
  964. func (h *handler) PriceCalc(c echo.Context) error {
  965. user := c.Get("user").(*jwt.Token)
  966. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  967. _, _ = db.Query("SELECT uuid as UUID ,task_apiCall as TaskAPICall , cron_expression as CronExpression , related_uuid as Ruuid, type FROM scheduler where active=1")
  968. _, _ = db.Query("SELECT uuid as UUID ,task_apiCall as TaskAPICall , cron_expression as CronExpression , related_uuid as Ruuid, type FROM scheduler where active=1")
  969. _, _ = db.Query("SELECT uuid as UUID ,task_apiCall as TaskAPICall , cron_expression as CronExpression , related_uuid as Ruuid, type FROM scheduler where active=1")
  970. db.Close()
  971. claims := user.Claims.(jwt.MapClaims)
  972. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  973. var hashChannel_ = make(chan []byte, 1)
  974. hashChannel_ <- _sha256[:]
  975. //token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  976. cpu, _ := strconv.Atoi(c.FormValue("cpu"))
  977. mem, _ := strconv.Atoi(c.FormValue("mem"))
  978. hdd, _ := strconv.Atoi(c.FormValue("hdd"))
  979. nic, _ := strconv.Atoi(c.FormValue("nic"))
  980. period, _ := strconv.Atoi(c.FormValue("period"))
  981. type PriceCalculator struct {
  982. Data struct {
  983. TotalPrice string `json:"TotalPrice"`
  984. } `json:"message"`
  985. Origin string `json:"origin"`
  986. Code int `json:"code"`
  987. }
  988. resp := PriceCalculator{
  989. Data: struct {
  990. TotalPrice string `json:"TotalPrice"`
  991. }{TotalPrice: strconv.Itoa((cpu*500 + mem + 10 + hdd*19 + nic*10000) * period)},
  992. Origin: "PriceCalc",
  993. Code: 1000,
  994. }
  995. return c.JSON(http.StatusOK, resp)
  996. }