Example #1
0
    def config_from_settings(cls, settings: Settings):
        """Class method for configuring a Mail instance from a molten.Settings object.

        Supports Setting key names in Upper or Lower case.
        """

        _mail_settings = {
            k.lower(): v
            for k, v in settings.items()
            if k.startswith("MAIL_") or k.startswith("mail_")
        }

        return cls(
            server=_mail_settings.get("mail_server", "localhost"),
            user=_mail_settings.get("mail_username"),
            password=_mail_settings.get("mail_password"),
            port=_mail_settings.get("mail_port", 25),
            use_tls=_mail_settings.get("mail_use_tls", False),
            use_ssl=_mail_settings.get("mail_use_ssl", False),
            default_sender=_mail_settings.get("mail_default_sender"),
            debug=_mail_settings.get("mail_debug", False),
            max_emails=_mail_settings.get("mail_max_emails"),
            suppress_send=_mail_settings.get("mail_suppress_send", False),
            ascii_attachments=_mail_settings.get("mail_ascii_attachements",
                                                 False),
        )
Example #2
0
def get_botx_wsgi_api(
    messages: List[APIMessage],
    requests: List[APIRequest],
    errors: Dict[Type[BotXMethod], Tuple[int, Any]],
) -> App:
    """Generate BotX API mock.

    Arguments:
        messages: list of message that were sent from bot and should be extended.
        requests: all requests that were sent from bot.
        errors: errors to be generated by mocked API.

    Returns:
        Generated BotX API mock for using with httpx.
    """
    return App(
        components=[
            SettingsComponent(
                Settings(messages=messages, requests=requests,
                         errors=errors), ),
        ],
        routes=list(_create_molten_routes()),
        middleware=[error_middleware],
        parsers=[JSONParser()],
    )
Example #3
0
def test_app():
    settings = Settings({
        'database_engine_dsn': 'sqlite://',
        'identity_server': 'http://localhost',
        'secret_key': 'fake_secret',
    })
    app = create_app(
        settings=settings,
        components=[
            SettingsComponent(settings),
            SQLAlchemyEngineComponent(),
            SQLAlchemySessionComponent(),
            # RequestSessionComponent(),
            MockProvider(AuthProviderComponent),
        ],
    )
    yield app
Example #4
0
def create_app(middleware=None, components=None, settings=None):
    if settings is None:
        settings = Settings({
            'database_engine_dsn': os.environ['SQLALCHEMY_URI'],
            'identity_server': os.environ['IDENTITY_SERVER'],
            'secret_key': os.environ['SECRET_KEY'],
        })

    if middleware is None:
        middleware = [
            ResponseRendererMiddleware(),
            SQLAlchemyMiddleware(),
            auth_middleware,
        ]

    if components is None:
        components = [
            SettingsComponent(settings),
            SQLAlchemyEngineComponent(),
            SQLAlchemySessionComponent(),
            RequestSessionComponent(),
            AuthProviderComponent(),
            ManagerComponent(ChoreInstanceManager),
            ManagerComponent(ChoreDefinitionManager),
            UserProviderComponent(),
        ]

    app = App(
        routes=[
            Route('/login', login, method='POST', name='login'),
            Include(
                '/api',
                routes,
                namespace='api',
            )
        ],
        middleware=middleware,
        components=components,
    )
    return app
Example #5
0
        def middleware(jwt_identity: JWTIdentity, settings: Settings) -> Any:

            white_list = settings.get("JWT_AUTH_WHITELIST", [])

            if (
                getattr(handler, "allow_anonymous", False)
                or handler.__name__ in white_list
            ):
                return handler()
            # TODO change this error message to something more sensible.
            if jwt_identity is None:
                raise HTTPError(
                    HTTP_401,
                    response="UNAUTHORIZED",
                    headers={"WWW-Authenticate": "Bearer"},
                )
            try:
                jwt_identity.token.validate()
            except TokenValidationError as err:
                raise HTTPError(
                    HTTP_401,
                    response={"status": 401, "error_message": str(err)},
                    headers={"WWW-Authenticate": "Bearer"},
                )

            if hasattr(handler, "claims"):
                claim_errors = [
                    {k: v}
                    for k, v in handler.claims.items()
                    if k not in jwt_identity.token or v != jwt_identity.token.get(k)
                ]
                if claim_errors:
                    raise HTTPError(
                        HTTP_403,
                        response={"status": 403, "error_message": claim_errors},
                    )

            return handler()
Example #6
0
    Route,
    Settings,
    SettingsComponent,
    QueryParams,
    HTTP_204,
    HTTP_400,
    Response,
)
from molten_mail import MailComponent, Mail, Message

# Replace with your own SMTP parameters
settings = Settings(
    {
        "MAIL_SERVER": "smtp.example.com",
        "MAIL_USERNAME": "******",
        "MAIL_PASSWORD": "******",
        "MAIL_PORT": 587,
        "MAIL_USE_TLS": True,
        "MAIL_DEFAULT_SENDER": "*****@*****.**",
    }
)


def send_message(params: QueryParams, mail: Mail):
    """Emails an email address provided in the query string"""
    addresses = params.get_all("email")
    if not addresses:
        return Response(
            HTTP_400,
            content="Provide emails in the query params to send a welcome message",
        )
    msg = Message(
Example #7
0
from molten import App, Route, Settings, SettingsComponent, testing


def index(settings: Settings) -> dict:
    return settings


app = App(
    components=[SettingsComponent(Settings({"database_dsn": "sqlite://"}))],
    routes=[Route("/", index)],
)

client = testing.TestClient(app)


def test_apps_can_load_settings():
    # Given that I have an app that uses settings
    # When I make a request to that handler
    response = client.get(app.reverse_uri("index"))

    # Then I should get back a successful response
    assert response.status_code == 200
    # And the response should contain the settings
    assert response.json() == {
        "database_dsn": "sqlite://",
    }
Example #8
0
 def resolve(self, settings: Settings):
     return Redis.from_url(settings.strict_get("redis.url"))
Example #9
0
def app_settings():
    return Settings({"JWT_SECRET_KEY": SECRET, "JWT_ALGORITHM": "HS256"})