Changeset View
Changeset View
Standalone View
Standalone View
cloud/webhooks.py
| Show First 20 Lines • Show All 111 Lines • ▼ Show 20 Lines | if user_count > 1: | ||||
| my_log.error('%d users found for query %s, picking user %s (%s)', | my_log.error('%d users found for query %s, picking user %s (%s)', | ||||
| user_count, query, best_score['_id'], best_score['email']) | user_count, query, best_score['_id'], best_score['email']) | ||||
| return best_score | return best_score | ||||
| if user_count: | if user_count: | ||||
| db_user = db_users[0] | db_user = db_users[0] | ||||
| my_log.debug('found user %s', db_user['email']) | my_log.debug('found user %s', db_user['email']) | ||||
| return db_user | return db_user | ||||
| if wh_payload.get('date_deletion_requested'): | |||||
| my_log.info('Received update for a deleted user %s, not creating', bid_str) | |||||
| return None | |||||
| # Pretend to create the user, so that we can inspect the resulting | # Pretend to create the user, so that we can inspect the resulting | ||||
| # capabilities. This is more future-proof than looking at the list | # capabilities. This is more future-proof than looking at the list | ||||
| # of roles in the webhook payload. | # of roles in the webhook payload. | ||||
| username = make_unique_username(email) | username = make_unique_username(email) | ||||
| user_doc = create_new_user_document(email, bid_str, username, | user_doc = create_new_user_document(email, bid_str, username, | ||||
| provider='blender-id', | provider='blender-id', | ||||
| full_name=wh_payload['full_name']) | full_name=wh_payload['full_name']) | ||||
| ▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | def user_modified(): | ||||
| my_log.info('payload: %s', payload) | my_log.info('payload: %s', payload) | ||||
| # Update the user | # Update the user | ||||
| db_user = insert_or_fetch_user(payload) | db_user = insert_or_fetch_user(payload) | ||||
| if not db_user: | if not db_user: | ||||
| my_log.info('Received update for unknown user %r', payload['old_email']) | my_log.info('Received update for unknown user %r', payload['old_email']) | ||||
| return '', 204 | return '', 204 | ||||
| if payload.get('date_deletion_requested'): | |||||
| delete_user(db_user, payload) | |||||
| return '', 204 | |||||
| # Use direct database updates to change the email and full name. | # Use direct database updates to change the email and full name. | ||||
| # Also updates the db_user dict so that local_user below will have | # Also updates the db_user dict so that local_user below will have | ||||
| # the updated information. | # the updated information. | ||||
| updates = {} | updates = {} | ||||
| if db_user['email'] != payload['email']: | if db_user['email'] != payload['email']: | ||||
| my_log.info('User changed email from %s to %s', payload['old_email'], payload['email']) | my_log.info('User changed email from %s to %s', payload['old_email'], payload['email']) | ||||
| updates['email'] = payload['email'] | updates['email'] = payload['email'] | ||||
| db_user['email'] = payload['email'] | db_user['email'] = payload['email'] | ||||
| Show All 22 Lines | if updates: | ||||
| 'we found them by email address %s', | 'we found them by email address %s', | ||||
| db_user['_id'], payload['old_email']) | db_user['_id'], payload['old_email']) | ||||
| # Defer to Pillar to do the role updates. | # Defer to Pillar to do the role updates. | ||||
| local_user = UserClass.construct('', db_user) | local_user = UserClass.construct('', db_user) | ||||
| subscription.do_update_subscription(local_user, payload) | subscription.do_update_subscription(local_user, payload) | ||||
| return '', 204 | return '', 204 | ||||
| def delete_user(db_user, payload): | |||||
| """Handle deletion request coming from BID.""" | |||||
| date_deletion_requested = payload['date_deletion_requested'] | |||||
| bid_str = str(payload['id']) | |||||
| local_id = db_user['_id'] | |||||
| log.info( | |||||
| 'User %s with BID=%s requested deletion on %s, soft-deleting the user', | |||||
| local_id, bid_str, date_deletion_requested, | |||||
| ) | |||||
| # Delete all session tokens linked to this user | |||||
| token_coll = current_app.db('tokens') | |||||
| delete_res = token_coll.delete_many({'user': local_id}) | |||||
| log.info('Deleted %s session tokens of user %s', delete_res.deleted_count, local_id) | |||||
| # Soft-delete the user and clear their PII | |||||
| users_coll = current_app.db('users') | |||||
| updates = { | |||||
| '_deleted': True, | |||||
| 'email': None, | |||||
| 'full_name': None, | |||||
| 'username': None, | |||||
| 'auth': [], | |||||
| } | |||||
| update_res = users_coll.update_one({'_id': local_id}, {'$set': updates}) | |||||
| if update_res.matched_count != 1: | |||||
| log.error( | |||||
| 'Soft-deleted %s users %s with BID=%s', | |||||
| update_res.matched_count, local_id, bid_str, | |||||
| ) | |||||
| else: | |||||
| log.warning('Soft-deleted user %s with BID=%s', local_id, bid_str) | |||||