handler.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. package main
  2. import (
  3. "crypto/sha256"
  4. "crypto/tls"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/dgrijalva/jwt-go"
  8. "github.com/labstack/echo"
  9. "io/ioutil"
  10. "net/http"
  11. "net/url"
  12. "strings"
  13. "time"
  14. )
  15. type handler struct{}
  16. type userInfo struct {
  17. Result struct {
  18. Result struct {
  19. Sshpubkeyfp []string `json:"sshpubkeyfp"`
  20. HasKeytab bool `json:"has_keytab"`
  21. Ipasshpubkey []string `json:"ipasshpubkey"`
  22. Cn []string `json:"cn"`
  23. Krbcanonicalname []string `json:"krbcanonicalname"`
  24. Krbticketflags []string `json:"krbticketflags"`
  25. MemberofGroup []string `json:"memberof_group"`
  26. HasPassword bool `json:"has_password"`
  27. Homedirectory []string `json:"homedirectory"`
  28. Nsaccountlock bool `json:"nsaccountlock"`
  29. UID []string `json:"uid"`
  30. Title []string `json:"title"`
  31. Loginshell []string `json:"loginshell"`
  32. Uidnumber []string `json:"uidnumber"`
  33. Preserved bool `json:"preserved"`
  34. Krbextradata []struct {
  35. Base64 string `json:"__base64__"`
  36. } `json:"krbextradata"`
  37. Mail []string `json:"mail"`
  38. MemberofindirectHbacrule []string `json:"memberofindirect_hbacrule"`
  39. Dn string `json:"dn"`
  40. Displayname []string `json:"displayname"`
  41. Mepmanagedentry []string `json:"mepmanagedentry"`
  42. Ipauniqueid []string `json:"ipauniqueid"`
  43. Krbloginfailedcount []string `json:"krbloginfailedcount"`
  44. Krbpwdpolicyreference []string `json:"krbpwdpolicyreference"`
  45. Krbprincipalname []string `json:"krbprincipalname"`
  46. Givenname []string `json:"givenname"`
  47. Krblastadminunlock []struct {
  48. Datetime string `json:"__datetime__"`
  49. } `json:"krblastadminunlock"`
  50. Krbpasswordexpiration []struct {
  51. Datetime string `json:"__datetime__"`
  52. } `json:"krbpasswordexpiration"`
  53. Krblastfailedauth []struct {
  54. Datetime string `json:"__datetime__"`
  55. } `json:"krblastfailedauth"`
  56. Objectclass []string `json:"objectclass"`
  57. Gidnumber []string `json:"gidnumber"`
  58. Gecos []string `json:"gecos"`
  59. Sn []string `json:"sn"`
  60. MemberofSudorule []string `json:"memberof_sudorule"`
  61. Krblastpwdchange []struct {
  62. Datetime string `json:"__datetime__"`
  63. } `json:"krblastpwdchange"`
  64. Initials []string `json:"initials"`
  65. } `json:"result"`
  66. Value string `json:"value"`
  67. Summary interface{} `json:"summary"`
  68. } `json:"result"`
  69. Version string `json:"version"`
  70. Error interface{} `json:"error"`
  71. ID int `json:"id"`
  72. Principal string `json:"principal"`
  73. }
  74. func (h *handler) login(c echo.Context) error {
  75. username := c.FormValue("username")
  76. password := c.FormValue("password")
  77. _url := URL + "/ipa/session/login_password"
  78. method := "POST"
  79. params := url.Values{}
  80. params.Add("user", username)
  81. params.Add("password", password)
  82. payload := strings.NewReader(params.Encode())
  83. tr := &http.Transport{
  84. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  85. }
  86. client := &http.Client{Transport: tr}
  87. req, err := http.NewRequest(method, _url, payload)
  88. audit("Recieved Login request from: " + RealIP)
  89. if err != nil {
  90. fmt.Println(err)
  91. }
  92. req.Header.Add("Referer", URL+"/ipa")
  93. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  94. req.Header.Add("Accept", "text/plain")
  95. res, err := client.Do(req)
  96. cockie := res.Cookies()
  97. token := cockie[0].Raw
  98. defer res.Body.Close()
  99. //fmt.Println(res.StatusCode)
  100. if res.StatusCode == 200 {
  101. user := getUserInfo(token, username)
  102. //fmt.Println(user.Result)
  103. tokens, err := generateTokenPair(user, token)
  104. if err != nil {
  105. return err
  106. }
  107. return c.JSON(http.StatusOK, tokens)
  108. }
  109. return echo.ErrUnauthorized
  110. }
  111. func getUserInfo(token string, username string) userInfo {
  112. fmt.Println("Checking for User: ", username)
  113. url := URL + "/ipa/session/json"
  114. method := "POST"
  115. _json := fmt.Sprintf(`
  116. {
  117. "method": "user_show",
  118. "params": [
  119. [
  120. "%s"
  121. ],
  122. {
  123. "all": true,
  124. "version": "2.215"
  125. }
  126. ],
  127. "id": 0
  128. }
  129. `, username)
  130. payload := strings.NewReader(_json)
  131. tr := &http.Transport{
  132. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  133. }
  134. client := &http.Client{Transport: tr}
  135. req, err := http.NewRequest(method, url, payload)
  136. if err != nil {
  137. fmt.Println(err)
  138. }
  139. req.Header.Add("Referer", URL+"/ipa")
  140. req.Header.Add("Content-Type", "application/json")
  141. req.Header.Add("Accept", "text/plain")
  142. req.Header.Add("Cookie", token)
  143. res, err := client.Do(req)
  144. defer res.Body.Close()
  145. body, err := ioutil.ReadAll(res.Body)
  146. user := userInfo{}
  147. json.Unmarshal(body, &user)
  148. return user
  149. }
  150. func (h *handler) private(c echo.Context) error {
  151. user := c.Get("user").(*jwt.Token)
  152. claims := user.Claims.(jwt.MapClaims)
  153. name := claims["name"].(string)
  154. return c.String(http.StatusOK, "Welcome "+name+"!")
  155. }
  156. func (h *handler) addUser(c echo.Context) error {
  157. type apiErr struct {
  158. Result interface{} `json:"result"`
  159. Error struct {
  160. Code int `json:"code"`
  161. Message string `json:"message"`
  162. Data struct {
  163. } `json:"data"`
  164. Name string `json:"name"`
  165. } `json:"error"`
  166. ID int `json:"id"`
  167. Principal string `json:"principal"`
  168. Version string `json:"version"`
  169. }
  170. type addUser struct {
  171. Result struct {
  172. Result struct {
  173. Displayname []string `json:"displayname"`
  174. UID []string `json:"uid"`
  175. Uidnumber []string `json:"uidnumber"`
  176. Objectclass []string `json:"objectclass"`
  177. Sn []string `json:"sn"`
  178. Telephonenumber []string `json:"telephonenumber"`
  179. Cn []string `json:"cn"`
  180. Krbpasswordexpiration []struct {
  181. Datetime string `json:"__datetime__"`
  182. } `json:"krbpasswordexpiration"`
  183. Mobile []string `json:"mobile"`
  184. Krbprincipalname []string `json:"krbprincipalname"`
  185. Ipauniqueid []string `json:"ipauniqueid"`
  186. Givenname []string `json:"givenname"`
  187. Gidnumber []string `json:"gidnumber"`
  188. Krbcanonicalname []string `json:"krbcanonicalname"`
  189. Mail []string `json:"mail"`
  190. Initials []string `json:"initials"`
  191. Homedirectory []string `json:"homedirectory"`
  192. Loginshell []string `json:"loginshell"`
  193. Gecos []string `json:"gecos"`
  194. Randompassword string `json:"randompassword"`
  195. HasPassword bool `json:"has_password"`
  196. HasKeytab bool `json:"has_keytab"`
  197. MemberofGroup []string `json:"memberof_group"`
  198. Dn string `json:"dn"`
  199. } `json:"result"`
  200. Value string `json:"value"`
  201. Summary string `json:"summary"`
  202. } `json:"result"`
  203. Error string `json:"error"`
  204. ID int `json:"id"`
  205. Principal string `json:"principal"`
  206. Version string `json:"version"`
  207. }
  208. user := c.Get("user").(*jwt.Token)
  209. claims := user.Claims.(jwt.MapClaims)
  210. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  211. var hashChannel_ = make(chan []byte, 1)
  212. hashChannel_ <- _sha256[:]
  213. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  214. b, err := json.Marshal(claims)
  215. if err != nil {
  216. fmt.Println("err:", err)
  217. }
  218. username := c.FormValue("Username")
  219. sha256 := sha256.Sum256([]byte(username))
  220. var hashChannel = make(chan []byte, 1)
  221. hashChannel <- sha256[:]
  222. ciphertext := encrypt(<-hashChannel, string(b))
  223. //fmt.Println(b)
  224. //fmt.Println(ciphertext)
  225. sn := c.FormValue("Lname")
  226. cn := c.FormValue("FullName")
  227. givenname := c.FormValue("Fname")
  228. displayname := c.FormValue("displayname")
  229. krbpasswordexpiration := c.FormValue("krbpasswordexpiration")
  230. mail := c.FormValue("mail")
  231. telephonenumber := c.FormValue("telephonenumber")
  232. mobile := c.FormValue("mobile")
  233. _url := URL + "/ipa/session/json"
  234. method := "POST"
  235. _json := fmt.Sprintf(`
  236. {
  237. "id": 0,
  238. "method": "user_add/1",
  239. "params": [
  240. [
  241. "%s"
  242. ],
  243. {
  244. "givenname": "%s",
  245. "sn": "%s",
  246. "cn":"%s",
  247. "displayname":"%s",
  248. "loginshell":"/usr/sbin/nologin",
  249. "krbpasswordexpiration":"%s",
  250. "mail":"%s",
  251. "random":"true",
  252. "gidnumber":"599200001",
  253. "telephonenumber":"%s",
  254. "mobile":"%s",
  255. "version": "2.235"
  256. }
  257. ]
  258. }
  259. `, username, givenname, sn, cn, displayname, krbpasswordexpiration, mail, telephonenumber, mobile)
  260. __json := fmt.Sprintf(`
  261. {
  262. "id": 0,
  263. "method": "group_add_member/1",
  264. "params": [
  265. [
  266. "svcaccounts"
  267. ],
  268. {
  269. "user": [
  270. "%s"
  271. ],
  272. "version": "2.235"
  273. }
  274. ]
  275. }
  276. `, username)
  277. payload := strings.NewReader(_json)
  278. _payload := strings.NewReader(__json)
  279. tr := &http.Transport{
  280. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  281. }
  282. client := &http.Client{Transport: tr}
  283. req, err := http.NewRequest(method, _url, payload)
  284. if err != nil {
  285. fmt.Println(err)
  286. }
  287. req.Header.Add("Referer", URL+"/ipa")
  288. req.Header.Add("Content-Type", "application/json")
  289. req.Header.Add("Accept", "text/plain")
  290. req.Header.Add("Cookie", token)
  291. res, err := client.Do(req)
  292. _req, _ := http.NewRequest(method, _url, _payload)
  293. _req.Header.Add("Referer", URL+"/ipa")
  294. _req.Header.Add("Content-Type", "application/json")
  295. _req.Header.Add("Accept", "text/plain")
  296. _req.Header.Add("Cookie", token)
  297. client.Do(_req)
  298. defer res.Body.Close()
  299. body, err := ioutil.ReadAll(res.Body)
  300. result := addUser{}
  301. _err := json.Unmarshal(body, &result)
  302. if _err != nil {
  303. _apiErr := apiErr{}
  304. __err := json.Unmarshal(body, &_apiErr)
  305. if __err != nil {
  306. return c.String(http.StatusBadRequest, "Error of error!!")
  307. }
  308. res2B, _ := json.Marshal(_apiErr)
  309. return c.String(http.StatusBadRequest, string(res2B))
  310. }
  311. go sendMail("Welcome to ZiCloud\r\n Your temporary link is :\r\n https://zicloud.com/reset/"+url.QueryEscape(ciphertext), "Welcome to ZiCloud", mail)
  312. return c.String(http.StatusOK, "Done, Reset Link was sent to "+mail)
  313. }
  314. func (h *handler) disableUser(c echo.Context) error {
  315. user := c.Get("user").(*jwt.Token)
  316. claims := user.Claims.(jwt.MapClaims)
  317. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  318. var hashChannel_ = make(chan []byte, 1)
  319. hashChannel_ <- _sha256[:]
  320. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  321. username := c.FormValue("Username")
  322. url := URL + "/ipa/session/json"
  323. method := "POST"
  324. _json := fmt.Sprintf(`
  325. {
  326. "id": 0,
  327. "method": "user_disable/1",
  328. "params": [
  329. [
  330. "%s"
  331. ],
  332. {
  333. "version": "2.235"
  334. }
  335. ]
  336. }
  337. `, username)
  338. payload := strings.NewReader(_json)
  339. tr := &http.Transport{
  340. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  341. }
  342. client := &http.Client{Transport: tr}
  343. req, err := http.NewRequest(method, url, payload)
  344. if err != nil {
  345. fmt.Println(err)
  346. }
  347. req.Header.Add("Referer", URL+"/ipa")
  348. req.Header.Add("Content-Type", "application/json")
  349. req.Header.Add("Accept", "text/plain")
  350. req.Header.Add("Cookie", token)
  351. res, err := client.Do(req)
  352. if err != nil {
  353. return c.String(http.StatusBadRequest, "Error"+err.Error())
  354. }
  355. defer res.Body.Close()
  356. return c.String(http.StatusOK, "Done")
  357. }
  358. func (h *handler) resetUser(c echo.Context) error {
  359. type keyJson struct {
  360. IPAToken string `json:"IPAToken"`
  361. Admin bool `json:"admin"`
  362. Exp int `json:"exp"`
  363. Memberof []string `json:"memberof"`
  364. Name []string `json:"name"`
  365. Sub int `json:"sub"`
  366. }
  367. t := time.Now() //%Y%m%d%H%M%SZ
  368. t = t.Add(time.Hour * 24 * 60)
  369. username := c.FormValue("Username")
  370. password := c.FormValue("Password")
  371. key := c.FormValue("key")
  372. key, _ = url.QueryUnescape(key)
  373. sha256 := sha256.Sum256([]byte(username))
  374. var hashChannel = make(chan []byte, 1)
  375. hashChannel <- sha256[:]
  376. plainkey := decrypt(<-hashChannel, key)
  377. _plainkey := keyJson{}
  378. json.Unmarshal([]byte(plainkey), &_plainkey)
  379. token := _plainkey.IPAToken
  380. _url := URL + "/ipa/session/json"
  381. method := "POST"
  382. _json := fmt.Sprintf(`
  383. {
  384. "id": 0,
  385. "method": "user_mod/1",
  386. "params": [
  387. [
  388. "%s"
  389. ],
  390. {
  391. "userpassword":"%s",
  392. "version": "2.235"
  393. }
  394. ]
  395. }
  396. `, username, password)
  397. payload := strings.NewReader(_json)
  398. tr := &http.Transport{
  399. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  400. }
  401. client := &http.Client{Transport: tr}
  402. req, err := http.NewRequest(method, _url, payload)
  403. if err != nil {
  404. fmt.Println(err)
  405. }
  406. req.Header.Add("Referer", URL+"/ipa")
  407. req.Header.Add("Content-Type", "application/json")
  408. req.Header.Add("Accept", "text/plain")
  409. req.Header.Add("Cookie", token)
  410. res, err := client.Do(req)
  411. _json = fmt.Sprintf(`
  412. {
  413. "id": 0,
  414. "method": "user_mod/1",
  415. "params": [
  416. [
  417. "%s"
  418. ],
  419. {
  420. "krbpasswordexpiration":"%s",
  421. "version": "2.235"
  422. }
  423. ]
  424. }
  425. `, username, t.Format("2006-01-02")+"Z")
  426. payload = strings.NewReader(_json)
  427. req, err = http.NewRequest(method, _url, payload)
  428. if err != nil {
  429. fmt.Println(err)
  430. }
  431. req.Header.Add("Referer", URL+"/ipa")
  432. req.Header.Add("Content-Type", "application/json")
  433. req.Header.Add("Accept", "text/plain")
  434. req.Header.Add("Cookie", token)
  435. err = nil
  436. res, err = client.Do(req)
  437. //fmt.Println(payload)
  438. if err != nil {
  439. return c.String(http.StatusBadRequest, "Error"+err.Error())
  440. }
  441. defer res.Body.Close()
  442. return c.String(http.StatusOK, "Done")
  443. }
  444. func (h *handler) dnsrecordadd(c echo.Context) error {
  445. user := c.Get("user").(*jwt.Token)
  446. claims := user.Claims.(jwt.MapClaims)
  447. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  448. var hashChannel_ = make(chan []byte, 1)
  449. hashChannel_ <- _sha256[:]
  450. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  451. recordName := c.FormValue("recordName")
  452. record := c.FormValue("record")
  453. url := URL + "/ipa/session/json"
  454. method := "POST"
  455. _json := fmt.Sprintf(`
  456. {
  457. "id": 0,
  458. "method": "dnsrecord_add/1",
  459. "params": [
  460. [
  461. "ZI-TEL.COM",
  462. {
  463. "__dns_name__": "%s"
  464. }
  465. ],
  466. {
  467. "a_part_ip_address": "%s",
  468. "raw": true,
  469. "version": "2.235"
  470. }
  471. ]
  472. }
  473. `, recordName, record)
  474. payload := strings.NewReader(_json)
  475. tr := &http.Transport{
  476. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  477. }
  478. client := &http.Client{Transport: tr}
  479. req, err := http.NewRequest(method, url, payload)
  480. if err != nil {
  481. fmt.Println(err)
  482. }
  483. req.Header.Add("Referer", URL+"/ipa")
  484. req.Header.Add("Content-Type", "application/json")
  485. req.Header.Add("Accept", "text/plain")
  486. req.Header.Add("Cookie", token)
  487. res, err := client.Do(req)
  488. if err != nil {
  489. return c.String(http.StatusBadRequest, "Error"+err.Error())
  490. }
  491. //body, err := ioutil.ReadAll(res.Body)
  492. //_res:=result{}
  493. //json.Unmarshal(body, &_res)
  494. //fmt.Println(_res)
  495. defer res.Body.Close()
  496. return c.String(http.StatusOK, "Done")
  497. }
  498. func (h *handler) token(c echo.Context) error {
  499. user := c.Get("user").(*jwt.Token)
  500. claims := user.Claims.(jwt.MapClaims)
  501. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  502. var hashChannel_ = make(chan []byte, 1)
  503. hashChannel_ <- _sha256[:]
  504. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  505. username := claims["name"].(string)
  506. _user := getUserInfo(token, username)
  507. //fmt.Println(user.Result)
  508. newtokens, err := generateTokenPair(_user, token)
  509. if err != nil {
  510. return err
  511. }
  512. return c.JSON(http.StatusOK, newtokens)
  513. }
  514. func (h *handler) verifyUser(c echo.Context) error {
  515. name := c.FormValue("Username")
  516. fmt.Println("Name: ", name)
  517. if name == "" {
  518. return c.JSON(http.StatusNotFound, "User NOT Found")
  519. }
  520. username := "admin"
  521. password := "h?_QJp5^&9FNc9w="
  522. _url := URL + "/ipa/session/login_password"
  523. method := "POST"
  524. params := url.Values{}
  525. params.Add("user", username)
  526. params.Add("password", password)
  527. payload := strings.NewReader(params.Encode())
  528. tr := &http.Transport{
  529. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  530. }
  531. client := &http.Client{Transport: tr}
  532. req, err := http.NewRequest(method, _url, payload)
  533. audit("Recieved Login request from: " + RealIP)
  534. if err != nil {
  535. fmt.Println(err)
  536. }
  537. req.Header.Add("Referer", URL+"/ipa")
  538. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  539. req.Header.Add("Accept", "text/plain")
  540. res, err := client.Do(req)
  541. cockie := res.Cookies()
  542. token := cockie[0].Raw
  543. defer res.Body.Close()
  544. //fmt.Println(token)
  545. if res.StatusCode == 200 {
  546. user := getUserInfo(token, name)
  547. if user.Result.Value != name {
  548. return c.JSON(http.StatusNotFound, "User NOT Found")
  549. }
  550. }
  551. return c.JSON(http.StatusOK, "User Founded")
  552. }