mirror of
https://github.com/WiiLink24/wfc-server.git
synced 2026-05-24 14:19:42 -05:00
111 lines
2.6 KiB
Go
111 lines
2.6 KiB
Go
package nas
|
|
|
|
import (
|
|
"github.com/logrusorgru/aurora/v3"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"wwfc/common"
|
|
"wwfc/database"
|
|
"wwfc/logging"
|
|
)
|
|
|
|
func handleAuthRequest(moduleName string, w http.ResponseWriter, r *http.Request) {
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
logging.Error(moduleName, "Failed to parse form")
|
|
return
|
|
}
|
|
|
|
fields := map[string]string{}
|
|
for key, values := range r.PostForm {
|
|
if len(values) != 1 {
|
|
logging.Warn(moduleName, "Ignoring multiple POST form values:", aurora.Cyan(key).String()+":", aurora.Cyan(values))
|
|
continue
|
|
}
|
|
|
|
parsed, err := common.Base64DwcEncoding.DecodeString(values[0])
|
|
if err != nil {
|
|
logging.Error(moduleName, "Invalid POST form value:", aurora.Cyan(key).String()+":", aurora.Cyan(values[0]))
|
|
return
|
|
}
|
|
logging.Info(moduleName, aurora.Cyan(key).String()+":", aurora.Cyan(string(parsed)))
|
|
fields[key] = string(parsed)
|
|
}
|
|
|
|
action, ok := fields["action"]
|
|
if !ok || action == "" {
|
|
logging.Error(moduleName, "No action in form")
|
|
return
|
|
}
|
|
|
|
reply := map[string]string{}
|
|
|
|
switch action {
|
|
case "login":
|
|
reply = login(moduleName, fields)
|
|
break
|
|
|
|
case "acctcreate":
|
|
reply = acctcreate(moduleName, fields)
|
|
break
|
|
}
|
|
|
|
param := url.Values{}
|
|
for key, value := range reply {
|
|
param.Set(key, common.Base64DwcEncoding.EncodeToString([]byte(value)))
|
|
}
|
|
response := []byte(param.Encode())
|
|
response = []byte(strings.Replace(string(response), "%2A", "*", -1))
|
|
// DWC treats the response like a null terminated string
|
|
response = append(response, 0x00)
|
|
|
|
w.Header().Set("Content-Type", "text/plain")
|
|
w.Header().Set("Content-Length", strconv.Itoa(len(response)))
|
|
w.Write(response)
|
|
}
|
|
|
|
func acctcreate(moduleName string, fields map[string]string) map[string]string {
|
|
return map[string]string{
|
|
"retry": "0",
|
|
"returncd": "002",
|
|
"userid": strconv.FormatInt(database.GetUniqueUserID(), 10),
|
|
}
|
|
}
|
|
|
|
func login(moduleName string, fields map[string]string) map[string]string {
|
|
param := map[string]string{
|
|
"retry": "0",
|
|
"locator": "gs.wiilink24.com",
|
|
}
|
|
|
|
strUserId, ok := fields["userid"]
|
|
if !ok {
|
|
logging.Error(moduleName, "No userid in form")
|
|
param["returncd"] = "103"
|
|
return param
|
|
}
|
|
|
|
userId, err := strconv.ParseInt(strUserId, 10, 64)
|
|
if err != nil {
|
|
logging.Error(moduleName, "Invalid userid string in form")
|
|
param["returncd"] = "103"
|
|
return param
|
|
}
|
|
|
|
gsbrcd, ok := fields["gsbrcd"]
|
|
if !ok {
|
|
logging.Error(moduleName, "No gsbrcd in form")
|
|
param["returncd"] = "103"
|
|
return param
|
|
}
|
|
|
|
authToken, challenge := database.GenerateAuthToken(pool, ctx, userId, gsbrcd)
|
|
|
|
param["returncd"] = "001"
|
|
param["challenge"] = challenge
|
|
param["token"] = authToken
|
|
return param
|
|
}
|