from altcha import (
create_challenge,
verify_solution,
)
from .settings import ALTCHA_HMAC_KEY # I have put it in settings
@action("altcha", method=["GET"])
def get_altcha():
try:
challenge = create_challenge(
ChallengeOptions(
hmac_key=ALTCHA_HMAC_KEY,
max_number=50000,
)
)
response.headers["Content-Type"] = "application/json"
print("Created challenge: ", challenge.__dict__)
return challenge.__dict__
except Exception as e:
response.status = 500
return {"error": f"Failed to create challenge: {str(e)}"}
@action.uses('form_altcha.html', session, flash)
def some_form():
fields = [
Field("name", requires=IS_NOT_EMPTY()),
Field("color", type="string", requires=IS_IN_SET(["red","blue","green"])),
]
form = Form(fields,
csrf_session=session,
submit_button=T("Submit"))
form.structure.insert(-1,XML('<altcha-widget></altcha-widget></br>'))
if form.accepted:
altcha_payload = request.POST.get("altcha")
if not altcha_payload:
response.status = 400
print("NO ALTCHA payload")
flash.set("NO ALTCHA payload")
else:
ok, error = verify_solution(altcha_payload, ALTCHA_SECRET_KEY)
if not ok:
response.status = 400
print("ALTCHA verification fail:", error)
flash.set("ALTCHA verification fail: {error}".format(error=error))
else:
flash.set("ALTCHA verified.")
return dict(form=form)
[[extend 'layout.html']]
<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
const altchaWidget = document.querySelector("altcha-widget");
if (altchaWidget) {
altchaWidget.setAttribute("challengeurl", "[[=URL('altcha')]]");
}
});
</script>
<div class="section">
<div class="vars">[[=form]]</div>
</div>
[[extend "layout.html"]]
<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
const altchaWidget = document.querySelector("altcha-widget");
if (altchaWidget) {
altchaWidget.setAttribute("challengeurl", "[[=URL('altcha')]]");
}
});
</script>
<style>
.auth-container {
max-width: 80%;
min-width: 400px;
margin-left: auto;
margin-right: auto;
border: 1px solid #e1e1e1;
border-radius: 10px;
padding: 20px;
}
</style>
[[form.structure.insert(-1,XML('<altcha-widget></altcha-widget></br>'))]]
<div class="auth-container">[[=form]]</div>