@@ -605,8 +605,8 @@ func serveDelete(w http.ResponseWriter, r *http.Request) {
605
605
return
606
606
}
607
607
608
- if link . Owner != login {
609
- http .Error (w , "cannot delete link owned by another user" , http .StatusForbidden )
608
+ if err := checkLinkOwnership ( r . Context (), link , login ); err != nil {
609
+ http .Error (w , fmt . Sprintf ( "cannot delete link: %v" , err ) , http .StatusForbidden )
610
610
return
611
611
}
612
612
@@ -653,17 +653,9 @@ func serveSave(w http.ResponseWriter, r *http.Request) {
653
653
http .Error (w , err .Error (), http .StatusInternalServerError )
654
654
}
655
655
656
- if link != nil && link .Owner != "" && link .Owner != login {
657
- exists , err := userExists (r .Context (), link .Owner )
658
- if err != nil {
659
- log .Printf ("looking up tailnet user %q: %v" , link .Owner , err )
660
- }
661
- // Don't allow taking over links if the owner account still exists
662
- // or if we're unsure because an error occurred.
663
- if exists || err != nil {
664
- http .Error (w , "not your link; owned by " + link .Owner , http .StatusForbidden )
665
- return
666
- }
656
+ if err := checkLinkOwnership (r .Context (), link , login ); err != nil {
657
+ http .Error (w , fmt .Sprintf ("cannot update link: %v" , err ), http .StatusForbidden )
658
+ return
667
659
}
668
660
669
661
// allow transferring ownership to valid users. If empty, set owner to current user.
@@ -705,6 +697,23 @@ func serveSave(w http.ResponseWriter, r *http.Request) {
705
697
}
706
698
}
707
699
700
+ func checkLinkOwnership (ctx context.Context , link * Link , login string ) error {
701
+ if link == nil || link .Owner == "" {
702
+ return nil
703
+ }
704
+
705
+ linkOwnerExists , err := userExists (ctx , link .Owner )
706
+ if err != nil {
707
+ log .Printf ("looking up tailnet user %q: %v" , link .Owner , err )
708
+ }
709
+ // Don't allow deleting or updating links if the owner account still exists
710
+ // or if we're unsure because an error occurred.
711
+ if (linkOwnerExists && link .Owner != login ) || err != nil {
712
+ return fmt .Errorf ("link owned by user %q" , link .Owner )
713
+ }
714
+ return nil
715
+ }
716
+
708
717
// serveExport prints a snapshot of the link database. Links are JSON encoded
709
718
// and printed one per line. This format is used to restore link snapshots on
710
719
// startup.
0 commit comments