@@ -3,7 +3,6 @@ package hub
33import (
44 "context"
55 "crypto/rand"
6- "errors"
76 "fmt"
87 "log"
98 "math/big"
@@ -219,17 +218,38 @@ func (h *WebSocketHandler) validateAuth(ctx context.Context, ws *websocket.Conn,
219218 if len (githubToken ) >= tokenPrefixLength {
220219 tokenPrefix = githubToken [:tokenPrefixLength ]
221220 }
221+
222+ // Determine specific error reason for better diagnostics
223+ errorMsg := "Authentication failed."
224+
225+ errStr := err .Error ()
226+ var errorReason string
227+ switch {
228+ case strings .Contains (errStr , "invalid GitHub token" ):
229+ errorMsg = "Invalid GitHub token."
230+ errorReason = "invalid_token"
231+ case strings .Contains (errStr , "access forbidden" ):
232+ errorMsg = "Access forbidden. Check token permissions."
233+ errorReason = "forbidden"
234+ case strings .Contains (errStr , "rate limit" ):
235+ errorMsg = "GitHub API rate limit exceeded. Try again later."
236+ errorReason = "rate_limit"
237+ default :
238+ errorReason = errStr
239+ }
240+
222241 logger .Error ("GitHub auth failed for wildcard org subscription" , err , logger.Fields {
223242 "ip" : ip ,
224243 "token_prefix" : tokenPrefix ,
225244 "token_length" : len (githubToken ),
245+ "reason" : errorReason ,
226246 })
227247
228248 // Send error response to client
229249 errorResp := map [string ]string {
230250 "type" : "error" ,
231251 "error" : "authentication_failed" ,
232- "message" : "Authentication failed." ,
252+ "message" : errorMsg ,
233253 }
234254
235255 // Set a write deadline to ensure we don't hang forever
@@ -243,8 +263,11 @@ func (h *WebSocketHandler) validateAuth(ctx context.Context, ws *websocket.Conn,
243263 return nil , sendErr
244264 }
245265
246- logger .Info ("sent authentication error to client" , logger.Fields {"ip" : ip })
247- return nil , errors .New ("authentication failed" )
266+ logger .Info ("sent authentication error to client" , logger.Fields {
267+ "ip" : ip ,
268+ "reason" : errorReason ,
269+ })
270+ return nil , fmt .Errorf ("authentication failed: %s: %w" , errorReason , err )
248271 }
249272
250273 logger .Info ("GitHub authentication successful for wildcard org subscription" , logger.Fields {
@@ -271,18 +294,47 @@ func (h *WebSocketHandler) validateAuth(ctx context.Context, ws *websocket.Conn,
271294 if len (githubToken ) >= tokenPrefixLength {
272295 tokenPrefix = githubToken [:tokenPrefixLength ]
273296 }
297+
298+ // Determine specific error reason for better diagnostics
299+ errorCode := "access_denied"
300+ errorMsg := "Access denied."
301+
302+ errStr := err .Error ()
303+ var errorReason string
304+ switch {
305+ case strings .Contains (errStr , "invalid GitHub token" ):
306+ errorCode = "authentication_failed"
307+ errorMsg = "Invalid GitHub token."
308+ errorReason = "invalid_token"
309+ case strings .Contains (errStr , "access forbidden" ):
310+ errorCode = "access_denied"
311+ errorMsg = "Access forbidden. Check token permissions."
312+ errorReason = "forbidden"
313+ case strings .Contains (errStr , "not a member" ):
314+ errorCode = "access_denied"
315+ errorMsg = fmt .Sprintf ("You are not a member of organization '%s'." , sub .Organization )
316+ errorReason = "not_org_member"
317+ case strings .Contains (errStr , "rate limit" ):
318+ errorCode = "rate_limit_exceeded"
319+ errorMsg = "GitHub API rate limit exceeded. Try again later."
320+ errorReason = "rate_limit"
321+ default :
322+ errorReason = errStr
323+ }
324+
274325 logger .Error ("GitHub auth/org membership validation failed" , err , logger.Fields {
275326 "ip" : ip ,
276327 "org" : sub .Organization ,
277328 "token_prefix" : tokenPrefix ,
278329 "token_length" : len (githubToken ),
330+ "reason" : errorReason ,
279331 })
280332
281333 // Send error response to client
282334 errorResp := map [string ]string {
283335 "type" : "error" ,
284- "error" : "access_denied" ,
285- "message" : "Access denied." ,
336+ "error" : errorCode ,
337+ "message" : errorMsg ,
286338 }
287339
288340 // Set a write deadline to ensure we don't hang forever
@@ -296,8 +348,13 @@ func (h *WebSocketHandler) validateAuth(ctx context.Context, ws *websocket.Conn,
296348 return nil , sendErr
297349 }
298350
299- logger .Info ("sent access denied error to client" , logger.Fields {"ip" : ip , "org" : sub .Organization })
300- return nil , errors .New ("access denied" )
351+ logger .Info ("sent error to client" , logger.Fields {
352+ "ip" : ip ,
353+ "org" : sub .Organization ,
354+ "error_code" : errorCode ,
355+ "error_reason" : errorReason ,
356+ })
357+ return nil , fmt .Errorf ("%s: %w" , errorReason , err )
301358 }
302359
303360 logger .Info ("GitHub authentication and org membership validated successfully" , logger.Fields {
@@ -326,17 +383,38 @@ func (h *WebSocketHandler) validateAuth(ctx context.Context, ws *websocket.Conn,
326383 if len (githubToken ) >= tokenPrefixLength {
327384 tokenPrefix = githubToken [:tokenPrefixLength ]
328385 }
386+
387+ // Determine specific error reason for better diagnostics
388+ errorMsg := "Authentication failed. Please check your GitHub token."
389+
390+ errStr := err .Error ()
391+ var errorReason string
392+ switch {
393+ case strings .Contains (errStr , "invalid GitHub token" ):
394+ errorMsg = "Invalid GitHub token."
395+ errorReason = "invalid_token"
396+ case strings .Contains (errStr , "access forbidden" ):
397+ errorMsg = "Access forbidden. Check token permissions."
398+ errorReason = "forbidden"
399+ case strings .Contains (errStr , "rate limit" ):
400+ errorMsg = "GitHub API rate limit exceeded. Try again later."
401+ errorReason = "rate_limit"
402+ default :
403+ errorReason = errStr
404+ }
405+
329406 logger .Error ("GitHub auth failed (no specific org)" , err , logger.Fields {
330407 "ip" : ip ,
331408 "token_prefix" : tokenPrefix ,
332409 "token_length" : len (githubToken ),
410+ "reason" : errorReason ,
333411 })
334412
335413 // Send error response to client
336414 errorResp := map [string ]string {
337415 "type" : "error" ,
338416 "error" : "authentication_failed" ,
339- "message" : "Authentication failed. Please check your GitHub token." ,
417+ "message" : errorMsg ,
340418 }
341419
342420 // Set a write deadline to ensure we don't hang forever
@@ -350,8 +428,11 @@ func (h *WebSocketHandler) validateAuth(ctx context.Context, ws *websocket.Conn,
350428 return nil , sendErr
351429 }
352430
353- logger .Info ("sent authentication error to client" , logger.Fields {"ip" : ip })
354- return nil , errors .New ("authentication failed" )
431+ logger .Info ("sent authentication error to client" , logger.Fields {
432+ "ip" : ip ,
433+ "reason" : errorReason ,
434+ })
435+ return nil , fmt .Errorf ("authentication failed: %s: %w" , errorReason , err )
355436 }
356437
357438 logger .Info ("GitHub authentication successful" , logger.Fields {
0 commit comments