Advertisement
Guest User

model.cotnrol.py

a guest
Oct 11th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.93 KB | None | 0 0
  1. """
  2. This module takes care of creating an instance of Flask app, defines routes to be resolved,
  3. and takes care of processing web form data.
  4. """
  5.  
  6. from flask import request, Flask, app, redirect, render_template, url_for
  7. from flask_login import LoginManager, login_required, logout_user, login_user  # current_user
  8. from TDG.core.data_generation import generate_logins_and_passwords
  9. from TDG.core.generate_output_file import _generate_output_name, _replace_boolean, _file_writer
  10. from TDG.web_app.forms_login import LoginForm, RegisterForm
  11. import os
  12. from io import StringIO
  13. import time
  14. from .forms_data_generation import SameForm, DifferentForm
  15. from .database import init_db
  16. from .database import FileHistory, User, drop_tables, LoginHistory
  17. from flask_wtf.csrf import CSRFProtect
  18.  
  19. app._static_folder = os.path.abspath('static')
  20. app = Flask(__name__)
  21. app.config['WTF_CSRF_ENABLED'] = True
  22. app.config['SECRET_KEY'] = 'DEV_ENV_KEY'
  23. csrf = CSRFProtect(app)
  24. csrf.init_app(app)
  25. database_type = 'sqlite'
  26. database_name = 'login_test.db'
  27. db_sessionmaker = init_db(database_type, database_name)
  28. login_manager = LoginManager()
  29. login_manager.init_app(app)
  30. login_manager.login_view = 'login'
  31.  
  32.  
  33. @login_manager.user_loader
  34. def load_user(user_id):
  35.     return User.query.get(int(user_id))
  36.  
  37.  
  38. @app.route('/')
  39. def toplevel():
  40.     return redirect(url_for('index'))
  41.  
  42.  
  43. @app.route('/index.html')
  44. def index():
  45.     """
  46.    App route for index page.
  47.  
  48.    :return: rendered template.
  49.    """
  50.     return render_template('index.html')
  51.  
  52.  
  53. @app.route('/same', methods=['POST', 'GET'])
  54. def same():
  55.     """
  56.    App route for generating logins and passwords with the same constraints.
  57.  
  58.    :return: rendered template.
  59.    """
  60.     form = SameForm()
  61.     return render_template('same.html', form=form)
  62.  
  63.  
  64. @app.route('/history')
  65. @login_required
  66. def history():
  67.     """
  68.    App route for displaying user's history of generated files.
  69.  
  70.    :return: rendered template.
  71.    """
  72.  
  73.     def all_constraints():
  74.         # user_id = session['user_id']
  75.         user_id = 1  # tymczasowo zeby zobacyzc czy filtruje
  76.         db_session = db_sessionmaker()
  77.         var = list(db_session.query(FileHistory).filter_by(user_id=user_id))
  78.         len_list = len(var)
  79.         for item in var:
  80.             item.created_at = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(item.created_at))
  81.         return var, len_list
  82.     return render_template('history.html', value=all_constraints())
  83.  
  84.  
  85. @app.route('/login', methods=['POST', 'GET'])
  86. def login():
  87.     """
  88.        App route for signing in. After successful login, redirection to main page
  89.  
  90.        :return: rendered template.
  91.    """
  92.     form = LoginForm()
  93.     if form.validate_on_submit():
  94.         user = User.query.filter('name={}'.format(form.login.data))
  95.         if user and user.verify_password(form.password.data):
  96.             login_user(user)
  97.             return redirect(url_for('index'))
  98.         else:
  99.             return '<h1>Invalid username or password</h1>'
  100.     return render_template('login.html')
  101.  
  102.  
  103. @app.route('/logout')
  104. @login_required
  105. def logout():
  106.     logout_user()
  107.     return redirect(url_for('index'))
  108.  
  109.  
  110. @app.route('/register', methods=['POST', 'GET'])
  111. def register():
  112.     """
  113.        App route for signing up. After successful registration, redirection to login page
  114.  
  115.        :return: rendered template.
  116.    """
  117.     form = RegisterForm()
  118.     if form.validate_on_submit():
  119.         hashed_password = generate_password_hash(form.password.data, method='sha256')
  120.         new_user = User(username=form.username.data, email=form.email.data, password=hashed_password)
  121.         db.session.add(new_user)
  122.         db.session.commit()
  123.  
  124.         return '<h1>New user has been created!</h1>'
  125.         # return '<h1>' + form.username.data + ' ' + form.email.data + ' ' + form.password.data + '</h1>'
  126.  
  127.     return render_template('register.html', form=form)
  128.  
  129.     # if request.method == 'POST':
  130.     # TODO TUTAJ LOGIKA RESJESTRACJI
  131.     # if user not in database and constraints ok, add to database and redirect to login
  132.     # return render_template('login.html')
  133.     # return render_template('register.html')
  134.  
  135.  
  136. @app.route('/different', methods=['POST', 'GET'])
  137. def different():
  138.     """
  139.    App route for generating logins and passwords with different constraints.
  140.  
  141.    :return: rendered template.
  142.    """
  143.     form = DifferentForm()
  144.     return render_template('different.html', form=form)
  145.  
  146.  
  147. @app.route('/406')
  148. def invalid_input():
  149.     """
  150.    App route for handling invalid input data.
  151.  
  152.    :return: rendered template.
  153.    """
  154.     return render_template('406.html'), 406
  155.  
  156.  
  157. def get_constraints_data(name):
  158.     """
  159.    This function processes request form for getting login or password data.
  160.  
  161.    :param name: login or password
  162.    :return: dictionary with login or password data.
  163.    """
  164.     if name == 'login':
  165.         return dict(login_or_password='login',
  166.                     min_length=int(request.form['login_min_length']),
  167.                     max_length=int(request.form['login_max_length']),
  168.                     positive_percentage=int(request.form['ratio']),
  169.                     list_length=int(request.form['records_no']))
  170.     elif name == 'pass':
  171.         return dict(min_length=int(request.form['pass_min_length']),
  172.                     max_length=int(request.form['pass_max_length']))
  173.     else:
  174.         return 'wrong key'
  175.  
  176.  
  177. def file_format():
  178.     """
  179.    This function returns file format.
  180.  
  181.    :return: a sting: 'txt' or 'csv'. In case of invalid input data, invalid_input() view is being rendered.
  182.    """
  183.     if 'txt' in request.form:
  184.         return 'txt'
  185.     elif 'csv' in request.form:
  186.         return 'csv'
  187.     else:
  188.         return invalid_input()
  189.  
  190.  
  191. def content_type():
  192.     """
  193.    This function returns file MIME type.
  194.  
  195.    :return: file MIME type. In case of invalid input data, invalid_input() view is being rendered.
  196.    """
  197.     if 'txt' in request.form:
  198.         return 'text/plain;charset=utf-8'
  199.     elif 'csv' in request.form:
  200.         return 'text/csv;charset=utf-8'
  201.     else:
  202.         return invalid_input()
  203.  
  204.  
  205. def special_characters(name):
  206.     """
  207.    This function prepares special characters string to be used during data generation.
  208.  
  209.    :param name: login or password
  210.    :return: a string containing special characters, as determined in the form. In case of invalid input data,
  211.        invalid_input() view is being rendered.
  212.    """
  213.     if name + '_all_special' in request.form.get(name + '_special_char'):
  214.         return '`~!@#$%^&*()_+-=[]{}|\;\':\",<.>/?'
  215.     elif name + '_none_special' in request.form.get(name + '_special_char'):
  216.         return ''
  217.     elif name + '_custom_special' in request.form.get(name + '_special_char'):
  218.         return request.form.get(name + '_textarea_custom')
  219.     else:
  220.         return invalid_input()
  221.  
  222.  
  223. def headers():
  224.     """
  225.    This function determines if headers should be generated in the output file.
  226.  
  227.    :return: True, False or invalid_input() view, in case of invalid input data.
  228.    """
  229.     if 'y_headers' in request.form.get('headers'):
  230.         return True
  231.     elif 'n_headers' in request.form.get('headers'):
  232.         return False
  233.     else:
  234.         return invalid_input()
  235.  
  236.  
  237. def create_dictionaries():
  238.     """
  239.    This function composes login and password dictionary. File format is determined using
  240.    file_format() function, special characters are determined by calling special_characters()
  241.    function. Additional get_constraints_data() and pass_data() functions are used to get form constraints
  242.    for both logins and passwords.
  243.  
  244.    :return: dictionaries containing login and password constraints.
  245.    """
  246.     login_dictionary = get_constraints_data('login')
  247.     login_dictionary['file_format'] = file_format()
  248.     login_dictionary['characters'] = special_characters('login')
  249.     login_dictionary['headers'] = headers()
  250.  
  251.     password_dictionary = dict(login_dictionary)
  252.     password_dictionary['login_or_password'] = 'password'
  253.  
  254.     if 'pass_min_length' in request.form:
  255.         password_dictionary.update(get_constraints_data('pass'))
  256.         password_dictionary['characters'] = special_characters('pass')
  257.  
  258.     return login_dictionary, password_dictionary
  259.  
  260.  
  261. @app.route('/handle_data', methods=['POST', 'GET'])
  262. def handle_data():
  263.     """
  264.    App route for handling form data.
  265.  
  266.    :return: stream of generated logins and passwords with headers consisting of HTTP status 200,
  267.        the MIME type of file determined by the content_type() function and filename determined by
  268.        _generate_output_name() function.
  269.    """
  270.  
  271.     output = _replace_boolean(generate_logins_and_passwords(create_dictionaries()))
  272.     output_text = StringIO('')
  273.     _file_writer(output_text, file_format(), output, headers())
  274.     name = _generate_output_name(file_format())
  275.     return output_text.getvalue(), 200, {
  276.         'content-type': content_type(),
  277.         'content-disposition': 'attachment; filename={}'.format(name),
  278.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement