frontend.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import os
  2. import base64
  3. import hvac
  4. import requests
  5. from flask import Blueprint, render_template, flash, redirect, url_for, current_app
  6. from flask_bootstrap import __version__ as FLASK_BOOTSTRAP_VERSION
  7. from flask_nav.elements import Navbar, View, Subgroup, Link, Text, Separator
  8. from markupsafe import escape
  9. from .forms import DataForm
  10. from .nav import nav
  11. frontend = Blueprint('frontend', __name__)
  12. nav.register_element('frontend_top', Navbar(
  13. View('Cubbyshare', '.index'),
  14. View('Home', '.index'),
  15. View('About', '.about'),
  16. ))
  17. @frontend.route('/', defaults={'path': ''})
  18. @frontend.route('/<path:path>')
  19. def index(path):
  20. token = path
  21. if not token:
  22. form = DataForm()
  23. return render_template('index.html', form=form, data='')
  24. vault_uri = os.environ.get('VAULT_URI', None)
  25. if not vault_uri:
  26. flash('Missing VAULT_URI')
  27. return redirect(url_for('.index'))
  28. try:
  29. cubby = hvac.Client(url=vault_uri, token=token)
  30. result = cubby.read('cubbyhole/%s' % token)
  31. except hvac.exceptions.Forbidden:
  32. flash('Something went wrong')
  33. return redirect(url_for('.index'))
  34. secret = base64.b64decode(result['data']['wrap']).decode()
  35. return render_template('index.html', form='', data=secret)
  36. @frontend.route('/add', methods=['POST'])
  37. def add_entry():
  38. form = DataForm()
  39. if form.validate_on_submit():
  40. secret_data = base64.b64encode(form.secrets.data.encode()).decode()
  41. root_token = current_app.get_token()
  42. vault_uri = os.environ.get('VAULT_URI', None)
  43. if not vault_uri:
  44. flash('Missing VAULT_URI')
  45. return redirect(url_for('.index'))
  46. vault = hvac.Client(url=vault_uri, token=root_token)
  47. token = vault.create_token(lease='24h', num_uses=2, renewable=False, no_default_policy=True)
  48. token_id = token['auth']['client_token']
  49. cubby = hvac.Client(url=vault_uri, token=token_id)
  50. cubby.write('cubbyhole/%s' % token_id, wrap=secret_data)
  51. flash('Successfully saved')
  52. return render_template('success.html', token=token_id)
  53. else:
  54. for error_field, error_message in form.errors.items():
  55. flash("Field : {field}; error : {error}".format(field=error_field, error=error_message))
  56. return redirect(url_for('.index'))
  57. @frontend.route('/about')
  58. def about():
  59. return render_template('about.html')