handler.go 40 KB

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