def _find_email_mentions(comments_data): """Find mentions of user email in the comment data. If a user email is not registered in the app, the user will be created via external service and a Creator role would be granted to this user. Params: comments_data: list of CommentData named tuples. Returns: a default dict with keys equals to mentioned user email and values equals to a set of related CommentData. """ link_pattern = re.compile(EMAIL_LINK_REGEXP) email_mentions = defaultdict(list) for comment in comments_data: comment_email_mentions = dict() for match in link_pattern.finditer(comment.comment_text): email = _extract_email(match) person = user_generator.find_user(email) if not person: continue comment_email_mentions[email] = comment for email, matched_comment in comment_email_mentions.iteritems(): email_mentions[email].append(matched_comment) return email_mentions
def get_current_user(use_external_user=True): """Gets current user. Retrieves the current logged-in user or the external user given in the X-external-user header based on the provided flag. Args: use_external_user: indicates should we use external user or not. Returns: current user. """ logged_in_user = _get_current_logged_user() if use_external_user and is_external_app_user(): try: from ggrc.utils.user_generator import parse_user_email external_user_email = parse_user_email(request, "X-external-user", mandatory=False) if external_user_email: from ggrc.utils.user_generator import find_user ext_user = find_user(external_user_email, modifier=logged_in_user.id) if ext_user: return ext_user except RuntimeError: logger.info("Working outside of request context.") return logged_in_user
def create_external_user(app_user, external_user_email): """Create external user.""" external_user = find_user(external_user_email, modifier=app_user.id) if external_user and external_user.id is None: db.session.flush() log_event(db.session, external_user, app_user.id) return external_user
def create_external_user(app_user, external_user_email): """Create external user.""" external_user = find_user(external_user_email, modifier=app_user.id) if external_user and external_user.id is None: db.session.flush() log_event(db.session, external_user, app_user.id) db.session.commit() return external_user
def get_person(self, email): from ggrc.utils import user_generator new_objects = self.row_converter.block_converter.converter.new_objects if email not in new_objects[Person]: try: new_objects[Person][email] = user_generator.find_user(email) except ValueError as ex: self.add_error(errors.VALIDATION_ERROR, column_name=self.display_name, message=ex.message) return None return new_objects[Person].get(email)
def get_person(self, email): from ggrc.utils import user_generator new_objects = self.row_converter.block_converter.converter.new_objects if email not in new_objects[all_models.Person]: try: new_objects[all_models.Person][email] = user_generator.find_user(email) except ValueError as ex: self.add_error( errors.VALIDATION_ERROR, column_name=self.display_name, message=ex.message ) return None return new_objects[all_models.Person].get(email)
def request_loader(request): """Get the user provided in X-GGRC-user if whitelisted Appid provided.""" whitelist = settings.ALLOWED_QUERYAPI_APP_IDS inbound_appid = request.headers.get("X-Appengine-Inbound-Appid") if not inbound_appid: # don't check X-GGRC-user if the request doesn't come from another app return None if inbound_appid not in whitelist: # by default, we don't allow incoming app2app connections from # non-whitelisted apps raise exceptions.BadRequest( "X-Appengine-Inbound-Appid header contains " "untrusted application id: {}".format(inbound_appid)) email = parse_user_email(request, "X-GGRC-user", mandatory=True) # External Application User should be created if doesn't exist. if is_external_app_user_email(email): db_user = find_or_create_ext_app_user() if db_user.id is None: db.session.flush() log_event(db.session, db_user, db_user.id) db.session.commit() try: # Create in the DB external app user provided in X-external-user header. external_user_email = parse_user_email(request, "X-external-user", mandatory=False) if external_user_email: from ggrc.utils.user_generator import find_user ext_user = find_user(external_user_email, modifier=db_user.id) if ext_user.id is None: log_event(db.session, ext_user, db_user.id) db.session.commit() except exceptions.BadRequest as exp: logger.error("Creation of external user has failed. %s", exp.message) raise else: db_user = all_models.Person.query.filter_by(email=email).first() if not db_user: raise exceptions.BadRequest( "No user with such email: {}".format(email)) return db_user
def get_person(self, email): from ggrc.utils import user_generator new_objects = self.row_converter.block_converter.converter.new_objects if email not in new_objects[Person]: new_objects[Person][email] = user_generator.find_user(email) return new_objects[Person].get(email)
def create_missed_issue_acl(email, role_name, obj): """Create missed acl for emails from IssueTracker""" person = user_generator.find_user(email) if not person: return obj.add_person_with_role_name(person, role_name)