 4915205678
			
		
	
	4915205678
	
	
	
		
			
			* core: start migrating to flows for authorisation * sources/oauth: start type-hinting * core: create default user * core: only show user delete button if an unenrollment flow exists * flows: Correctly check initial policies on flow with context * policies: add more verbosity to engine * sources/oauth: migrate to flows * sources/oauth: fix typing errors * flows: add more tests * sources/oauth: start implementing unittests * sources/ldap: add option to disable user sync, move connection init to model * sources/ldap: re-add default PropertyMappings * providers/saml: re-add default PropertyMappings * admin: fix missing stage count * stages/identification: fix sources not being shown * crypto: fix being unable to save with private key * crypto: re-add default self-signed keypair * policies: rewrite cache_key to prevent wrong cache * sources/saml: migrate to flows for auth and enrollment * stages/consent: add new stage * admin: fix PropertyMapping widget not rendering properly * core: provider.authorization_flow is mandatory * flows: add support for "autosubmit" attribute on form * flows: add InMemoryStage for dynamic stages * flows: optionally allow empty flows from FlowPlanner * providers/saml: update to authorization_flow * sources/*: fix flow executor URL * flows: fix pylint error * flows: wrap responses in JSON object to easily handle redirects * flow: dont cache plan's context * providers/oauth: rewrite OAuth2 Provider to use flows * providers/*: update docstrings of models * core: fix forms not passing help_text through safe * flows: fix HttpResponses not being converted to JSON * providers/oidc: rewrite to use flows * flows: fix linting
		
			
				
	
	
		
			132 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Generated by Django 3.0.6 on 2020-05-23 15:47
 | |
| 
 | |
| from django.apps.registry import Apps
 | |
| from django.db import migrations
 | |
| from django.db.backends.base.schema import BaseDatabaseSchemaEditor
 | |
| 
 | |
| from passbook.flows.models import FlowDesignation
 | |
| from passbook.stages.prompt.models import FieldTypes
 | |
| 
 | |
| FLOW_POLICY_EXPRESSION = """{{ pb_is_sso_flow }}"""
 | |
| 
 | |
| PROMPT_POLICY_EXPRESSION = """
 | |
| {% if pb_flow_plan.context.prompt_data.username %}
 | |
| False
 | |
| {% else %}
 | |
| True
 | |
| {% endif %}
 | |
| """
 | |
| 
 | |
| 
 | |
| def create_default_source_enrollment_flow(
 | |
|     apps: Apps, schema_editor: BaseDatabaseSchemaEditor
 | |
| ):
 | |
|     Flow = apps.get_model("passbook_flows", "Flow")
 | |
|     FlowStageBinding = apps.get_model("passbook_flows", "FlowStageBinding")
 | |
|     PolicyBinding = apps.get_model("passbook_policies", "PolicyBinding")
 | |
| 
 | |
|     ExpressionPolicy = apps.get_model(
 | |
|         "passbook_policies_expression", "ExpressionPolicy"
 | |
|     )
 | |
| 
 | |
|     PromptStage = apps.get_model("passbook_stages_prompt", "PromptStage")
 | |
|     Prompt = apps.get_model("passbook_stages_prompt", "Prompt")
 | |
|     UserWriteStage = apps.get_model("passbook_stages_user_write", "UserWriteStage")
 | |
|     UserLoginStage = apps.get_model("passbook_stages_user_login", "UserLoginStage")
 | |
| 
 | |
|     db_alias = schema_editor.connection.alias
 | |
| 
 | |
|     # Create a policy that only allows this flow when doing an SSO Request
 | |
|     flow_policy = ExpressionPolicy.objects.create(
 | |
|         name="default-source-enrollment-if-sso", expression=FLOW_POLICY_EXPRESSION
 | |
|     )
 | |
| 
 | |
|     # This creates a Flow used by sources to enroll users
 | |
|     # It makes sure that a username is set, and if not, prompts the user for a Username
 | |
|     flow = Flow.objects.create(
 | |
|         name="default-source-enrollment",
 | |
|         slug="default-source-enrollment",
 | |
|         designation=FlowDesignation.ENROLLMENT,
 | |
|     )
 | |
|     PolicyBinding.objects.create(policy=flow_policy, target=flow, order=0)
 | |
| 
 | |
|     # PromptStage to ask user for their username
 | |
|     prompt_stage = PromptStage.objects.create(
 | |
|         name="default-source-enrollment-username-prompt",
 | |
|     )
 | |
|     prompt_stage.fields.add(
 | |
|         Prompt.objects.create(
 | |
|             field_key="username",
 | |
|             label="Username",
 | |
|             type=FieldTypes.TEXT,
 | |
|             required=True,
 | |
|             placeholder="Username",
 | |
|         )
 | |
|     )
 | |
|     # Policy to only trigger prompt when no username is given
 | |
|     prompt_policy = ExpressionPolicy.objects.create(
 | |
|         name="default-source-enrollment-if-username",
 | |
|         expression=PROMPT_POLICY_EXPRESSION,
 | |
|     )
 | |
| 
 | |
|     # UserWrite stage to create the user, and login stage to log user in
 | |
|     user_write = UserWriteStage.objects.create(name="default-source-enrollment-write")
 | |
|     user_login = UserLoginStage.objects.create(name="default-source-enrollment-login")
 | |
| 
 | |
|     binding = FlowStageBinding.objects.create(flow=flow, stage=prompt_stage, order=0)
 | |
|     PolicyBinding.objects.create(policy=prompt_policy, target=binding)
 | |
| 
 | |
|     FlowStageBinding.objects.create(flow=flow, stage=user_write, order=1)
 | |
|     FlowStageBinding.objects.create(flow=flow, stage=user_login, order=2)
 | |
| 
 | |
| 
 | |
| def create_default_source_authentication_flow(
 | |
|     apps: Apps, schema_editor: BaseDatabaseSchemaEditor
 | |
| ):
 | |
|     Flow = apps.get_model("passbook_flows", "Flow")
 | |
|     FlowStageBinding = apps.get_model("passbook_flows", "FlowStageBinding")
 | |
|     PolicyBinding = apps.get_model("passbook_policies", "PolicyBinding")
 | |
| 
 | |
|     ExpressionPolicy = apps.get_model(
 | |
|         "passbook_policies_expression", "ExpressionPolicy"
 | |
|     )
 | |
| 
 | |
|     UserLoginStage = apps.get_model("passbook_stages_user_login", "UserLoginStage")
 | |
| 
 | |
|     db_alias = schema_editor.connection.alias
 | |
| 
 | |
|     # Create a policy that only allows this flow when doing an SSO Request
 | |
|     flow_policy = ExpressionPolicy.objects.create(
 | |
|         name="default-source-authentication-if-sso", expression=FLOW_POLICY_EXPRESSION
 | |
|     )
 | |
| 
 | |
|     # This creates a Flow used by sources to authenticate users
 | |
|     flow = Flow.objects.create(
 | |
|         name="default-source-authentication",
 | |
|         slug="default-source-authentication",
 | |
|         designation=FlowDesignation.AUTHENTICATION,
 | |
|     )
 | |
|     PolicyBinding.objects.create(policy=flow_policy, target=flow, order=0)
 | |
| 
 | |
|     user_login = UserLoginStage.objects.create(
 | |
|         name="default-source-authentication-login"
 | |
|     )
 | |
|     FlowStageBinding.objects.create(flow=flow, stage=user_login, order=0)
 | |
| 
 | |
| 
 | |
| class Migration(migrations.Migration):
 | |
| 
 | |
|     dependencies = [
 | |
|         ("passbook_flows", "0003_auto_20200523_1133"),
 | |
|         ("passbook_policies", "0001_initial"),
 | |
|         ("passbook_policies_expression", "0001_initial"),
 | |
|         ("passbook_stages_prompt", "0001_initial"),
 | |
|         ("passbook_stages_user_write", "0001_initial"),
 | |
|         ("passbook_stages_user_login", "0001_initial"),
 | |
|     ]
 | |
| 
 | |
|     operations = [
 | |
|         migrations.RunPython(create_default_source_enrollment_flow),
 | |
|         migrations.RunPython(create_default_source_authentication_flow),
 | |
|     ]
 |