Exemple #1
0
def send_notification(person_id, subject, messages):
    """
    Send email notification to given person. Use the job queue if it is
    activated.
    """
    person = persons_service.get_person(person_id)
    email_message = messages["email_message"]
    slack_message = messages["slack_message"]
    if person["notifications_enabled"]:
        if config.ENABLE_JOB_QUEUE:
            queue_store.job_queue.enqueue(
                emails.send_email,
                args=(
                    subject,
                    email_message + get_signature(),
                    person["email"],
                ),
            )
        else:
            emails.send_email(subject, email_message + get_signature(),
                              person["email"])

    if person["notifications_slack_enabled"]:
        organisation = persons_service.get_organisation()
        userid = person["notifications_slack_userid"]
        token = organisation.get("chat_token_slack", "")
        if config.ENABLE_JOB_QUEUE:
            queue_store.job_queue.enqueue(chats.send_to_slack,
                                          args=(token, userid, slack_message))
        else:
            chats.send_to_slack(token, userid, slack_message)

    return True
Exemple #2
0
 def get(self):
     """
     Returns information if the user is authenticated else it returns a 401 response.
     ---
     description:  It can be used by third party tools, especially browser frontend, to know if current user is still logged in.
     tags:
         - Authentification
     responses:
       200:
         description: User authenticated
       401:
         description: Person not found
     """
     try:
         person = persons_service.get_person_by_email(get_jwt_identity(),
                                                      relations=True)
         organisation = persons_service.get_organisation()
         return {
             "authenticated": True,
             "user": person,
             "organisation": organisation,
             "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap",
         }
     except PersonNotFoundException:
         abort(401)
Exemple #3
0
def get_signature():
    """
    Build signature for Zou emails.
    """
    organisation = persons_service.get_organisation()
    return ("""
<p>Best,</p>

<p>%s Team</p>""" % organisation["name"])
Exemple #4
0
def get_signature():
    """
    Build signature for Zou emails.
    """
    organisation = persons_service.get_organisation()
    return """
Best,

%s Team""" % organisation["name"]
Exemple #5
0
 def get(self):
     try:
         person = persons_service.get_person_by_email(get_jwt_identity())
         organisation = persons_service.get_organisation()
         return {
             "authenticated": True,
             "user": person,
             "organisation": organisation,
             "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap",
         }
     except PersonNotFoundException:
         abort(401)
Exemple #6
0
    def post(self):
        (email, password) = self.get_arguments()
        try:
            user = auth_service.check_auth(app, email, password)
            del user["password"]

            if auth_service.is_default_password(app, password):
                token = uuid.uuid4()
                auth_tokens_store.add("reset-%s" % token, email, ttl=3600 * 2)
                current_app.logger.info("User must change his password.")
                return (
                    {
                        "login": False,
                        "default_password": True,
                        "token": str(token),
                    },
                    400,
                )

            access_token = create_access_token(identity=user["email"])
            refresh_token = create_refresh_token(identity=user["email"])
            auth_service.register_tokens(app, access_token, refresh_token)
            identity_changed.send(current_app._get_current_object(),
                                  identity=Identity(user["id"]))

            ip_address = request.environ.get("HTTP_X_REAL_IP",
                                             request.remote_addr)

            if is_from_browser(request.user_agent):
                organisation = persons_service.get_organisation()
                response = jsonify({
                    "user": user,
                    "organisation": organisation,
                    "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap",
                    "login": True,
                })
                set_access_cookies(response, access_token)
                set_refresh_cookies(response, refresh_token)
                events_service.create_login_log(user["id"], ip_address, "web")

            else:
                events_service.create_login_log(user["id"], ip_address,
                                                "script")
                response = {
                    "login": True,
                    "user": user,
                    "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap",
                    "access_token": access_token,
                    "refresh_token": refresh_token,
                }

            return response
        except PersonNotFoundException:
            current_app.logger.info("User is not registered.")
            return {"login": False}, 400
        except WrongUserException:
            current_app.logger.info("User is not registered.")
            return {"login": False}, 400
        except WrongPasswordException:
            current_app.logger.info("User gave a wrong password.")
            return {"login": False}, 400
        except NoAuthStrategyConfigured:
            current_app.logger.info(
                "Authentication strategy is not properly configured.")
            return {"login": False}, 400
        except TimeoutError:
            current_app.logger.info("Timeout occurs while logging in.")
            return {"login": False}, 400
        except UnactiveUserException:
            return (
                {
                    "error": True,
                    "login": False,
                    "message": "User is unactive, he cannot log in.",
                },
                400,
            )
        except OperationalError as exception:
            current_app.logger.error(exception, exc_info=1)
            return (
                {
                    "error": True,
                    "login": False,
                    "message": "Database doesn't seem reachable.",
                },
                500,
            )
        except Exception as exception:
            current_app.logger.error(exception, exc_info=1)
            if hasattr(exception, "message"):
                message = exception.message
            else:
                message = str(exception)
            return {"error": True, "login": False, "message": message}, 500
