Compare commits
	
		
			2 Commits
		
	
	
		
			safari-cra
			...
			policies-e
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ad9b5e98ba | |||
| e4a21c824a | 
| @ -78,6 +78,7 @@ class PolicyBindingSerializer(ModelSerializer): | |||||||
|             "negate", |             "negate", | ||||||
|             "enabled", |             "enabled", | ||||||
|             "order", |             "order", | ||||||
|  |             "honor_order", | ||||||
|             "timeout", |             "timeout", | ||||||
|             "failure_result", |             "failure_result", | ||||||
|         ] |         ] | ||||||
| @ -110,7 +111,16 @@ class PolicyBindingFilter(FilterSet): | |||||||
|  |  | ||||||
|     class Meta: |     class Meta: | ||||||
|         model = PolicyBinding |         model = PolicyBinding | ||||||
|         fields = ["policy", "policy__isnull", "target", "target_in", "enabled", "order", "timeout"] |         fields = [ | ||||||
|  |             "policy", | ||||||
|  |             "policy__isnull", | ||||||
|  |             "target", | ||||||
|  |             "target_in", | ||||||
|  |             "enabled", | ||||||
|  |             "order", | ||||||
|  |             "honor_order", | ||||||
|  |             "timeout", | ||||||
|  |         ] | ||||||
|  |  | ||||||
|  |  | ||||||
| class PolicyBindingViewSet(UsedByMixin, ModelViewSet): | class PolicyBindingViewSet(UsedByMixin, ModelViewSet): | ||||||
|  | |||||||
| @ -0,0 +1,40 @@ | |||||||
|  | # Generated by Django 5.1.8 on 2025-04-17 15:13 | ||||||
|  |  | ||||||
|  | from django.conf import settings | ||||||
|  | from django.db import migrations, models | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  |  | ||||||
|  |     dependencies = [ | ||||||
|  |         ("authentik_core", "0047_delete_oldauthenticatedsession"), | ||||||
|  |         ("authentik_policies", "0011_policybinding_failure_result_and_more"), | ||||||
|  |         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AddConstraint( | ||||||
|  |             model_name="policybinding", | ||||||
|  |             constraint=models.CheckConstraint( | ||||||
|  |                 condition=models.Q( | ||||||
|  |                     models.Q( | ||||||
|  |                         ("policy_id__isnull", False), | ||||||
|  |                         ("group_id__isnull", True), | ||||||
|  |                         ("user_id__isnull", True), | ||||||
|  |                     ), | ||||||
|  |                     models.Q( | ||||||
|  |                         ("group_id__isnull", False), | ||||||
|  |                         ("policy_id__isnull", True), | ||||||
|  |                         ("user_id__isnull", True), | ||||||
|  |                     ), | ||||||
|  |                     models.Q( | ||||||
|  |                         ("user_id__isnull", False), | ||||||
|  |                         ("policy_id__isnull", True), | ||||||
|  |                         ("group_id__isnull", True), | ||||||
|  |                     ), | ||||||
|  |                     _connector="OR", | ||||||
|  |                 ), | ||||||
|  |                 name="authentik_policies_policybinding_only_one_type", | ||||||
|  |             ), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
| @ -0,0 +1,20 @@ | |||||||
|  | # Generated by Django 5.1.8 on 2025-04-17 15:16 | ||||||
|  |  | ||||||
|  | from django.db import migrations, models | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  |  | ||||||
|  |     dependencies = [ | ||||||
|  |         ("authentik_policies", "0012_policybinding_authentik_policies_policybinding_only_one_type"), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name="policybinding", | ||||||
|  |             name="honor_order", | ||||||
|  |             field=models.BooleanField( | ||||||
|  |                 default=False, help_text="Honor order when evaluating policies." | ||||||
|  |             ), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
| @ -3,6 +3,7 @@ | |||||||
| from uuid import uuid4 | from uuid import uuid4 | ||||||
|  |  | ||||||
| from django.db import models | from django.db import models | ||||||
|  | from django.db.models import Q | ||||||
| from django.utils.translation import gettext_lazy as _ | from django.utils.translation import gettext_lazy as _ | ||||||
| from model_utils.managers import InheritanceManager | from model_utils.managers import InheritanceManager | ||||||
| from rest_framework.serializers import BaseSerializer | from rest_framework.serializers import BaseSerializer | ||||||
| @ -100,6 +101,10 @@ class PolicyBinding(SerializerModel): | |||||||
|     ) |     ) | ||||||
|  |  | ||||||
|     order = models.IntegerField() |     order = models.IntegerField() | ||||||
|  |     honor_order = models.BooleanField( | ||||||
|  |         default=False, | ||||||
|  |         help_text=_("Honor order when evaluating policies."), | ||||||
|  |     ) | ||||||
|  |  | ||||||
|     def passes(self, request: PolicyRequest) -> PolicyResult: |     def passes(self, request: PolicyRequest) -> PolicyResult: | ||||||
|         """Check if request passes this PolicyBinding, check policy, group or user""" |         """Check if request passes this PolicyBinding, check policy, group or user""" | ||||||
| @ -158,6 +163,28 @@ class PolicyBinding(SerializerModel): | |||||||
|             models.Index(fields=["user"]), |             models.Index(fields=["user"]), | ||||||
|             models.Index(fields=["target"]), |             models.Index(fields=["target"]), | ||||||
|         ] |         ] | ||||||
|  |         constraints = ( | ||||||
|  |             models.CheckConstraint( | ||||||
|  |                 condition=( | ||||||
|  |                     ( | ||||||
|  |                         Q(policy_id__isnull=False) | ||||||
|  |                         & Q(group_id__isnull=True) | ||||||
|  |                         & Q(user_id__isnull=True) | ||||||
|  |                     ) | ||||||
|  |                     | ( | ||||||
|  |                         Q(group_id__isnull=False) | ||||||
|  |                         & Q(policy_id__isnull=True) | ||||||
|  |                         & Q(user_id__isnull=True) | ||||||
|  |                     ) | ||||||
|  |                     | ( | ||||||
|  |                         Q(user_id__isnull=False) | ||||||
|  |                         & Q(policy_id__isnull=True) | ||||||
|  |                         & Q(group_id__isnull=True) | ||||||
|  |                     ) | ||||||
|  |                 ), | ||||||
|  |                 name="%(app_label)s_%(class)s_only_one_type", | ||||||
|  |             ), | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class Policy(SerializerModel, CreatedUpdatedModel): | class Policy(SerializerModel, CreatedUpdatedModel): | ||||||
|  | |||||||
| @ -5623,6 +5623,11 @@ | |||||||
|                     "maximum": 2147483647, |                     "maximum": 2147483647, | ||||||
|                     "title": "Order" |                     "title": "Order" | ||||||
|                 }, |                 }, | ||||||
|  |                 "honor_order": { | ||||||
|  |                     "type": "boolean", | ||||||
|  |                     "title": "Honor order", | ||||||
|  |                     "description": "Honor order when evaluating policies." | ||||||
|  |                 }, | ||||||
|                 "timeout": { |                 "timeout": { | ||||||
|                     "type": "integer", |                     "type": "integer", | ||||||
|                     "minimum": 0, |                     "minimum": 0, | ||||||
|  | |||||||
							
								
								
									
										16
									
								
								schema.yml
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								schema.yml
									
									
									
									
									
								
							| @ -12092,6 +12092,10 @@ paths: | |||||||
|         name: enabled |         name: enabled | ||||||
|         schema: |         schema: | ||||||
|           type: boolean |           type: boolean | ||||||
|  |       - in: query | ||||||
|  |         name: honor_order | ||||||
|  |         schema: | ||||||
|  |           type: boolean | ||||||
|       - in: query |       - in: query | ||||||
|         name: order |         name: order | ||||||
|         schema: |         schema: | ||||||
| @ -53311,6 +53315,9 @@ components: | |||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
|           minimum: -2147483648 |           minimum: -2147483648 | ||||||
|  |         honor_order: | ||||||
|  |           type: boolean | ||||||
|  |           description: Honor order when evaluating policies. | ||||||
|         timeout: |         timeout: | ||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
| @ -54880,6 +54887,9 @@ components: | |||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
|           minimum: -2147483648 |           minimum: -2147483648 | ||||||
|  |         honor_order: | ||||||
|  |           type: boolean | ||||||
|  |           description: Honor order when evaluating policies. | ||||||
|         timeout: |         timeout: | ||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
| @ -54922,6 +54932,9 @@ components: | |||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
|           minimum: -2147483648 |           minimum: -2147483648 | ||||||
|  |         honor_order: | ||||||
|  |           type: boolean | ||||||
|  |           description: Honor order when evaluating policies. | ||||||
|         timeout: |         timeout: | ||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
| @ -59183,6 +59196,9 @@ components: | |||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
|           minimum: -2147483648 |           minimum: -2147483648 | ||||||
|  |         honor_order: | ||||||
|  |           type: boolean | ||||||
|  |           description: Honor order when evaluating policies. | ||||||
|         timeout: |         timeout: | ||||||
|           type: integer |           type: integer | ||||||
|           maximum: 2147483647 |           maximum: 2147483647 | ||||||
|  | |||||||
| @ -61,6 +61,7 @@ export class BoundPoliciesList extends Table<PolicyBinding> { | |||||||
|             new TableColumn(this.allowedTypesLabel), |             new TableColumn(this.allowedTypesLabel), | ||||||
|             new TableColumn(msg("Enabled"), "enabled"), |             new TableColumn(msg("Enabled"), "enabled"), | ||||||
|             new TableColumn(msg("Timeout"), "timeout"), |             new TableColumn(msg("Timeout"), "timeout"), | ||||||
|  |             new TableColumn(msg("Honor order"), "honor_order"), | ||||||
|             new TableColumn(msg("Actions")), |             new TableColumn(msg("Actions")), | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| @ -165,6 +166,7 @@ export class BoundPoliciesList extends Table<PolicyBinding> { | |||||||
|             html`${this.getPolicyUserGroupRow(item)}`, |             html`${this.getPolicyUserGroupRow(item)}`, | ||||||
|             html`<ak-status-label type="warning" ?good=${item.enabled}></ak-status-label>`, |             html`<ak-status-label type="warning" ?good=${item.enabled}></ak-status-label>`, | ||||||
|             html`${item.timeout}`, |             html`${item.timeout}`, | ||||||
|  |             html`<ak-status-label type="info" ?good=${item.honorOrder}></ak-status-label>`, | ||||||
|             html` ${this.getObjectEditButton(item)} |             html` ${this.getObjectEditButton(item)} | ||||||
|                 <ak-forms-modal size=${PFSize.Medium}> |                 <ak-forms-modal size=${PFSize.Medium}> | ||||||
|                     <span slot="submit"> ${msg("Update")} </span> |                     <span slot="submit"> ${msg("Update")} </span> | ||||||
|  | |||||||
| @ -310,6 +310,26 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> { | |||||||
|                     required |                     required | ||||||
|                 /> |                 /> | ||||||
|             </ak-form-element-horizontal> |             </ak-form-element-horizontal> | ||||||
|  |             <ak-form-element-horizontal name="honorOrder"> | ||||||
|  |                 <label class="pf-c-switch"> | ||||||
|  |                     <input | ||||||
|  |                         class="pf-c-switch__input" | ||||||
|  |                         type="checkbox" | ||||||
|  |                         ?checked=${first(this.instance?.honorOrder, false)} | ||||||
|  |                     /> | ||||||
|  |                     <span class="pf-c-switch__toggle"> | ||||||
|  |                         <span class="pf-c-switch__toggle-icon"> | ||||||
|  |                             <i class="fas fa-check" aria-hidden="true"></i> | ||||||
|  |                         </span> | ||||||
|  |                     </span> | ||||||
|  |                     <span class="pf-c-switch__label">${msg("Honor order")}</span> | ||||||
|  |                 </label> | ||||||
|  |                 <p class="pf-c-form__helper-text"> | ||||||
|  |                     ${msg( | ||||||
|  |                         "Honor the order of policies. Use if policies must be evaluated sequentially following the specified order. May impact performance.", | ||||||
|  |                     )} | ||||||
|  |                 </p> | ||||||
|  |             </ak-form-element-horizontal> | ||||||
|             <ak-form-element-horizontal label=${msg("Timeout")} ?required=${true} name="timeout"> |             <ak-form-element-horizontal label=${msg("Timeout")} ?required=${true} name="timeout"> | ||||||
|                 <input |                 <input | ||||||
|                     type="number" |                     type="number" | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	