ppss-auth 0.12.0.0__tar.gz → 0.12.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ppss_auth-0.12.0.0/ppss_auth.egg-info → ppss_auth-0.12.0.2}/PKG-INFO +1 -1
- ppss_auth-0.12.0.2/ppss_auth/ppss_auth_static/ppssauth.css +26 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/confirm_email.jinja2 +8 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/confirm_email.mako +8 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/edituser.jinja2 +11 -8
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/edituser.mako +12 -10
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/recover.jinja2 +5 -2
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/recover.mako +6 -3
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/views/auth.py +16 -6
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/views/crud.py +8 -8
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2/ppss_auth.egg-info}/PKG-INFO +1 -1
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/setup.py +1 -1
- ppss_auth-0.12.0.0/ppss_auth/ppss_auth_static/ppssauth.css +0 -26
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/MANIFEST.in +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/README.md +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/babel.ini +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/changelog.txt +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/__init__.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/alembic.ini +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/env.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/script.py.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20201026_52f4d4eefdfe_unique_permission_name.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20201120_6c9e84ab8280_unique_user_name.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20220329_44fde88fa438_creazione_colonne_per_login_history.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20220331_6190d529682d_result_reason.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20231016_3f4032dd2d1b_added_email_to_user.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20240110_4b95deb2d91c_tabella_reset_token.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20240209_7d2e85bbf831_add_otp_hash.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20240304_483944c8ff05_add_phone.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/20260109_000ec266dd6e_add_salt.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/f724fac25359_creation.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/constants.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/locale/en/LC_MESSAGES/ppss_auth.mo +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/locale/fr/LC_MESSAGES/ppss_auth.mo +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/locale/it/LC_MESSAGES/ppss_auth.mo +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/models.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_static/edituser.js +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_static/loader.js +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_static/ppssauth.js +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_static/template.html +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/__init__.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/createdb.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/db.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/emailclient.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/i18n.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/otp.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/password.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/scriptutils.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/ppss_auth_utils/usersession.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/routes.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/scripts/__init__.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/scripts/alchemyutils.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/scripts/cleanup_db.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/scripts/create_user.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/scripts/initialize_db.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/scripts/sayauth.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/scripts/upgrade_db.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/change.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/change.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/edit2fa.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/edit2fa.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/editgroup.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/editgroup.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/editperm.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/editperm.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/email/activation.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/email/activation.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/email/recover.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/email/recover.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/enable2fa.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/enable2fa.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/layouts/masterlayout.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/layouts/masterlayout.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/layouts/midlayout.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/layouts/midlayout.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/layouts/public.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/layouts/public.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/listgroup.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/listgroup.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/listperm.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/listperm.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/listuser.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/listuser.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/login.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/login.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/login_nogrid.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/login_nogrid.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/partials/auth-apps.html +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/partials/otp.html +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/partials/userblock.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/partials/userblock.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/partials/usermanage.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/partials/usermanage.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/registeruser.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/registeruser.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/reset.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/reset.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/shared/splash.html +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/splash.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/splash.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/verify2fa.jinja2 +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/templates/verify2fa.mako +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/views/__init__.py +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth.egg-info/SOURCES.txt +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth.egg-info/dependency_links.txt +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth.egg-info/entry_points.txt +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth.egg-info/requires.txt +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth.egg-info/top_level.txt +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/readme.txt +0 -0
- {ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/setup.cfg +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* PPSS Auth - Bootstrap 5 Custom Implementation
|
|
3
|
+
* ============================================
|
|
4
|
+
* This file contains a curated Bootstrap 5 CSS implementation
|
|
5
|
+
* with only the classes used in this project's Mako templates.
|
|
6
|
+
*
|
|
7
|
+
* NAMESPACE SUPPORT:
|
|
8
|
+
* Set the $namespace variable at the top to add a namespace prefix to all Bootstrap classes.
|
|
9
|
+
* Examples:
|
|
10
|
+
* $namespace: '' → .row, .container, .btn-primary
|
|
11
|
+
* $namespace: 'bs-' → .bs-row, .bs-container, .bs-btn-primary
|
|
12
|
+
* $namespace: 'app-' → .app-row, .app-container, .app-btn-primary
|
|
13
|
+
*
|
|
14
|
+
* EXTRACTED BOOTSTRAP CLASSES:
|
|
15
|
+
* Grid: container, container-fluid, row, col, col-12, col-sm-6, col-md-4, offset-md-4
|
|
16
|
+
* Spacing: m-auto, mt-1, mt-3, mb-0, mb-3, my-2, my-3, my-5, p-3, w-50
|
|
17
|
+
* Text: text-center, text-danger, text-success, font-weight-normal, small, h3
|
|
18
|
+
* Forms: form, form-inline, form-group, form-control, form-check, form-check-input, form-check-label, label, checkbox, checkbox-inline
|
|
19
|
+
* Buttons: btn, btn-primary, btn-success, btn-danger
|
|
20
|
+
* Alerts: alert, alert-danger, alert-info
|
|
21
|
+
* Tables: table
|
|
22
|
+
* Lists: list-group, list-group-item
|
|
23
|
+
* Images: img-fluid
|
|
24
|
+
* Borders: border
|
|
25
|
+
* Flexbox: d-flex
|
|
26
|
+
*/*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body.ppss_auth{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}body.ppss_auth [tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}body.ppss_auth hr{box-sizing:content-box;height:0;overflow:visible}body.ppss_auth h1,body.ppss_auth h2,body.ppss_auth h3,body.ppss_auth h4,body.ppss_auth h5,body.ppss_auth h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}body.ppss_auth h1{font-size:2.5rem}body.ppss_auth h2{font-size:2rem}body.ppss_auth h3{font-size:1.75rem}body.ppss_auth h4{font-size:1.5rem}body.ppss_auth h5{font-size:1.25rem}body.ppss_auth h6{font-size:1rem}body.ppss_auth p{margin-top:0;margin-bottom:1rem}body.ppss_auth abbr[title],body.ppss_auth abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}body.ppss_auth address{margin-bottom:1rem;font-style:normal;line-height:inherit}body.ppss_auth ol,body.ppss_auth ul,body.ppss_auth dl{margin-top:0;margin-bottom:1rem}body.ppss_auth ol ol,body.ppss_auth ul ul,body.ppss_auth ol ul,body.ppss_auth ul ol{margin-bottom:0}body.ppss_auth dt{font-weight:700}body.ppss_auth dd{margin-bottom:.5rem;margin-left:0}body.ppss_auth blockquote{margin:0 0 1rem}body.ppss_auth b,body.ppss_auth strong{font-weight:bolder}body.ppss_auth small{font-size:.875em}body.ppss_auth sub,body.ppss_auth sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}body.ppss_auth sub{bottom:-0.25em}body.ppss_auth sup{top:-0.5em}body.ppss_auth a:not([href]):not([class]),body.ppss_auth a:not([href]):not([class]):hover{color:inherit;text-decoration:none}body.ppss_auth pre,body.ppss_auth code,body.ppss_auth kbd,body.ppss_auth samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}body.ppss_auth pre{margin-top:0;margin-bottom:1rem;overflow:auto}body.ppss_auth figure{margin:0 0 1rem}body.ppss_auth img{vertical-align:middle;border-style:none}body.ppss_auth svg{overflow:hidden;vertical-align:middle}body.ppss_auth table{border-collapse:collapse}body.ppss_auth caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}body.ppss_auth th{text-align:inherit}body.ppss_auth label{display:inline-block;margin-bottom:.5rem}body.ppss_auth button{border-radius:0}body.ppss_auth button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}body.ppss_auth input,body.ppss_auth button,body.ppss_auth select,body.ppss_auth optgroup,body.ppss_auth textarea{font-family:inherit;font-size:inherit;line-height:inherit}body.ppss_auth button,body.ppss_auth input{overflow:visible}body.ppss_auth button,body.ppss_auth select{text-transform:none}body.ppss_auth [role=button]{cursor:pointer}body.ppss_auth select{word-wrap:normal}body.ppss_auth button,body.ppss_auth [type=button],body.ppss_auth [type=reset],body.ppss_auth [type=submit]{-webkit-appearance:button;appearance:button}body.ppss_auth button:not(:disabled),body.ppss_auth [type=button]:not(:disabled),body.ppss_auth [type=reset]:not(:disabled),body.ppss_auth [type=submit]:not(:disabled){cursor:pointer}body.ppss_auth button::-moz-focus-inner,body.ppss_auth [type=button]::-moz-focus-inner,body.ppss_auth [type=reset]::-moz-focus-inner,body.ppss_auth [type=submit]::-moz-focus-inner{padding:0;border:0}body.ppss_auth input[type=radio],body.ppss_auth input[type=checkbox]{box-sizing:border-box;padding:0}body.ppss_auth textarea{overflow:auto;resize:vertical}body.ppss_auth fieldset{min-width:0;padding:0;margin:0;border:0}body.ppss_auth legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}body.ppss_auth progress{vertical-align:baseline}body.ppss_auth [type=number]::-webkit-inner-spin-button,body.ppss_auth [type=number]::-webkit-outer-spin-button{height:auto}body.ppss_auth [type=search]{outline-offset:-2px;-webkit-appearance:none;appearance:none}body.ppss_auth [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}body.ppss_auth ::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}body.ppss_auth output{display:inline-block}body.ppss_auth summary{display:list-item;cursor:pointer}body.ppss_auth template{display:none}body.ppss_auth [hidden]{display:none !important}.auth-container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width: 576px){.auth-container{max-width:540px}}@media(min-width: 768px){.auth-container{max-width:720px}}@media(min-width: 992px){.auth-container{max-width:960px}}@media(min-width: 1200px){.auth-container{max-width:1140px}}@media(min-width: 1400px){.auth-container{max-width:1320px}}.auth-container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.auth-row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.auth-col,.auth-col-12,.auth-col-sm-6{flex-basis:0;flex-grow:1;max-width:100%;position:relative;width:100%;padding-right:15px;padding-left:15px}.auth-col-12{flex:0 0 100%;max-width:100%}@media(min-width: 576px){.auth-col-sm-6{flex:0 0 50%;max-width:50%}}@media(min-width: 768px){.auth-col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.auth-offset-md-4{margin-left:33.333333%}}.auth-m-auto{margin:auto}.auth-mt-1{margin-top:.25rem}.auth-mt-3{margin-top:1rem}.auth-mb-0{margin-bottom:0}.auth-mb-3{margin-bottom:1rem}.auth-my-2{margin-top:.5rem;margin-bottom:.5rem}.auth-my-3{margin-top:1rem;margin-bottom:1rem}.auth-my-5{margin-top:3rem;margin-bottom:3rem}.auth-mx-auto{margin-left:auto;margin-right:auto}.auth-mx-1{margin-left:.25rem;margin-right:.25rem}.auth-p-3{padding:1rem}.auth-w-50{width:50%}.auth-w-75{width:75%}.auth-text-center{text-align:center}.auth-text-danger{color:#dc3545}.auth-text-success{color:#198754}.auth-font-weight-normal{font-weight:400}.auth-small{font-size:.875em}.auth-h3{font-size:1.75rem;font-weight:600}.auth-form{display:block}.auth-form-inline{display:flex;flex-flow:row wrap;align-items:center}.auth-form-inline input,.auth-form-inline button{display:inline-block;margin-right:.75rem}.auth-form-group{margin-bottom:1rem}.auth-form-control{display:block;margin-bottom:.5rem;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.auth-form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.auth-form-check{display:block;padding-left:1.5rem}.auth-form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.5rem;width:1rem;height:1rem;border:1px solid rgba(0,0,0,.25);border-radius:.25rem;background-color:#fff;cursor:pointer}.auth-form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.auth-form-check-label{margin-bottom:0;cursor:pointer}.auth-label{display:inline-block;margin-bottom:.5rem}.auth-checkbox{display:block;min-height:1.5rem;padding-left:1.5rem}.auth-checkbox input{float:left;margin-left:-1.5rem}.auth-checkbox-inline{display:inline-block;margin-right:1rem}.auth-btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid rgba(0,0,0,0);padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.auth-btn:hover{color:#212529}.auth-btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.auth-btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.auth-btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.auth-btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.auth-btn-success{color:#fff;background-color:#198754;border-color:#198754}.auth-btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.auth-btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.auth-btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.auth-btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.auth-btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.auth-spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:spinner-border .75s linear infinite}.auth-spinner-border-sm{width:1rem;height:1rem;border-width:.2em}.auth-spinner-grow{display:inline-block;width:1rem;height:1rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.auth-spinner-grow-sm{width:1rem;height:1rem}@keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-grow{0%{opacity:0}50%{opacity:1}}.auth-alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid rgba(0,0,0,0);border-radius:.25rem}.auth-alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.auth-alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.auth-alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.auth-alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.auth-alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.auth-alert-info{color:#055160;background-color:#cfe2ff;border-color:#b6d4fe}.auth-alert-light{color:#636464;background-color:#f8f9fa;border-color:#ddd}.auth-alert-dark{color:#141619;background-color:#d3d5d6;border-color:#bcccce}.auth-table{width:100%;margin-bottom:1rem;color:#212529;border-collapse:collapse}.auth-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dee2e6;padding:.75rem;background-color:#f8f9fa;font-weight:600}.auth-table>tbody>tr>td{padding:.75rem;vertical-align:top;border-bottom:1px solid #dee2e6}.auth-table>tbody>tr:nth-child(odd){background-color:#f9f9f9}.auth-table>tbody>tr:hover{background-color:rgba(0,0,0,.075)}.auth-list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none;border:1px solid #dee2e6;border-radius:.25rem}.auth-list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid inherit}.auth-list-group-item:nth-child(odd){background:#f9f9f9}.auth-img-fluid{max-width:100%;height:auto}.auth-border{border:1px solid #dee2e6 !important}.auth-d-flex{display:flex}.auth-align-items-center{align-items:center}.auth-justify-content-center{justify-content:center}.ppss_auth--userblock{display:block}.ppss_auth--usermanage{display:block}.usermenu{margin-bottom:15px}.usermenu ul li.active{background-color:gray}.usermenu ul{list-style-type:none;margin:0;padding:0;overflow:hidden;background-color:#333}.usermenu ul li{float:left}.usermenu ul li.active a{background-color:#111}.usermenu ul li a{display:block;color:#fff;text-align:center;padding:16px;text-decoration:none}.usermenu ul li a:hover{background-color:#111}.command{cursor:pointer}a.btn{color:#fff}.ui-state-active,.ui-widget-content .ui-state-active{border:none;background:#5cb85c}.loginform .form-control{width:100%}.resultmsg{font-size:.8em;color:red}
|
|
@@ -11,6 +11,14 @@
|
|
|
11
11
|
{% if login_url %}
|
|
12
12
|
<a href="{{login_url}}">Login</a>
|
|
13
13
|
{% endif %}
|
|
14
|
+
{% if email %}
|
|
15
|
+
<form action="{{request.route_url('ppss:user:recoverpassword')}}" method="post" class="auth-my-2">
|
|
16
|
+
<input type="hidden" value="{{get_csrf_token()}}" name="csrf_token">
|
|
17
|
+
<input type="hidden" value="{{email}}" name="email">
|
|
18
|
+
<input type="hidden" value="false" name="showform">
|
|
19
|
+
<button class="auth-btn auth-btn-success auth-my-2" type="submit">{{_('Send email', domain='ppss_auth')}}</button>
|
|
20
|
+
</form>
|
|
21
|
+
{% endif %}
|
|
14
22
|
</div>
|
|
15
23
|
</div>
|
|
16
24
|
</div>
|
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
% if login_url:
|
|
10
10
|
<a href="${login_url}">Login</a>
|
|
11
11
|
% endif
|
|
12
|
+
%if email:
|
|
13
|
+
<form action="${request.route_url('ppss:user:recoverpassword')}" method="post" class="auth-my-2">
|
|
14
|
+
<input type="hidden" value="${get_csrf_token()}" name="csrf_token">
|
|
15
|
+
<input type="hidden" value="${email}" name="email">
|
|
16
|
+
<input type="hidden" value="false" name="showform">
|
|
17
|
+
<button class="auth-btn auth-btn-success auth-my-2" type="submit">${_('Send email', domain='ppss_auth')}</button>
|
|
18
|
+
</form>
|
|
19
|
+
%endif
|
|
12
20
|
</div>
|
|
13
21
|
</div>
|
|
14
22
|
</div>
|
|
@@ -63,20 +63,23 @@
|
|
|
63
63
|
</form>
|
|
64
64
|
{% endif %}
|
|
65
65
|
{% if ppsauthconf.issuer2fa %}
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
{% if selfediting and not user.otp_hash %}
|
|
68
|
+
<div class="auth-border auth-p-3">
|
|
68
69
|
<a href="{{request.route_url('2fa:enable')}}" class="auth-btn auth-btn-primary auth-my-2">{{_('Enable 2FA', domain='ppss_auth')}}</a>
|
|
70
|
+
</div>
|
|
69
71
|
{% endif %}
|
|
70
72
|
{% if user.otp_hash %}
|
|
71
|
-
<div class="auth-
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
<div class="auth-border auth-p-3">
|
|
74
|
+
<div class="auth-form-check">
|
|
75
|
+
<input checked class="auth-form-check-input" type="checkbox" id="defaultCheck2" disabled>
|
|
76
|
+
<label class="auth-form-check-auth-label auth-text-success" for="defaultCheck2">
|
|
77
|
+
2FA enabled
|
|
78
|
+
</label>
|
|
79
|
+
</div>
|
|
77
80
|
<a href="{{request.route_url('ppss:user:editotp')}}" class="auth-btn auth-btn-primary auth-my-2">{{_('show/change 2FA', domain='ppss_auth')}}</a>
|
|
81
|
+
</div>
|
|
78
82
|
{% endif %}
|
|
79
|
-
</div>
|
|
80
83
|
{% endif %}
|
|
81
84
|
<form action="{{request.route_url('ppss:user:groups:edit')}}" method="post" data-ajax-form class="auth-border auth-p-3">
|
|
82
85
|
<input type="hidden" value="{{get_csrf_token()}}" name="csrf_token">
|
|
@@ -63,20 +63,22 @@ for g in user.groups:
|
|
|
63
63
|
</form>
|
|
64
64
|
%endif
|
|
65
65
|
%if ppsauthconf.issuer2fa:
|
|
66
|
-
<div class="auth-border auth-p-3">
|
|
67
66
|
%if selfediting and not user.otp_hash:
|
|
68
|
-
<
|
|
67
|
+
<div class="auth-border auth-p-3">
|
|
68
|
+
<a href="${request.route_url('2fa:enable')}" class="auth-btn auth-btn-primary auth-my-2">${_('Enable 2FA', domain='ppss_auth')}</a>
|
|
69
|
+
</div>
|
|
69
70
|
%endif
|
|
70
71
|
%if user.otp_hash:
|
|
71
|
-
<div class="auth-
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
<div class="auth-border auth-p-3">
|
|
73
|
+
<div class="auth-form-check">
|
|
74
|
+
<input checked class="auth-form-check-input" type="checkbox" id="defaultCheck2" disabled>
|
|
75
|
+
<label class="auth-form-check-auth-label auth-text-success" for="defaultCheck2">
|
|
76
|
+
2FA enabled
|
|
77
|
+
</label>
|
|
78
|
+
</div>
|
|
79
|
+
<a href="${request.route_url('ppss:user:editotp')}" class="auth-btn auth-btn-primary auth-my-2">${_('show/change 2FA', domain='ppss_auth')}</a>
|
|
80
|
+
</div>
|
|
78
81
|
%endif
|
|
79
|
-
</div>
|
|
80
82
|
%endif
|
|
81
83
|
<form action="${request.route_url('ppss:user:groups:edit')}" method="post" data-ajax-form class="auth-border auth-p-3">
|
|
82
84
|
<input type="hidden" value="${get_csrf_token()}" name="csrf_token">
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
<div class="auth-d-flex auth-mt-1">
|
|
8
8
|
<div class="auth-m-auto auth-text-center">
|
|
9
9
|
<h1 class="auth-h3 auth-mb-3 auth-font-weight-normal">{{_("Recover password",domain='ppss_auth')}}</h1>
|
|
10
|
+
{% if showform %}
|
|
10
11
|
<p>{{_("Please fill with your email to recover password",domain='ppss_auth')}}</p>
|
|
11
12
|
<br>
|
|
12
13
|
|
|
@@ -23,10 +24,12 @@
|
|
|
23
24
|
value="{{_('Recover', domain='ppss_auth')}}" />
|
|
24
25
|
</div>
|
|
25
26
|
</br>
|
|
26
|
-
|
|
27
|
+
|
|
28
|
+
</form>
|
|
29
|
+
{% endif %}
|
|
30
|
+
<p class="auth-text-danger">
|
|
27
31
|
{{msg}}
|
|
28
32
|
</p>
|
|
29
|
-
</form>
|
|
30
33
|
</div>
|
|
31
34
|
</div>
|
|
32
35
|
</div>
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
<div class="auth-d-flex auth-mt-1">
|
|
5
5
|
<div class="auth-m-auto">
|
|
6
6
|
<h1 class="auth-h3 auth-mb-3 auth-font-weight-normal">${_("Recover password",domain='ppss_auth')}</h1>
|
|
7
|
+
%if showform:
|
|
7
8
|
<p>${_("Please fill with your email to recover password",domain='ppss_auth')}</p>
|
|
8
9
|
<br>
|
|
9
10
|
<form method="POST" class="loginform ppssauthform">
|
|
@@ -20,11 +21,13 @@
|
|
|
20
21
|
</div>
|
|
21
22
|
|
|
22
23
|
</br>
|
|
23
|
-
|
|
24
|
+
|
|
25
|
+
</form>
|
|
26
|
+
%endif
|
|
27
|
+
<p class="auth-text-danger">
|
|
24
28
|
${msg}
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
</form>
|
|
30
|
+
</p>
|
|
28
31
|
</div>
|
|
29
32
|
</div>
|
|
30
33
|
</div>
|
|
@@ -409,14 +409,14 @@ class AuthController():
|
|
|
409
409
|
self.logloginattempt(self.user, OtpValidity(loginreason=LOGINREASON.OTPSKIPPED), self.user.username)
|
|
410
410
|
self.request.tm.commit()
|
|
411
411
|
self.request.tm.begin()
|
|
412
|
-
return HTTPFound(self.
|
|
412
|
+
return HTTPFound(self.getPostLoginRoute())
|
|
413
413
|
|
|
414
414
|
if self.request.POST:
|
|
415
415
|
otp = self.request.POST.get('otp', None)
|
|
416
416
|
if otp:
|
|
417
417
|
is_otp_valid = OtpValidity.isOtpValid(otp=otp, otp_hash=self.user.otp_hash)
|
|
418
418
|
if is_otp_valid:
|
|
419
|
-
postloginpage = self.
|
|
419
|
+
postloginpage = self.getPostLoginRoute()
|
|
420
420
|
|
|
421
421
|
self.request.usersession.otpPass()
|
|
422
422
|
|
|
@@ -646,10 +646,19 @@ class AuthController():
|
|
|
646
646
|
user.email = additionaldata['email']
|
|
647
647
|
if user.enabled == -1:
|
|
648
648
|
user.enabled = 1
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
649
|
+
|
|
650
|
+
if user.password:
|
|
651
|
+
self.retdict['msg'] = __(self.request,"Email confirmed")
|
|
652
|
+
self.retdict['login_url'] = self.request.route_url('ppsslogin')
|
|
653
|
+
self.retdict['redirect_url'] = additionaldata.get('redirect_url', '')
|
|
654
|
+
self.retdict['msg_type'] = "success"
|
|
655
|
+
else:
|
|
656
|
+
self.retdict['login_url'] = False
|
|
657
|
+
self.retdict['redirect_url'] = False
|
|
658
|
+
self.retdict['msg'] = __(self.request,"Email confirmed. Please click link below to receive an email to set your password.")
|
|
659
|
+
self.retdict['email'] = user.email
|
|
660
|
+
self.retdict['msg_type'] = "success"
|
|
661
|
+
|
|
653
662
|
|
|
654
663
|
for user_token in user_tokens:
|
|
655
664
|
self.request.dbsession.delete(user_token)
|
|
@@ -660,6 +669,7 @@ class AuthController():
|
|
|
660
669
|
def recover(self):
|
|
661
670
|
if self.request.POST:
|
|
662
671
|
email = self.request.params.get("email",None)
|
|
672
|
+
self.retdict['showform'] = bool(self.request.params.get("showform", "true")=="true")
|
|
663
673
|
if not email:
|
|
664
674
|
self.retdict['msg'] = __( self.request,"Email is required")
|
|
665
675
|
return self.retdict
|
|
@@ -200,19 +200,19 @@ class CrudController(AuthController):
|
|
|
200
200
|
)
|
|
201
201
|
enabled = 1 if self.request.params.get("enabled") == "1" else 0
|
|
202
202
|
if isinstance(user, PPSsuser):
|
|
203
|
-
if user.password:
|
|
203
|
+
# if user.password:
|
|
204
204
|
user.enabled = enabled
|
|
205
205
|
return {
|
|
206
206
|
"res": True,
|
|
207
207
|
"msg": f"User {'enabled' if enabled else 'disabled'}",
|
|
208
208
|
}
|
|
209
|
-
else:
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
209
|
+
# else:
|
|
210
|
+
# return HTTPBadRequest(
|
|
211
|
+
# text=json.dumps(
|
|
212
|
+
# {"res": False, "msg": "User has no password, can't enable"}
|
|
213
|
+
# ),
|
|
214
|
+
# content_type="application/json",
|
|
215
|
+
# )
|
|
216
216
|
else:
|
|
217
217
|
return HTTPNotFound(
|
|
218
218
|
text=json.dumps({"res": False, "msg": "User not found"}),
|
|
@@ -9,7 +9,7 @@ changelog = open(os.path.join(here, "README.md"), "r").read()
|
|
|
9
9
|
|
|
10
10
|
setup(
|
|
11
11
|
name="ppss_auth",
|
|
12
|
-
version="0.12.0.
|
|
12
|
+
version="0.12.0.2",
|
|
13
13
|
description="simple auth scheme for pyramid, based on Mako template and sqlalchemy backend",
|
|
14
14
|
long_description=readme + "\n\n\n" + changelog,
|
|
15
15
|
long_description_content_type="text/markdown",
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* PPSS Auth - Bootstrap 5 Custom Implementation
|
|
3
|
-
* ============================================
|
|
4
|
-
* This file contains a curated Bootstrap 5 CSS implementation
|
|
5
|
-
* with only the classes used in this project's Mako templates.
|
|
6
|
-
*
|
|
7
|
-
* NAMESPACE SUPPORT:
|
|
8
|
-
* Set the $namespace variable at the top to add a namespace prefix to all Bootstrap classes.
|
|
9
|
-
* Examples:
|
|
10
|
-
* $namespace: '' → .row, .container, .btn-primary
|
|
11
|
-
* $namespace: 'bs-' → .bs-row, .bs-container, .bs-btn-primary
|
|
12
|
-
* $namespace: 'app-' → .app-row, .app-container, .app-btn-primary
|
|
13
|
-
*
|
|
14
|
-
* EXTRACTED BOOTSTRAP CLASSES:
|
|
15
|
-
* Grid: container, container-fluid, row, col, col-12, col-sm-6, col-md-4, offset-md-4
|
|
16
|
-
* Spacing: m-auto, mt-1, mt-3, mb-0, mb-3, my-2, my-3, my-5, p-3, w-50
|
|
17
|
-
* Text: text-center, text-danger, text-success, font-weight-normal, small, h3
|
|
18
|
-
* Forms: form, form-inline, form-group, form-control, form-check, form-check-input, form-check-label, label, checkbox, checkbox-inline
|
|
19
|
-
* Buttons: btn, btn-primary, btn-success, btn-danger
|
|
20
|
-
* Alerts: alert, alert-danger, alert-info
|
|
21
|
-
* Tables: table
|
|
22
|
-
* Lists: list-group, list-group-item
|
|
23
|
-
* Images: img-fluid
|
|
24
|
-
* Borders: border
|
|
25
|
-
* Flexbox: d-flex
|
|
26
|
-
*/*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body.ppss_auth{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}body.ppss_auth [tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}body.ppss_auth hr{box-sizing:content-box;height:0;overflow:visible}body.ppss_auth h1,body.ppss_auth h2,body.ppss_auth h3,body.ppss_auth h4,body.ppss_auth h5,body.ppss_auth h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}body.ppss_auth h1{font-size:2.5rem}body.ppss_auth h2{font-size:2rem}body.ppss_auth h3{font-size:1.75rem}body.ppss_auth h4{font-size:1.5rem}body.ppss_auth h5{font-size:1.25rem}body.ppss_auth h6{font-size:1rem}body.ppss_auth p{margin-top:0;margin-bottom:1rem}body.ppss_auth abbr[title],body.ppss_auth abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}body.ppss_auth address{margin-bottom:1rem;font-style:normal;line-height:inherit}body.ppss_auth ol,body.ppss_auth ul,body.ppss_auth dl{margin-top:0;margin-bottom:1rem}body.ppss_auth ol ol,body.ppss_auth ul ul,body.ppss_auth ol ul,body.ppss_auth ul ol{margin-bottom:0}body.ppss_auth dt{font-weight:700}body.ppss_auth dd{margin-bottom:.5rem;margin-left:0}body.ppss_auth blockquote{margin:0 0 1rem}body.ppss_auth b,body.ppss_auth strong{font-weight:bolder}body.ppss_auth small{font-size:.875em}body.ppss_auth sub,body.ppss_auth sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}body.ppss_auth sub{bottom:-0.25em}body.ppss_auth sup{top:-0.5em}body.ppss_auth a{color:#0d6efd;text-decoration:none;background-color:rgba(0,0,0,0)}body.ppss_auth a:hover{color:#0a58ca;text-decoration:underline}body.ppss_auth a:not([href]):not([class]),body.ppss_auth a:not([href]):not([class]):hover{color:inherit;text-decoration:none}body.ppss_auth pre,body.ppss_auth code,body.ppss_auth kbd,body.ppss_auth samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}body.ppss_auth pre{margin-top:0;margin-bottom:1rem;overflow:auto}body.ppss_auth figure{margin:0 0 1rem}body.ppss_auth img{vertical-align:middle;border-style:none}body.ppss_auth svg{overflow:hidden;vertical-align:middle}body.ppss_auth table{border-collapse:collapse}body.ppss_auth caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}body.ppss_auth th{text-align:inherit}body.ppss_auth label{display:inline-block;margin-bottom:.5rem}body.ppss_auth button{border-radius:0}body.ppss_auth button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}body.ppss_auth input,body.ppss_auth button,body.ppss_auth select,body.ppss_auth optgroup,body.ppss_auth textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}body.ppss_auth button,body.ppss_auth input{overflow:visible}body.ppss_auth button,body.ppss_auth select{text-transform:none}body.ppss_auth [role=button]{cursor:pointer}body.ppss_auth select{word-wrap:normal}body.ppss_auth button,body.ppss_auth [type=button],body.ppss_auth [type=reset],body.ppss_auth [type=submit]{-webkit-appearance:button;appearance:button}body.ppss_auth button:not(:disabled),body.ppss_auth [type=button]:not(:disabled),body.ppss_auth [type=reset]:not(:disabled),body.ppss_auth [type=submit]:not(:disabled){cursor:pointer}body.ppss_auth button::-moz-focus-inner,body.ppss_auth [type=button]::-moz-focus-inner,body.ppss_auth [type=reset]::-moz-focus-inner,body.ppss_auth [type=submit]::-moz-focus-inner{padding:0;border:0}body.ppss_auth input[type=radio],body.ppss_auth input[type=checkbox]{box-sizing:border-box;padding:0}body.ppss_auth textarea{overflow:auto;resize:vertical}body.ppss_auth fieldset{min-width:0;padding:0;margin:0;border:0}body.ppss_auth legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}body.ppss_auth progress{vertical-align:baseline}body.ppss_auth [type=number]::-webkit-inner-spin-button,body.ppss_auth [type=number]::-webkit-outer-spin-button{height:auto}body.ppss_auth [type=search]{outline-offset:-2px;-webkit-appearance:none;appearance:none}body.ppss_auth [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}body.ppss_auth ::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}body.ppss_auth output{display:inline-block}body.ppss_auth summary{display:list-item;cursor:pointer}body.ppss_auth template{display:none}body.ppss_auth [hidden]{display:none !important}.auth-container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width: 576px){.auth-container{max-width:540px}}@media(min-width: 768px){.auth-container{max-width:720px}}@media(min-width: 992px){.auth-container{max-width:960px}}@media(min-width: 1200px){.auth-container{max-width:1140px}}@media(min-width: 1400px){.auth-container{max-width:1320px}}.auth-container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.auth-row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.auth-col,.auth-col-12,.auth-col-sm-6{flex-basis:0;flex-grow:1;max-width:100%;position:relative;width:100%;padding-right:15px;padding-left:15px}.auth-col-12{flex:0 0 100%;max-width:100%}@media(min-width: 576px){.auth-col-sm-6{flex:0 0 50%;max-width:50%}}@media(min-width: 768px){.auth-col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.auth-offset-md-4{margin-left:33.333333%}}.auth-m-auto{margin:auto}.auth-mt-1{margin-top:.25rem}.auth-mt-3{margin-top:1rem}.auth-mb-0{margin-bottom:0}.auth-mb-3{margin-bottom:1rem}.auth-my-2{margin-top:.5rem;margin-bottom:.5rem}.auth-my-3{margin-top:1rem;margin-bottom:1rem}.auth-my-5{margin-top:3rem;margin-bottom:3rem}.auth-mx-auto{margin-left:auto;margin-right:auto}.auth-mx-1{margin-left:.25rem;margin-right:.25rem}.auth-p-3{padding:1rem}.auth-w-50{width:50%}.auth-w-75{width:75%}.auth-text-center{text-align:center}.auth-text-danger{color:#dc3545}.auth-text-success{color:#198754}.auth-font-weight-normal{font-weight:400}.auth-small{font-size:.875em}.auth-h3{font-size:1.75rem;font-weight:600}.auth-form{display:block}.auth-form-inline{display:flex;flex-flow:row wrap;align-items:center}.auth-form-inline input,.auth-form-inline button{display:inline-block;margin-right:.75rem}.auth-form-group{margin-bottom:1rem}.auth-form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.auth-form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.auth-form-check{display:block;padding-left:1.5rem}.auth-form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.5rem;width:1rem;height:1rem;border:1px solid rgba(0,0,0,.25);border-radius:.25rem;background-color:#fff;cursor:pointer}.auth-form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.auth-form-check-label{margin-bottom:0;cursor:pointer}.auth-label{display:inline-block;margin-bottom:.5rem}.auth-checkbox{display:block;min-height:1.5rem;padding-left:1.5rem}.auth-checkbox input{float:left;margin-left:-1.5rem}.auth-checkbox-inline{display:inline-block;margin-right:1rem}.auth-btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid rgba(0,0,0,0);padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.auth-btn:hover{color:#212529}.auth-btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.auth-btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.auth-btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.auth-btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.auth-btn-success{color:#fff;background-color:#198754;border-color:#198754}.auth-btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.auth-btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.auth-btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.auth-btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.auth-btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.auth-spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:spinner-border .75s linear infinite}.auth-spinner-border-sm{width:1rem;height:1rem;border-width:.2em}.auth-spinner-grow{display:inline-block;width:1rem;height:1rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.auth-spinner-grow-sm{width:1rem;height:1rem}@keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-grow{0%{opacity:0}50%{opacity:1}}.auth-alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid rgba(0,0,0,0);border-radius:.25rem}.auth-alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.auth-alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.auth-alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.auth-alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.auth-alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.auth-alert-info{color:#055160;background-color:#cfe2ff;border-color:#b6d4fe}.auth-alert-light{color:#636464;background-color:#f8f9fa;border-color:#ddd}.auth-alert-dark{color:#141619;background-color:#d3d5d6;border-color:#bcccce}.auth-table{width:100%;margin-bottom:1rem;color:#212529;border-collapse:collapse}.auth-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dee2e6;padding:.75rem;background-color:#f8f9fa;font-weight:600}.auth-table>tbody>tr>td{padding:.75rem;vertical-align:top;border-bottom:1px solid #dee2e6}.auth-table>tbody>tr:nth-child(odd){background-color:#f9f9f9}.auth-table>tbody>tr:hover{background-color:rgba(0,0,0,.075)}.auth-list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none;border:1px solid #dee2e6;border-radius:.25rem}.auth-list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid inherit}.auth-list-group-item:nth-child(odd){background:#f9f9f9}.auth-img-fluid{max-width:100%;height:auto}.auth-border{border:1px solid #dee2e6 !important}.auth-d-flex{display:flex}.auth-align-items-center{align-items:center}.auth-justify-content-center{justify-content:center}.ppss_auth--userblock{display:block}.ppss_auth--usermanage{display:block}.usermenu{margin-bottom:15px}.usermenu ul li.active{background-color:gray}.usermenu ul{list-style-type:none;margin:0;padding:0;overflow:hidden;background-color:#333}.usermenu ul li{float:left}.usermenu ul li.active a{background-color:#111}.usermenu ul li a{display:block;color:#fff;text-align:center;padding:16px;text-decoration:none}.usermenu ul li a:hover{background-color:#111}.command{cursor:pointer}a.btn{color:#fff}.ui-state-active,.ui-widget-content .ui-state-active{border:none;background:#5cb85c}.loginform .form-control{width:100%}.resultmsg{font-size:.8em;color:red}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ppss_auth-0.12.0.0 → ppss_auth-0.12.0.2}/ppss_auth/alembic/versions/f724fac25359_creation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|