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) }