@@ -93,10 +93,10 @@ async fn get_grantees(headers: Headers, mut conn: DbConn) -> Json<Value> {
93
93
}
94
94
95
95
#[ get( "/emergency-access/<emer_id>" ) ]
96
- async fn get_emergency_access ( emer_id : & str , mut conn : DbConn ) -> JsonResult {
96
+ async fn get_emergency_access ( emer_id : & str , headers : Headers , mut conn : DbConn ) -> JsonResult {
97
97
check_emergency_access_enabled ( ) ?;
98
98
99
- match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
99
+ match EmergencyAccess :: find_by_uuid_and_grantor_uuid ( emer_id, & headers . user . uuid , & mut conn) . await {
100
100
Some ( emergency_access) => Ok ( Json (
101
101
emergency_access. to_json_grantee_details ( & mut conn) . await . expect ( "Grantee user should exist but does not!" ) ,
102
102
) ) ,
@@ -117,20 +117,31 @@ struct EmergencyAccessUpdateData {
117
117
}
118
118
119
119
#[ put( "/emergency-access/<emer_id>" , data = "<data>" ) ]
120
- async fn put_emergency_access ( emer_id : & str , data : Json < EmergencyAccessUpdateData > , conn : DbConn ) -> JsonResult {
121
- post_emergency_access ( emer_id, data, conn) . await
120
+ async fn put_emergency_access (
121
+ emer_id : & str ,
122
+ data : Json < EmergencyAccessUpdateData > ,
123
+ headers : Headers ,
124
+ conn : DbConn ,
125
+ ) -> JsonResult {
126
+ post_emergency_access ( emer_id, data, headers, conn) . await
122
127
}
123
128
124
129
#[ post( "/emergency-access/<emer_id>" , data = "<data>" ) ]
125
- async fn post_emergency_access ( emer_id : & str , data : Json < EmergencyAccessUpdateData > , mut conn : DbConn ) -> JsonResult {
130
+ async fn post_emergency_access (
131
+ emer_id : & str ,
132
+ data : Json < EmergencyAccessUpdateData > ,
133
+ headers : Headers ,
134
+ mut conn : DbConn ,
135
+ ) -> JsonResult {
126
136
check_emergency_access_enabled ( ) ?;
127
137
128
138
let data: EmergencyAccessUpdateData = data. into_inner ( ) ;
129
139
130
- let mut emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
131
- Some ( emergency_access) => emergency_access,
132
- None => err ! ( "Emergency access not valid." ) ,
133
- } ;
140
+ let mut emergency_access =
141
+ match EmergencyAccess :: find_by_uuid_and_grantor_uuid ( emer_id, & headers. user . uuid , & mut conn) . await {
142
+ Some ( emergency_access) => emergency_access,
143
+ None => err ! ( "Emergency access not valid." ) ,
144
+ } ;
134
145
135
146
let new_type = match EmergencyAccessType :: from_str ( & data. r#type . into_string ( ) ) {
136
147
Some ( new_type) => new_type as i32 ,
@@ -155,17 +166,21 @@ async fn post_emergency_access(emer_id: &str, data: Json<EmergencyAccessUpdateDa
155
166
async fn delete_emergency_access ( emer_id : & str , headers : Headers , mut conn : DbConn ) -> EmptyResult {
156
167
check_emergency_access_enabled ( ) ?;
157
168
158
- let grantor_user = headers. user ;
159
-
160
- let emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
161
- Some ( emer) => {
162
- if emer. grantor_uuid != grantor_user. uuid && emer. grantee_uuid != Some ( grantor_user. uuid ) {
163
- err ! ( "Emergency access not valid." )
164
- }
165
- emer
169
+ let emergency_access = match (
170
+ EmergencyAccess :: find_by_uuid_and_grantor_uuid ( emer_id, & headers. user . uuid , & mut conn) . await ,
171
+ EmergencyAccess :: find_by_uuid_and_grantee_uuid ( emer_id, & headers. user . uuid , & mut conn) . await ,
172
+ ) {
173
+ ( Some ( grantor_emer) , None ) => {
174
+ info ! ( "Grantor deleted emergency access {emer_id}" ) ;
175
+ grantor_emer
166
176
}
167
- None => err ! ( "Emergency access not valid." ) ,
177
+ ( None , Some ( grantee_emer) ) => {
178
+ info ! ( "Grantee deleted emergency access {emer_id}" ) ;
179
+ grantee_emer
180
+ }
181
+ _ => err ! ( "Emergency access not valid." ) ,
168
182
} ;
183
+
169
184
emergency_access. delete ( & mut conn) . await ?;
170
185
Ok ( ( ) )
171
186
}
@@ -269,14 +284,11 @@ async fn send_invite(data: Json<EmergencyAccessInviteData>, headers: Headers, mu
269
284
async fn resend_invite ( emer_id : & str , headers : Headers , mut conn : DbConn ) -> EmptyResult {
270
285
check_emergency_access_enabled ( ) ?;
271
286
272
- let mut emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
273
- Some ( emer) => emer,
274
- None => err ! ( "Emergency access not valid." ) ,
275
- } ;
276
-
277
- if emergency_access. grantor_uuid != headers. user . uuid {
278
- err ! ( "Emergency access not valid." ) ;
279
- }
287
+ let mut emergency_access =
288
+ match EmergencyAccess :: find_by_uuid_and_grantor_uuid ( emer_id, & headers. user . uuid , & mut conn) . await {
289
+ Some ( emer) => emer,
290
+ None => err ! ( "Emergency access not valid." ) ,
291
+ } ;
280
292
281
293
if emergency_access. status != EmergencyAccessStatus :: Invited as i32 {
282
294
err ! ( "The grantee user is already accepted or confirmed to the organization" ) ;
@@ -342,10 +354,13 @@ async fn accept_invite(emer_id: &str, data: Json<AcceptData>, headers: Headers,
342
354
None => err ! ( "Invited user not found" ) ,
343
355
} ;
344
356
345
- let mut emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
346
- Some ( emer) => emer,
347
- None => err ! ( "Emergency access not valid." ) ,
348
- } ;
357
+ // We need to search for the uuid in combination with the email, since we do not yet store the uuid of the grantee in the database.
358
+ // The uuid of the grantee gets stored once accepted.
359
+ let mut emergency_access =
360
+ match EmergencyAccess :: find_by_uuid_and_grantee_email ( emer_id, & headers. user . email , & mut conn) . await {
361
+ Some ( emer) => emer,
362
+ None => err ! ( "Emergency access not valid." ) ,
363
+ } ;
349
364
350
365
// get grantor user to send Accepted email
351
366
let grantor_user = match User :: find_by_uuid ( & emergency_access. grantor_uuid , & mut conn) . await {
@@ -388,10 +403,11 @@ async fn confirm_emergency_access(
388
403
let data: ConfirmData = data. into_inner ( ) ;
389
404
let key = data. key ;
390
405
391
- let mut emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
392
- Some ( emer) => emer,
393
- None => err ! ( "Emergency access not valid." ) ,
394
- } ;
406
+ let mut emergency_access =
407
+ match EmergencyAccess :: find_by_uuid_and_grantor_uuid ( emer_id, & confirming_user. uuid , & mut conn) . await {
408
+ Some ( emer) => emer,
409
+ None => err ! ( "Emergency access not valid." ) ,
410
+ } ;
395
411
396
412
if emergency_access. status != EmergencyAccessStatus :: Accepted as i32
397
413
|| emergency_access. grantor_uuid != confirming_user. uuid
@@ -434,14 +450,13 @@ async fn initiate_emergency_access(emer_id: &str, headers: Headers, mut conn: Db
434
450
check_emergency_access_enabled ( ) ?;
435
451
436
452
let initiating_user = headers. user ;
437
- let mut emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
438
- Some ( emer) => emer,
439
- None => err ! ( "Emergency access not valid." ) ,
440
- } ;
453
+ let mut emergency_access =
454
+ match EmergencyAccess :: find_by_uuid_and_grantee_uuid ( emer_id, & initiating_user. uuid , & mut conn) . await {
455
+ Some ( emer) => emer,
456
+ None => err ! ( "Emergency access not valid." ) ,
457
+ } ;
441
458
442
- if emergency_access. status != EmergencyAccessStatus :: Confirmed as i32
443
- || emergency_access. grantee_uuid != Some ( initiating_user. uuid )
444
- {
459
+ if emergency_access. status != EmergencyAccessStatus :: Confirmed as i32 {
445
460
err ! ( "Emergency access not valid." )
446
461
}
447
462
@@ -473,14 +488,13 @@ async fn initiate_emergency_access(emer_id: &str, headers: Headers, mut conn: Db
473
488
async fn approve_emergency_access ( emer_id : & str , headers : Headers , mut conn : DbConn ) -> JsonResult {
474
489
check_emergency_access_enabled ( ) ?;
475
490
476
- let mut emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
477
- Some ( emer) => emer,
478
- None => err ! ( "Emergency access not valid." ) ,
479
- } ;
491
+ let mut emergency_access =
492
+ match EmergencyAccess :: find_by_uuid_and_grantor_uuid ( emer_id, & headers. user . uuid , & mut conn) . await {
493
+ Some ( emer) => emer,
494
+ None => err ! ( "Emergency access not valid." ) ,
495
+ } ;
480
496
481
- if emergency_access. status != EmergencyAccessStatus :: RecoveryInitiated as i32
482
- || emergency_access. grantor_uuid != headers. user . uuid
483
- {
497
+ if emergency_access. status != EmergencyAccessStatus :: RecoveryInitiated as i32 {
484
498
err ! ( "Emergency access not valid." )
485
499
}
486
500
@@ -511,23 +525,18 @@ async fn approve_emergency_access(emer_id: &str, headers: Headers, mut conn: DbC
511
525
async fn reject_emergency_access ( emer_id : & str , headers : Headers , mut conn : DbConn ) -> JsonResult {
512
526
check_emergency_access_enabled ( ) ?;
513
527
514
- let mut emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
515
- Some ( emer) => emer,
516
- None => err ! ( "Emergency access not valid." ) ,
517
- } ;
528
+ let mut emergency_access =
529
+ match EmergencyAccess :: find_by_uuid_and_grantor_uuid ( emer_id, & headers. user . uuid , & mut conn) . await {
530
+ Some ( emer) => emer,
531
+ None => err ! ( "Emergency access not valid." ) ,
532
+ } ;
518
533
519
- if ( emergency_access. status != EmergencyAccessStatus :: RecoveryInitiated as i32
520
- && emergency_access. status != EmergencyAccessStatus :: RecoveryApproved as i32 )
521
- || emergency_access. grantor_uuid != headers. user . uuid
534
+ if emergency_access. status != EmergencyAccessStatus :: RecoveryInitiated as i32
535
+ && emergency_access. status != EmergencyAccessStatus :: RecoveryApproved as i32
522
536
{
523
537
err ! ( "Emergency access not valid." )
524
538
}
525
539
526
- let grantor_user = match User :: find_by_uuid ( & headers. user . uuid , & mut conn) . await {
527
- Some ( user) => user,
528
- None => err ! ( "Grantor user not found." ) ,
529
- } ;
530
-
531
540
if let Some ( grantee_uuid) = emergency_access. grantee_uuid . as_ref ( ) {
532
541
let grantee_user = match User :: find_by_uuid ( grantee_uuid, & mut conn) . await {
533
542
Some ( user) => user,
@@ -538,7 +547,7 @@ async fn reject_emergency_access(emer_id: &str, headers: Headers, mut conn: DbCo
538
547
emergency_access. save ( & mut conn) . await ?;
539
548
540
549
if CONFIG . mail_enabled ( ) {
541
- mail:: send_emergency_access_recovery_rejected ( & grantee_user. email , & grantor_user . name ) . await ?;
550
+ mail:: send_emergency_access_recovery_rejected ( & grantee_user. email , & headers . user . name ) . await ?;
542
551
}
543
552
Ok ( Json ( emergency_access. to_json ( ) ) )
544
553
} else {
@@ -554,10 +563,11 @@ async fn reject_emergency_access(emer_id: &str, headers: Headers, mut conn: DbCo
554
563
async fn view_emergency_access ( emer_id : & str , headers : Headers , mut conn : DbConn ) -> JsonResult {
555
564
check_emergency_access_enabled ( ) ?;
556
565
557
- let emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
558
- Some ( emer) => emer,
559
- None => err ! ( "Emergency access not valid." ) ,
560
- } ;
566
+ let emergency_access =
567
+ match EmergencyAccess :: find_by_uuid_and_grantee_uuid ( emer_id, & headers. user . uuid , & mut conn) . await {
568
+ Some ( emer) => emer,
569
+ None => err ! ( "Emergency access not valid." ) ,
570
+ } ;
561
571
562
572
if !is_valid_request ( & emergency_access, & headers. user . uuid , EmergencyAccessType :: View ) {
563
573
err ! ( "Emergency access not valid." )
@@ -592,10 +602,11 @@ async fn takeover_emergency_access(emer_id: &str, headers: Headers, mut conn: Db
592
602
check_emergency_access_enabled ( ) ?;
593
603
594
604
let requesting_user = headers. user ;
595
- let emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
596
- Some ( emer) => emer,
597
- None => err ! ( "Emergency access not valid." ) ,
598
- } ;
605
+ let emergency_access =
606
+ match EmergencyAccess :: find_by_uuid_and_grantee_uuid ( emer_id, & requesting_user. uuid , & mut conn) . await {
607
+ Some ( emer) => emer,
608
+ None => err ! ( "Emergency access not valid." ) ,
609
+ } ;
599
610
600
611
if !is_valid_request ( & emergency_access, & requesting_user. uuid , EmergencyAccessType :: Takeover ) {
601
612
err ! ( "Emergency access not valid." )
@@ -639,10 +650,11 @@ async fn password_emergency_access(
639
650
//let key = &data.Key;
640
651
641
652
let requesting_user = headers. user ;
642
- let emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
643
- Some ( emer) => emer,
644
- None => err ! ( "Emergency access not valid." ) ,
645
- } ;
653
+ let emergency_access =
654
+ match EmergencyAccess :: find_by_uuid_and_grantee_uuid ( emer_id, & requesting_user. uuid , & mut conn) . await {
655
+ Some ( emer) => emer,
656
+ None => err ! ( "Emergency access not valid." ) ,
657
+ } ;
646
658
647
659
if !is_valid_request ( & emergency_access, & requesting_user. uuid , EmergencyAccessType :: Takeover ) {
648
660
err ! ( "Emergency access not valid." )
@@ -674,10 +686,11 @@ async fn password_emergency_access(
674
686
#[ get( "/emergency-access/<emer_id>/policies" ) ]
675
687
async fn policies_emergency_access ( emer_id : & str , headers : Headers , mut conn : DbConn ) -> JsonResult {
676
688
let requesting_user = headers. user ;
677
- let emergency_access = match EmergencyAccess :: find_by_uuid ( emer_id, & mut conn) . await {
678
- Some ( emer) => emer,
679
- None => err ! ( "Emergency access not valid." ) ,
680
- } ;
689
+ let emergency_access =
690
+ match EmergencyAccess :: find_by_uuid_and_grantee_uuid ( emer_id, & requesting_user. uuid , & mut conn) . await {
691
+ Some ( emer) => emer,
692
+ None => err ! ( "Emergency access not valid." ) ,
693
+ } ;
681
694
682
695
if !is_valid_request ( & emergency_access, & requesting_user. uuid , EmergencyAccessType :: Takeover ) {
683
696
err ! ( "Emergency access not valid." )
0 commit comments