Skip to content

Commit ceffbac

Browse files
committed
fix(nnas): wrap all errors in an "errors" block
the NNAS client expects all errors to be in a "errors" block. this was not previously done, and some instances were missed when updating the error handling. this likely fixes many 102-2402 errors
1 parent e222390 commit ceffbac

File tree

3 files changed

+90
-58
lines changed

3 files changed

+90
-58
lines changed

src/middleware/console-status-verification.ts

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import type express from 'express';
77
async function consoleStatusVerificationMiddleware(request: express.Request, response: express.Response, next: express.NextFunction): Promise<void> {
88
if (!request.certificate || !request.certificate.valid) {
99
response.status(400).send(xmlbuilder.create({
10-
error: {
11-
code: '0110',
12-
message: 'Unlinked device'
10+
errors: {
11+
error: {
12+
code: '0110',
13+
message: 'Unlinked device'
14+
}
1315
}
1416
}).end());
1517

@@ -20,9 +22,11 @@ async function consoleStatusVerificationMiddleware(request: express.Request, res
2022

2123
if (!deviceIDHeader) {
2224
response.status(400).send(xmlbuilder.create({
23-
error: {
24-
code: '0002',
25-
message: 'deviceId format is invalid'
25+
errors: {
26+
error: {
27+
code: '0002',
28+
message: 'deviceId format is invalid'
29+
}
2630
}
2731
}).end());
2832

@@ -33,9 +37,11 @@ async function consoleStatusVerificationMiddleware(request: express.Request, res
3337

3438
if (isNaN(deviceID)) {
3539
response.status(400).send(xmlbuilder.create({
36-
error: {
37-
code: '0002',
38-
message: 'deviceId format is invalid'
40+
errors: {
41+
error: {
42+
code: '0002',
43+
message: 'deviceId format is invalid'
44+
}
3945
}
4046
}).end());
4147

@@ -47,10 +53,12 @@ async function consoleStatusVerificationMiddleware(request: express.Request, res
4753
if (deviceID !== certificateDeviceID) {
4854
// TODO - Change this to a different error
4955
response.status(400).send(xmlbuilder.create({
50-
error: {
51-
cause: 'Bad Request',
52-
code: '1600',
53-
message: 'Unable to process request'
56+
errors: {
57+
error: {
58+
cause: 'Bad Request',
59+
code: '1600',
60+
message: 'Unable to process request'
61+
}
5462
}
5563
}).end());
5664

@@ -74,9 +82,11 @@ async function consoleStatusVerificationMiddleware(request: express.Request, res
7482
// * compare against. We are not so lucky
7583
if (!serialNumber) {
7684
response.status(400).send(xmlbuilder.create({
77-
error: {
78-
code: '0002',
79-
message: 'serialNumber format is invalid'
85+
errors: {
86+
error: {
87+
code: '0002',
88+
message: 'serialNumber format is invalid'
89+
}
8090
}
8191
}).end());
8292

@@ -96,9 +106,11 @@ async function consoleStatusVerificationMiddleware(request: express.Request, res
96106
// * know that serial tampering happened on the 3DS if this fails
97107
// * to find a device document.
98108
response.status(400).send(xmlbuilder.create({
99-
error: {
100-
code: '0002',
101-
message: 'serialNumber format is invalid'
109+
errors: {
110+
error: {
111+
code: '0002',
112+
message: 'serialNumber format is invalid'
113+
}
102114
}
103115
}).end());
104116

@@ -127,10 +139,12 @@ async function consoleStatusVerificationMiddleware(request: express.Request, res
127139
if (device.serial !== serialNumber) {
128140
// TODO - Change this to a different error
129141
response.status(400).send(xmlbuilder.create({
130-
error: {
131-
cause: 'Bad Request',
132-
code: '1600',
133-
message: 'Unable to process request'
142+
errors: {
143+
error: {
144+
cause: 'Bad Request',
145+
code: '1600',
146+
message: 'Unable to process request'
147+
}
134148
}
135149
}).end());
136150

src/services/nnas/routes/oauth.ts

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ router.post('/access_token/generate', deviceCertificateMiddleware, consoleStatus
2525

2626
if (!['password', 'refresh_token'].includes(grantType)) {
2727
response.status(400).send(xmlbuilder.create({
28-
error: {
29-
cause: 'grant_type',
30-
code: '0004',
31-
message: 'Invalid Grant Type'
28+
errors: {
29+
error: {
30+
cause: 'grant_type',
31+
code: '0004',
32+
message: 'Invalid Grant Type'
33+
}
3234
}
3335
}).end());
3436

@@ -40,10 +42,12 @@ router.post('/access_token/generate', deviceCertificateMiddleware, consoleStatus
4042
if (grantType === 'password') {
4143
if (!username || username.trim() === '') {
4244
response.status(400).send(xmlbuilder.create({
43-
error: {
44-
cause: 'user_id',
45-
code: '0002',
46-
message: 'user_id format is invalid'
45+
errors: {
46+
error: {
47+
cause: 'user_id',
48+
code: '0002',
49+
message: 'user_id format is invalid'
50+
}
4751
}
4852
}).end());
4953

@@ -52,10 +56,12 @@ router.post('/access_token/generate', deviceCertificateMiddleware, consoleStatus
5256

5357
if (!password || password.trim() === '') {
5458
response.status(400).send(xmlbuilder.create({
55-
error: {
56-
cause: 'password',
57-
code: '0002',
58-
message: 'password format is invalid'
59+
errors: {
60+
error: {
61+
cause: 'password',
62+
code: '0002',
63+
message: 'password format is invalid'
64+
}
5965
}
6066
}).end());
6167

@@ -79,10 +85,12 @@ router.post('/access_token/generate', deviceCertificateMiddleware, consoleStatus
7985
} else {
8086
if (!refreshToken || refreshToken.trim() === '') {
8187
response.status(400).send(xmlbuilder.create({
82-
error: {
83-
cause: 'refresh_token',
84-
code: '0106',
85-
message: 'Invalid Refresh Token'
88+
errors: {
89+
error: {
90+
cause: 'refresh_token',
91+
code: '0106',
92+
message: 'Invalid Refresh Token'
93+
}
8694
}
8795
}).end());
8896

@@ -94,21 +102,25 @@ router.post('/access_token/generate', deviceCertificateMiddleware, consoleStatus
94102

95103
if (!pnid) {
96104
response.status(400).send(xmlbuilder.create({
97-
error: {
98-
cause: 'refresh_token',
99-
code: '0106',
100-
message: 'Invalid Refresh Token'
105+
errors: {
106+
error: {
107+
cause: 'refresh_token',
108+
code: '0106',
109+
message: 'Invalid Refresh Token'
110+
}
101111
}
102112
}).end());
103113

104114
return;
105115
}
106116
} catch {
107117
response.status(400).send(xmlbuilder.create({
108-
error: {
109-
cause: 'refresh_token',
110-
code: '0106',
111-
message: 'Invalid Refresh Token'
118+
errors: {
119+
error: {
120+
cause: 'refresh_token',
121+
code: '0106',
122+
message: 'Invalid Refresh Token'
123+
}
112124
}
113125
}).end());
114126

@@ -121,9 +133,11 @@ router.post('/access_token/generate', deviceCertificateMiddleware, consoleStatus
121133
// * 0143 is the "The link to this Nintendo Network ID has been temporarliy removed" error,
122134
// * maybe that is a better error to use here?
123135
response.status(400).send(xmlbuilder.create({
124-
error: {
125-
code: '0112',
126-
message: pnid.username
136+
errors: {
137+
error: {
138+
code: '0112',
139+
message: pnid.username
140+
}
127141
}
128142
}).end());
129143

src/services/nnas/routes/people.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ router.post('/', ratelimit, deviceCertificateMiddleware, async (request: express
5353
if (!request.certificate || !request.certificate.valid) {
5454
// TODO - Change this to a different error
5555
response.status(400).send(xmlbuilder.create({
56-
error: {
57-
cause: 'Bad Request',
58-
code: '1600',
59-
message: 'Unable to process request'
56+
errors: {
57+
error: {
58+
cause: 'Bad Request',
59+
code: '1600',
60+
message: 'Unable to process request'
61+
}
6062
}
6163
}).end());
6264

@@ -205,10 +207,12 @@ router.post('/', ratelimit, deviceCertificateMiddleware, async (request: express
205207
await session.abortTransaction();
206208

207209
response.status(400).send(xmlbuilder.create({
208-
error: {
209-
cause: 'Bad Request',
210-
code: '1600',
211-
message: 'Unable to process request'
210+
errors: {
211+
error: {
212+
cause: 'Bad Request',
213+
code: '1600',
214+
message: 'Unable to process request'
215+
}
212216
}
213217
}).end());
214218

0 commit comments

Comments
 (0)