@@ -314,6 +314,9 @@ func (s *Sharing) GetInteractCode(inst *instance.Instance, member *Member, membe
314314 if err != nil {
315315 return "" , err
316316 }
317+ if interact .Codes == nil {
318+ interact .Codes = make (map [string ]string )
319+ }
317320 interact .Codes [key ] = code
318321 if err := couchdb .UpdateDoc (inst , interact ); err != nil {
319322 return "" , err
@@ -462,6 +465,9 @@ func (s *Sharing) Revoke(inst *instance.Instance) error {
462465 return err
463466 }
464467 }
468+ if err := s .RevokeInteractPermissions (inst ); err != nil {
469+ return err
470+ }
465471 if rule := s .FirstBitwardenOrganizationRule (); rule != nil && len (rule .Values ) > 0 {
466472 if err := s .RemoveAllBitwardenMembers (inst , rule .Values [0 ]); err != nil {
467473 return err
@@ -486,6 +492,43 @@ func (s *Sharing) RevokePreviewPermissions(inst *instance.Instance) error {
486492 return couchdb .UpdateDoc (inst , perms )
487493}
488494
495+ // RevokeInteractPermissions ensure that the permissions for interact tokens
496+ // are no longer valid.
497+ func (s * Sharing ) RevokeInteractPermissions (inst * instance.Instance ) error {
498+ perms , err := permission .GetForShareInteract (inst , s .SID )
499+ if err != nil {
500+ if couchdb .IsNotFoundError (err ) {
501+ return nil
502+ }
503+ return err
504+ }
505+ now := time .Now ()
506+ perms .ExpiresAt = & now
507+ return couchdb .UpdateDoc (inst , perms )
508+ }
509+
510+ func (s * Sharing ) RemoveInteractPermissionsForAMember (inst * instance.Instance , m * Member , memberIndex int ) error {
511+ interact , err := permission .GetForShareInteract (inst , s .SID )
512+ if err != nil {
513+ if couchdb .IsNotFoundError (err ) {
514+ return nil
515+ }
516+ return err
517+ }
518+
519+ indexKey := keyFromMemberIndex (memberIndex )
520+ for key := range interact .Codes {
521+ if key == "" {
522+ continue
523+ }
524+ if key == m .Instance || key == m .Email || key == indexKey {
525+ delete (interact .Codes , key )
526+ return couchdb .UpdateDoc (inst , interact )
527+ }
528+ }
529+ return nil
530+ }
531+
489532// RevokeRecipient revoke only one recipient on the sharer. After that, if the
490533// sharing has still at least one active member, we keep it as is. Else, we
491534// disable the sharing.
@@ -606,31 +649,35 @@ func (s *Sharing) RevokeByNotification(inst *instance.Instance) error {
606649 if s .Owner {
607650 return ErrInvalidSharing
608651 }
609- if err := DeleteOAuthClient (inst , & s .Members [0 ], & s .Credentials [0 ]); err != nil {
610- return err
611- }
612- if err := s .RemoveTriggers (inst ); err != nil {
613- return err
614- }
615- if err := s .ClearLastSequenceNumbers (inst , & s .Members [0 ]); err != nil {
616- return err
617- }
618- if err := RemoveSharedRefs (inst , s .SID ); err != nil {
619- return err
620- }
621- if err := s .FixRevokedNotes (inst ); err != nil {
622- inst .Logger ().WithNamespace ("sharing" ).
623- Warnf ("RevokeByNotification failed to fix notes for revoked sharing %s: %s" , s .ID (), err )
624- }
625- if rule := s .FirstFilesRule (); rule != nil && rule .Mime == "" {
626- if err := s .RemoveSharingDir (inst ); err != nil {
652+ if s .Drive {
653+ s .cleanShortcutID (inst )
654+ } else {
655+ if err := DeleteOAuthClient (inst , & s .Members [0 ], & s .Credentials [0 ]); err != nil {
627656 return err
628657 }
629- }
630- if rule := s .FirstBitwardenOrganizationRule (); rule != nil && len (rule .Values ) > 0 {
631- if err := s .RemoveBitwardenOrganization (inst , rule .Values [0 ]); err != nil {
658+ if err := s .RemoveTriggers (inst ); err != nil {
659+ return err
660+ }
661+ if err := s .ClearLastSequenceNumbers (inst , & s .Members [0 ]); err != nil {
662+ return err
663+ }
664+ if err := s .FixRevokedNotes (inst ); err != nil {
665+ inst .Logger ().WithNamespace ("sharing" ).
666+ Warnf ("RevokeByNotification failed to fix notes for revoked sharing %s: %s" , s .ID (), err )
667+ }
668+ if rule := s .FirstFilesRule (); rule != nil && rule .Mime == "" {
669+ if err := s .RemoveSharingDir (inst ); err != nil {
670+ return err
671+ }
672+ }
673+ if err := RemoveSharedRefs (inst , s .SID ); err != nil {
632674 return err
633675 }
676+ if rule := s .FirstBitwardenOrganizationRule (); rule != nil && len (rule .Values ) > 0 {
677+ if err := s .RemoveBitwardenOrganization (inst , rule .Values [0 ]); err != nil {
678+ return err
679+ }
680+ }
634681 }
635682
636683 var err error
0 commit comments