frontend.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import os
  2. import base64
  3. import hvac
  4. from flask import (
  5. Blueprint,
  6. render_template,
  7. flash,
  8. redirect,
  9. url_for,
  10. current_app,
  11. jsonify
  12. )
  13. from flask_nav.elements import Navbar, View
  14. from .forms import DataForm
  15. from .nav import nav
  16. frontend = Blueprint("frontend", __name__)
  17. nav.register_element(
  18. "frontend_top",
  19. Navbar(
  20. View("Cubbyshare", ".index"),
  21. View("Home", ".index"),
  22. View("About", ".about")
  23. ),
  24. )
  25. @frontend.route("/", defaults={"path": ""})
  26. @frontend.route("/<path:path>")
  27. def index(path):
  28. if not path:
  29. form = DataForm()
  30. return render_template("index.html", form=form, data="")
  31. if current_app.debug:
  32. result_url = url_for(
  33. '.get_data', path=path
  34. )
  35. else:
  36. result_url = url_for(
  37. '.get_data', path=path, _external=True, _scheme='https'
  38. )
  39. return render_template(
  40. "index.html",
  41. form="",
  42. result_url=result_url
  43. )
  44. @frontend.route("/_get_data/<path:path>")
  45. def get_data(path):
  46. token = path
  47. if not token:
  48. return redirect(url_for(".index"))
  49. if current_app.debug:
  50. secret = "123\n123"
  51. else:
  52. vault_uri = os.environ.get("VAULT_URI", None)
  53. if not vault_uri:
  54. flash("Missing VAULT_URI")
  55. return redirect(url_for(".index"))
  56. try:
  57. cubby = hvac.Client(url=vault_uri, token=token)
  58. result = cubby.read("cubbyhole/%s" % token)
  59. except hvac.exceptions.Forbidden:
  60. return jsonify(result="link expired")
  61. secret = base64.b64decode(result["data"]["wrap"]).decode()
  62. return jsonify(result=secret)
  63. @frontend.route("/add", methods=["POST"])
  64. def add_entry():
  65. form = DataForm()
  66. if form.validate_on_submit():
  67. secret_data = base64.b64encode(form.secrets.data.encode()).decode()
  68. root_token = current_app.get_token()
  69. if current_app.debug:
  70. token_id="0000"
  71. else:
  72. vault_uri = os.environ.get("VAULT_URI", None)
  73. if not vault_uri:
  74. flash("Missing VAULT_URI")
  75. return redirect(url_for(".index"))
  76. vault = hvac.Client(url=vault_uri, token=root_token)
  77. token = vault.create_token(
  78. lease="24h",
  79. num_uses=2,
  80. renewable=False,
  81. no_default_policy=True,
  82. )
  83. token_id = token["auth"]["client_token"]
  84. cubby = hvac.Client(url=vault_uri, token=token_id)
  85. cubby.write("cubbyhole/%s" % token_id, wrap=secret_data)
  86. flash("Successfully saved")
  87. return render_template("success.html", token=token_id)
  88. else:
  89. for error_field, error_message in form.errors.items():
  90. flash(
  91. "Field : {field}; error : {error}".format(
  92. field=error_field, error=error_message
  93. )
  94. )
  95. return redirect(url_for(".index"))
  96. @frontend.route("/about")
  97. def about():
  98. return render_template("about.html")