Drew Short
7 years ago
29 changed files with 919 additions and 118 deletions
-
BINserver/.admin_credentials.swp
-
2server/.env
-
547server/.pylintrc
-
2server/Pipfile
-
94server/Pipfile.lock
-
37server/corvus/__init__.py
-
3server/corvus/api/__init__.py
-
26server/corvus/api/authentication_api.py
-
12server/corvus/api/decorators.py
-
5server/corvus/api/model.py
-
10server/corvus/db.py
-
2server/corvus/default_settings.py
-
1server/corvus/middleware/__init__.py
-
66server/corvus/middleware/authentication_middleware.py
-
1server/corvus/model/__init__.py
-
11server/corvus/model/user_model.py
-
1server/corvus/service/__init__.py
-
42server/corvus/service/authentication_service.py
-
52server/corvus/service/user_service.py
-
31server/corvus/service/user_token_service.py
-
18server/corvus/utility.py
-
1server/corvus/utility/__init__.py
-
14server/corvus/utility/authentication_utility.py
-
22server/corvus/utility/json_utility.py
-
4server/entrypoint.sh
-
6server/manage.py
-
4server/run_tests.sh
-
19server/tests/conftest.py
@ -1 +1 @@ |
|||||
FLASK_APP=corvus |
|
||||
|
FLASK_APP=atheneum:atheneum |
@ -0,0 +1,547 @@ |
|||||
|
[MASTER] |
||||
|
|
||||
|
# A comma-separated list of package or module names from where C extensions may |
||||
|
# be loaded. Extensions are loading into the active Python interpreter and may |
||||
|
# run arbitrary code |
||||
|
extension-pkg-whitelist= |
||||
|
|
||||
|
# Add files or directories to the blacklist. They should be base names, not |
||||
|
# paths. |
||||
|
ignore=CVS |
||||
|
|
||||
|
# Add files or directories matching the regex patterns to the blacklist. The |
||||
|
# regex matches against base names, not paths. |
||||
|
ignore-patterns= |
||||
|
|
||||
|
# Python code to execute, usually for sys.path manipulation such as |
||||
|
# pygtk.require(). |
||||
|
#init-hook= |
||||
|
|
||||
|
# Use multiple processes to speed up Pylint. |
||||
|
jobs=1 |
||||
|
|
||||
|
# List of plugins (as comma separated values of python modules names) to load, |
||||
|
# usually to register additional checkers. |
||||
|
load-plugins= |
||||
|
|
||||
|
# Pickle collected data for later comparisons. |
||||
|
persistent=yes |
||||
|
|
||||
|
# Specify a configuration file. |
||||
|
#rcfile= |
||||
|
|
||||
|
# When enabled, pylint would attempt to guess common misconfiguration and emit |
||||
|
# user-friendly hints instead of false-positive error messages |
||||
|
suggestion-mode=yes |
||||
|
|
||||
|
# Allow loading of arbitrary C extensions. Extensions are imported into the |
||||
|
# active Python interpreter and may run arbitrary code. |
||||
|
unsafe-load-any-extension=no |
||||
|
|
||||
|
|
||||
|
[MESSAGES CONTROL] |
||||
|
|
||||
|
# Only show warnings with the listed confidence levels. Leave empty to show |
||||
|
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED |
||||
|
confidence= |
||||
|
|
||||
|
# Disable the message, report, category or checker with the given id(s). You |
||||
|
# can either give multiple identifiers separated by comma (,) or put this |
||||
|
# option multiple times (only on the command line, not in the configuration |
||||
|
# file where it should appear only once).You can also use "--disable=all" to |
||||
|
# disable everything first and then reenable specific checks. For example, if |
||||
|
# you want to run only the similarities checker, you can use "--disable=all |
||||
|
# --enable=similarities". If you want to run only the classes checker, but have |
||||
|
# no Warning level messages displayed, use"--disable=all --enable=classes |
||||
|
# --disable=W" |
||||
|
disable=print-statement, |
||||
|
parameter-unpacking, |
||||
|
unpacking-in-except, |
||||
|
old-raise-syntax, |
||||
|
backtick, |
||||
|
long-suffix, |
||||
|
old-ne-operator, |
||||
|
old-octal-literal, |
||||
|
import-star-module-level, |
||||
|
non-ascii-bytes-literal, |
||||
|
invalid-unicode-literal, |
||||
|
raw-checker-failed, |
||||
|
bad-inline-option, |
||||
|
locally-disabled, |
||||
|
locally-enabled, |
||||
|
file-ignored, |
||||
|
suppressed-message, |
||||
|
useless-suppression, |
||||
|
deprecated-pragma, |
||||
|
apply-builtin, |
||||
|
basestring-builtin, |
||||
|
buffer-builtin, |
||||
|
cmp-builtin, |
||||
|
coerce-builtin, |
||||
|
execfile-builtin, |
||||
|
file-builtin, |
||||
|
long-builtin, |
||||
|
raw_input-builtin, |
||||
|
reduce-builtin, |
||||
|
standarderror-builtin, |
||||
|
unicode-builtin, |
||||
|
xrange-builtin, |
||||
|
coerce-method, |
||||
|
delslice-method, |
||||
|
getslice-method, |
||||
|
setslice-method, |
||||
|
no-absolute-import, |
||||
|
old-division, |
||||
|
dict-iter-method, |
||||
|
dict-view-method, |
||||
|
next-method-called, |
||||
|
metaclass-assignment, |
||||
|
indexing-exception, |
||||
|
raising-string, |
||||
|
reload-builtin, |
||||
|
oct-method, |
||||
|
hex-method, |
||||
|
nonzero-method, |
||||
|
cmp-method, |
||||
|
input-builtin, |
||||
|
round-builtin, |
||||
|
intern-builtin, |
||||
|
unichr-builtin, |
||||
|
map-builtin-not-iterating, |
||||
|
zip-builtin-not-iterating, |
||||
|
range-builtin-not-iterating, |
||||
|
filter-builtin-not-iterating, |
||||
|
using-cmp-argument, |
||||
|
eq-without-hash, |
||||
|
div-method, |
||||
|
idiv-method, |
||||
|
rdiv-method, |
||||
|
exception-message-attribute, |
||||
|
invalid-str-codec, |
||||
|
sys-max-int, |
||||
|
bad-python3-import, |
||||
|
deprecated-string-function, |
||||
|
deprecated-str-translate-call, |
||||
|
deprecated-itertools-function, |
||||
|
deprecated-types-field, |
||||
|
next-method-defined, |
||||
|
dict-items-not-iterating, |
||||
|
dict-keys-not-iterating, |
||||
|
dict-values-not-iterating, |
||||
|
deprecated-operator-function, |
||||
|
deprecated-urllib-function, |
||||
|
xreadlines-attribute, |
||||
|
deprecated-sys-function, |
||||
|
exception-escape, |
||||
|
comprehension-escape |
||||
|
|
||||
|
# Enable the message, report, category or checker with the given id(s). You can |
||||
|
# either give multiple identifier separated by comma (,) or put this option |
||||
|
# multiple time (only on the command line, not in the configuration file where |
||||
|
# it should appear only once). See also the "--disable" option for examples. |
||||
|
enable=c-extension-no-member |
||||
|
|
||||
|
|
||||
|
[REPORTS] |
||||
|
|
||||
|
# Python expression which should return a note less than 10 (10 is the highest |
||||
|
# note). You have access to the variables errors warning, statement which |
||||
|
# respectively contain the number of errors / warnings messages and the total |
||||
|
# number of statements analyzed. This is used by the global evaluation report |
||||
|
# (RP0004). |
||||
|
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) |
||||
|
|
||||
|
# Template used to display messages. This is a python new-style format string |
||||
|
# used to format the message information. See doc for all details |
||||
|
#msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} |
||||
|
msg-template={C}:{line:3d},{column:2d}: {msg} [({symbol}) {msg_id}] |
||||
|
|
||||
|
# Set the output format. Available formats are text, parseable, colorized, json |
||||
|
# and msvs (visual studio).You can also give a reporter class, eg |
||||
|
# mypackage.mymodule.MyReporterClass. |
||||
|
output-format=text |
||||
|
|
||||
|
# Tells whether to display a full report or only the messages |
||||
|
reports=yes |
||||
|
|
||||
|
# Activate the evaluation score. |
||||
|
score=yes |
||||
|
|
||||
|
|
||||
|
[REFACTORING] |
||||
|
|
||||
|
# Maximum number of nested blocks for function / method body |
||||
|
max-nested-blocks=5 |
||||
|
|
||||
|
# Complete name of functions that never returns. When checking for |
||||
|
# inconsistent-return-statements if a never returning function is called then |
||||
|
# it will be considered as an explicit return statement and no message will be |
||||
|
# printed. |
||||
|
never-returning-functions=optparse.Values,sys.exit |
||||
|
|
||||
|
|
||||
|
[MISCELLANEOUS] |
||||
|
|
||||
|
# List of note tags to take in consideration, separated by a comma. |
||||
|
notes=FIXME, |
||||
|
XXX, |
||||
|
TODO |
||||
|
|
||||
|
|
||||
|
[FORMAT] |
||||
|
|
||||
|
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. |
||||
|
expected-line-ending-format= |
||||
|
|
||||
|
# Regexp for a line that is allowed to be longer than the limit. |
||||
|
ignore-long-lines=^\s*(# )?<?https?://\S+>?$ |
||||
|
|
||||
|
# Number of spaces of indent required inside a hanging or continued line. |
||||
|
indent-after-paren=4 |
||||
|
|
||||
|
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 |
||||
|
# tab). |
||||
|
indent-string=' ' |
||||
|
|
||||
|
# Maximum number of characters on a single line. |
||||
|
max-line-length=80 |
||||
|
|
||||
|
# Maximum number of lines in a module |
||||
|
max-module-lines=1000 |
||||
|
|
||||
|
# List of optional constructs for which whitespace checking is disabled. `dict- |
||||
|
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. |
||||
|
# `trailing-comma` allows a space between comma and closing bracket: (a, ). |
||||
|
# `empty-line` allows space-only lines. |
||||
|
no-space-check=trailing-comma, |
||||
|
dict-separator |
||||
|
|
||||
|
# Allow the body of a class to be on the same line as the declaration if body |
||||
|
# contains single statement. |
||||
|
single-line-class-stmt=no |
||||
|
|
||||
|
# Allow the body of an if to be on the same line as the test if there is no |
||||
|
# else. |
||||
|
single-line-if-stmt=no |
||||
|
|
||||
|
|
||||
|
[LOGGING] |
||||
|
|
||||
|
# Logging modules to check that the string format arguments are in logging |
||||
|
# function parameter format |
||||
|
logging-modules=logging |
||||
|
|
||||
|
|
||||
|
[TYPECHECK] |
||||
|
|
||||
|
# List of decorators that produce context managers, such as |
||||
|
# contextlib.contextmanager. Add to this list to register other decorators that |
||||
|
# produce valid context managers. |
||||
|
contextmanager-decorators=contextlib.contextmanager |
||||
|
|
||||
|
# List of members which are set dynamically and missed by pylint inference |
||||
|
# system, and so shouldn't trigger E1101 when accessed. Python regular |
||||
|
# expressions are accepted. |
||||
|
generated-members= |
||||
|
|
||||
|
# Tells whether missing members accessed in mixin class should be ignored. A |
||||
|
# mixin class is detected if its name ends with "mixin" (case insensitive). |
||||
|
ignore-mixin-members=yes |
||||
|
|
||||
|
# This flag controls whether pylint should warn about no-member and similar |
||||
|
# checks whenever an opaque object is returned when inferring. The inference |
||||
|
# can return multiple potential results while evaluating a Python object, but |
||||
|
# some branches might not be evaluated, which results in partial inference. In |
||||
|
# that case, it might be useful to still emit no-member and other checks for |
||||
|
# the rest of the inferred objects. |
||||
|
ignore-on-opaque-inference=yes |
||||
|
|
||||
|
# List of class names for which member attributes should not be checked (useful |
||||
|
# for classes with dynamically set attributes). This supports the use of |
||||
|
# qualified names. |
||||
|
ignored-classes=optparse.Values,thread._local,_thread._local,SQLAlchemy,scoped_session,logger |
||||
|
|
||||
|
# List of module names for which member attributes should not be checked |
||||
|
# (useful for modules/projects where namespaces are manipulated during runtime |
||||
|
# and thus existing member attributes cannot be deduced by static analysis. It |
||||
|
# supports qualified module names, as well as Unix pattern matching. |
||||
|
ignored-modules= |
||||
|
|
||||
|
# Show a hint with possible names when a member name was not found. The aspect |
||||
|
# of finding the hint is based on edit distance. |
||||
|
missing-member-hint=yes |
||||
|
|
||||
|
# The minimum edit distance a name should have in order to be considered a |
||||
|
# similar match for a missing member name. |
||||
|
missing-member-hint-distance=1 |
||||
|
|
||||
|
# The total number of similar names that should be taken in consideration when |
||||
|
# showing a hint for a missing member. |
||||
|
missing-member-max-choices=1 |
||||
|
|
||||
|
|
||||
|
[SIMILARITIES] |
||||
|
|
||||
|
# Ignore comments when computing similarities. |
||||
|
ignore-comments=yes |
||||
|
|
||||
|
# Ignore docstrings when computing similarities. |
||||
|
ignore-docstrings=yes |
||||
|
|
||||
|
# Ignore imports when computing similarities. |
||||
|
ignore-imports=no |
||||
|
|
||||
|
# Minimum lines number of a similarity. |
||||
|
min-similarity-lines=4 |
||||
|
|
||||
|
|
||||
|
[VARIABLES] |
||||
|
|
||||
|
# List of additional names supposed to be defined in builtins. Remember that |
||||
|
# you should avoid to define new builtins when possible. |
||||
|
additional-builtins= |
||||
|
|
||||
|
# Tells whether unused global variables should be treated as a violation. |
||||
|
allow-global-unused-variables=yes |
||||
|
|
||||
|
# List of strings which can identify a callback function by name. A callback |
||||
|
# name must start or end with one of those strings. |
||||
|
callbacks=cb_, |
||||
|
_cb |
||||
|
|
||||
|
# A regular expression matching the name of dummy variables (i.e. expectedly |
||||
|
# not used). |
||||
|
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ |
||||
|
|
||||
|
# Argument names that match this expression will be ignored. Default to name |
||||
|
# with leading underscore |
||||
|
ignored-argument-names=_.*|^ignored_|^unused_ |
||||
|
|
||||
|
# Tells whether we should check for unused import in __init__ files. |
||||
|
init-import=no |
||||
|
|
||||
|
# List of qualified module names which can have objects that can redefine |
||||
|
# builtins. |
||||
|
redefining-builtins-modules=six.moves,past.builtins,future.builtins,io,builtins |
||||
|
|
||||
|
|
||||
|
[BASIC] |
||||
|
|
||||
|
# Naming style matching correct argument names |
||||
|
argument-naming-style=snake_case |
||||
|
|
||||
|
# Regular expression matching correct argument names. Overrides argument- |
||||
|
# naming-style |
||||
|
#argument-rgx= |
||||
|
|
||||
|
# Naming style matching correct attribute names |
||||
|
attr-naming-style=snake_case |
||||
|
|
||||
|
# Regular expression matching correct attribute names. Overrides attr-naming- |
||||
|
# style |
||||
|
#attr-rgx= |
||||
|
|
||||
|
# Bad variable names which should always be refused, separated by a comma |
||||
|
bad-names=foo, |
||||
|
bar, |
||||
|
baz, |
||||
|
toto, |
||||
|
tutu, |
||||
|
tata |
||||
|
|
||||
|
# Naming style matching correct class attribute names |
||||
|
class-attribute-naming-style=any |
||||
|
|
||||
|
# Regular expression matching correct class attribute names. Overrides class- |
||||
|
# attribute-naming-style |
||||
|
#class-attribute-rgx= |
||||
|
|
||||
|
# Naming style matching correct class names |
||||
|
class-naming-style=PascalCase |
||||
|
|
||||
|
# Regular expression matching correct class names. Overrides class-naming-style |
||||
|
#class-rgx= |
||||
|
|
||||
|
# Naming style matching correct constant names |
||||
|
const-naming-style=UPPER_CASE |
||||
|
|
||||
|
# Regular expression matching correct constant names. Overrides const-naming- |
||||
|
# style |
||||
|
#const-rgx= |
||||
|
|
||||
|
# Minimum line length for functions/classes that require docstrings, shorter |
||||
|
# ones are exempt. |
||||
|
docstring-min-length=-1 |
||||
|
|
||||
|
# Naming style matching correct function names |
||||
|
function-naming-style=snake_case |
||||
|
|
||||
|
# Regular expression matching correct function names. Overrides function- |
||||
|
# naming-style |
||||
|
#function-rgx= |
||||
|
|
||||
|
# Good variable names which should always be accepted, separated by a comma |
||||
|
good-names=i, |
||||
|
j, |
||||
|
k, |
||||
|
ex, |
||||
|
Run, |
||||
|
_ |
||||
|
|
||||
|
# Include a hint for the correct naming format with invalid-name |
||||
|
include-naming-hint=no |
||||
|
|
||||
|
# Naming style matching correct inline iteration names |
||||
|
inlinevar-naming-style=any |
||||
|
|
||||
|
# Regular expression matching correct inline iteration names. Overrides |
||||
|
# inlinevar-naming-style |
||||
|
#inlinevar-rgx= |
||||
|
|
||||
|
# Naming style matching correct method names |
||||
|
method-naming-style=snake_case |
||||
|
|
||||
|
# Regular expression matching correct method names. Overrides method-naming- |
||||
|
# style |
||||
|
#method-rgx= |
||||
|
|
||||
|
# Naming style matching correct module names |
||||
|
module-naming-style=snake_case |
||||
|
|
||||
|
# Regular expression matching correct module names. Overrides module-naming- |
||||
|
# style |
||||
|
#module-rgx= |
||||
|
|
||||
|
# Colon-delimited sets of names that determine each other's naming style when |
||||
|
# the name regexes allow several styles. |
||||
|
name-group= |
||||
|
|
||||
|
# Regular expression which should only match function or class names that do |
||||
|
# not require a docstring. |
||||
|
no-docstring-rgx=^_ |
||||
|
|
||||
|
# List of decorators that produce properties, such as abc.abstractproperty. Add |
||||
|
# to this list to register other decorators that produce valid properties. |
||||
|
property-classes=abc.abstractproperty |
||||
|
|
||||
|
# Naming style matching correct variable names |
||||
|
variable-naming-style=snake_case |
||||
|
|
||||
|
# Regular expression matching correct variable names. Overrides variable- |
||||
|
# naming-style |
||||
|
#variable-rgx= |
||||
|
|
||||
|
|
||||
|
[SPELLING] |
||||
|
|
||||
|
# Limits count of emitted suggestions for spelling mistakes |
||||
|
max-spelling-suggestions=4 |
||||
|
|
||||
|
# Spelling dictionary name. Available dictionaries: none. To make it working |
||||
|
# install python-enchant package. |
||||
|
spelling-dict= |
||||
|
|
||||
|
# List of comma separated words that should not be checked. |
||||
|
spelling-ignore-words= |
||||
|
|
||||
|
# A path to a file that contains private dictionary; one word per line. |
||||
|
spelling-private-dict-file= |
||||
|
|
||||
|
# Tells whether to store unknown words to indicated private dictionary in |
||||
|
# --spelling-private-dict-file option instead of raising a message. |
||||
|
spelling-store-unknown-words=no |
||||
|
|
||||
|
|
||||
|
[DESIGN] |
||||
|
|
||||
|
# Maximum number of arguments for function / method |
||||
|
max-args=5 |
||||
|
|
||||
|
# Maximum number of attributes for a class (see R0902). |
||||
|
max-attributes=7 |
||||
|
|
||||
|
# Maximum number of boolean expressions in a if statement |
||||
|
max-bool-expr=5 |
||||
|
|
||||
|
# Maximum number of branch for function / method body |
||||
|
max-branches=12 |
||||
|
|
||||
|
# Maximum number of locals for function / method body |
||||
|
max-locals=15 |
||||
|
|
||||
|
# Maximum number of parents for a class (see R0901). |
||||
|
max-parents=7 |
||||
|
|
||||
|
# Maximum number of public methods for a class (see R0904). |
||||
|
max-public-methods=20 |
||||
|
|
||||
|
# Maximum number of return / yield for function / method body |
||||
|
max-returns=6 |
||||
|
|
||||
|
# Maximum number of statements in function / method body |
||||
|
max-statements=50 |
||||
|
|
||||
|
# Minimum number of public methods for a class (see R0903). |
||||
|
min-public-methods=2 |
||||
|
|
||||
|
|
||||
|
[IMPORTS] |
||||
|
|
||||
|
# Allow wildcard imports from modules that define __all__. |
||||
|
allow-wildcard-with-all=no |
||||
|
|
||||
|
# Analyse import fallback blocks. This can be used to support both Python 2 and |
||||
|
# 3 compatible code, which means that the block might have code that exists |
||||
|
# only in one or another interpreter, leading to false positives when analysed. |
||||
|
analyse-fallback-blocks=no |
||||
|
|
||||
|
# Deprecated modules which should not be used, separated by a comma |
||||
|
deprecated-modules=optparse,tkinter.tix |
||||
|
|
||||
|
# Create a graph of external dependencies in the given file (report RP0402 must |
||||
|
# not be disabled) |
||||
|
ext-import-graph= |
||||
|
|
||||
|
# Create a graph of every (i.e. internal and external) dependencies in the |
||||
|
# given file (report RP0402 must not be disabled) |
||||
|
import-graph= |
||||
|
|
||||
|
# Create a graph of internal dependencies in the given file (report RP0402 must |
||||
|
# not be disabled) |
||||
|
int-import-graph= |
||||
|
|
||||
|
# Force import order to recognize a module as part of the standard |
||||
|
# compatibility libraries. |
||||
|
known-standard-library= |
||||
|
|
||||
|
# Force import order to recognize a module as part of a third party library. |
||||
|
known-third-party=enchant |
||||
|
|
||||
|
|
||||
|
[CLASSES] |
||||
|
|
||||
|
# List of method names used to declare (i.e. assign) instance attributes. |
||||
|
defining-attr-methods=__init__, |
||||
|
__new__, |
||||
|
setUp |
||||
|
|
||||
|
# List of member names, which should be excluded from the protected access |
||||
|
# warning. |
||||
|
exclude-protected=_asdict, |
||||
|
_fields, |
||||
|
_replace, |
||||
|
_source, |
||||
|
_make |
||||
|
|
||||
|
# List of valid names for the first argument in a class method. |
||||
|
valid-classmethod-first-arg=cls |
||||
|
|
||||
|
# List of valid names for the first argument in a metaclass class method. |
||||
|
valid-metaclass-classmethod-first-arg=mcs |
||||
|
|
||||
|
|
||||
|
[EXCEPTIONS] |
||||
|
|
||||
|
# Exceptions that will emit a warning when being caught. Defaults to |
||||
|
# "Exception" |
||||
|
overgeneral-exceptions=Exception |
@ -1 +1,2 @@ |
|||||
from corvus.api.authentication_api import auth_blueprint |
|
||||
|
"""API blueprint exports.""" |
||||
|
from corvus.api.authentication_api import AUTH_BLUEPRINT |
@ -1,44 +1,52 @@ |
|||||
|
"""Authentication API blueprint and endpoint definitions.""" |
||||
from flask import Blueprint, g |
from flask import Blueprint, g |
||||
|
|
||||
from corvus.api.decorators import return_json |
from corvus.api.decorators import return_json |
||||
from corvus.api.model import APIResponse |
from corvus.api.model import APIResponse |
||||
from corvus.middleware import authentication_middleware |
from corvus.middleware import authentication_middleware |
||||
from corvus.service import user_token_service, authentication_service |
|
||||
|
from corvus.service import ( |
||||
|
user_token_service, |
||||
|
authentication_service, |
||||
|
user_service |
||||
|
) |
||||
|
|
||||
auth_blueprint = Blueprint( |
|
||||
|
AUTH_BLUEPRINT = Blueprint( |
||||
name='auth', import_name=__name__, url_prefix='/auth') |
name='auth', import_name=__name__, url_prefix='/auth') |
||||
|
|
||||
|
|
||||
@auth_blueprint.route('/login', methods=['POST']) |
|
||||
|
@AUTH_BLUEPRINT.route('/login', methods=['POST']) |
||||
@return_json |
@return_json |
||||
@authentication_middleware.require_basic_auth |
@authentication_middleware.require_basic_auth |
||||
def login() -> APIResponse: |
def login() -> APIResponse: |
||||
""" |
""" |
||||
Get a token for continued authentication |
|
||||
|
Get a token for continued authentication. |
||||
|
|
||||
:return: A login token for continued authentication |
:return: A login token for continued authentication |
||||
""" |
""" |
||||
user_token = user_token_service.create(g.user) |
user_token = user_token_service.create(g.user) |
||||
return APIResponse({'token': user_token.token}, 200) |
return APIResponse({'token': user_token.token}, 200) |
||||
|
|
||||
|
|
||||
@auth_blueprint.route('/bump', methods=['POST']) |
|
||||
|
@AUTH_BLUEPRINT.route('/bump', methods=['POST']) |
||||
@return_json |
@return_json |
||||
@authentication_middleware.require_token_auth |
@authentication_middleware.require_token_auth |
||||
def login_bump() -> APIResponse: |
def login_bump() -> APIResponse: |
||||
""" |
""" |
||||
Update the user last seen timestamp |
|
||||
|
Update the user last seen timestamp. |
||||
|
|
||||
:return: A time stamp for the bumped login |
:return: A time stamp for the bumped login |
||||
""" |
""" |
||||
authentication_service.bump_login(g.user) |
|
||||
|
user_service.update_last_login_time(g.user) |
||||
return APIResponse({'last_login_time': g.user.last_login_time}, 200) |
return APIResponse({'last_login_time': g.user.last_login_time}, 200) |
||||
|
|
||||
|
|
||||
@auth_blueprint.route('/logout', methods=['POST']) |
|
||||
|
@AUTH_BLUEPRINT.route('/logout', methods=['POST']) |
||||
@return_json |
@return_json |
||||
@authentication_middleware.require_token_auth |
@authentication_middleware.require_token_auth |
||||
def logout() -> APIResponse: |
def logout() -> APIResponse: |
||||
""" |
""" |
||||
logout and delete a token |
|
||||
|
Logout and delete a token. |
||||
|
|
||||
:return: |
:return: |
||||
""" |
""" |
||||
authentication_service.logout(g.user_token) |
authentication_service.logout(g.user_token) |
||||
|
@ -1,6 +1,9 @@ |
|||||
|
"""Model definitions for the api module.""" |
||||
from typing import Any, NamedTuple |
from typing import Any, NamedTuple |
||||
|
|
||||
|
|
||||
class APIResponse(NamedTuple): |
|
||||
|
class APIResponse(NamedTuple): # pylint: disable=too-few-public-methods |
||||
|
"""Custom class to wrap api responses.""" |
||||
|
|
||||
payload: Any |
payload: Any |
||||
status: int |
status: int |
@ -0,0 +1,10 @@ |
|||||
|
"""Database configuration and methods.""" |
||||
|
from flask_migrate import upgrade |
||||
|
from flask_sqlalchemy import SQLAlchemy |
||||
|
|
||||
|
db: SQLAlchemy = SQLAlchemy() |
||||
|
|
||||
|
|
||||
|
def init_db() -> None: |
||||
|
"""Clear existing data and create new tables.""" |
||||
|
upgrade('migrations') |
@ -1,3 +1,5 @@ |
|||||
|
"""Default settings for corvus.""" |
||||
|
|
||||
DEBUG = False |
DEBUG = False |
||||
SECRET_KEY = b'\xb4\x89\x0f\x0f\xe5\x88\x97\xfe\x8d<\x0b@d\xe9\xa5\x87%' \ |
SECRET_KEY = b'\xb4\x89\x0f\x0f\xe5\x88\x97\xfe\x8d<\x0b@d\xe9\xa5\x87%' \ |
||||
b'\xc6\xf0@l1\xe3\x90g\xfaA.?u=s' # CHANGE ME IN REAL CONFIG |
b'\xc6\xf0@l1\xe3\x90g\xfaA.?u=s' # CHANGE ME IN REAL CONFIG |
||||
|
@ -0,0 +1 @@ |
|||||
|
"""Middleware package.""" |
@ -1 +1,2 @@ |
|||||
|
"""Expose models to be used in Corvus.""" |
||||
from corvus.model.user_model import User, UserToken |
from corvus.model.user_model import User, UserToken |
@ -0,0 +1 @@ |
|||||
|
"""Service package.""" |
@ -1,18 +0,0 @@ |
|||||
from datetime import date |
|
||||
from typing import Any |
|
||||
|
|
||||
import rfc3339 |
|
||||
from flask.json import JSONEncoder |
|
||||
|
|
||||
|
|
||||
class CustomJSONEncoder(JSONEncoder): |
|
||||
def default(self, obj: Any) -> Any: |
|
||||
try: |
|
||||
if isinstance(obj, date): |
|
||||
return rfc3339.format(obj) |
|
||||
iterable = iter(obj) |
|
||||
except TypeError: |
|
||||
pass |
|
||||
else: |
|
||||
return list(iterable) |
|
||||
return JSONEncoder.default(self, obj) |
|
@ -0,0 +1 @@ |
|||||
|
"""Utilities for Corvus.""" |
@ -0,0 +1,14 @@ |
|||||
|
"""Authentication specific utilities.""" |
||||
|
from typing import Tuple |
||||
|
|
||||
|
from nacl import pwhash |
||||
|
|
||||
|
|
||||
|
def get_password_hash(password: str) -> Tuple[str, int]: |
||||
|
""" |
||||
|
Retrieve argon2id password hash. |
||||
|
|
||||
|
:param password: plaintext password to convert |
||||
|
:return: Tuple[password_hash, password_revision] |
||||
|
""" |
||||
|
return pwhash.argon2id.str(password.encode('utf8')).decode('utf8'), 1 |
@ -0,0 +1,22 @@ |
|||||
|
"""JSON specific utilities.""" |
||||
|
from datetime import date |
||||
|
from typing import Any |
||||
|
|
||||
|
import rfc3339 |
||||
|
from flask.json import JSONEncoder |
||||
|
|
||||
|
|
||||
|
class CustomJSONEncoder(JSONEncoder): |
||||
|
"""Ensure that datetime values are serialized correctly.""" |
||||
|
|
||||
|
def default(self, o: Any) -> Any: # pylint: disable=E0202 |
||||
|
"""Handle encoding date and datetime objects according to rfc3339.""" |
||||
|
try: |
||||
|
if isinstance(o, date): |
||||
|
return rfc3339.format(o) |
||||
|
iterable = iter(o) |
||||
|
except TypeError: |
||||
|
pass |
||||
|
else: |
||||
|
return list(iterable) |
||||
|
return JSONEncoder.default(self, o) |
@ -1,10 +1,10 @@ |
|||||
#!/usr/bin/env bash |
#!/usr/bin/env bash |
||||
|
|
||||
# Migrate the Database |
# Migrate the Database |
||||
FLASK_APP=corvus:app flask db upgrade |
|
||||
|
FLASK_APP=corvus:corvus flask db upgrade |
||||
|
|
||||
# Make sure an administrator is registered |
# Make sure an administrator is registered |
||||
python manage.py user register-admin |
python manage.py user register-admin |
||||
|
|
||||
# Start the application |
# Start the application |
||||
gunicorn -b 0.0.0.0:8080 corvus:app |
|
||||
|
gunicorn -b 0.0.0.0:8080 corvus:corvus |
Write
Preview
Loading…
Cancel
Save
Reference in new issue