MCPcopy Create free account
hub / github.com/couchbase/sync_gateway / MarkPrincipalsChanged

Method MarkPrincipalsChanged

db/crud.go:3125–3179  ·  view source on GitHub ↗
(ctx context.Context, docid string, newRevID string, changedPrincipals, changedRoleUsers []string, invalSeq uint64)

Source from the content-addressed store, hash-verified

3123}
3124
3125func (db *DatabaseCollectionWithUser) MarkPrincipalsChanged(ctx context.Context, docid string, newRevID string, changedPrincipals, changedRoleUsers []string, invalSeq uint64) {
3126
3127 reloadActiveUser := false
3128
3129 // Mark affected users/roles as needing to recompute their channel access:
3130 if len(changedPrincipals) > 0 {
3131 base.InfofCtx(ctx, base.KeyAccess, "Rev %q / %q invalidates channels of %s", base.UD(docid), newRevID, changedPrincipals)
3132 for _, changedAccessPrincipalName := range changedPrincipals {
3133 db.invalUserOrRoleChannels(ctx, changedAccessPrincipalName, invalSeq)
3134 // Check whether the active user needs to be recalculated. Skip check if reload has already been identified
3135 // as required for a previous changedPrincipal
3136 if db.user != nil && reloadActiveUser == false {
3137 // If role changed, check if active user has been granted the role
3138 changedPrincipalName, isRole := channels.AccessNameToPrincipalName(changedAccessPrincipalName)
3139 if isRole {
3140 for roleName := range db.user.RoleNames() {
3141 if roleName == changedPrincipalName {
3142 base.DebugfCtx(ctx, base.KeyAccess, "Active user belongs to role %q with modified channel access - user %q will be reloaded.", base.UD(roleName), base.UD(db.user.Name()))
3143 reloadActiveUser = true
3144 break
3145 }
3146 }
3147 } else if db.user.Name() == changedPrincipalName {
3148 // User matches
3149 base.DebugfCtx(ctx, base.KeyAccess, "Channel set for active user has been modified - user %q will be reloaded.", base.UD(db.user.Name()))
3150 reloadActiveUser = true
3151 }
3152
3153 }
3154 }
3155 }
3156
3157 if len(changedRoleUsers) > 0 {
3158 base.InfofCtx(ctx, base.KeyAccess, "Rev %q / %q invalidates roles of %s", base.UD(docid), newRevID, base.UD(changedRoleUsers))
3159 for _, name := range changedRoleUsers {
3160 db.dbCtx.invalUserRoles(ctx, name, invalSeq)
3161 // If this is the current in memory db.user, reload to generate updated roles
3162 if db.user != nil && db.user.Name() == name {
3163 base.DebugfCtx(ctx, base.KeyAccess, "Role set for active user has been modified - user %q will be reloaded.", base.UD(db.user.Name()))
3164 reloadActiveUser = true
3165
3166 }
3167 }
3168 }
3169
3170 if reloadActiveUser {
3171 user, err := db.Authenticator(ctx).GetUser(db.user.Name())
3172 if err != nil {
3173 base.WarnfCtx(ctx, "Error reloading active db.user[%s], security information will not be recalculated until next authentication --> %+v", base.UD(db.user.Name()), err)
3174 } else {
3175 db.user = user
3176 }
3177 }
3178
3179}
3180
3181// Creates a new document, assigning it a random doc ID.
3182func (db *DatabaseCollectionWithUser) Post(ctx context.Context, body Body) (docid string, rev string, doc *Document, err error) {

Callers 1

updateAndReturnDocMethod · 0.95

Calls 11

InfofCtxFunction · 0.92
UDFunction · 0.92
DebugfCtxFunction · 0.92
WarnfCtxFunction · 0.92
invalUserRolesMethod · 0.80
GetUserMethod · 0.80
RoleNamesMethod · 0.65
NameMethod · 0.65
AuthenticatorMethod · 0.45

Tested by

no test coverage detected