@@ -48,6 +48,33 @@ const clearRateLimitState = (key) => {
4848 loginAttempts . delete ( key ) ;
4949} ;
5050
51+ const parseBearerToken = ( authHeader ) => {
52+ if ( typeof authHeader !== 'string' ) {
53+ return null ;
54+ }
55+
56+ const [ scheme , token ] = authHeader . trim ( ) . split ( / \s + / , 2 ) ;
57+ if ( ! scheme || ! token || scheme . toLowerCase ( ) !== 'bearer' ) {
58+ return null ;
59+ }
60+
61+ return token ;
62+ } ;
63+
64+ const getUserFromAuthHeader = ( authHeader ) => {
65+ const token = parseBearerToken ( authHeader ) ;
66+ if ( ! token || ! token . startsWith ( 'demo-token-' ) ) {
67+ return null ;
68+ }
69+
70+ const userId = token . slice ( 'demo-token-' . length ) ;
71+ if ( ! userId ) {
72+ return null ;
73+ }
74+
75+ return database . getUserById ( userId ) ;
76+ } ;
77+
5178const recordFailedLoginAttempt = ( key ) => {
5279 const now = Date . now ( ) ;
5380 const state = getRateLimitState ( key ) ;
@@ -181,8 +208,8 @@ const server = createServer(async (req, res) => {
181208 if ( method === 'GET' && path . startsWith ( '/api/orders/' ) ) {
182209 const orderId = path . replace ( '/api/orders/' , '' ) ;
183210
184- const authHeader = req . headers . authorization ;
185- if ( ! authHeader ) {
211+ const authedUser = getUserFromAuthHeader ( req . headers . authorization ) ;
212+ if ( ! authedUser ) {
186213 sendJson ( res , 401 , { error : 'Unauthorized' } ) ;
187214 return ;
188215 }
@@ -194,6 +221,12 @@ const server = createServer(async (req, res) => {
194221 return ;
195222 }
196223
224+ const isAdmin = authedUser . role === 'admin' ;
225+ if ( ! isAdmin && order . userId !== authedUser . id ) {
226+ sendJson ( res , 403 , { error : 'Forbidden' } ) ;
227+ return ;
228+ }
229+
197230 sendJson ( res , 200 , order ) ;
198231 return ;
199232 }
0 commit comments