Exemple #7
0
    def post(self):
        """
        Log in user by creating and registering auth tokens.
        ---
        description: Login is based on email and password. 
                     If no user match given email and a destkop ID, it looks in matching the desktop ID with the one stored in database. 
                     It is useful for clients that run on desktop tools and that don't know user email.
        tags:
            - Authentification
        parameters:
          - in: body
            name: Credentials
            description: The email and password of the user
            schema:
                type: object
                required:
                - email
                - password
                properties:
                    email:
                        type: string
                    password:
                        type: string
        responses:
          200:
            description: Login successful
          400:
            description: Login failed
          500:
            description: Database not reachable
        """
        (email, password) = self.get_arguments()
        try:
            user = auth_service.check_auth(app, email, password)
            if "password" in user:
                del user["password"]

            if auth_service.is_default_password(app, password):
                token = uuid.uuid4()
                auth_tokens_store.add("reset-%s" % token, email, ttl=3600 * 2)
                current_app.logger.info("User must change his password.")
                return (
                    {
                        "login": False,
                        "default_password": True,
                        "token": str(token),
                    },
                    400,
                )

            access_token = create_access_token(identity=user["email"])
            refresh_token = create_refresh_token(identity=user["email"])
            auth_service.register_tokens(app, access_token, refresh_token)
            identity_changed.send(
                current_app._get_current_object(),
                identity=Identity(user["id"]),
            )

            ip_address = request.environ.get("HTTP_X_REAL_IP",
                                             request.remote_addr)

            if is_from_browser(request.user_agent):
                organisation = persons_service.get_organisation()
                response = jsonify({
                    "user": user,
                    "organisation": organisation,
                    "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap",
                    "login": True,
                })
                set_access_cookies(response, access_token)
                set_refresh_cookies(response, refresh_token)
                events_service.create_login_log(user["id"], ip_address, "web")

            else:
                events_service.create_login_log(user["id"], ip_address,
                                                "script")
                response = {
                    "login": True,
                    "user": user,
                    "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap",
                    "access_token": access_token,
                    "refresh_token": refresh_token,
                }

            return response
        except PersonNotFoundException:
            current_app.logger.info("User is not registered.")
            return {"login": False}, 400
        except WrongUserException:
            current_app.logger.info("User is not registered.")
            return {"login": False}, 400
        except WrongPasswordException:
            current_app.logger.info("User gave a wrong password.")
            return {"login": False}, 400
        except NoAuthStrategyConfigured:
            current_app.logger.info(
                "Authentication strategy is not properly configured.")
            return {"login": False}, 400
        except TimeoutError:
            current_app.logger.info("Timeout occurs while logging in.")
            return {"login": False}, 400
        except UnactiveUserException:
            return (
                {
                    "error": True,
                    "login": False,
                    "message": "User is inactive, he cannot log in.",
                },
                400,
            )
        except OperationalError as exception:
            current_app.logger.error(exception, exc_info=1)
            return (
                {
                    "error": True,
                    "login": False,
                    "message": "Database doesn't seem reachable.",
                },
                500,
            )
        except Exception as exception:
            current_app.logger.error(exception, exc_info=1)
            if hasattr(exception, "message"):
                message = exception.message
            else:
                message = str(exception)
            return {"error": True, "login": False, "message": message}, 500