2022-01-16 07:25:43 +00:00
|
|
|
package databag
|
|
|
|
|
|
|
|
import (
|
2022-07-22 19:28:14 +00:00
|
|
|
"databag/internal/store"
|
|
|
|
"errors"
|
2022-09-10 09:13:41 +00:00
|
|
|
"time"
|
2022-07-22 19:28:14 +00:00
|
|
|
"net/http"
|
|
|
|
"strings"
|
2022-01-16 07:25:43 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type accountUsername struct {
|
2022-07-22 19:28:14 +00:00
|
|
|
Username string
|
2022-01-16 07:25:43 +00:00
|
|
|
}
|
|
|
|
|
2022-07-25 19:48:57 +00:00
|
|
|
//GetAccountUsername determines if username is assignable
|
2022-01-16 07:25:43 +00:00
|
|
|
func GetAccountUsername(w http.ResponseWriter, r *http.Request) {
|
2022-03-11 07:57:27 +00:00
|
|
|
|
2022-07-22 19:28:14 +00:00
|
|
|
if r.FormValue("token") != "" {
|
|
|
|
token, _, res := AccessToken(r)
|
|
|
|
if res != nil || token.TokenType != APPTokenCreate {
|
2022-09-10 09:20:32 +00:00
|
|
|
time.Sleep(APPUsernameWait * time.Second);
|
2022-07-22 19:28:14 +00:00
|
|
|
ErrResponse(w, http.StatusUnauthorized, res)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if available, err := getAvailableAccounts(); err != nil {
|
|
|
|
ErrResponse(w, http.StatusInternalServerError, err)
|
|
|
|
return
|
|
|
|
} else if available == 0 {
|
|
|
|
ErrResponse(w, http.StatusForbidden, errors.New("no open accounts available"))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
2022-01-16 07:25:43 +00:00
|
|
|
|
2022-07-22 19:28:14 +00:00
|
|
|
username := r.URL.Query().Get("name")
|
|
|
|
if username == "" {
|
2022-09-10 09:13:41 +00:00
|
|
|
WriteResponse(w, true);
|
2022-07-22 19:28:14 +00:00
|
|
|
return
|
|
|
|
}
|
2022-01-16 07:25:43 +00:00
|
|
|
|
2022-07-22 19:28:14 +00:00
|
|
|
if strings.Contains(username, " ") || strings.Contains(username, "\t") {
|
|
|
|
WriteResponse(w, false)
|
|
|
|
return
|
|
|
|
}
|
2022-07-21 06:26:52 +00:00
|
|
|
|
2022-07-22 19:28:14 +00:00
|
|
|
var accounts []accountUsername
|
|
|
|
if err := store.DB.Model(&store.Account{}).Where("username = ?", username).Find(&accounts).Error; err != nil {
|
|
|
|
LogMsg("failed to query accounts")
|
|
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(accounts) != 0 {
|
|
|
|
WriteResponse(w, false)
|
|
|
|
return
|
|
|
|
}
|
2022-01-16 07:25:43 +00:00
|
|
|
|
2022-07-22 19:28:14 +00:00
|
|
|
handle := strings.ToLower(username)
|
|
|
|
if err := store.DB.Model(&store.Account{}).Where("handle = ?", handle).Find(&accounts).Error; err != nil {
|
|
|
|
LogMsg("failed to query accounts")
|
|
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(accounts) != 0 {
|
|
|
|
WriteResponse(w, false)
|
|
|
|
return
|
|
|
|
}
|
2022-07-21 21:59:18 +00:00
|
|
|
|
2022-07-22 19:28:14 +00:00
|
|
|
WriteResponse(w, true)
|
2022-01-16 07:25:43 +00:00
|
|
|
}
|