| @@ -1,2 +1,3 @@ | |||||
| __pycache__ | __pycache__ | ||||
| src/app/sessions/ | src/app/sessions/ | ||||
| logs/ | |||||
| @@ -1,6 +1,5 @@ | |||||
| version: "2" | version: "2" | ||||
| services: | services: | ||||
| db: | db: | ||||
| build: | build: | ||||
| context: ./mysql | context: ./mysql | ||||
| @@ -11,11 +10,12 @@ services: | |||||
| app: | app: | ||||
| env_file: | env_file: | ||||
| - .env | |||||
| build: | |||||
| context: ./src | |||||
| dockerfile: Dockerfile | |||||
| - .env | |||||
| build: | |||||
| context: ./src | |||||
| dockerfile: Dockerfile | |||||
| volumes: | |||||
| - ./logs/:/logs/:rw | |||||
| ports: | ports: | ||||
| - "80${groupid}:8080" | - "80${groupid}:8080" | ||||
| - "4${groupid}:443" | - "4${groupid}:443" | ||||
| @@ -26,10 +26,8 @@ services: | |||||
| ipv4_address: 10.${groupid}.0.6 | ipv4_address: 10.${groupid}.0.6 | ||||
| networks: | networks: | ||||
| backend: | backend: | ||||
| driver: bridge | driver: bridge | ||||
| ipam: | ipam: | ||||
| config: | |||||
| - subnet: 10.${groupid}.0.0/18 | |||||
| config: | |||||
| - subnet: 10.${groupid}.0.0/18 | |||||
| @@ -1,6 +1,11 @@ | |||||
| from views.app import app | from views.app import app | ||||
| import logging | |||||
| logging.basicConfig( | |||||
| filename='/logs/beelance.log', | |||||
| filemode='a', | |||||
| level=logging.INFO, | |||||
| ) | |||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| app.run() | app.run() | ||||
| @@ -1,6 +1,10 @@ | |||||
| from models.database import db | from models.database import db | ||||
| import logging | |||||
| import mysql.connector | import mysql.connector | ||||
| logger = logging.getLogger(__name__) | |||||
| def get_categories(): | def get_categories(): | ||||
| """ | """ | ||||
| Get all categories | Get all categories | ||||
| @@ -14,7 +18,7 @@ def get_categories(): | |||||
| cursor.execute(query) | cursor.execute(query) | ||||
| categories = cursor.fetchall() | categories = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| categories = [] | categories = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -23,6 +27,7 @@ def get_categories(): | |||||
| db.close() | db.close() | ||||
| return categories | return categories | ||||
| def set_project(categoryid, userid, project_title, project_description, project_status): | def set_project(categoryid, userid, project_title, project_description, project_status): | ||||
| """ | """ | ||||
| Store a project in the database | Store a project in the database | ||||
| @@ -48,7 +53,7 @@ def set_project(categoryid, userid, project_title, project_description, project_ | |||||
| users_projects = get_projects_by_owner(userid) | users_projects = get_projects_by_owner(userid) | ||||
| projectid = users_projects[-1][0] | projectid = users_projects[-1][0] | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| projectid = None | projectid = None | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -57,6 +62,7 @@ def set_project(categoryid, userid, project_title, project_description, project_ | |||||
| db.close() | db.close() | ||||
| return projectid | return projectid | ||||
| def get_project_by_id(projectid): | def get_project_by_id(projectid): | ||||
| """ | """ | ||||
| Retrieve a project by its id | Retrieve a project by its id | ||||
| @@ -72,7 +78,7 @@ def get_project_by_id(projectid): | |||||
| cursor.execute(query, (projectid,)) | cursor.execute(query, (projectid,)) | ||||
| project = cursor.fetchall() | project = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| project = [] | project = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -81,6 +87,7 @@ def get_project_by_id(projectid): | |||||
| db.close() | db.close() | ||||
| return project[0] | return project[0] | ||||
| def update_project_status(projectid, status): | def update_project_status(projectid, status): | ||||
| """ | """ | ||||
| Change the status of a selected project | Change the status of a selected project | ||||
| @@ -96,13 +103,14 @@ def update_project_status(projectid, status): | |||||
| cursor.execute(query, (status, projectid)) | cursor.execute(query, (status, projectid)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| cursor.close() | cursor.close() | ||||
| db.close() | db.close() | ||||
| def get_user_permissions(userid, projectid): | def get_user_permissions(userid, projectid): | ||||
| """ | """ | ||||
| Get permissions for a selected users in a specific project | Get permissions for a selected users in a specific project | ||||
| @@ -120,7 +128,7 @@ def get_user_permissions(userid, projectid): | |||||
| cursor.execute(query, (projectid, userid)) | cursor.execute(query, (projectid, userid)) | ||||
| permissions = cursor.fetchall() | permissions = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -154,7 +162,7 @@ def get_projects_by_status_and_category(categoryid, project_status): | |||||
| cursor.execute(query, (project_status, categoryid)) | cursor.execute(query, (project_status, categoryid)) | ||||
| projects = cursor.fetchall() | projects = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| projects = [] | projects = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -178,7 +186,7 @@ def get_projects_by_owner(userid): | |||||
| cursor.execute(query, (userid,)) | cursor.execute(query, (userid,)) | ||||
| projects = cursor.fetchall() | projects = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| projects = [] | projects = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -206,7 +214,7 @@ def get_projects_by_status_and_owner(userid, project_status): | |||||
| cursor.execute(query, (project_status, userid)) | cursor.execute(query, (project_status, userid)) | ||||
| projects = cursor.fetchall() | projects = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| projects = [] | projects = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -230,12 +238,11 @@ def get_projects_by_participant_and_status(userid, project_status): | |||||
| cursor = db.cursor() | cursor = db.cursor() | ||||
| query = ("SELECT * FROM projects, projects_users WHERE projects.project_status = %s AND " + | query = ("SELECT * FROM projects, projects_users WHERE projects.project_status = %s AND " + | ||||
| "projects_users.userid = %s AND projects_users.projectid = projects.projectid") | "projects_users.userid = %s AND projects_users.projectid = projects.projectid") | ||||
| db.connect() | |||||
| try: | try: | ||||
| cursor.execute(query, (project_status, userid)) | cursor.execute(query, (project_status, userid)) | ||||
| projects = cursor.fetchall() | projects = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| projects = [] | projects = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -266,7 +273,7 @@ def set_task(projectid, task_title, task_description, budget): | |||||
| cursor.execute(query, (projectid, task_title, task_description, budget)) | cursor.execute(query, (projectid, task_title, task_description, budget)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -282,7 +289,7 @@ def update_task_status(taskid, status): | |||||
| cursor.execute(query, (status, taskid)) | cursor.execute(query, (status, taskid)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -305,7 +312,7 @@ def get_tasks_by_project_id(projectid): | |||||
| cursor.execute(query, (projectid,)) | cursor.execute(query, (projectid,)) | ||||
| tasks = cursor.fetchall() | tasks = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| tasks = [] | tasks = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -331,7 +338,7 @@ def set_task_file(taskid, filename): | |||||
| cursor.execute(query, (taskid, filename)) | cursor.execute(query, (taskid, filename)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -353,7 +360,7 @@ def get_task_files(taskid): | |||||
| cursor.execute(query, (str(taskid),)) | cursor.execute(query, (str(taskid),)) | ||||
| filenames = cursor.fetchall() | filenames = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| filenames = [] | filenames = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -384,7 +391,7 @@ def set_projects_user(projectid, userid, read_permission="TRUE", | |||||
| cursor.execute(query, (projectid, userid, read_permission, write_permission, modify_permission)) | cursor.execute(query, (projectid, userid, read_permission, write_permission, modify_permission)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -1,6 +1,10 @@ | |||||
| from models.database import db | from models.database import db | ||||
| import logging | |||||
| import mysql.connector | import mysql.connector | ||||
| logger = logging.getLogger(__name__) | |||||
| def set_user(username, password, full_name, company, email, | def set_user(username, password, full_name, company, email, | ||||
| street_address, city, state, postal_code, country): | street_address, city, state, postal_code, country): | ||||
| """ | """ | ||||
| @@ -34,7 +38,7 @@ def set_user(username, password, full_name, company, email, | |||||
| city, state, postal_code, country)) | city, state, postal_code, country)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -1,6 +1,9 @@ | |||||
| from models.database import db | from models.database import db | ||||
| import logging | |||||
| import mysql.connector | import mysql.connector | ||||
| logger = logging.getLogger(__name__) | |||||
| def set_cookie(userid, token, expiry): | def set_cookie(userid, token, expiry): | ||||
| """ | """ | ||||
| @@ -16,7 +19,7 @@ def set_cookie(userid, token, expiry): | |||||
| cursor.execute(query, (userid, token, expiry)) | cursor.execute(query, (userid, token, expiry)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -42,7 +45,7 @@ def get_cookie(token): | |||||
| userid = users[0][0] | userid = users[0][0] | ||||
| expiry = users[0][1] | expiry = users[0][1] | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -65,7 +68,7 @@ def delete_cookie(token): | |||||
| cursor.execute(query, (token,)) | cursor.execute(query, (token,)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -1,6 +1,9 @@ | |||||
| from models.database import db | from models.database import db | ||||
| import logging | |||||
| import mysql.connector | import mysql.connector | ||||
| logger = logging.getLogger(__name__) | |||||
| def get_user(username): | def get_user(username): | ||||
| """ | """ | ||||
| @@ -20,7 +23,7 @@ def get_user(username): | |||||
| if len(users): | if len(users): | ||||
| user = users[0] | user = users[0] | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -41,7 +44,7 @@ def get_users(): | |||||
| cursor.execute(query) | cursor.execute(query) | ||||
| users = cursor.fetchall() | users = cursor.fetchall() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| users = [] | users = [] | ||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| @@ -62,7 +65,7 @@ def set_login_attempts(userid, num, timestamp): | |||||
| cursor.execute(query, (num, timestamp, userid)) | cursor.execute(query, (num, timestamp, userid)) | ||||
| db.commit() | db.commit() | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -87,7 +90,7 @@ def get_user_id_by_name(username): | |||||
| if(len(users)): | if(len(users)): | ||||
| userid = users[0][0] | userid = users[0][0] | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -112,7 +115,7 @@ def get_user_name_by_id(userid): | |||||
| if len(users): | if len(users): | ||||
| username = users[0][0] | username = users[0][0] | ||||
| except mysql.connector.Error as err: | except mysql.connector.Error as err: | ||||
| print("Failed executing query: {}".format(err)) | |||||
| logger.error("Failed executing query: %s", err) | |||||
| cursor.fetchall() | cursor.fetchall() | ||||
| exit(1) | exit(1) | ||||
| finally: | finally: | ||||
| @@ -1,3 +1,4 @@ | |||||
| [uwsgi] | [uwsgi] | ||||
| module = main | module = main | ||||
| callable = app | |||||
| callable = app | |||||
| logto = /logs/uwsgi.log | |||||
| @@ -3,11 +3,14 @@ from views.forms import login_form | |||||
| from views.utils import get_nav_bar, csrf_protected | from views.utils import get_nav_bar, csrf_protected | ||||
| import models.session | import models.session | ||||
| import models.user | import models.user | ||||
| import logging | |||||
| import random | import random | ||||
| import string | import string | ||||
| import bcrypt | import bcrypt | ||||
| import time | import time | ||||
| logger = logging.getLogger(__name__) | |||||
| # Get html templates | # Get html templates | ||||
| render = web.template.render('templates/') | render = web.template.render('templates/') | ||||
| @@ -60,10 +63,14 @@ class Login(): | |||||
| return render.login(nav, login_form, "- There have been too many incorrect login attempts for your account. You have to wait a minute before you can log in.") | return render.login(nav, login_form, "- There have been too many incorrect login attempts for your account. You have to wait a minute before you can log in.") | ||||
| if bcrypt.checkpw(data.password.encode('UTF-8'), password_hash.encode('UTF-8')): | if bcrypt.checkpw(data.password.encode('UTF-8'), password_hash.encode('UTF-8')): | ||||
| if login_attempts > login_attempts_threshold: | |||||
| logger.info("User %s logged in succesfully after %s attempts", username, login_attempts) | |||||
| models.user.set_login_attempts(userid, 0, time.time()) | models.user.set_login_attempts(userid, 0, time.time()) | ||||
| self.login(username, userid, data.remember) | self.login(username, userid, data.remember) | ||||
| raise web.seeother("/") | raise web.seeother("/") | ||||
| else: | else: | ||||
| logger.warning("Incorrect login attempt on user %s by IP %s", username, web.ctx.ip) | |||||
| models.user.set_login_attempts(userid, login_attempts+1, time.time()) | models.user.set_login_attempts(userid, login_attempts+1, time.time()) | ||||
| if login_attempts == login_attempts_threshold: | if login_attempts == login_attempts_threshold: | ||||
| return render.login(nav, login_form, "- Too many incorrect login attempts. You have to wait a minute before trying again.") | return render.login(nav, login_form, "- Too many incorrect login attempts. You have to wait a minute before trying again.") | ||||
| @@ -3,9 +3,12 @@ from views.forms import register_form | |||||
| from views.utils import get_nav_bar, csrf_protected, password_weakness | from views.utils import get_nav_bar, csrf_protected, password_weakness | ||||
| import models.register | import models.register | ||||
| import models.user | import models.user | ||||
| import logging | |||||
| import bcrypt | import bcrypt | ||||
| import re | import re | ||||
| logger = logging.getLogger(__name__) | |||||
| # Get html templates | # Get html templates | ||||
| render = web.template.render('templates/') | render = web.template.render('templates/') | ||||
| @@ -52,4 +55,5 @@ class Register: | |||||
| data.email, data.street_address, data.city, data.state, | data.email, data.street_address, data.city, data.state, | ||||
| data.postal_code, data.country) | data.postal_code, data.country) | ||||
| logger.info("User %s registered", data.username) | |||||
| return render.register(nav, register_form, "User registered!") | return render.register(nav, register_form, "User registered!") | ||||
| @@ -24,6 +24,8 @@ content_server=$content_server' }\n' | |||||
| content_server=$content_server" location $USE_STATIC_URL {\n" | content_server=$content_server" location $USE_STATIC_URL {\n" | ||||
| content_server=$content_server" alias $USE_STATIC_PATH;\n" | content_server=$content_server" alias $USE_STATIC_PATH;\n" | ||||
| content_server=$content_server' }\n' | content_server=$content_server' }\n' | ||||
| content_server=$content_server" error_log /logs/error_log_http.log warn;\n" | |||||
| content_server=$content_server" access_log /logs/access_log_http.log;\n" | |||||
| content_server=$content_server'}\n' | content_server=$content_server'}\n' | ||||
| @@ -44,6 +46,8 @@ content_server=$content_server' }\n' | |||||
| content_server=$content_server" location $USE_STATIC_URL {\n" | content_server=$content_server" location $USE_STATIC_URL {\n" | ||||
| content_server=$content_server" alias $USE_STATIC_PATH;\n" | content_server=$content_server" alias $USE_STATIC_PATH;\n" | ||||
| content_server=$content_server' }\n' | content_server=$content_server' }\n' | ||||
| content_server=$content_server" error_log /logs/error_log_https.log warn;\n" | |||||
| content_server=$content_server" access_log /logs/access_log_https.log;\n" | |||||
| content_server=$content_server'}\n' | content_server=$content_server'}\n' | ||||