diff --git a/backend/flask/src/clipperz/api.py b/backend/flask/src/clipperz/api.py index 4f6a277..3ced864 100644 --- a/backend/flask/src/clipperz/api.py +++ b/backend/flask/src/clipperz/api.py @@ -438,6 +438,11 @@ class message(HandlerMixin): result['oldestUsedEncryptedVersion'] = oldest_encryption_version result['versions'] = record_versions result['currentVersion'] = record.current_record_version.reference + record.current_record_version.access() + record.access() + db.session.add(record) + db.session.add(record_version) + db.session.commit() return jsonify({'result': result}) @login_required @@ -659,6 +664,15 @@ class message(HandlerMixin): result['result'] = 'done' return jsonify({'result': result}) + @login_required + def getCertificatesStatus(self, parameters, request): + """ + Provides support for BTC Certificate feature. + + No idea how it works. + """ + return jsonify({'result': {}}) + class logout(HandlerMixin): diff --git a/backend/flask/src/clipperz/models.py b/backend/flask/src/clipperz/models.py index 61ca25d..6403881 100644 --- a/backend/flask/src/clipperz/models.py +++ b/backend/flask/src/clipperz/models.py @@ -87,8 +87,11 @@ class RecordVersion(db.Model): order_by=id, cascade='all,delete')) - def __init__(self): + def __init__(self, record=None): """Initialize a record version.""" + if record: + self.record = record + self.record_id = record.id self.creation_date = datetime.datetime.utcnow() def update(self, someData): @@ -101,8 +104,12 @@ class RecordVersion(db.Model): self.version = self.record.version self.previous_version_key = recordVersionData['previousVersionKey'] self.update_date = datetime.datetime.utcnow() + self.access_date = datetime.datetime.utcnow() self.record.update(someData['record'], self) + + def access(self): + self.access_date = datetime.datetime.now() # ------------------------------------------------------------------------------ @@ -128,8 +135,11 @@ class Record(db.Model): uselist=False, cascade='save-update, merge, delete, delete-orphan') - def __init__(self): + def __init__(self, user=None): """Initialize a record.""" + if user: + self.user_id = user.id + self.version = 1 self.creation_date = datetime.datetime.utcnow() def update(self, data, record_version): @@ -138,11 +148,12 @@ class Record(db.Model): self.data = data['data'] self.api_version = data['version'] self.update_date = datetime.datetime.now() + self.access_date = datetime.datetime.now() self.current_record_version = record_version - if self.version: - self.version += 1 - else: - self.version = 1 + self.version += 1 + + def access(self): + self.access_date = datetime.datetime.now() # ------------------------------------------------------------------------------ diff --git a/backend/flask/src/clipperz/views.py b/backend/flask/src/clipperz/views.py index 0bece2a..79fbaea 100644 --- a/backend/flask/src/clipperz/views.py +++ b/backend/flask/src/clipperz/views.py @@ -1,10 +1,11 @@ """Clipperz views.""" -from flask import session, request, g +from flask import session, request, g, send_from_directory from clipperz import app, db, lm from .models import User from .api import * # NOQA from .exceptions import InvalidUsage from flask.ext.login import login_required +from os.path import dirname @lm.user_loader @@ -113,19 +114,25 @@ def dump(frontend_version): @app.route('/beta/') def beta(path): """Fallback for serving beta version.""" - return send_from_directory('beta', path) + here = dirname(__file__) + file_path = "{0}/../beta/".format(here) + return send_from_directory(file_path, path) @app.route('/gamma/') def gamma(path): """Fallback for serving gamma version.""" - return send_from_directory('gamma', path) + here = dirname(__file__) + file_path = "{0}/../gamma/".format(here) + return send_from_directory(file_path, path) @app.route('/delta/') def delta(path): """Fallback for serving delta version.""" - return send_from_directory('delta', path) + here = dirname(__file__) + file_path = "{0}/../delta/".format(here) + return send_from_directory(file_path, path) @app.route('/pm', methods=['GET', 'OPTIONS', 'POST']) @@ -133,8 +140,9 @@ def pm(): """Main request handler.""" method = request.form['method'] if method not in globals(): + app.logger.error(method) raise InvalidUsage('This method is not yet implemented', status_code=501) - handler = globals()[method]() app.logger.debug(method) + handler = globals()[method]() return handler.handle_request(request) diff --git a/backend/flask/src/config.py b/backend/flask/src/config.py index a32c6f7..c3fff6b 100644 --- a/backend/flask/src/config.py +++ b/backend/flask/src/config.py @@ -3,16 +3,13 @@ import os basedir = os.path.abspath(os.path.dirname(__file__)) -CSRF_ENABLED = True - - if os.environ.get('DATABASE_URL') is None: SQLALCHEMY_DATABASE_URI = ('sqlite:///' + os.path.join(basedir, 'app.db') + '?check_same_thread=False') else: SQLALCHEMY_DATABASE_URI = os.environ['DATABASE_URL'] SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') -SQLALCHEMY_RECRD_QUERIES = True +SQLALCHEMY_RECORD_QUERIES = True ADMINS = ['you@example.com'] @@ -20,15 +17,20 @@ ADMINS = ['you@example.com'] class Config(object): DEBUG = False TESTING = False - SQLALCHEMY_ECHO = False + CSRF_ENABLED = True WTF_CSRF_ENABLED = True SECRET_KEY = 'you-will-never-guess' sessionTimeout = datetime.timedelta(minutes=-2) + SQLALCHEMY_ECHO = False + SQLALCHEMY_DATABASE_URI = SQLALCHEMY_DATABASE_URI + SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') + class DevelopmentConfig(Config): DEBUG = True SQLALCHEMY_ECHO = True + SQLALCHEMY_RECORD_QUERIES = True class TestingConfig(Config): diff --git a/backend/flask/src/nginx.conf.example b/backend/flask/src/nginx.conf.example new file mode 100644 index 0000000..8dad8ce --- /dev/null +++ b/backend/flask/src/nginx.conf.example @@ -0,0 +1,11 @@ + location /pm { + auth_basic "Restricted"; + auth_basic_user_file /etc/nginx/.htpasswd; + try_files $uri $uri/ @pm; + } + location @pm { + include uwsgi_params; + uwsgi_param SCRIPT_NAME /pm; + uwsgi_modifier1 30; + uwsgi_pass unix:/run/uwsgi/pm.sock; + } diff --git a/backend/flask/src/run.py b/backend/flask/src/run.py new file mode 100644 index 0000000..5fa654f --- /dev/null +++ b/backend/flask/src/run.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +from clipperz import app, db + + +def main(): + db.create_all() + app.run(debug=True) + +if __name__ == "__main__": + main() diff --git a/backend/flask/src/uwsg-emperor.ini.example b/backend/flask/src/uwsg-emperor.ini.example new file mode 100644 index 0000000..d301077 --- /dev/null +++ b/backend/flask/src/uwsg-emperor.ini.example @@ -0,0 +1,28 @@ +[uwsgi] +plugin = python +socket = /run/uwsgi/%n.sock +chmod-socket = 660 +master = true +processes = 1 +uid = clipperz +gid = clipperz +umask = 027 +procname-master = uwsgi pm + +vacuum = true + +die-on-term = true + +base = /home/clipperz/password-manager/target/flask/ +module = clipperz +callable = app +venv = /home/clipperz/password-manager/target/flask/ + +#the variable that holds a flask application inside the module imported at line #6 +callable = app + +#location of log files +logto = /var/log/uwsgi/%n.log + +env = PYTHON_EGG_CACHE=/var/tmp/clipperz +env = DATABASE_URL = 'mysql://clipperz:clipperz@localhost/clipperz'