policies/expiry: migrate to web

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens Langhammer 2021-04-02 16:48:15 +02:00
parent f75f6a8404
commit ac136ec5f6
4 changed files with 91 additions and 28 deletions

View file

@ -1,22 +0,0 @@
"""authentik PasswordExpiry Policy forms"""
from django import forms
from django.utils.translation import gettext as _
from authentik.policies.expiry.models import PasswordExpiryPolicy
from authentik.policies.forms import PolicyForm
class PasswordExpiryPolicyForm(PolicyForm):
"""Edit PasswordExpiryPolicy instances"""
class Meta:
model = PasswordExpiryPolicy
fields = PolicyForm.Meta.fields + ["days", "deny_only"]
widgets = {
"name": forms.TextInput(),
"order": forms.NumberInput(),
"days": forms.NumberInput(),
}
labels = {"deny_only": _("Only fail the policy, don't set user's password.")}

View file

@ -1,9 +1,7 @@
"""authentik password_expiry_policy Models""" """authentik password_expiry_policy Models"""
from datetime import timedelta from datetime import timedelta
from typing import Type
from django.db import models from django.db import models
from django.forms import ModelForm
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from rest_framework.serializers import BaseSerializer from rest_framework.serializers import BaseSerializer
@ -29,10 +27,8 @@ class PasswordExpiryPolicy(Policy):
return PasswordExpiryPolicySerializer return PasswordExpiryPolicySerializer
@property @property
def form(self) -> Type[ModelForm]: def component(self) -> str:
from authentik.policies.expiry.forms import PasswordExpiryPolicyForm return "ak-policy-password-expiry-form"
return PasswordExpiryPolicyForm
def passes(self, request: PolicyRequest) -> PolicyResult: def passes(self, request: PolicyRequest) -> PolicyResult:
"""If password change date is more than x days in the past, call set_unusable_password """If password change date is more than x days in the past, call set_unusable_password

View file

@ -18,6 +18,7 @@ import { ifDefined } from "lit-html/directives/if-defined";
import "./dummy/DummyPolicyForm"; import "./dummy/DummyPolicyForm";
import "./event_matcher/EventMatcherPolicyForm"; import "./event_matcher/EventMatcherPolicyForm";
import "./expression/ExpressionPolicyForm"; import "./expression/ExpressionPolicyForm";
import "./expiry/ExpiryPolicyForm";
@customElement("ak-policy-list") @customElement("ak-policy-list")
export class PolicyListPage extends TablePage<Policy> { export class PolicyListPage extends TablePage<Policy> {
@ -85,6 +86,7 @@ export class PolicyListPage extends TablePage<Policy> {
"dummy": "ak-policy-dummy-form", "dummy": "ak-policy-dummy-form",
"eventmatcher": "ak-policy-event-matcher-form", "eventmatcher": "ak-policy-event-matcher-form",
"expression": "ak-policy-expression-form", "expression": "ak-policy-expression-form",
"expiry": "ak-policy-password-expiry-form",
}}> }}>
</ak-proxy-form> </ak-proxy-form>
<button slot="trigger" class="pf-c-button pf-m-secondary"> <button slot="trigger" class="pf-c-button pf-m-secondary">

View file

@ -0,0 +1,87 @@
import { PasswordExpiryPolicy, PoliciesApi } from "authentik-api";
import { gettext } from "django";
import { customElement, property } from "lit-element";
import { html, TemplateResult } from "lit-html";
import { DEFAULT_CONFIG } from "../../../api/Config";
import { Form } from "../../../elements/forms/Form";
import { ifDefined } from "lit-html/directives/if-defined";
import "../../../elements/forms/HorizontalFormElement";
import "../../../elements/forms/FormGroup";
@customElement("ak-policy-password-expiry-form")
export class PasswordExpiryPolicyForm extends Form<PasswordExpiryPolicy> {
set policyUUID(value: string) {
new PoliciesApi(DEFAULT_CONFIG).policiesPasswordExpiryRead({
policyUuid: value,
}).then(policy => {
this.policy = policy;
});
}
@property({attribute: false})
policy?: PasswordExpiryPolicy;
getSuccessMessage(): string {
if (this.policy) {
return gettext("Successfully updated policy.");
} else {
return gettext("Successfully created policy.");
}
}
send = (data: PasswordExpiryPolicy): Promise<PasswordExpiryPolicy> => {
if (this.policy) {
return new PoliciesApi(DEFAULT_CONFIG).policiesPasswordExpiryUpdate({
policyUuid: this.policy.pk || "",
data: data
});
} else {
return new PoliciesApi(DEFAULT_CONFIG).policiesPasswordExpiryCreate({
data: data
});
}
};
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<ak-form-element-horizontal
label=${gettext("Name")}
?required=${true}
name="name">
<input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required>
</ak-form-element-horizontal>
<ak-form-element-horizontal name="executionLogging">
<div class="pf-c-check">
<input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}>
<label class="pf-c-check__label">
${gettext("Execution logging")}
</label>
</div>
<p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p>
</ak-form-element-horizontal>
<ak-form-group .expanded=${true}>
<span slot="header">
${gettext("Policy-specific settings")}
</span>
<div slot="body" class="pf-c-form">
<ak-form-element-horizontal
label=${gettext("Maximum age (in days)")}
?required=${true}
name="days">
<input type="number" value="${ifDefined(this.policy?.days || "")}" class="pf-c-form-control" required>
</ak-form-element-horizontal>
<ak-form-element-horizontal name="denyOnly">
<div class="pf-c-check">
<input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.denyOnly || false}>
<label class="pf-c-check__label">
${gettext("Only fail the policy, don't set user's password.")}
</label>
</div>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
}
}