(ctx context.Context, docid string, newRevID string, changedPrincipals, changedRoleUsers []string, invalSeq uint64)
| 3123 | } |
| 3124 | |
| 3125 | func (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. |
| 3182 | func (db *DatabaseCollectionWithUser) Post(ctx context.Context, body Body) (docid string, rev string, doc *Document, err error) { |
no test coverage detected