| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460 |
- package main
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net/http"
- "unicode/utf8"
- )
- // *func
- // return uid,isvalid
- func f_cookieGetUid(r *http.Request) (int, bool) {
- token, err := r.Cookie("token")
- if err != nil {
- return -1, false
- }
- uid, err := parseToken(token.Value)
- if err != nil {
- return -1, false
- }
- return uid, true
- }
- func f_readBody(r *http.Request) ([]byte, error) {
- return ioutil.ReadAll(r.Body)
- }
- func f_sendReq(uid int, url string, w http.ResponseWriter) bool {
- go f_log_db(uid, 0, url)
- tx, err := db.Begin()
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return false
- }
- result, err := tx.Exec("call set_url(?,?)", uid, url)
- e := tx.Commit()
- if e != nil {
- _ = tx.Rollback()
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return false
- }
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return false
- }
- affected, err := result.RowsAffected()
- if err != nil || affected != 1 {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return false
- }
- go f_send(uid, url)
- return true
- }
- // *handler func
- func f_login(w http.ResponseWriter, r *http.Request) {
- body, err := f_readBody(r)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
- return
- }
- loginData := &HandlerLoginData{}
- err = json.Unmarshal(body, loginData)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
- }
- if loginData.Name == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_USERNAME, 0))
- return
- }
- if loginData.Password == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_PASSWORD, 0))
- return
- }
- nameLen := utf8.RuneCountInString(loginData.Name)
- if nameLen < 1 || nameLen > 18 {
- fmt.Fprint(w, simpleJsonMsg(ERR_USERNAME_LENGTH, 0))
- return
- }
- passwordLen := utf8.RuneCountInString(loginData.Password)
- if passwordLen < 6 || passwordLen > 18 {
- fmt.Fprint(w, simpleJsonMsg(ERR_PASSWORD_LENGTH, 0))
- return
- }
- rows, err := db_query("SELECT 1 FROM user where name = ? LIMIT 1", loginData.Name)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- if !rows.Next() {
- fmt.Fprint(w, simpleJsonMsg(ERR_USER_NOT_EXIST, 0))
- return
- } else {
- rows.Close()
- }
- rows, err = db_query("SELECT id FROM user where name = ? AND password = ? LIMIT 1", loginData.Name, b64encode(loginData.Password))
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- uid := -1
- if rows.Next() {
- defer rows.Close()
- if err = rows.Scan(&uid); err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- token, err := createToken(uid)
- if err != nil {
- fmt.Println(err)
- fmt.Fprint(w, simpleJsonMsg(ERR_UNKNOWN, 0))
- } else {
- ck := &http.Cookie{
- Name: "token",
- Value: token,
- Path: "/",
- MaxAge: 86400,
- }
- http.SetCookie(w, ck)
- fmt.Fprint(w, simpleJsonMsg("success", 1))
- }
- } else {
- fmt.Fprint(w, simpleJsonMsg(ERR_WRONG_PASSWORD, 0))
- }
- }
- func f_cookieLogin(w http.ResponseWriter, r *http.Request) {
- uid, valid := f_cookieGetUid(r)
- if valid {
- // 刷新cookie时间
- token, err := createToken(uid)
- if err != nil {
- fmt.Println(err)
- fmt.Fprint(w, simpleJsonMsg(ERR_UNKNOWN, 0))
- } else {
- ck := &http.Cookie{
- Name: "token",
- Value: token,
- Path: "/",
- MaxAge: 86400,
- }
- http.SetCookie(w, ck)
- fmt.Fprint(w, simpleJsonMsg("success", 1))
- }
- } else {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- }
- }
- func f_register(w http.ResponseWriter, r *http.Request) {
- body, err := f_readBody(r)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
- return
- }
- data := &HandlerRegisterData{}
- err = json.Unmarshal(body, data)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
- return
- }
- if data.Key != "789456" {
- fmt.Fprint(w, simpleJsonMsg(ERR_KEY, 0))
- return
- }
- if data.Name == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_USERNAME, 0))
- return
- }
- if data.Password == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_PASSWORD, 0))
- return
- }
- nameLen := utf8.RuneCountInString(data.Name)
- if nameLen < 1 || nameLen > 18 {
- fmt.Fprint(w, simpleJsonMsg(ERR_USERNAME_LENGTH, 0))
- return
- }
- passwordLen := utf8.RuneCountInString(data.Password)
- if passwordLen < 6 || passwordLen > 18 {
- fmt.Fprint(w, simpleJsonMsg(ERR_PASSWORD_LENGTH, 0))
- return
- }
- if data.Password2 == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_PASSWORD2, 0))
- return
- }
- if data.Password != data.Password2 {
- fmt.Fprint(w, simpleJsonMsg(ERR_DIFFERENT_PASSWORD, 0))
- return
- }
- // tx, err := db.Begin()
- // 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)
- rows, err := db.Query("call user_register(?,?)", data.Name, b64encode(data.Password))
- // tx.Commit()
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- uid := -1
- if rows.Next() {
- // 有结果返回,则添加用户成功
- rows.Scan(&uid)
- } else {
- fmt.Fprint(w, simpleJsonMsg(ERR_USER_EXIST, 0))
- return
- }
- // rowsChange, err := result.RowsAffected()
- // if err != nil {
- // fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- // return
- // }
- // // 无行更改,则用户已存在
- // if rowsChange == 0 {
- // fmt.Fprint(w, simpleJsonMsg(ERR_USER_EXIST, 0))
- // return
- // }
- // uid, err := result.LastInsertId()
- // if err != nil {
- // fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- // return
- // }
- token, err := createToken(int(uid))
- if err != nil {
- fmt.Println(err)
- fmt.Fprint(w, simpleJsonMsg(ERR_UNKNOWN, 0))
- } else {
- ck := &http.Cookie{
- Name: "token",
- Value: token,
- Path: "/",
- MaxAge: 86400,
- }
- http.SetCookie(w, ck)
- fmt.Fprint(w, simpleJsonMsg("success", 1))
- }
- }
- func f_getUserInfo(w http.ResponseWriter, r *http.Request) {
- uid, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- rows, err := db_query("select `name` from `user` where id = ? LIMIT 1", uid)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- if !rows.Next() {
- fmt.Fprint(w, simpleJsonMsg(ERR_USER_NOT_EXIST, 0))
- return
- }
- userInfo := &HandlerUserInfo{}
- if err = rows.Scan(&userInfo.Name); err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- msg := &MsgInterface{
- Success: 1,
- Msg: userInfo,
- }
- j, err := json.Marshal(msg)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
- return
- }
- fmt.Fprint(w, string(j))
- }
- func f_setUrl(w http.ResponseWriter, r *http.Request) {
- uid, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- body, err := f_readBody(r)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
- return
- }
- data := &HandlerSetUrl{}
- err = json.Unmarshal(body, data)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
- return
- }
- if data.Url == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_URL, 0))
- return
- }
- rows, err := db_query("select status from url where uid = ?", uid)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- defer rows.Close()
- if rows.Next() { // 提交过URL
- status := -1
- rows.Scan(&status)
- switch status {
- case 0: // 请求中,不允许再次提交
- fmt.Fprint(w, simpleJsonMsg(ERR_REQUESTING, 0))
- return
- default: // 成功,失败,其他
- succ := f_sendReq(uid, data.Url, w)
- if !succ {
- return
- }
- fmt.Fprint(w, simpleJsonMsg("success", 1))
- return
- }
- } else { // 没有提交过URL
- succ := f_sendReq(uid, data.Url, w)
- if !succ {
- return
- }
- fmt.Fprint(w, simpleJsonMsg("success", 1))
- }
- }
- func f_getUrl(w http.ResponseWriter, r *http.Request) {
- uid, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- rows, err := db_query("select `url`, `status`, `msg` from `url` where `uid` = ?", uid)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- defer rows.Close()
- if rows.Next() {
- data := &HandlerGetUrl{}
- rows.Scan(&data.Url, &data.Status, &data.Msg)
- msg := &MsgInterface{
- Success: 1,
- Msg: data,
- }
- j, err := json.Marshal(msg)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
- return
- }
- fmt.Fprint(w, string(j))
- } else {
- fmt.Fprint(w, simpleJsonMsg(ERR_URL_NOT_EXISTS, -1))
- }
- }
- func f_setKey(w http.ResponseWriter, r *http.Request) {
- uid, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- body, err := f_readBody(r)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_READ_BODY, 0))
- return
- }
- data := &HandlerKey{}
- err = json.Unmarshal(body, data)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
- return
- }
- if data.AK == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_AK, 0))
- return
- }
- if data.SK == "" {
- fmt.Fprint(w, simpleJsonMsg(ERR_EMPTY_SK, 0))
- return
- }
- go f_log_db(uid, 3, data.AK+" - "+data.SK)
- tx, err := db.Begin()
- result, err := tx.Exec("call set_key(?,?,?)", uid, data.AK, data.SK)
- e := tx.Commit()
- if e != nil {
- _ = tx.Rollback()
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- affected, err := result.RowsAffected()
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- if affected == 0 {
- fmt.Fprint(w, simpleJsonMsg(ERR_AKSK_NO_CHANGE, -1))
- return
- }
- fmt.Fprint(w, simpleJsonMsg("success", 1))
- }
- func f_getKey(w http.ResponseWriter, r *http.Request) {
- uid, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- rows, err := db_query("select `ak`, `sk` from `key` where `uid` = ?", uid)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_DB, 0))
- return
- }
- defer rows.Close()
- if rows.Next() {
- data := &HandlerKey{}
- rows.Scan(&data.AK, &data.SK)
- msg := &MsgInterface{
- Success: 1,
- Msg: data,
- }
- j, err := json.Marshal(msg)
- if err != nil {
- fmt.Fprint(w, simpleJsonMsg(ERR_LOAD_JSON, 0))
- return
- }
- fmt.Fprint(w, string(j))
- } else {
- fmt.Fprint(w, simpleJsonMsg(ERR_AKSK_NOT_EXISTS, -1))
- }
- }
- func f_getLog(w http.ResponseWriter, r *http.Request) {
- _, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- fmt.Fprint(w, logData)
- }
- func f_getLogAdmin(w http.ResponseWriter, r *http.Request) {
- _, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- fmt.Fprint(w, logAdmin)
- }
- func f_getLogDetails(w http.ResponseWriter, r *http.Request) {
- _, valid := f_cookieGetUid(r)
- if !valid {
- fmt.Fprint(w, simpleJsonMsg(ERR_TOKEN, 0))
- return
- }
- fmt.Fprint(w, logDetail)
- }
|