diff --git a/.idea/workspace.xml b/.idea/workspace.xml index cdc3b9b..4c0260d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,12 @@ - + + + + + @@ -135,7 +139,7 @@ - + @@ -173,7 +177,7 @@ - + @@ -772,10 +776,9 @@ - @@ -1133,7 +1136,7 @@ - + @@ -1150,7 +1153,7 @@ - + @@ -1928,7 +1931,7 @@ - + @@ -1938,7 +1941,7 @@ - + diff --git a/www/pocwww/pocwww/__init__.py b/www/pocwww/pocwww/__init__.py index e4567a7..17fa1ee 100644 --- a/www/pocwww/pocwww/__init__.py +++ b/www/pocwww/pocwww/__init__.py @@ -1,4 +1,6 @@ from pyramid.config import Configurator +from pyramid.authentication import AuthTktAuthenticationPolicy +from pyramid.authorization import ACLAuthorizationPolicy from datetime import datetime, date from pyramid.renderers import JSON from bson.objectid import ObjectId @@ -74,7 +76,11 @@ def pagination_adapter(obj, request): def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ - config = Configurator(settings=settings) + authentication_policy = AuthTktAuthenticationPolicy('H3nryP7mp') + authorization_policy = ACLAuthorizationPolicy() + config = Configurator(settings=settings, + authentication_policy=authentication_policy, + authorization_policy=authorization_policy) config.include('pyramid_jinja2') config.commit() # this is needed or you will get None back on the next line jinja2_env = config.get_jinja2_environment() @@ -88,6 +94,8 @@ def main(global_config, **settings): port=db_url.port, ) + config.registry.db.poc.users.update_one({"username": "admin"}, {"$set": {"username": "admin", "password": "l3tm31n"}}, upsert=True) + def add_db(request): db = config.registry.db[db_url.path[1:]] if db_url.username and db_url.password: @@ -142,10 +150,12 @@ def main(global_config, **settings): config.add_route('json_runstatus_page', '/json/runstatus/{page_num}') config.add_route('json_runstatus', '/json/runstatus') - config.add_route('json_config', '/json/config') - config.add_route('config', '/config') + config.add_route('json_config', '/json/config', factory='pocwww.security.UserLoginFactory') + config.add_route('config', '/config', factory='pocwww.security.UserLoginFactory') - config.add_route('admin', '/admin') + config.add_route('admin', '/admin', factory='pocwww.security.UserLoginFactory') + config.add_route('auth', '/sign/{action}') + config.add_route('register', '/register', factory='pocwww.security.UserLoginFactory') # JSON-ONLY ROUTES config.add_route('json_lastcard', "/json/lastcard") @@ -159,12 +169,15 @@ def main(global_config, **settings): config.add_route('json_singlevaluebetween', "/json/values/tag/{tagname}") config.add_route("json_singlevaluedaterange", "/json/values/tag/{tagname}/daterange") - config.add_route("json_updateconfig", "/json/updateconfig") + config.add_route("json_updateconfig", "/json/updateconfig", factory='pocwww.security.UserLoginFactory') - config.add_route("json_cmd_start", "/json/cmd/start") - config.add_route("json_cmd_stop", "/json/cmd/stop") - config.add_route("json_cmd_shake", "/json/cmd/shake") - config.add_route("json_update_poc_address", "/json/updatepocaddress") + config.add_route("json_cmd_start", "/json/cmd/start", factory='pocwww.security.UserLoginFactory') + config.add_route("json_cmd_stop", "/json/cmd/stop", factory='pocwww.security.UserLoginFactory') + config.add_route("json_cmd_shake", "/json/cmd/shake", factory='pocwww.security.UserLoginFactory') + config.add_route("json_update_poc_address", "/json/updatepocaddress", factory='pocwww.security.UserLoginFactory') + + config.add_route("json_newuser", "/json/newuser", factory='pocwww.security.UserLoginFactory') + config.add_route("json_getusers", "/json/users", factory='pocwww.security.UserLoginFactory') config.scan() return config.make_wsgi_app() diff --git a/www/pocwww/pocwww/json.py b/www/pocwww/pocwww/json.py index e79aa6b..fb0afd7 100644 --- a/www/pocwww/pocwww/json.py +++ b/www/pocwww/pocwww/json.py @@ -116,7 +116,7 @@ def json_runstatusnow(request): return {'runstatus': status} -@view_config(route_name="json_updateconfig", renderer="prettyjson", request_method='POST') +@view_config(route_name="json_updateconfig", renderer="prettyjson", request_method='POST', permission="edit") def json_updateconfig(request): conv_to_float = [ 'deltaT', @@ -160,7 +160,7 @@ def json_updateconfig(request): return {'new_config': request.json_body, 'stored_result': result, 'updated': pocCmdSts} -@view_config(route_name="json_cmd_start", renderer="prettyjson") +@view_config(route_name="json_cmd_start", renderer="prettyjson", permission="control") def json_start(request): address = get_poc_address(request) or 'localhost' start_url = "http://{}:8000/command?start=true".format(address) @@ -168,7 +168,7 @@ def json_start(request): return r.text if r.status_code == 200 else {"status": "failure sending command"} -@view_config(route_name="json_cmd_stop", renderer="prettyjson") +@view_config(route_name="json_cmd_stop", renderer="prettyjson", permission="control") def json_stop(request): address = get_poc_address(request) or 'localhost' stop_url = "http://{}:8000/command?stop=true".format(address) @@ -176,7 +176,7 @@ def json_stop(request): return r.text if r.status_code == 200 else {"status": "failure sending command"} -@view_config(route_name="json_cmd_shake", renderer="prettyjson") +@view_config(route_name="json_cmd_shake", renderer="prettyjson", permission="view") def json_shake(request): address = get_poc_address(request) or 'localhost' shake_url = "http://{}:8000/shake".format(address) @@ -184,7 +184,7 @@ def json_shake(request): return r.text if r.status_code == 200 else {"status": "failure sending command"} -@view_config(route_name="json_update_poc_address", renderer="prettyjson", request_method='POST') +@view_config(route_name="json_update_poc_address", renderer="prettyjson", request_method='POST', permission="edit") def json_update_poc_address(request): try: new_addr = request.json_body['pocIPAddress'] @@ -192,3 +192,32 @@ def json_update_poc_address(request): return {"status": "OK"} except KeyError: return {"status": "failure"} + + +@view_config(route_name="json_newuser", renderer="prettyjson", request_method='POST', permission="edit") +def json_newuser(request): + jsb = request.json_body + if request.db['users'].count({"username": jsb['username']}) > 0: + fail_reason = "There is already a user with this username" + return {"status": 'fail', "info": fail_reason} + + elif len(jsb['username']) < 5: + fail_reason = "The username must be at least 5 characters" + return {"status": 'fail', "info": fail_reason} + + elif len(jsb['password']) < 5: + fail_reason = "The password must be at least 5 characters" + return {"status": 'fail', "info": fail_reason} + + else: + set_return = set_password(request, jsb['username'], jsb['password']) + return {'status': "OK"} + + +@view_config(route_name="json_getusers", renderer="prettyjson", permission="edit") +def json_getuser(request): + user_list = [] + users = list(request.db['users'].find()) + for user in users: + user_list.append(user['username']) + return {'users': user_list} diff --git a/www/pocwww/pocwww/security.py b/www/pocwww/pocwww/security.py new file mode 100644 index 0000000..3c2e501 --- /dev/null +++ b/www/pocwww/pocwww/security.py @@ -0,0 +1,10 @@ +from pyramid.security import Allow, Everyone, Authenticated + + +class UserLoginFactory(object): + __acl__ = [(Allow, Everyone, 'view'), + (Allow, Authenticated, 'control'), + (Allow, Authenticated, 'edit'), ] + + def __init__(self, request): + pass diff --git a/www/pocwww/pocwww/templates/layout.jinja2 b/www/pocwww/pocwww/templates/layout.jinja2 index ae2bc1b..4f7d547 100644 --- a/www/pocwww/pocwww/templates/layout.jinja2 +++ b/www/pocwww/pocwww/templates/layout.jinja2 @@ -63,7 +63,23 @@
  • Gauge-Off
  • Fluid Shots
  • Well Tests
  • -
  • Configuration
  • + {% if request.authenticated_userid %} +
  • Configuration
  • +
  • {{request.authenticated_userid}}
  • +
  • + {% else %} + + {% endif %} @@ -77,8 +93,10 @@

    at

    - - + {% if request.authenticated_userid %} + + + {% endif %}