@@ -1091,4 +1091,105 @@ var _ = Describe("source handler", Ordered, func() {
10911091 gormdb .Exec ("DELETE FROM sources;" )
10921092 })
10931093 })
1094+
1095+ Context ("GetSourceDownloadURL" , func () {
1096+ It ("successfully returns image URL for owned source" , func () {
1097+ sourceID := uuid .New ()
1098+ tx := gormdb .Exec (fmt .Sprintf (insertSourceWithUsernameStm , sourceID , "admin" , "admin" ))
1099+ Expect (tx .Error ).To (BeNil ())
1100+
1101+ // Insert image_infra record (required for URL generation)
1102+ insertImageInfraStm := `INSERT INTO image_infras (source_id) VALUES ('%s');`
1103+ tx = gormdb .Exec (fmt .Sprintf (insertImageInfraStm , sourceID ))
1104+ Expect (tx .Error ).To (BeNil ())
1105+
1106+ user := auth.User {
1107+ Username : "admin" ,
1108+ Organization : "admin" ,
1109+ EmailDomain : "admin.example.com" ,
1110+ }
1111+ ctx := auth .NewTokenContext (context .TODO (), user )
1112+
1113+ srv := handlers .NewServiceHandler (service .NewSourceService (s , nil ), service .NewAssessmentService (s , nil , nil ), nil , service .NewSizerService (nil , s ), nil , nil , nil )
1114+ resp , err := srv .GetSourceDownloadURL (ctx , server.GetSourceDownloadURLRequestObject {Id : sourceID })
1115+ Expect (err ).To (BeNil ())
1116+ Expect (reflect .TypeOf (resp ).String ()).To (Equal (reflect .TypeOf (server.GetSourceDownloadURL200JSONResponse {}).String ()))
1117+
1118+ result := resp .(server.GetSourceDownloadURL200JSONResponse )
1119+ Expect (result .Url ).NotTo (BeEmpty ())
1120+ Expect (result .ExpiresAt ).NotTo (BeNil ())
1121+ })
1122+
1123+ It ("returns 404 when trying to access another org's source - SECURITY TEST" , func () {
1124+ // Create source owned by "batman" org
1125+ victimSourceID := uuid .New ()
1126+ tx := gormdb .Exec (fmt .Sprintf (insertSourceWithUsernameStm , victimSourceID , "batman" , "batman" ))
1127+ Expect (tx .Error ).To (BeNil ())
1128+
1129+ insertImageInfraStm := `INSERT INTO image_infras (source_id) VALUES ('%s');`
1130+ tx = gormdb .Exec (fmt .Sprintf (insertImageInfraStm , victimSourceID ))
1131+ Expect (tx .Error ).To (BeNil ())
1132+
1133+ // Attempt to access with "joker" credentials
1134+ attackerUser := auth.User {
1135+ Username : "joker" ,
1136+ Organization : "joker" ,
1137+ EmailDomain : "joker.example.com" ,
1138+ }
1139+ ctx := auth .NewTokenContext (context .TODO (), attackerUser )
1140+
1141+ srv := handlers .NewServiceHandler (service .NewSourceService (s , nil ), service .NewAssessmentService (s , nil , nil ), nil , service .NewSizerService (nil , s ), nil , nil , nil )
1142+ resp , err := srv .GetSourceDownloadURL (ctx , server.GetSourceDownloadURLRequestObject {Id : victimSourceID })
1143+
1144+ Expect (err ).To (BeNil ())
1145+ // CRITICAL: Must return 404 (not 403) to prevent existence oracle
1146+ Expect (reflect .TypeOf (resp ).String ()).To (Equal (reflect .TypeOf (server.GetSourceDownloadURL404JSONResponse {}).String ()))
1147+ })
1148+
1149+ It ("returns 404 when accessing with same username but different org - SECURITY TEST" , func () {
1150+ // Create source owned by "batman" user in "batman-org"
1151+ victimSourceID := uuid .New ()
1152+ tx := gormdb .Exec (fmt .Sprintf (insertSourceWithUsernameStm , victimSourceID , "batman" , "batman-org" ))
1153+ Expect (tx .Error ).To (BeNil ())
1154+
1155+ insertImageInfraStm := `INSERT INTO image_infras (source_id) VALUES ('%s');`
1156+ tx = gormdb .Exec (fmt .Sprintf (insertImageInfraStm , victimSourceID ))
1157+ Expect (tx .Error ).To (BeNil ())
1158+
1159+ // Attempt to access with same username but different organization
1160+ attackerUser := auth.User {
1161+ Username : "batman" ,
1162+ Organization : "evil-org" ,
1163+ EmailDomain : "evil.example.com" ,
1164+ }
1165+ ctx := auth .NewTokenContext (context .TODO (), attackerUser )
1166+
1167+ srv := handlers .NewServiceHandler (service .NewSourceService (s , nil ), service .NewAssessmentService (s , nil , nil ), nil , service .NewSizerService (nil , s ), nil , nil , nil )
1168+ resp , err := srv .GetSourceDownloadURL (ctx , server.GetSourceDownloadURLRequestObject {Id : victimSourceID })
1169+
1170+ Expect (err ).To (BeNil ())
1171+ // CRITICAL: Must return 404 to prove organization check is working
1172+ Expect (reflect .TypeOf (resp ).String ()).To (Equal (reflect .TypeOf (server.GetSourceDownloadURL404JSONResponse {}).String ()))
1173+ })
1174+
1175+ It ("returns 404 for non-existent source" , func () {
1176+ user := auth.User {
1177+ Username : "admin" ,
1178+ Organization : "admin" ,
1179+ EmailDomain : "admin.example.com" ,
1180+ }
1181+ ctx := auth .NewTokenContext (context .TODO (), user )
1182+
1183+ srv := handlers .NewServiceHandler (service .NewSourceService (s , nil ), service .NewAssessmentService (s , nil , nil ), nil , service .NewSizerService (nil , s ), nil , nil , nil )
1184+ resp , err := srv .GetSourceDownloadURL (ctx , server.GetSourceDownloadURLRequestObject {Id : uuid .New ()})
1185+
1186+ Expect (err ).To (BeNil ())
1187+ Expect (reflect .TypeOf (resp ).String ()).To (Equal (reflect .TypeOf (server.GetSourceDownloadURL404JSONResponse {}).String ()))
1188+ })
1189+
1190+ AfterEach (func () {
1191+ gormdb .Exec ("DELETE FROM image_infras;" )
1192+ gormdb .Exec ("DELETE FROM sources;" )
1193+ })
1194+ })
10941195})
0 commit comments