handler.go 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469
  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 ResetResponseErr struct {
  489. Result interface{} `json:"result"`
  490. Error struct {
  491. Code int `json:"code"`
  492. Message string `json:"message"`
  493. Data struct {
  494. Desc string `json:"desc"`
  495. Info string `json:"info"`
  496. } `json:"data"`
  497. Name string `json:"name"`
  498. } `json:"error"`
  499. ID int `json:"id"`
  500. Principal string `json:"principal"`
  501. Version string `json:"version"`
  502. }
  503. type ResetResponse struct {
  504. Result struct {
  505. Result struct {
  506. Mail []string `json:"mail"`
  507. UID []string `json:"uid"`
  508. Loginshell []string `json:"loginshell"`
  509. Sn []string `json:"sn"`
  510. Givenname []string `json:"givenname"`
  511. Uidnumber []string `json:"uidnumber"`
  512. Krbcanonicalname []string `json:"krbcanonicalname"`
  513. Gidnumber []string `json:"gidnumber"`
  514. Homedirectory []string `json:"homedirectory"`
  515. Telephonenumber []string `json:"telephonenumber"`
  516. Krbprincipalname []string `json:"krbprincipalname"`
  517. Nsaccountlock bool `json:"nsaccountlock"`
  518. HasPassword bool `json:"has_password"`
  519. HasKeytab bool `json:"has_keytab"`
  520. MemberofGroup []string `json:"memberof_group"`
  521. } `json:"result"`
  522. Value string `json:"value"`
  523. Summary string `json:"summary"`
  524. } `json:"result"`
  525. Error interface{} `json:"error"`
  526. ID int `json:"id"`
  527. Principal string `json:"principal"`
  528. Version string `json:"version"`
  529. }
  530. type keyJson struct {
  531. IPAToken string `json:"IPAToken"`
  532. Admin bool `json:"admin"`
  533. Exp int `json:"exp"`
  534. Memberof []string `json:"memberof"`
  535. Name string `json:"name"`
  536. Sub int `json:"sub"`
  537. }
  538. t := time.Now() //%Y%m%d%H%M%SZ
  539. t = t.Add(time.Hour * 24 * 60)
  540. //username := c.FormValue("Username")
  541. password := c.FormValue("Password")
  542. short := c.FormValue("key")
  543. key, username := getResetKey(short)
  544. if len(key) < 5 {
  545. resp := _response{
  546. Origin: "resetUser",
  547. Message: "Link has been expired",
  548. Code: 1001,
  549. }
  550. //b, _ := json.MarshalIndent(resp, "", " ")
  551. return c.JSON(http.StatusOK, resp)
  552. }
  553. //key, _ = url.QueryUnescape(key)
  554. _sha256 := sha256.Sum256([]byte(username))
  555. var hashChannel = make(chan []byte, 1)
  556. hashChannel <- _sha256[:]
  557. plainkey := decrypt(<-hashChannel, key)
  558. _plainkey := keyJson{}
  559. json.Unmarshal([]byte(plainkey), &_plainkey)
  560. _name := _plainkey.Name
  561. //_sha256 := sha256.Sum256([]byte(string("")))
  562. var hashChannel_ = make(chan []byte, 1)
  563. __sha256 := sha256.Sum256([]byte(_name))
  564. hashChannel_ <- __sha256[:]
  565. token := decrypt(<-hashChannel_, string(_plainkey.IPAToken))
  566. // token := _plainkey.IPAToken
  567. _url := URL + "/ipa/session/json"
  568. method := "POST"
  569. _json := fmt.Sprintf(`
  570. {
  571. "id": 0,
  572. "method": "user_mod/1",
  573. "params": [
  574. [
  575. "%s"
  576. ],
  577. {
  578. "userpassword":"%s",
  579. "version": "2.235"
  580. }
  581. ]
  582. }
  583. `, username, password)
  584. payload := strings.NewReader(_json)
  585. tr := &http.Transport{
  586. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  587. }
  588. client := &http.Client{Transport: tr}
  589. req, err := http.NewRequest(method, _url, payload)
  590. if err != nil {
  591. fmt.Println(err)
  592. }
  593. req.Header.Add("Referer", URL+"/ipa")
  594. req.Header.Add("Content-Type", "application/json")
  595. req.Header.Add("Accept", "text/plain")
  596. req.Header.Add("Cookie", token)
  597. res, err := client.Do(req)
  598. fmt.Println(token)
  599. fmt.Println(_json)
  600. fmt.Println(req)
  601. fmt.Println(res)
  602. //body, err := ioutil.ReadAll(res.Body)
  603. //result := ResetResponse{}
  604. //resultErr := ResetResponseErr{}
  605. //_err := json.Unmarshal(body, &result)
  606. //fmt.Println("Sassan:", result.Error)
  607. //fmt.Println("SassanType:", reflect.TypeOf(result.Error))
  608. //var respErr interface{}
  609. //respErrRaw := fmt.Sprintf("%v", result.Error)
  610. //fmt.Println(respErrRaw)
  611. //json.Unmarshal([]byte(respErrRaw), &respErr)
  612. //fmt.Println("Sassan Code:", respErr.(interface{}).(map[string]interface{})["code"])
  613. //if _err != nil {
  614. // _err := json.Unmarshal(body, &resultErr)
  615. // resp := _response{
  616. // Origin: "resetUser",
  617. // Message: "Something went wrong; " + _err.Error() + ": " + resultErr.Error.Message,
  618. // Code: 1001,
  619. // }
  620. // if _err != nil {
  621. // resp.Message = "Something went wrong"
  622. // }
  623. // fmt.Println("Sassan Err:", resp.Message)
  624. // return c.JSON(http.StatusBadRequest, resp)
  625. //}
  626. //fmt.Println(body)
  627. //fmt.Println(string(body))
  628. _json = fmt.Sprintf(`
  629. {
  630. "id": 0,
  631. "method": "user_mod/1",
  632. "params": [
  633. [
  634. "%s"
  635. ],
  636. {
  637. "krbpasswordexpiration":"%s",
  638. "version": "2.235"
  639. }
  640. ]
  641. }
  642. `, username, t.Format("2006-01-02")+"Z")
  643. payload = strings.NewReader(_json)
  644. req, err = http.NewRequest(method, _url, payload)
  645. if err != nil {
  646. fmt.Println(err)
  647. }
  648. req.Header.Add("Referer", URL+"/ipa")
  649. req.Header.Add("Content-Type", "application/json")
  650. req.Header.Add("Accept", "text/plain")
  651. req.Header.Add("Cookie", token)
  652. err = nil
  653. res, err = client.Do(req)
  654. //fmt.Println(token)
  655. // fmt.Println(_json)
  656. // fmt.Println(req)
  657. // body, err := ioutil.ReadAll(res.Body)
  658. // fmt.Println(body)
  659. // fmt.Println(string(body))
  660. if err != nil {
  661. //return c.String(http.StatusBadRequest, "Error"+err.Error())
  662. return c.JSON(http.StatusBadRequest, "Error"+err.Error())
  663. }
  664. defer res.Body.Close()
  665. resp := _response{
  666. Origin: "resetUser",
  667. Message: "Done",
  668. Code: 1000,
  669. }
  670. expireResetKey(username)
  671. //b, _ := json.MarshalIndent(resp, "", " ")
  672. return c.JSON(http.StatusOK, resp)
  673. //return c.String(http.StatusOK, string(b))
  674. }
  675. func (h *handler) dnsrecordadd(c echo.Context) error {
  676. user := c.Get("user").(*jwt.Token)
  677. claims := user.Claims.(jwt.MapClaims)
  678. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  679. var hashChannel_ = make(chan []byte, 1)
  680. hashChannel_ <- _sha256[:]
  681. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  682. recordName := c.FormValue("recordName")
  683. record := c.FormValue("record")
  684. url := URL + "/ipa/session/json"
  685. method := "POST"
  686. _json := fmt.Sprintf(`
  687. {
  688. "id": 0,
  689. "method": "dnsrecord_add/1",
  690. "params": [
  691. [
  692. "ZI-TEL.COM",
  693. {
  694. "__dns_name__": "%s"
  695. }
  696. ],
  697. {
  698. "a_part_ip_address": "%s",
  699. "raw": true,
  700. "version": "2.235"
  701. }
  702. ]
  703. }
  704. `, recordName, record)
  705. payload := strings.NewReader(_json)
  706. tr := &http.Transport{
  707. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  708. }
  709. client := &http.Client{Transport: tr}
  710. req, err := http.NewRequest(method, url, payload)
  711. if err != nil {
  712. fmt.Println(err)
  713. }
  714. req.Header.Add("Referer", URL+"/ipa")
  715. req.Header.Add("Content-Type", "application/json")
  716. req.Header.Add("Accept", "text/plain")
  717. req.Header.Add("Cookie", token)
  718. res, err := client.Do(req)
  719. if err != nil {
  720. //return c.String(http.StatusBadRequest, "Error"+err.Error())
  721. return c.JSON(http.StatusBadRequest, "Error"+err.Error())
  722. }
  723. //body, err := ioutil.ReadAll(res.Body)
  724. //_res:=result{}
  725. //json.Unmarshal(body, &_res)
  726. //fmt.Println(_res)
  727. defer res.Body.Close()
  728. resp := _response{
  729. Origin: "dnsrecordadd",
  730. Message: "Done",
  731. Code: 1000,
  732. }
  733. //b, _ := json.MarshalIndent(resp, "", " ")
  734. return c.JSON(http.StatusOK, resp)
  735. //return c.String(http.StatusOK, string(b))
  736. }
  737. func (h *handler) token(c echo.Context) error {
  738. user := c.Get("user").(*jwt.Token)
  739. claims := user.Claims.(jwt.MapClaims)
  740. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  741. var hashChannel_ = make(chan []byte, 1)
  742. hashChannel_ <- _sha256[:]
  743. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  744. username := claims["name"].(string)
  745. //fmt.Println("User: ",username)
  746. //fmt.Println("Token : ",token)
  747. _user := getUserInfo(token, username)
  748. fmt.Println("User: ", _user.Result.Summary)
  749. newtokens, err := generateTokenPair(_user, token)
  750. if err != nil {
  751. return err
  752. }
  753. return c.JSON(http.StatusOK, newtokens)
  754. }
  755. func (h *handler) verifyUser(c echo.Context) error {
  756. name := c.FormValue("Username")
  757. //fmt.Println("Name: ", name)
  758. if name == "" {
  759. return c.JSON(http.StatusNotFound, "User NOT Found")
  760. }
  761. username := "admin"
  762. password := "h?_QJp5^&9FNc9w="
  763. _url := URL + "/ipa/session/login_password"
  764. method := "POST"
  765. params := url.Values{}
  766. ///TODO: remove admin password
  767. params.Add("user", username)
  768. params.Add("password", password)
  769. payload := strings.NewReader(params.Encode())
  770. tr := &http.Transport{
  771. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  772. }
  773. client := &http.Client{Transport: tr}
  774. req, err := http.NewRequest(method, _url, payload)
  775. audit("Recieved Login request from: " + RealIP)
  776. if err != nil {
  777. fmt.Println(err)
  778. }
  779. req.Header.Add("Referer", URL+"/ipa")
  780. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  781. req.Header.Add("Accept", "text/plain")
  782. res, err := client.Do(req)
  783. cockie := res.Cookies()
  784. token := cockie[0].Raw
  785. defer res.Body.Close()
  786. //fmt.Println(token)
  787. fmt.Println(res.StatusCode)
  788. fmt.Println(res)
  789. if res.StatusCode == 200 {
  790. user := getUserInfo(token, name)
  791. fmt.Println(user)
  792. if user.Result.Value != name {
  793. resp := _response{
  794. Origin: "VerifyUser",
  795. Message: "User Not Found",
  796. Code: 1000,
  797. }
  798. //b, _errr := json.MarshalIndent(resp, "", " ")
  799. //b, _= json.Marshal(resp)
  800. //if _errr != nil {
  801. // fmt.Println(_errr)
  802. //}
  803. //fmt.Print(string(b))
  804. return c.JSON(http.StatusOK, resp)
  805. }
  806. }
  807. resp := _response{
  808. Origin: "VerifyUser",
  809. Message: "User Found",
  810. Code: 1001,
  811. }
  812. //b, _ := json.MarshalIndent(resp, "", " ")
  813. return c.JSON(http.StatusNotFound, resp)
  814. }
  815. func (h *handler) forgetpassword(c echo.Context) error {
  816. user := c.Get("user").(*jwt.Token)
  817. claims := user.Claims.(jwt.MapClaims)
  818. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  819. var hashChannel_ = make(chan []byte, 1)
  820. hashChannel_ <- _sha256[:]
  821. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  822. _type := c.FormValue("type")
  823. _data := c.FormValue("data")
  824. url := URL + "/ipa/session/json"
  825. method := "POST"
  826. __type, _ := strconv.Atoi(_type)
  827. _json := ""
  828. if __type == 1 {
  829. // email
  830. _json = fmt.Sprintf(`
  831. {
  832. "id": 0,
  833. "method": "user_find/1",
  834. "params": [
  835. [],
  836. {
  837. "mail": [
  838. "%s"
  839. ],
  840. "version": "2.235"
  841. }
  842. ]
  843. }
  844. `, _data)
  845. } else if __type == 2 {
  846. // username
  847. _json = fmt.Sprintf(`
  848. {
  849. "id": 0,
  850. "method": "user_find/1",
  851. "params": [
  852. [
  853. "%s"
  854. ],
  855. {
  856. "version": "2.235"
  857. }
  858. ]
  859. }
  860. `, _data)
  861. } else if __type == 3 {
  862. //mobile
  863. _json = fmt.Sprintf(`
  864. {
  865. "id": 0,
  866. "method": "user_find/1",
  867. "params": [
  868. [],
  869. {
  870. "mobile": [
  871. "%s"
  872. ],
  873. "version": "2.235"
  874. }
  875. ]
  876. }
  877. `, _data)
  878. } else {
  879. resp := _response{
  880. Origin: "forgetpassword",
  881. Message: "unknown requested type",
  882. Code: 1001,
  883. }
  884. return c.JSON(http.StatusNotFound, resp)
  885. }
  886. //fmt.Println(_json)
  887. payload := strings.NewReader(_json)
  888. tr := &http.Transport{
  889. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  890. }
  891. client := &http.Client{Transport: tr}
  892. req, err := http.NewRequest(method, url, payload)
  893. if err != nil {
  894. fmt.Println(err)
  895. }
  896. req.Header.Add("Referer", URL+"/ipa")
  897. req.Header.Add("Content-Type", "application/json")
  898. req.Header.Add("Accept", "text/plain")
  899. req.Header.Add("Cookie", token)
  900. res, err := client.Do(req)
  901. body, err := ioutil.ReadAll(res.Body)
  902. defer res.Body.Close()
  903. //fmt.Println("Getting Data for Response: ", body)
  904. _user := user_findResult{}
  905. json.Unmarshal(body, &_user)
  906. fmt.Println("find in forgetpass : ", _user.Result.Count)
  907. if _user.Result.Count != 1 {
  908. resp := _response{
  909. Origin: "forgetpassword",
  910. Message: "Something goes wrong",
  911. Code: 1001,
  912. }
  913. return c.JSON(http.StatusNotFound, resp)
  914. }
  915. b, err := json.Marshal(claims)
  916. if err != nil {
  917. fmt.Println("err:", err)
  918. }
  919. //fmt.Println("AddUser Claims: ", claims)
  920. //fmt.Println("AddUser token: ", token)
  921. username := _user.Result.Result[0].UID[0]
  922. sha256 := sha256.Sum256([]byte(username))
  923. var hashChannel = make(chan []byte, 1)
  924. hashChannel <- sha256[:]
  925. ciphertext := encrypt(<-hashChannel, string(b))
  926. shortLink := setResetKey(ciphertext, username)
  927. key, _ := getResetKey(username)
  928. if len(key) > 5 {
  929. resp := _response{
  930. Origin: "forgetpassword",
  931. Message: "A resetLink request with this email already exists",
  932. Code: 1003,
  933. }
  934. return c.JSON(http.StatusNotFound, resp)
  935. }
  936. go sendMail("Your temporary link is :\r\n https://zi-cloud.ir/reset/"+shortLink, "ResetPassword Link", _user.Result.Result[0].Mail[0], nil)
  937. resp := _response{
  938. Origin: "forgetpassword",
  939. Message: "You will receive an email with a link to reset your password",
  940. Code: 1000,
  941. }
  942. return c.JSON(http.StatusNotFound, resp)
  943. }
  944. func setResetKey(key string, username string) string {
  945. short := uniuri.NewLen(32)
  946. db, err := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  947. if err != nil {
  948. return ""
  949. }
  950. defer db.Close()
  951. insert, err := db.Query("INSERT INTO url_shortener VALUES ( '" + short + "'," +
  952. "'" + key + "'," +
  953. "NOW() + INTERVAL 1 HOUR" + "," +
  954. "'" + "setResetKey" + "'," +
  955. "'" + username + "'," +
  956. "1" +
  957. " )")
  958. defer insert.Close()
  959. return short
  960. }
  961. func getResetKey(short string) (string, string) {
  962. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  963. results, _ := db.Query("SELECT `long` as `long`, related_obj as username FROM url_shortener where active=1 and short='" + short + "' and expiration > NOW()")
  964. var key, username string
  965. for results.Next() {
  966. err := results.Scan(&key, &username)
  967. if err != nil {
  968. return "ERR", "ERR"
  969. }
  970. }
  971. return key, username
  972. }
  973. func expireResetKey(username string) {
  974. db, err := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  975. if err != nil {
  976. return
  977. }
  978. update, err := db.Query("update url_shortener set active='0' where related_obj='" + username + "'")
  979. defer db.Close()
  980. defer update.Close()
  981. }
  982. func (h *handler) ListServices(c echo.Context) error {
  983. user := c.Get("user").(*jwt.Token)
  984. claims := user.Claims.(jwt.MapClaims)
  985. //IPAUid:=claims["IPAUid"]
  986. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  987. var hashChannel_ = make(chan []byte, 1)
  988. hashChannel_ <- _sha256[:]
  989. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  990. _BA := strings.Split(token, ";")
  991. BA := _BA[len(_BA)-2]
  992. db, _ := sql.Open("mysql", MySQLUSER+":"+MySQLPASS+"@tcp(127.0.0.1:3306)/zicloud")
  993. defer db.Close()
  994. results, _ := db.Query("SELECT `type` as `type`, uuid as Service_uuid , active , objectName FROM service_profile where uid=" + claims["IPAUid"].(string) + " and active!='-1'")
  995. paiedResult, _ := db.Query("select count(id) PaidCount from iaasinvoice where customer_id='" + login(BA).AuthenticatedUser.ID + "' and is_paid=1")
  996. totalInvoiceResult, _ := db.Query("select count(id) TotalInvoiceCount from iaasinvoice where customer_id='" + login(BA).AuthenticatedUser.ID + "'")
  997. PaidCount := 0
  998. TotalInvoiceCount := 0
  999. activeCount := 0
  1000. totalCount := 0
  1001. activeVMCount := 0
  1002. totalVMCount := 0
  1003. var cpu, mem float64
  1004. var _type, service_uuid, active, objectName string
  1005. ///TODO: too SLOW
  1006. var wg sync.WaitGroup
  1007. for results.Next() {
  1008. err := results.Scan(&_type, &service_uuid, &active, &objectName)
  1009. if err != nil {
  1010. resp := _response{
  1011. Origin: "ListServices",
  1012. Message: "Listing Error in service",
  1013. Code: 1001,
  1014. }
  1015. //b, _ := json.MarshalIndent(resp, "", " ")
  1016. return c.JSON(http.StatusInternalServerError, resp)
  1017. }
  1018. if _type == "VM" {
  1019. if active == "1" {
  1020. wg.Add(1)
  1021. go func(activeCount *int, activeVMCount *int, cpu *float64, mem *float64, totalCount *int, totalVMCount *int, suid string) {
  1022. _, _cpu, _mem, err := vmStatistics(BA, suid)
  1023. defer wg.Done()
  1024. //fmt.Println("Service UUID: ",suid)
  1025. if err != nil {
  1026. //fmt.Println("Error in vmDetails : ", err)
  1027. //continue
  1028. *totalVMCount--
  1029. *totalCount--
  1030. return
  1031. }
  1032. *activeCount++
  1033. *activeVMCount++
  1034. *cpu += _cpu
  1035. *mem += _mem
  1036. }(&activeCount, &activeVMCount, &cpu, &mem, &totalCount, &totalVMCount, service_uuid)
  1037. //_, _cpu, _mem, err := vmStatistics(BA, service_uuid)
  1038. //if err != nil {
  1039. // fmt.Println("Error in vmDetails : ", err)
  1040. // continue
  1041. //}
  1042. //activeCount++
  1043. //fmt.Println("activeCount:", activeCount)
  1044. //fmt.Println(vmStatistics(BA,service_uuid))
  1045. //activeVMCount++
  1046. //cpu += _cpu
  1047. //mem += _mem
  1048. }
  1049. totalCount++
  1050. totalVMCount++
  1051. }
  1052. }
  1053. wg.Wait()
  1054. for paiedResult.Next() {
  1055. err := paiedResult.Scan(&PaidCount)
  1056. if err != nil {
  1057. resp := _response{
  1058. Origin: "ListServices",
  1059. Message: "Listing Error in paid",
  1060. Code: 1001,
  1061. }
  1062. //b, _ := json.MarshalIndent(resp, "", " ")
  1063. return c.JSON(http.StatusInternalServerError, resp)
  1064. }
  1065. }
  1066. for totalInvoiceResult.Next() {
  1067. err := totalInvoiceResult.Scan(&TotalInvoiceCount)
  1068. if err != nil {
  1069. resp := _response{
  1070. Origin: "ListServices",
  1071. Message: "Listing Error in total:" + err.Error(),
  1072. Code: 1001,
  1073. }
  1074. //b, _ := json.MarshalIndent(resp, "", " ")
  1075. return c.JSON(http.StatusInternalServerError, resp)
  1076. }
  1077. }
  1078. //fmt.Println(activeVMCount)
  1079. //fmt.Println(activeCount)
  1080. //fmt.Println(totalCount)
  1081. //fmt.Println(totalVMCount)
  1082. //SL := ServiceList{
  1083. // TotalCount: string(totalCount),
  1084. // ActiveCount: string(activeCount),
  1085. // ActiveVMCount: string(activeVMCount),
  1086. // TotalVMCount: string(totalVMCount),
  1087. //}
  1088. type AutoGenerated struct {
  1089. Message struct {
  1090. TotalCount string `json:"TotalCount"`
  1091. ActiveCount string `json:"ActiveCount"`
  1092. ActiveVMCount string `json:"ActiveVMCount"`
  1093. TotalVMCount string `json:"TotalVMCount"`
  1094. TotalCPUUsage string `json:"TotalCPUUsage"`
  1095. TotalMemUsage string `json:"TotalMemUsage"`
  1096. TotalPaid string `json:"TotalPaid"`
  1097. TotalInvoice string `json:"TotalInvoice"`
  1098. } `json:"message"`
  1099. Origin string `json:"origin"`
  1100. Code int `json:"code"`
  1101. }
  1102. resp := AutoGenerated{
  1103. Message: struct {
  1104. TotalCount string `json:"TotalCount"`
  1105. ActiveCount string `json:"ActiveCount"`
  1106. ActiveVMCount string `json:"ActiveVMCount"`
  1107. TotalVMCount string `json:"TotalVMCount"`
  1108. TotalCPUUsage string `json:"TotalCPUUsage"`
  1109. TotalMemUsage string `json:"TotalMemUsage"`
  1110. TotalPaid string `json:"TotalPaid"`
  1111. TotalInvoice string `json:"TotalInvoice"`
  1112. }{
  1113. TotalCount: strconv.Itoa(totalCount),
  1114. ActiveCount: strconv.Itoa(activeCount),
  1115. ActiveVMCount: strconv.Itoa(activeVMCount),
  1116. TotalVMCount: strconv.Itoa(totalVMCount),
  1117. TotalCPUUsage: fmt.Sprintf("%f", 100*cpu/float64(activeVMCount)),
  1118. TotalMemUsage: fmt.Sprintf("%f", 100*mem/float64(activeVMCount)),
  1119. TotalPaid: strconv.Itoa(PaidCount),
  1120. TotalInvoice: strconv.Itoa(TotalInvoiceCount),
  1121. },
  1122. Origin: "ListServices",
  1123. Code: 1000,
  1124. }
  1125. return c.JSON(http.StatusOK, resp)
  1126. }
  1127. func (h *handler) PriceCalc(c echo.Context) error {
  1128. user := c.Get("user").(*jwt.Token)
  1129. claims := user.Claims.(jwt.MapClaims)
  1130. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  1131. var hashChannel_ = make(chan []byte, 1)
  1132. hashChannel_ <- _sha256[:]
  1133. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1134. _BA := strings.Split(token, ";")
  1135. BA := _BA[len(_BA)-2]
  1136. //token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1137. cpu := c.FormValue("cpu")
  1138. mem := c.FormValue("mem")
  1139. Disk := c.FormValue("hdd")
  1140. nic := c.FormValue("nic")
  1141. period := c.FormValue("period")
  1142. nic = c.FormValue("VmNIC")
  1143. extraBW := c.FormValue("extraBW")
  1144. coupon, _ := strconv.Atoi(c.FormValue("coupon"))
  1145. __cpu, _ := strconv.Atoi(cpu)
  1146. __mem, _ := strconv.Atoi(mem)
  1147. __Disk, _ := strconv.Atoi(Disk)
  1148. __nic, _ := strconv.Atoi(nic)
  1149. __period, _ := strconv.Atoi(period)
  1150. __extraBW, _ := strconv.Atoi(extraBW)
  1151. if __cpu < 0 {
  1152. cpu = "0"
  1153. }
  1154. if __mem < 0 {
  1155. mem = "0"
  1156. }
  1157. if __Disk < 0 {
  1158. Disk = "0"
  1159. }
  1160. if __nic < 0 {
  1161. nic = "0"
  1162. }
  1163. if __extraBW < 0 {
  1164. extraBW = "0"
  1165. }
  1166. if __period < 0 {
  1167. period = "0"
  1168. }
  1169. type PriceCalculator struct {
  1170. Data struct {
  1171. TotalPrice string `json:"TotalPrice"`
  1172. } `json:"message"`
  1173. Origin string `json:"origin"`
  1174. Code int `json:"code"`
  1175. }
  1176. _, _, _, _, _, SUM, _, _ := IaaSCreate(login(BA).AuthenticatedUser.ID, period, cpu, mem, Disk, nic, extraBW, true, coupon)
  1177. resp := PriceCalculator{
  1178. Data: struct {
  1179. TotalPrice string `json:"TotalPrice"`
  1180. }{TotalPrice: strconv.Itoa(int(SUM))},
  1181. Origin: "PriceCalc",
  1182. Code: 1000,
  1183. }
  1184. return c.JSON(http.StatusOK, resp)
  1185. }
  1186. func (h *handler) EditIaaSPriceCalc(c echo.Context) error {
  1187. user := c.Get("user").(*jwt.Token)
  1188. claims := user.Claims.(jwt.MapClaims)
  1189. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  1190. var hashChannel_ = make(chan []byte, 1)
  1191. hashChannel_ <- _sha256[:]
  1192. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1193. _BA := strings.Split(token, ";")
  1194. BA := _BA[len(_BA)-2]
  1195. //token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1196. cpu := c.FormValue("cpu")
  1197. mem := c.FormValue("mem")
  1198. Disk := c.FormValue("hdd")
  1199. nic := c.FormValue("nic")
  1200. period := c.FormValue("period")
  1201. nic = c.FormValue("VmNIC")
  1202. extraBW := c.FormValue("extraBW")
  1203. VMUUID := c.FormValue("VMUUID")
  1204. coupon, _ := strconv.Atoi(c.FormValue("coupon"))
  1205. __cpu, _ := strconv.Atoi(cpu)
  1206. __mem, _ := strconv.Atoi(mem)
  1207. __Disk, _ := strconv.Atoi(Disk)
  1208. __nic, _ := strconv.Atoi(nic)
  1209. __period, _ := strconv.Atoi(period)
  1210. __extraBW, _ := strconv.Atoi(extraBW)
  1211. if __cpu < 0 {
  1212. cpu = "0"
  1213. }
  1214. if __mem < 0 {
  1215. mem = "0"
  1216. }
  1217. if __Disk < 0 {
  1218. Disk = "0"
  1219. }
  1220. if __nic < 0 {
  1221. nic = "0"
  1222. }
  1223. if __extraBW < 0 {
  1224. extraBW = "0"
  1225. }
  1226. if __period < 0 {
  1227. period = "0"
  1228. }
  1229. type PriceCalculator struct {
  1230. Data struct {
  1231. TotalPrice string `json:"TotalPrice"`
  1232. } `json:"message"`
  1233. Origin string `json:"origin"`
  1234. Code int `json:"code"`
  1235. }
  1236. _, _, _, _, _, SUM, _, _ := IaaSEdit(login(BA).AuthenticatedUser.ID, period, cpu, mem, Disk, nic, extraBW, true, coupon, VMUUID)
  1237. resp := PriceCalculator{
  1238. Data: struct {
  1239. TotalPrice string `json:"TotalPrice"`
  1240. }{TotalPrice: strconv.Itoa(int(SUM))},
  1241. Origin: "EditIaaSPriceCalc",
  1242. Code: 1000,
  1243. }
  1244. return c.JSON(http.StatusOK, resp)
  1245. }
  1246. func (h *handler) showUser(c echo.Context) error {
  1247. type response struct {
  1248. Message struct {
  1249. Username string `json:"Username"`
  1250. Firstname string `json:"Firstname"`
  1251. LastName string `json:"LastName"`
  1252. PhoneNo string `json:"PhoneNo."`
  1253. NationalID string `json:"NationalID"`
  1254. Email string `json:"email"`
  1255. } `json:"message"`
  1256. Origin string `json:"origin"`
  1257. Code int `json:"code"`
  1258. }
  1259. user := c.Get("user").(*jwt.Token)
  1260. claims := user.Claims.(jwt.MapClaims)
  1261. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  1262. var hashChannel_ = make(chan []byte, 1)
  1263. hashChannel_ <- _sha256[:]
  1264. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1265. userName := c.FormValue("username")
  1266. _userInfo := getUserInfo(token, userName)
  1267. ///TODO: handle uncompleted profiles
  1268. if _userInfo.Error != nil {
  1269. //fmt.Println("Error on ListVM",err)
  1270. //return CPUPrice, memPrice, StoragePrice, IPPrice, extraBWPrice
  1271. resp := _response{
  1272. Origin: "showUser",
  1273. Message: "Error in Showing User",
  1274. Code: 1001,
  1275. }
  1276. return c.JSON(http.StatusInternalServerError, resp)
  1277. }
  1278. userInfo := response{
  1279. Message: struct {
  1280. Username string `json:"Username"`
  1281. Firstname string `json:"Firstname"`
  1282. LastName string `json:"LastName"`
  1283. PhoneNo string `json:"PhoneNo."`
  1284. NationalID string `json:"NationalID"`
  1285. Email string `json:"email"`
  1286. }{
  1287. Username: _userInfo.Result.Result.UID[0],
  1288. Firstname: _userInfo.Result.Result.Givenname[0],
  1289. LastName: _userInfo.Result.Result.Sn[0],
  1290. PhoneNo: _userInfo.Result.Result.Mobile[0],
  1291. NationalID: _userInfo.Result.Result.Pager[0],
  1292. Email: _userInfo.Result.Result.Mail[0],
  1293. },
  1294. Origin: "showUser",
  1295. Code: 1000,
  1296. }
  1297. return c.JSON(http.StatusOK, userInfo)
  1298. }
  1299. func (h *handler) editUser(c echo.Context) error {
  1300. type apiErr struct {
  1301. Result interface{} `json:"result"`
  1302. Error struct {
  1303. Code int `json:"code"`
  1304. Message string `json:"message"`
  1305. Data struct {
  1306. } `json:"data"`
  1307. Name string `json:"name"`
  1308. } `json:"error"`
  1309. ID int `json:"id"`
  1310. Principal string `json:"principal"`
  1311. Version string `json:"version"`
  1312. }
  1313. type editUser struct {
  1314. Result struct {
  1315. Result struct {
  1316. Displayname []string `json:"displayname"`
  1317. UID []string `json:"uid"`
  1318. Uidnumber []string `json:"uidnumber"`
  1319. Objectclass []string `json:"objectclass"`
  1320. Sn []string `json:"sn"`
  1321. Telephonenumber []string `json:"telephonenumber"`
  1322. Cn []string `json:"cn"`
  1323. Krbpasswordexpiration []struct {
  1324. Datetime string `json:"__datetime__"`
  1325. } `json:"krbpasswordexpiration"`
  1326. Mobile []string `json:"mobile"`
  1327. Krbprincipalname []string `json:"krbprincipalname"`
  1328. Ipauniqueid []string `json:"ipauniqueid"`
  1329. Givenname []string `json:"givenname"`
  1330. Gidnumber []string `json:"gidnumber"`
  1331. Krbcanonicalname []string `json:"krbcanonicalname"`
  1332. Mail []string `json:"mail"`
  1333. Initials []string `json:"initials"`
  1334. Homedirectory []string `json:"homedirectory"`
  1335. Loginshell []string `json:"loginshell"`
  1336. Gecos []string `json:"gecos"`
  1337. Randompassword string `json:"randompassword"`
  1338. HasPassword bool `json:"has_password"`
  1339. HasKeytab bool `json:"has_keytab"`
  1340. MemberofGroup []string `json:"memberof_group"`
  1341. Dn string `json:"dn"`
  1342. } `json:"result"`
  1343. Value string `json:"value"`
  1344. Summary string `json:"summary"`
  1345. } `json:"result"`
  1346. Error string `json:"error"`
  1347. ID int `json:"id"`
  1348. Principal string `json:"principal"`
  1349. Version string `json:"version"`
  1350. }
  1351. user := c.Get("user").(*jwt.Token)
  1352. claims := user.Claims.(jwt.MapClaims)
  1353. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  1354. var hashChannel_ = make(chan []byte, 1)
  1355. hashChannel_ <- _sha256[:]
  1356. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  1357. username := c.FormValue("Username")
  1358. sha256 := sha256.Sum256([]byte(username))
  1359. var hashChannel = make(chan []byte, 1)
  1360. hashChannel <- sha256[:]
  1361. sn := c.FormValue("Lname")
  1362. cn := c.FormValue("FullName")
  1363. givenname := c.FormValue("Fname")
  1364. mail := c.FormValue("mail")
  1365. telephonenumber := c.FormValue("telephonenumber")
  1366. mobile := c.FormValue("mobile")
  1367. pager := c.FormValue("nationalID")
  1368. _url := URL + "/ipa/session/json"
  1369. method := "POST"
  1370. _json := fmt.Sprintf(`
  1371. {
  1372. "id": 0,
  1373. "method": "user_mod/1",
  1374. "params": [
  1375. [
  1376. "%s"
  1377. ],
  1378. {
  1379. "cn": "%s",
  1380. "givenname": "%s",
  1381. "mail": [
  1382. "%s"
  1383. ],
  1384. "mobile": [
  1385. "%s"
  1386. ],
  1387. "pager": [
  1388. "%s"
  1389. ],
  1390. "sn": "%s",
  1391. "telephonenumber": [
  1392. "%s"
  1393. ],
  1394. "version": "2.235"
  1395. }
  1396. ]
  1397. }
  1398. `, username, cn, givenname, mail, mobile, pager, sn, telephonenumber)
  1399. payload := strings.NewReader(_json)
  1400. tr := &http.Transport{
  1401. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  1402. }
  1403. client := &http.Client{Transport: tr}
  1404. req, err := http.NewRequest(method, _url, payload)
  1405. if err != nil {
  1406. fmt.Println(err)
  1407. }
  1408. req.Header.Add("Referer", URL+"/ipa")
  1409. req.Header.Add("Content-Type", "application/json")
  1410. req.Header.Add("Accept", "text/plain")
  1411. req.Header.Add("Cookie", token)
  1412. res, err := client.Do(req)
  1413. body, err := ioutil.ReadAll(res.Body)
  1414. defer res.Body.Close()
  1415. result := editUser{}
  1416. _err := json.Unmarshal(body, &result)
  1417. if _err != nil {
  1418. _apiErr := apiErr{}
  1419. __err := json.Unmarshal(body, &_apiErr)
  1420. if __err != nil {
  1421. return c.String(http.StatusBadRequest, "Error of error!!")
  1422. }
  1423. resp := _response{
  1424. Origin: "editUser",
  1425. Message: _apiErr.Error.Name + ": " + _apiErr.Error.Message,
  1426. Code: _apiErr.Error.Code,
  1427. }
  1428. return c.JSON(http.StatusNotFound, resp)
  1429. }
  1430. resp := _response{
  1431. Origin: "editUser",
  1432. Message: "Done",
  1433. Code: 1000,
  1434. }
  1435. return c.JSON(http.StatusOK, resp)
  1436. }