Skip to content

Commit 31adedb

Browse files
committed
Fix query failing with Discord IDs
1 parent 521e5a5 commit 31adedb

File tree

1 file changed

+29
-56
lines changed

1 file changed

+29
-56
lines changed

api/query.go

Lines changed: 29 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import (
99
)
1010

1111
type QueryRequest struct {
12-
Secret string `json:"secret"`
13-
IP string `json:"ip"`
14-
DeviceID uint32 `json:"deviceID"`
15-
Csnum string `json:"csnum"`
16-
DiscordID string `json:"discordId"`
12+
Secret string `json:"secret"`
13+
IP string `json:"ip"`
14+
DeviceID uint32 `json:"deviceID"`
15+
Csnum string `json:"csnum"`
16+
DiscordID string `json:"discordID"`
1717
// 0: Either, 1: No Ban, 2: Ban
1818
HasBan byte `json:"hasban"`
1919
}
@@ -32,17 +32,18 @@ var QueryRoute = MakeRouteSpec[QueryRequest, QueryResponse](
3232
)
3333

3434
var (
35-
ErrInvalidIPFormat = errors.New("Invalid IP Format. IPs must be in the format 'xx.xx.xx.xx'.")
36-
ErrInvalidDeviceID = errors.New("DeviceID cannot be 0.")
37-
ErrInvalidCsnum = errors.New("Csnums must be less than 16 characters long and match the format '^[a-zA-Z0-9]+$'.")
38-
ErrInvalidDiscordID = errors.New("Discord ID must be less than 18 characters long.")
39-
ErrInvalidHasBan = errors.New("HasBan must be either 0 (Either), 1 (No Ban), 2 (Ban)")
40-
ErrEmptyParams = errors.New("At least one of IP, Csnum, and DeviceID must be nonzero or nonempty")
41-
ipRegex = regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`)
42-
csnumRegex = regexp.MustCompile(`^[a-zA-Z0-9]+$`)
35+
ErrInvalidIPFormat = errors.New("Invalid IP Format. IPs must be in the format 'xx.xx.xx.xx'.")
36+
ErrInvalidDeviceID = errors.New("DeviceID cannot be 0.")
37+
ErrInvalidCsnum = errors.New("Csnums must be less than 16 characters long and match the format '^[a-zA-Z0-9]+$'.")
38+
ErrInvalidDiscordID = errors.New("Discord ID must be 18 or fewer characters long and all numbers.")
39+
ErrInvalidHasBan = errors.New("HasBan must be either 0 (Either), 1 (No Ban), 2 (Ban)")
40+
ErrEmptyParams = errors.New("At least one of IP, Csnum, DeviceID, or DiscordID must be nonzero or nonempty")
41+
ipRegex = regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`)
42+
csnumRegex = regexp.MustCompile(`^[a-zA-Z0-9]+$`)
43+
numOnlyRegex = regexp.MustCompile("^[0-9]+$")
4344
)
4445

45-
const QUERYBASE = `SELECT profile_id, user_id, gsbrcd, ng_device_id, email, unique_nick, firstname, lastname, has_ban, ban_reason, open_host, last_ingamesn, last_ip_address, csnum, ban_moderator, ban_reason_hidden, ban_issued, ban_expires FROM users WHERE`
46+
const QUERYBASE = `SELECT profile_id FROM users WHERE`
4647

4748
func HandleQuery(req any, _ bool, _ *http.Request) (any, int, error) {
4849
_req := req.(QueryRequest)
@@ -55,7 +56,7 @@ func HandleQuery(req any, _ bool, _ *http.Request) (any, int, error) {
5556
return nil, http.StatusBadRequest, ErrInvalidCsnum
5657
}
5758

58-
if _req.DiscordID != "" && len(_req.DiscordID) > 18 {
59+
if _req.DiscordID != "" && (len(_req.DiscordID) > 18 || !numOnlyRegex.MatchString(_req.DiscordID)) {
5960
return nil, http.StatusBadRequest, ErrInvalidDiscordID
6061
}
6162

@@ -100,62 +101,34 @@ func HandleQuery(req any, _ bool, _ *http.Request) (any, int, error) {
100101
return nil, http.StatusInternalServerError, err
101102
}
102103

103-
res := QueryResponse{}
104-
res.Users = []database.User{}
104+
pids := []uint32{}
105105

106106
count := 0
107107
for rows.Next() {
108108
count++
109109

110-
user := database.User{}
111-
112-
// May be null
113-
var firstName *string
114-
var lastName *string
115-
var banReason *string
116-
var lastInGameSn *string
117-
var lastIPAddress *string
118-
var banModerator *string
119-
var banHiddenReason *string
120-
121-
err := rows.Scan(&user.ProfileId, &user.UserId, &user.GsbrCode, &user.NgDeviceId, &user.Email, &user.UniqueNick, &firstName, &lastName, &user.Restricted, &banReason, &user.OpenHost, &lastInGameSn, &lastIPAddress, &user.Csnum, &banModerator, &banHiddenReason, &user.BanIssued, &user.BanExpires)
122-
110+
var pid uint32
111+
err := rows.Scan(&pid)
123112
if err != nil {
124113
return nil, http.StatusInternalServerError, err
125114
}
126115

127-
if firstName != nil {
128-
user.FirstName = *firstName
129-
}
130-
131-
if lastName != nil {
132-
user.LastName = *lastName
133-
}
134-
135-
if banReason != nil {
136-
user.BanReason = *banReason
137-
}
138-
139-
if lastInGameSn != nil {
140-
user.LastInGameSn = *lastInGameSn
141-
}
116+
pids = append(pids, pid)
142117

143-
if lastIPAddress != nil {
144-
user.LastIPAddress = *lastIPAddress
145-
}
118+
// TODO: Return a count of the total number of matches, do something
119+
// about returing 80000 matches if the query is vague enough
120+
}
146121

147-
if banModerator != nil {
148-
user.BanModerator = *banModerator
149-
}
122+
res := QueryResponse{}
123+
res.Users = []database.User{}
150124

151-
if banHiddenReason != nil {
152-
user.BanReasonHidden = *banHiddenReason
125+
for _, pid := range pids {
126+
user, err := database.GetProfile(pool, ctx, pid)
127+
if err != nil {
128+
return nil, http.StatusInternalServerError, err
153129
}
154130

155131
res.Users = append(res.Users, user)
156-
157-
// TODO: Return a count of the total number of matches, do something
158-
// about returing 80000 matches if the query is vague enough
159132
}
160133

161134
return res, http.StatusOK, nil

0 commit comments

Comments
 (0)