from database import make_db_utils # Database Connection _, db_session, _ = make_db_utils() # App configuration app = Flask(__name__, static_url_path='', static_folder='../static') app.config["SECRET_KEY"] = urandom(24) app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False app.config["SQLALCHEMY_DATABASE_URI"] = environ["SQLALCHEMY_DATABASE_URI"] app.add_url_rule("/", "root", lambda: app.send_static_file("index.html")) # API configuration api = MultiApi(app) api.add_resource(ReadingResource, "/api/reading/") api.add_resource(DeviceResource, "/api/dev/") # Admin and Security configuration admin = Admin(index_view=HomeView("Helmuth")) admin.register(Device, AuthModelView, session=db_session) admin.register(Reading, AuthModelView, session=db_session) admin.register(User, AuthModelView, session=db_session) admin.add_view(UploadView(name="upload")) admin.init_app(app) db = SQLAlchemy(app) user_datastore = SQLAlchemyUserDatastore(db, User, Role) security = Security(app, user_datastore) if __name__ == "__main__": app.run(host="0.0.0.0", port=8000, debug=True)
def init_app(app, messageService, locatorService): class BroadcastView(BaseView): @expose('/') def index(self): roles = Role.query.all() return self.render('broadcast.jade', roles=roles) @expose('/send', methods=['POST']) def send(self): role_id = request.form.get('role') message = request.form.get('message') if message is None or len(message) == 0: flash("You need to supply a message!") return redirect(url_for('.index')) if role_id is None: flash("You need to select which group to target!") return redirect(url_for('.index')) if role_id < 0: messageService.sendBroadcast(User.query.all(), message) else: role = Role.query.get(role_id) messageService.sendBroadcast(role.users, message) flash("Successfully sent message") return redirect(url_for('.index')) class LocateView(BaseView): @expose('/') def index(self): users = User.query.all() return self.render('locate.jade', users=users) @expose('/send', methods=['POST']) def send(self): sender = User.query.get(request.form.get('sender', 1)) target = User.query.get(request.form.get('target', 1)) locatorService.startLocating(target, sender) flash('Started locating') return redirect(url_for('.index')) @expose('/cheeseit') def cheeseit(self): testuser = Role.query.get(27) messageService.sendCheesit(testuser.users) flash('Delicious topping activated') return redirect(url_for('.index')) class DataView(BaseView): @expose('/') def index(self): users = User.query.all() return self.render('data.jade', users=users) @expose('/send', methods=['POST']) def send(self): target = User.query.get(request.form.get('sender', 1)) action = request.form.get('action') payload = request.form.get('payload') if action is None or len(action) == 0: flash("You need to supply an action!") return redirect(url_for('.index')) if payload is None or len(payload) == 0: flash("You need to supply a payload!") return redirect(url_for('.index')) messageService.sendData(target, payload, action) flash('Successfully sent data') return redirect(url_for('.index')) class UserView(model.ModelAdmin): session = db.session list_display = ('fullname', 'username', 'is_admin') class BeaconView(model.ModelAdmin): session = db.session list_display = ('location', 'uuid') class HashView(BaseView): @expose('/') def index(self): return self.render('hashview.jade') @expose('/send', methods=['POST']) def send(self): pw = request.form.get('password') hashpw = _hash(pw).hexdigest() flash(hashpw) return redirect(url_for('.index')) class AdminView(AdminIndexView): @expose('/') def index(self): return self.render('admin_index.jade') admin = Admin(name='LoKI', index_view=AdminView()) admin.register(Role, session=db.session) admin.register(User, UserView) admin.register(Device, session=db.session) admin.register(AccessToken, session=db.session) admin.register(LocatingRequest, session=db.session) admin.register(Beacon, BeaconView) admin.add_view(BroadcastView(name='Broadcast', category='Tools')) admin.add_view(LocateView(name='Locate', category='Tools')) admin.add_view(DataView(name='Data', category='Tools')) admin.add_view(HashView(name='Hash', category='Tools')) admin.init_app(app)