handler.go 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  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. defer res.Body.Close()
  237. body, err := ioutil.ReadAll(res.Body)
  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. if res.StatusCode == 200 {
  718. user := getUserInfo(token, name)
  719. if user.Result.Value != name {
  720. resp := _response{
  721. Origin: "VerifyUser",
  722. Message: "User Not Found",
  723. Code: 1000,
  724. }
  725. //b, _errr := json.MarshalIndent(resp, "", " ")
  726. //b, _= json.Marshal(resp)
  727. //if _errr != nil {
  728. // fmt.Println(_errr)
  729. //}
  730. //fmt.Print(string(b))
  731. return c.JSON(http.StatusOK, resp)
  732. }
  733. }
  734. resp := _response{
  735. Origin: "VerifyUser",
  736. Message: "User Found",
  737. Code: 1001,
  738. }
  739. //b, _ := json.MarshalIndent(resp, "", " ")
  740. return c.JSON(http.StatusNotFound, resp)
  741. }
  742. func (h *handler) forgetpassword(c echo.Context) error {
  743. user := c.Get("user").(*jwt.Token)
  744. claims := user.Claims.(jwt.MapClaims)
  745. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  746. var hashChannel_ = make(chan []byte, 1)
  747. hashChannel_ <- _sha256[:]
  748. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  749. _type := c.FormValue("type")
  750. _data := c.FormValue("data")
  751. url := URL + "/ipa/session/json"
  752. method := "POST"
  753. __type, _ := strconv.Atoi(_type)
  754. _json := ""
  755. if __type == 1 {
  756. // email
  757. _json = fmt.Sprintf(`
  758. {
  759. "id": 0,
  760. "method": "user_find/1",
  761. "params": [
  762. [],
  763. {
  764. "mail": [
  765. "%s"
  766. ],
  767. "version": "2.235"
  768. }
  769. ]
  770. }
  771. `, _data)
  772. } else if __type == 2 {
  773. // username
  774. _json = fmt.Sprintf(`
  775. {
  776. "id": 0,
  777. "method": "user_find/1",
  778. "params": [
  779. [
  780. "%s"
  781. ],
  782. {
  783. "version": "2.235"
  784. }
  785. ]
  786. }
  787. `, _data)
  788. } else if __type == 3 {
  789. //mobile
  790. _json = fmt.Sprintf(`
  791. {
  792. "id": 0,
  793. "method": "user_find/1",
  794. "params": [
  795. [],
  796. {
  797. "mobile": [
  798. "%s"
  799. ],
  800. "version": "2.235"
  801. }
  802. ]
  803. }
  804. `, _data)
  805. } else {
  806. resp := _response{
  807. Origin: "forgetpassword",
  808. Message: "unknown requested type",
  809. Code: 1001,
  810. }
  811. return c.JSON(http.StatusNotFound, resp)
  812. }
  813. //fmt.Println(_json)
  814. payload := strings.NewReader(_json)
  815. tr := &http.Transport{
  816. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  817. }
  818. client := &http.Client{Transport: tr}
  819. req, err := http.NewRequest(method, url, payload)
  820. if err != nil {
  821. fmt.Println(err)
  822. }
  823. req.Header.Add("Referer", URL+"/ipa")
  824. req.Header.Add("Content-Type", "application/json")
  825. req.Header.Add("Accept", "text/plain")
  826. req.Header.Add("Cookie", token)
  827. res, err := client.Do(req)
  828. defer res.Body.Close()
  829. body, err := ioutil.ReadAll(res.Body)
  830. //fmt.Println("Getting Data for Response: ", body)
  831. _user := user_findResult{}
  832. json.Unmarshal(body, &_user)
  833. fmt.Println("find in forgetpass : ", _user.Result.Count)
  834. if _user.Result.Count != 1 {
  835. resp := _response{
  836. Origin: "forgetpassword",
  837. Message: "Something goes wrong",
  838. Code: 1001,
  839. }
  840. return c.JSON(http.StatusNotFound, resp)
  841. }
  842. b, err := json.Marshal(claims)
  843. if err != nil {
  844. fmt.Println("err:", err)
  845. }
  846. //fmt.Println("AddUser Claims: ", claims)
  847. //fmt.Println("AddUser token: ", token)
  848. username := _user.Result.Result[0].UID[0]
  849. sha256 := sha256.Sum256([]byte(username))
  850. var hashChannel = make(chan []byte, 1)
  851. hashChannel <- sha256[:]
  852. ciphertext := encrypt(<-hashChannel, string(b))
  853. shortLink := setResetKey(ciphertext, username)
  854. key, _ := getResetKey(username)
  855. if len(key) > 5 {
  856. resp := _response{
  857. Origin: "forgetpassword",
  858. Message: "A resetLink request with this email already exists",
  859. Code: 1003,
  860. }
  861. return c.JSON(http.StatusNotFound, resp)
  862. }
  863. go sendMail("Your temporary link is :\r\n https://zi-cloud.ir/reset/"+shortLink, "ResetPassword Link", _user.Result.Result[0].Mail[0], nil)
  864. resp := _response{
  865. Origin: "forgetpassword",
  866. Message: "You will receive an email with a link to reset your password",
  867. Code: 1000,
  868. }
  869. return c.JSON(http.StatusNotFound, resp)
  870. }
  871. func setResetKey(key string, username string) string {
  872. short := uniuri.NewLen(32)
  873. db, err := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  874. if err != nil {
  875. return ""
  876. }
  877. defer db.Close()
  878. insert, err := db.Query("INSERT INTO url_shortener VALUES ( '" + short + "'," +
  879. "'" + key + "'," +
  880. "NOW() + INTERVAL 1 HOUR" + "," +
  881. "'" + "setResetKey" + "'," +
  882. "'" + username + "'," +
  883. "1" +
  884. " )")
  885. defer insert.Close()
  886. return short
  887. }
  888. func getResetKey(short string) (string, string) {
  889. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  890. results, _ := db.Query("SELECT `long` as `long`, related_obj as username FROM url_shortener where active=1 and short='" + short + "' and expiration > NOW()")
  891. var key, username string
  892. for results.Next() {
  893. err := results.Scan(&key, &username)
  894. if err != nil {
  895. return "ERR", "ERR"
  896. }
  897. }
  898. return key, username
  899. }
  900. func expireResetKey(username string) {
  901. db, err := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  902. if err != nil {
  903. return
  904. }
  905. update, err := db.Query("update url_shortener set active='0' where related_obj='" + username + "'")
  906. defer db.Close()
  907. defer update.Close()
  908. }
  909. func (h *handler) ListServices(c echo.Context) error {
  910. user := c.Get("user").(*jwt.Token)
  911. claims := user.Claims.(jwt.MapClaims)
  912. //IPAUid:=claims["IPAUid"]
  913. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  914. var hashChannel_ = make(chan []byte, 1)
  915. hashChannel_ <- _sha256[:]
  916. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  917. _BA := strings.Split(token, ";")
  918. BA := _BA[len(_BA)-2]
  919. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  920. results, _ := db.Query("SELECT `type` as `type`, uuid as Service_uuid , active , objectName FROM service_profile where uid=" + claims["IPAUid"].(string) + " and active!='-1'")
  921. activeCount := 0
  922. totalCount := 0
  923. activeVMCount := 0
  924. totalVMCount := 0
  925. var cpu, mem float64
  926. var _type, service_uuid, active, objectName string
  927. ///TODO: too SLOW
  928. var wg sync.WaitGroup
  929. for results.Next() {
  930. err := results.Scan(&_type, &service_uuid, &active, &objectName)
  931. if err != nil {
  932. resp := _response{
  933. Origin: "ListServices",
  934. Message: "Listing Error",
  935. Code: 1001,
  936. }
  937. //b, _ := json.MarshalIndent(resp, "", " ")
  938. return c.JSON(http.StatusInternalServerError, resp)
  939. }
  940. if _type == "VM" {
  941. if active == "1" {
  942. wg.Add(1)
  943. go func(activeCount *int, activeVMCount *int, cpu *float64, mem *float64, totalCount *int, totalVMCount *int, suid string) {
  944. _, _cpu, _mem, err := vmStatistics(BA, suid)
  945. defer wg.Done()
  946. //fmt.Println("Service UUID: ",suid)
  947. if err != nil {
  948. //fmt.Println("Error in vmDetails : ", err)
  949. //continue
  950. *totalVMCount--
  951. *totalCount--
  952. return
  953. }
  954. *activeCount++
  955. *activeVMCount++
  956. *cpu += _cpu
  957. *mem += _mem
  958. }(&activeCount, &activeVMCount, &cpu, &mem, &totalCount, &totalVMCount, service_uuid)
  959. //_, _cpu, _mem, err := vmStatistics(BA, service_uuid)
  960. //if err != nil {
  961. // fmt.Println("Error in vmDetails : ", err)
  962. // continue
  963. //}
  964. //activeCount++
  965. //fmt.Println("activeCount:", activeCount)
  966. //fmt.Println(vmStatistics(BA,service_uuid))
  967. //activeVMCount++
  968. //cpu += _cpu
  969. //mem += _mem
  970. }
  971. totalCount++
  972. totalVMCount++
  973. }
  974. }
  975. wg.Wait()
  976. //fmt.Println(activeVMCount)
  977. //fmt.Println(activeCount)
  978. //fmt.Println(totalCount)
  979. //fmt.Println(totalVMCount)
  980. //SL := ServiceList{
  981. // TotalCount: string(totalCount),
  982. // ActiveCount: string(activeCount),
  983. // ActiveVMCount: string(activeVMCount),
  984. // TotalVMCount: string(totalVMCount),
  985. //}
  986. type AutoGenerated struct {
  987. Message struct {
  988. TotalCount string `json:"TotalCount"`
  989. ActiveCount string `json:"ActiveCount"`
  990. ActiveVMCount string `json:"ActiveVMCount"`
  991. TotalVMCount string `json:"TotalVMCount"`
  992. TotalCPUUsage string `json:"TotalCPUUsage"`
  993. TotalMemUsage string `json:"TotalMemUsage"`
  994. } `json:"message"`
  995. Origin string `json:"origin"`
  996. Code int `json:"code"`
  997. }
  998. resp := AutoGenerated{
  999. Message: struct {
  1000. TotalCount string `json:"TotalCount"`
  1001. ActiveCount string `json:"ActiveCount"`
  1002. ActiveVMCount string `json:"ActiveVMCount"`
  1003. TotalVMCount string `json:"TotalVMCount"`
  1004. TotalCPUUsage string `json:"TotalCPUUsage"`
  1005. TotalMemUsage string `json:"TotalMemUsage"`
  1006. }{
  1007. TotalCount: strconv.Itoa(totalCount),
  1008. ActiveCount: strconv.Itoa(activeCount),
  1009. ActiveVMCount: strconv.Itoa(activeVMCount),
  1010. TotalVMCount: strconv.Itoa(totalVMCount),
  1011. TotalCPUUsage: fmt.Sprintf("%f", 100*cpu/float64(activeVMCount)),
  1012. TotalMemUsage: fmt.Sprintf("%f", 100*mem/float64(activeVMCount)),
  1013. },
  1014. Origin: "ListServices",
  1015. Code: 1000,
  1016. }
  1017. return c.JSON(http.StatusOK, resp)
  1018. }
  1019. func (h *handler) PriceCalc(c echo.Context) error {
  1020. user := c.Get("user").(*jwt.Token)
  1021. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  1022. _, _ = db.Query("SELECT uuid as UUID ,task_apiCall as TaskAPICall , cron_expression as CronExpression , related_uuid as Ruuid, type FROM scheduler where active=1")
  1023. _, _ = db.Query("SELECT uuid as UUID ,task_apiCall as TaskAPICall , cron_expression as CronExpression , related_uuid as Ruuid, type FROM scheduler where active=1")
  1024. _, _ = db.Query("SELECT uuid as UUID ,task_apiCall as TaskAPICall , cron_expression as CronExpression , related_uuid as Ruuid, type FROM scheduler where active=1")
  1025. db.Close()
  1026. claims := user.Claims.(jwt.MapClaims)
  1027. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  1028. var hashChannel_ = make(chan []byte, 1)
  1029. hashChannel_ <- _sha256[:]
  1030. //token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1031. cpu, _ := strconv.Atoi(c.FormValue("cpu"))
  1032. mem, _ := strconv.Atoi(c.FormValue("mem"))
  1033. hdd, _ := strconv.Atoi(c.FormValue("hdd"))
  1034. nic, _ := strconv.Atoi(c.FormValue("nic"))
  1035. period, _ := strconv.Atoi(c.FormValue("period"))
  1036. type PriceCalculator struct {
  1037. Data struct {
  1038. TotalPrice string `json:"TotalPrice"`
  1039. } `json:"message"`
  1040. Origin string `json:"origin"`
  1041. Code int `json:"code"`
  1042. }
  1043. resp := PriceCalculator{
  1044. Data: struct {
  1045. TotalPrice string `json:"TotalPrice"`
  1046. }{TotalPrice: strconv.Itoa((cpu*500 + mem + 10 + hdd*19 + nic*10000) * period)},
  1047. Origin: "PriceCalc",
  1048. Code: 1000,
  1049. }
  1050. return c.JSON(http.StatusOK, resp)
  1051. }
  1052. func (h *handler) showUser(c echo.Context) error {
  1053. type response struct {
  1054. Message struct {
  1055. Username string `json:"Username"`
  1056. Firstname string `json:"Firstname"`
  1057. LastName string `json:"LastName"`
  1058. PhoneNo string `json:"PhoneNo."`
  1059. NationalID string `json:"NationalID"`
  1060. Email string `json:"email"`
  1061. } `json:"message"`
  1062. Origin string `json:"origin"`
  1063. Code int `json:"code"`
  1064. }
  1065. user := c.Get("user").(*jwt.Token)
  1066. claims := user.Claims.(jwt.MapClaims)
  1067. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  1068. var hashChannel_ = make(chan []byte, 1)
  1069. hashChannel_ <- _sha256[:]
  1070. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1071. userName := c.FormValue("username")
  1072. _userInfo := getUserInfo(token, userName)
  1073. ///TODO: handle uncompleted profiles
  1074. if _userInfo.Error != nil {
  1075. //fmt.Println("Error on ListVM",err)
  1076. //return CPUPrice, memPrice, StoragePrice, IPPrice, extraBWPrice
  1077. resp := _response{
  1078. Origin: "showUser",
  1079. Message: "Error in Showing User",
  1080. Code: 1001,
  1081. }
  1082. return c.JSON(http.StatusInternalServerError, resp)
  1083. }
  1084. userInfo := response{
  1085. Message: struct {
  1086. Username string `json:"Username"`
  1087. Firstname string `json:"Firstname"`
  1088. LastName string `json:"LastName"`
  1089. PhoneNo string `json:"PhoneNo."`
  1090. NationalID string `json:"NationalID"`
  1091. Email string `json:"email"`
  1092. }{
  1093. Username: _userInfo.Result.Result.UID[0],
  1094. Firstname: _userInfo.Result.Result.Givenname[0],
  1095. LastName: _userInfo.Result.Result.Sn[0],
  1096. PhoneNo: _userInfo.Result.Result.Mobile[0],
  1097. NationalID: _userInfo.Result.Result.Pager[0],
  1098. Email: _userInfo.Result.Result.Mail[0],
  1099. },
  1100. Origin: "showUser",
  1101. Code: 1000,
  1102. }
  1103. return c.JSON(http.StatusOK, userInfo)
  1104. }
  1105. func (h *handler) editUser(c echo.Context) error {
  1106. type apiErr struct {
  1107. Result interface{} `json:"result"`
  1108. Error struct {
  1109. Code int `json:"code"`
  1110. Message string `json:"message"`
  1111. Data struct {
  1112. } `json:"data"`
  1113. Name string `json:"name"`
  1114. } `json:"error"`
  1115. ID int `json:"id"`
  1116. Principal string `json:"principal"`
  1117. Version string `json:"version"`
  1118. }
  1119. type editUser struct {
  1120. Result struct {
  1121. Result struct {
  1122. Displayname []string `json:"displayname"`
  1123. UID []string `json:"uid"`
  1124. Uidnumber []string `json:"uidnumber"`
  1125. Objectclass []string `json:"objectclass"`
  1126. Sn []string `json:"sn"`
  1127. Telephonenumber []string `json:"telephonenumber"`
  1128. Cn []string `json:"cn"`
  1129. Krbpasswordexpiration []struct {
  1130. Datetime string `json:"__datetime__"`
  1131. } `json:"krbpasswordexpiration"`
  1132. Mobile []string `json:"mobile"`
  1133. Krbprincipalname []string `json:"krbprincipalname"`
  1134. Ipauniqueid []string `json:"ipauniqueid"`
  1135. Givenname []string `json:"givenname"`
  1136. Gidnumber []string `json:"gidnumber"`
  1137. Krbcanonicalname []string `json:"krbcanonicalname"`
  1138. Mail []string `json:"mail"`
  1139. Initials []string `json:"initials"`
  1140. Homedirectory []string `json:"homedirectory"`
  1141. Loginshell []string `json:"loginshell"`
  1142. Gecos []string `json:"gecos"`
  1143. Randompassword string `json:"randompassword"`
  1144. HasPassword bool `json:"has_password"`
  1145. HasKeytab bool `json:"has_keytab"`
  1146. MemberofGroup []string `json:"memberof_group"`
  1147. Dn string `json:"dn"`
  1148. } `json:"result"`
  1149. Value string `json:"value"`
  1150. Summary string `json:"summary"`
  1151. } `json:"result"`
  1152. Error string `json:"error"`
  1153. ID int `json:"id"`
  1154. Principal string `json:"principal"`
  1155. Version string `json:"version"`
  1156. }
  1157. user := c.Get("user").(*jwt.Token)
  1158. claims := user.Claims.(jwt.MapClaims)
  1159. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  1160. var hashChannel_ = make(chan []byte, 1)
  1161. hashChannel_ <- _sha256[:]
  1162. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1163. username := c.FormValue("Username")
  1164. sha256 := sha256.Sum256([]byte(username))
  1165. var hashChannel = make(chan []byte, 1)
  1166. hashChannel <- sha256[:]
  1167. sn := c.FormValue("Lname")
  1168. cn := c.FormValue("FullName")
  1169. givenname := c.FormValue("Fname")
  1170. mail := c.FormValue("mail")
  1171. telephonenumber := c.FormValue("telephonenumber")
  1172. mobile := c.FormValue("mobile")
  1173. pager := c.FormValue("nationalID")
  1174. _url := URL + "/ipa/session/json"
  1175. method := "POST"
  1176. _json := fmt.Sprintf(`
  1177. {
  1178. "id": 0,
  1179. "method": "user_mod/1",
  1180. "params": [
  1181. [
  1182. "%s"
  1183. ],
  1184. {
  1185. "cn": "%s",
  1186. "givenname": "%s",
  1187. "mail": [
  1188. "%s"
  1189. ],
  1190. "mobile": [
  1191. "%s"
  1192. ],
  1193. "pager": [
  1194. "%s"
  1195. ],
  1196. "sn": "%s",
  1197. "telephonenumber": [
  1198. "%s"
  1199. ],
  1200. "version": "2.235"
  1201. }
  1202. ]
  1203. }
  1204. `, username, cn, givenname, mail, mobile, pager, sn, telephonenumber)
  1205. payload := strings.NewReader(_json)
  1206. tr := &http.Transport{
  1207. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  1208. }
  1209. client := &http.Client{Transport: tr}
  1210. req, err := http.NewRequest(method, _url, payload)
  1211. if err != nil {
  1212. fmt.Println(err)
  1213. }
  1214. req.Header.Add("Referer", URL+"/ipa")
  1215. req.Header.Add("Content-Type", "application/json")
  1216. req.Header.Add("Accept", "text/plain")
  1217. req.Header.Add("Cookie", token)
  1218. res, err := client.Do(req)
  1219. defer res.Body.Close()
  1220. body, err := ioutil.ReadAll(res.Body)
  1221. result := editUser{}
  1222. _err := json.Unmarshal(body, &result)
  1223. if _err != nil {
  1224. _apiErr := apiErr{}
  1225. __err := json.Unmarshal(body, &_apiErr)
  1226. if __err != nil {
  1227. return c.String(http.StatusBadRequest, "Error of error!!")
  1228. }
  1229. resp := _response{
  1230. Origin: "editUser",
  1231. Message: _apiErr.Error.Name + ": " + _apiErr.Error.Message,
  1232. Code: _apiErr.Error.Code,
  1233. }
  1234. return c.JSON(http.StatusNotFound, resp)
  1235. }
  1236. resp := _response{
  1237. Origin: "editUser",
  1238. Message: "Done",
  1239. Code: 1000,
  1240. }
  1241. return c.JSON(http.StatusOK, resp)
  1242. }