handler_functions.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "unicode/utf8"
  8. )
  9. // *func
  10. // return uid,isvalid
  11. func f_cookieGetUid(r *http.Request) (int, bool) {
  12. token, err := r.Cookie("token")
  13. if err != nil {
  14. return -1, false
  15. }
  16. uid, err := parseToken(token.Value)
  17. if err != nil {
  18. return -1, false
  19. }
  20. return uid, true
  21. }
  22. func f_readBody(r *http.Request) ([]byte, error) {
  23. return ioutil.ReadAll(r.Body)
  24. }
  25. func f_sendReq(uid int, url string, w http.ResponseWriter) bool {
  26. go f_log_db(uid, 0, url)
  27. tx, err := db.Begin()
  28. if err != nil {
  29. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  30. return false
  31. }
  32. result, err := tx.Exec("call set_url(?,?)", uid, url)
  33. e := tx.Commit()
  34. if e != nil {
  35. _ = tx.Rollback()
  36. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  37. return false
  38. }
  39. if err != nil {
  40. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  41. return false
  42. }
  43. affected, err := result.RowsAffected()
  44. if err != nil || affected != 1 {
  45. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  46. return false
  47. }
  48. go f_send(uid, url)
  49. return true
  50. }
  51. // *handler func
  52. func f_login(w http.ResponseWriter, r *http.Request) {
  53. body, err := f_readBody(r)
  54. if err != nil {
  55. fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
  56. return
  57. }
  58. loginData := &HandlerLoginData{}
  59. err = json.Unmarshal(body, loginData)
  60. if err != nil {
  61. fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
  62. }
  63. if loginData.Name == "" {
  64. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_USERNAME, 0))
  65. return
  66. }
  67. if loginData.Password == "" {
  68. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_PASSWORD, 0))
  69. return
  70. }
  71. nameLen := utf8.RuneCountInString(loginData.Name)
  72. if nameLen < 1 || nameLen > 18 {
  73. fmt.Fprint(w, simpleJsonMsg(ERR_USERNAME_LENGTH, 0))
  74. return
  75. }
  76. passwordLen := utf8.RuneCountInString(loginData.Password)
  77. if passwordLen < 6 || passwordLen > 18 {
  78. fmt.Fprint(w, simpleJsonMsg(ERR_PASSWORD_LENGTH, 0))
  79. return
  80. }
  81. rows, err := db_query("SELECT 1 FROM user where name = ? LIMIT 1", loginData.Name)
  82. if err != nil {
  83. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  84. return
  85. }
  86. if !rows.Next() {
  87. fmt.Fprint(w, simpleJsonMsg(ERR_USER_NOT_EXIST, 0))
  88. return
  89. } else {
  90. rows.Close()
  91. }
  92. rows, err = db_query("SELECT id FROM user where name = ? AND password = ? LIMIT 1", loginData.Name, b64encode(loginData.Password))
  93. if err != nil {
  94. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  95. return
  96. }
  97. uid := -1
  98. if rows.Next() {
  99. defer rows.Close()
  100. if err = rows.Scan(&uid); err != nil {
  101. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  102. return
  103. }
  104. token, err := createToken(uid)
  105. if err != nil {
  106. fmt.Println(err)
  107. fmt.Fprint(w, simpleJsonMsg(ERR_UNKNOWN, 0))
  108. } else {
  109. ck := &http.Cookie{
  110. Name: "token",
  111. Value: token,
  112. Path: "/",
  113. MaxAge: 86400,
  114. }
  115. http.SetCookie(w, ck)
  116. fmt.Fprint(w, simpleJsonMsg("success", 1))
  117. }
  118. } else {
  119. fmt.Fprint(w, simpleJsonMsg(ERR_WRONG_PASSWORD, 0))
  120. }
  121. }
  122. func f_cookieLogin(w http.ResponseWriter, r *http.Request) {
  123. uid, valid := f_cookieGetUid(r)
  124. if valid {
  125. // 刷新cookie时间
  126. token, err := createToken(uid)
  127. if err != nil {
  128. fmt.Println(err)
  129. fmt.Fprint(w, simpleJsonMsg(ERR_UNKNOWN, 0))
  130. } else {
  131. ck := &http.Cookie{
  132. Name: "token",
  133. Value: token,
  134. Path: "/",
  135. MaxAge: 86400,
  136. }
  137. http.SetCookie(w, ck)
  138. fmt.Fprint(w, simpleJsonMsg("success", 1))
  139. }
  140. } else {
  141. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  142. }
  143. }
  144. func f_register(w http.ResponseWriter, r *http.Request) {
  145. body, err := f_readBody(r)
  146. if err != nil {
  147. fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
  148. return
  149. }
  150. data := &HandlerRegisterData{}
  151. err = json.Unmarshal(body, data)
  152. if err != nil {
  153. fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
  154. return
  155. }
  156. if data.Key != "789456" {
  157. fmt.Fprint(w, simpleJsonMsg(ERR_KEY, 0))
  158. return
  159. }
  160. if data.Name == "" {
  161. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_USERNAME, 0))
  162. return
  163. }
  164. if data.Password == "" {
  165. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_PASSWORD, 0))
  166. return
  167. }
  168. nameLen := utf8.RuneCountInString(data.Name)
  169. if nameLen < 1 || nameLen > 18 {
  170. fmt.Fprint(w, simpleJsonMsg(ERR_USERNAME_LENGTH, 0))
  171. return
  172. }
  173. passwordLen := utf8.RuneCountInString(data.Password)
  174. if passwordLen < 6 || passwordLen > 18 {
  175. fmt.Fprint(w, simpleJsonMsg(ERR_PASSWORD_LENGTH, 0))
  176. return
  177. }
  178. if data.Password2 == "" {
  179. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_PASSWORD2, 0))
  180. return
  181. }
  182. if data.Password != data.Password2 {
  183. fmt.Fprint(w, simpleJsonMsg(ERR_DIFFERENT_PASSWORD, 0))
  184. return
  185. }
  186. // tx, err := db.Begin()
  187. // result, err := db_exec("insert into `user`(`name`,`password`) select ?,? from `user` where not exists (select 1 from `user` where `name`=?) LIMIT 1", data.Name, b64encode(data.Password), data.Name)
  188. rows, err := db.Query("call user_register(?,?)", data.Name, b64encode(data.Password))
  189. // tx.Commit()
  190. if err != nil {
  191. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  192. return
  193. }
  194. uid := -1
  195. if rows.Next() {
  196. // 有结果返回,则添加用户成功
  197. rows.Scan(&uid)
  198. } else {
  199. fmt.Fprint(w, simpleJsonMsg(ERR_USER_EXIST, 0))
  200. return
  201. }
  202. // rowsChange, err := result.RowsAffected()
  203. // if err != nil {
  204. // fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  205. // return
  206. // }
  207. // // 无行更改,则用户已存在
  208. // if rowsChange == 0 {
  209. // fmt.Fprint(w, simpleJsonMsg(ERR_USER_EXIST, 0))
  210. // return
  211. // }
  212. // uid, err := result.LastInsertId()
  213. // if err != nil {
  214. // fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  215. // return
  216. // }
  217. token, err := createToken(int(uid))
  218. if err != nil {
  219. fmt.Println(err)
  220. fmt.Fprint(w, simpleJsonMsg(ERR_UNKNOWN, 0))
  221. } else {
  222. ck := &http.Cookie{
  223. Name: "token",
  224. Value: token,
  225. Path: "/",
  226. MaxAge: 86400,
  227. }
  228. http.SetCookie(w, ck)
  229. fmt.Fprint(w, simpleJsonMsg("success", 1))
  230. }
  231. }
  232. func f_getUserInfo(w http.ResponseWriter, r *http.Request) {
  233. uid, valid := f_cookieGetUid(r)
  234. if !valid {
  235. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  236. return
  237. }
  238. rows, err := db_query("select `name` from `user` where id = ? LIMIT 1", uid)
  239. if err != nil {
  240. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  241. return
  242. }
  243. if !rows.Next() {
  244. fmt.Fprint(w, simpleJsonMsg(ERR_USER_NOT_EXIST, 0))
  245. return
  246. }
  247. userInfo := &HandlerUserInfo{}
  248. if err = rows.Scan(&userInfo.Name); err != nil {
  249. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  250. return
  251. }
  252. msg := &MsgInterface{
  253. Success: 1,
  254. Msg: userInfo,
  255. }
  256. j, err := json.Marshal(msg)
  257. if err != nil {
  258. fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
  259. return
  260. }
  261. fmt.Fprint(w, string(j))
  262. }
  263. func f_setUrl(w http.ResponseWriter, r *http.Request) {
  264. uid, valid := f_cookieGetUid(r)
  265. if !valid {
  266. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  267. return
  268. }
  269. body, err := f_readBody(r)
  270. if err != nil {
  271. fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
  272. return
  273. }
  274. data := &HandlerSetUrl{}
  275. err = json.Unmarshal(body, data)
  276. if err != nil {
  277. fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
  278. return
  279. }
  280. if data.Url == "" {
  281. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_URL, 0))
  282. return
  283. }
  284. rows, err := db_query("select status from url where uid = ?", uid)
  285. if err != nil {
  286. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  287. return
  288. }
  289. defer rows.Close()
  290. if rows.Next() { // 提交过URL
  291. status := -1
  292. rows.Scan(&status)
  293. switch status {
  294. case 0: // 请求中,不允许再次提交
  295. fmt.Fprint(w, simpleJsonMsg(ERR_REQUESTING, 0))
  296. return
  297. default: // 成功,失败,其他
  298. succ := f_sendReq(uid, data.Url, w)
  299. if !succ {
  300. return
  301. }
  302. fmt.Fprint(w, simpleJsonMsg("success", 1))
  303. return
  304. }
  305. } else { // 没有提交过URL
  306. succ := f_sendReq(uid, data.Url, w)
  307. if !succ {
  308. return
  309. }
  310. fmt.Fprint(w, simpleJsonMsg("success", 1))
  311. }
  312. }
  313. func f_getUrl(w http.ResponseWriter, r *http.Request) {
  314. uid, valid := f_cookieGetUid(r)
  315. if !valid {
  316. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  317. return
  318. }
  319. rows, err := db_query("select `url`, `status`, `msg` from `url` where `uid` = ?", uid)
  320. if err != nil {
  321. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  322. return
  323. }
  324. defer rows.Close()
  325. if rows.Next() {
  326. data := &HandlerGetUrl{}
  327. rows.Scan(&data.Url, &data.Status, &data.Msg)
  328. msg := &MsgInterface{
  329. Success: 1,
  330. Msg: data,
  331. }
  332. j, err := json.Marshal(msg)
  333. if err != nil {
  334. fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
  335. return
  336. }
  337. fmt.Fprint(w, string(j))
  338. } else {
  339. fmt.Fprint(w, simpleJsonMsg(ERR_URL_NOT_EXISTS, -1))
  340. }
  341. }
  342. func f_setKey(w http.ResponseWriter, r *http.Request) {
  343. uid, valid := f_cookieGetUid(r)
  344. if !valid {
  345. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  346. return
  347. }
  348. body, err := f_readBody(r)
  349. if err != nil {
  350. fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
  351. return
  352. }
  353. data := &HandlerKey{}
  354. err = json.Unmarshal(body, data)
  355. if err != nil {
  356. fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
  357. return
  358. }
  359. if data.AK == "" {
  360. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_AK, 0))
  361. return
  362. }
  363. if data.SK == "" {
  364. fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_SK, 0))
  365. return
  366. }
  367. go f_log_db(uid, 3, data.AK+" - "+data.SK)
  368. tx, err := db.Begin()
  369. result, err := tx.Exec("call set_key(?,?,?)", uid, data.AK, data.SK)
  370. e := tx.Commit()
  371. if e != nil {
  372. _ = tx.Rollback()
  373. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  374. return
  375. }
  376. if err != nil {
  377. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  378. return
  379. }
  380. affected, err := result.RowsAffected()
  381. if err != nil {
  382. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  383. return
  384. }
  385. if affected == 0 {
  386. fmt.Fprint(w, simpleJsonMsg(ERR_AKSK_NO_CHANGE, -1))
  387. return
  388. }
  389. fmt.Fprint(w, simpleJsonMsg("success", 1))
  390. }
  391. func f_getKey(w http.ResponseWriter, r *http.Request) {
  392. uid, valid := f_cookieGetUid(r)
  393. if !valid {
  394. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  395. return
  396. }
  397. rows, err := db_query("select `ak`, `sk` from `key` where `uid` = ?", uid)
  398. if err != nil {
  399. fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
  400. return
  401. }
  402. defer rows.Close()
  403. if rows.Next() {
  404. data := &HandlerKey{}
  405. rows.Scan(&data.AK, &data.SK)
  406. msg := &MsgInterface{
  407. Success: 1,
  408. Msg: data,
  409. }
  410. j, err := json.Marshal(msg)
  411. if err != nil {
  412. fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
  413. return
  414. }
  415. fmt.Fprint(w, string(j))
  416. } else {
  417. fmt.Fprint(w, simpleJsonMsg(ERR_AKSK_NOT_EXISTS, -1))
  418. }
  419. }
  420. func f_getLog(w http.ResponseWriter, r *http.Request) {
  421. _, valid := f_cookieGetUid(r)
  422. if !valid {
  423. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  424. return
  425. }
  426. fmt.Fprint(w, logData)
  427. }
  428. func f_getLogAdmin(w http.ResponseWriter, r *http.Request) {
  429. _, valid := f_cookieGetUid(r)
  430. if !valid {
  431. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  432. return
  433. }
  434. fmt.Fprint(w, logAdmin)
  435. }
  436. func f_getLogDetails(w http.ResponseWriter, r *http.Request) {
  437. _, valid := f_cookieGetUid(r)
  438. if !valid {
  439. fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
  440. return
  441. }
  442. fmt.Fprint(w, logDetail)
  443. }