Pastebin
Paste #24098: No description
< previous paste - next paste>
Pasted by Anonymous Coward
########### data.py from app import db from app.models import Challenge, ChallengeLevel, ChallengeCategory cl_veryeasy = ChallengeLevel() cl_veryeasy.sort_key = 100 cl_veryeasy.name = "Very Easy" cl_veryeasy.description = "Requires only a single step to get the flag. These are good if you are starting from scratch." cl_medium = ChallengeLevel() cl_medium.sort_key = 200 cl_medium.name = "Medium" cl_medium.description = "Moderate difficulty. Typically requires multiple steps to get the flag." cl_hard = ChallengeLevel() cl_hard.sort_key = 300 cl_hard.name = "Hard" cl_hard.description = "Harder challenges. Will typically require multiple or complex steps to solve. Or will require background knowledge in the subject." db.session.add(cl_veryeasy) db.session.add(cl_medium) db.session.add(cl_hard) db.session.commit() ################ output C:\wc\sascode\python\CTF\venv\Scripts\python.exe C:\wc\sascode\python\CTF\data.py [2022-10-29 16:46:17,842] INFO in __init__: ctfwebapp startup Traceback (most recent call last): File "C:\wc\sascode\python\CTF\data.py", line 19, in <module> db.session.add(cl_veryeasy) File "<string>", line 2, in add File "C:\wc\sascode\python\CTF\venv\lib\site-packages\sqlalchemy\orm\scoping.py", line 24, in _proxied return self.registry() File "C:\wc\sascode\python\CTF\venv\lib\site-packages\sqlalchemy\util\_collections.py", line 1006, in __call__ key = self.scopefunc() File "C:\wc\sascode\python\CTF\venv\lib\site-packages\flask_sqlalchemy\session.py", line 81, in _app_ctx_id return id(app_ctx._get_current_object()) # type: ignore[attr-defined] File "C:\wc\sascode\python\CTF\venv\lib\site-packages\werkzeug\local.py", line 513, in _get_current_object raise RuntimeError(unbound_message) from None RuntimeError: Working outside of application context. This typically means that you attempted to use functionality that needed the current application. To solve this, set up an application context with app.app_context(). See the documentation for more information. Process finished with exit code 1 #################### app/models.py from sqlalchemy.dialects.postgresql import UUID import uuid from datetime import datetime from hashlib import md5 from app import db, login from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) password_hash = db.Column(db.String(128)) posts = db.relationship('Post', backref='author', lazy='dynamic') about_me = db.Column(db.String(140)) last_seen = db.Column(db.DateTime, default=datetime.utcnow) is_deleted = db.Column(db.Boolean, default=False) def __repr__(self): return '<User {}>'.format(self.username) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) def avatar(self, size): digest = md5(self.username.encode('utf-8')).hexdigest() return 'https://www.gravatar.com/avatar/{}?d=identicon&s={}'.format( digest, size) @login.user_loader def load_user(id): return User.query.get(int(id)) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) body = db.Column(db.String(140)) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) def __repr__(self): return '<Post {}>'.format(self.body) class ChallengeCategory(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) description = db.Column(db.String) date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow) is_deleted = db.Column(db.Boolean, default=False) challenges = db.relationship('Challenge', backref='category_challenge', lazy='dynamic') def __repr__(self): return f'<ChallengeCategory {self.name}>' class ChallengeLevel(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) description = db.Column(db.String) sort_key = db.Column(db.Integer) date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow) is_deleted = db.Column(db.Boolean, default=False) challenges = db.relationship('Challenge', backref='level_challenge', lazy='dynamic') def __repr__(self): return f'<ChallengeLevel {self.name}>' class Challenge(db.Model): id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow) is_deleted = db.Column(db.Boolean, default=False) is_published = db.Column(db.Boolean, default=False) name = db.Column(db.String) instructions = db.Column(db.String) hint = db.Column(db.String) flag_hash = db.Column(db.String(128)) category_id = db.Column(db.Integer, db.ForeignKey('challenge_category.id')) level_id = db.Column(db.Integer, db.ForeignKey('challenge_level.id')) score = db.Column(db.Integer, default=0) def set_flag(self, flag): self.flag_hash = generate_password_hash(flag) def check_flag(self, flag): return check_password_hash(self.password_hash, flag) def __repr__(self): return f'<Challenge {self.name}>' ############## app/__init__.py import logging from logging.handlers import SMTPHandler, RotatingFileHandler import os from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_login import LoginManager from config import Config app = Flask(__name__) app.config.from_object(Config) db = SQLAlchemy(app) migrate = Migrate(app, db) login = LoginManager(app) login.login_view = 'login' if not app.debug: if app.config['MAIL_SERVER']: auth = None if app.config['MAIL_USERNAME'] or app.config['MAIL_PASSWORD']: auth = (app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD']) secure = None if app.config['MAIL_USE_TLS']: secure = () mail_handler = SMTPHandler( mailhost=(app.config['MAIL_SERVER'], app.config['MAIL_PORT']), fromaddr='no-reply@' + app.config['MAIL_SERVER'], toaddrs=app.config['ADMINS'], subject='CTFWebApp Failure', credentials=auth, secure=secure) mail_handler.setLevel(logging.ERROR) app.logger.addHandler(mail_handler) if not os.path.exists('logs'): os.mkdir('logs') file_handler = RotatingFileHandler('logs/ctfwebapp.log', maxBytes=10240, backupCount=10) file_handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')) file_handler.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) app.logger.info('ctfwebapp startup') from app import routes, models, errors
New Paste
Go to most recent paste.