authentik.endpoints.connectors.agent.migrations.0001_initial

  1# Generated by Django 5.2.8 on 2025-11-20 20:14
  2
  3import authentik.core.models
  4import authentik.lib.generators
  5import authentik.lib.utils.time
  6import django.db.models.deletion
  7import uuid
  8from django.db import migrations, models
  9
 10
 11class Migration(migrations.Migration):
 12
 13    initial = True
 14
 15    dependencies = [
 16        ("authentik_crypto", "0004_alter_certificatekeypair_name"),
 17        ("authentik_endpoints", "0001_initial"),
 18        ("authentik_flows", "0028_flowtoken_revoke_on_execution"),
 19    ]
 20
 21    operations = [
 22        migrations.CreateModel(
 23            name="AgentDeviceConnection",
 24            fields=[
 25                (
 26                    "deviceconnection_ptr",
 27                    models.OneToOneField(
 28                        auto_created=True,
 29                        on_delete=django.db.models.deletion.CASCADE,
 30                        parent_link=True,
 31                        primary_key=True,
 32                        serialize=False,
 33                        to="authentik_endpoints.deviceconnection",
 34                    ),
 35                ),
 36                ("apple_signing_key", models.TextField()),
 37                ("apple_encryption_key", models.TextField()),
 38                ("apple_key_exchange_key", models.TextField()),
 39                ("apple_sign_key_id", models.TextField()),
 40                ("apple_enc_key_id", models.TextField()),
 41            ],
 42            options={
 43                "abstract": False,
 44            },
 45            bases=("authentik_endpoints.deviceconnection",),
 46        ),
 47        migrations.CreateModel(
 48            name="AgentDeviceUserBinding",
 49            fields=[
 50                (
 51                    "deviceuserbinding_ptr",
 52                    models.OneToOneField(
 53                        auto_created=True,
 54                        on_delete=django.db.models.deletion.CASCADE,
 55                        parent_link=True,
 56                        primary_key=True,
 57                        serialize=False,
 58                        to="authentik_endpoints.deviceuserbinding",
 59                    ),
 60                ),
 61                ("apple_secure_enclave_key", models.TextField()),
 62                ("apple_enclave_key_id", models.TextField()),
 63            ],
 64            options={
 65                "abstract": False,
 66            },
 67            bases=("authentik_endpoints.deviceuserbinding",),
 68        ),
 69        migrations.CreateModel(
 70            name="AgentConnector",
 71            fields=[
 72                (
 73                    "connector_ptr",
 74                    models.OneToOneField(
 75                        auto_created=True,
 76                        on_delete=django.db.models.deletion.CASCADE,
 77                        parent_link=True,
 78                        primary_key=True,
 79                        serialize=False,
 80                        to="authentik_endpoints.connector",
 81                    ),
 82                ),
 83                ("nss_uid_offset", models.PositiveIntegerField(default=1000)),
 84                ("nss_gid_offset", models.PositiveIntegerField(default=1000)),
 85                ("auth_terminate_session_on_expiry", models.BooleanField(default=False)),
 86                (
 87                    "refresh_interval",
 88                    models.TextField(
 89                        default="minutes=30",
 90                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 91                    ),
 92                ),
 93                (
 94                    "authentication_flow",
 95                    models.ForeignKey(
 96                        default=None,
 97                        null=True,
 98                        on_delete=django.db.models.deletion.SET_DEFAULT,
 99                        to="authentik_flows.flow",
100                    ),
101                ),
102                (
103                    "challenge_key",
104                    models.ForeignKey(
105                        null=True,
106                        on_delete=django.db.models.deletion.CASCADE,
107                        to="authentik_crypto.certificatekeypair",
108                    ),
109                ),
110            ],
111            options={
112                "verbose_name": "Agent Connector",
113                "verbose_name_plural": "Agent Connectors",
114            },
115            bases=("authentik_endpoints.connector",),
116        ),
117        migrations.CreateModel(
118            name="DeviceToken",
119            fields=[
120                ("expires", models.DateTimeField(default=None, null=True)),
121                ("expiring", models.BooleanField(default=True)),
122                (
123                    "token_uuid",
124                    models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False),
125                ),
126                ("key", models.TextField(default=authentik.lib.generators.generate_key)),
127                (
128                    "device",
129                    models.ForeignKey(
130                        on_delete=django.db.models.deletion.CASCADE,
131                        to="authentik_endpoints_connectors_agent.agentdeviceconnection",
132                    ),
133                ),
134            ],
135            options={
136                "abstract": False,
137                "indexes": [
138                    models.Index(fields=["expires"], name="authentik_e_expires_675725_idx"),
139                    models.Index(fields=["expiring"], name="authentik_e_expirin_8eb6d1_idx"),
140                    models.Index(
141                        fields=["expiring", "expires"], name="authentik_e_expirin_bd42e6_idx"
142                    ),
143                ],
144            },
145        ),
146        migrations.CreateModel(
147            name="EnrollmentToken",
148            fields=[
149                ("expires", models.DateTimeField(default=None, null=True)),
150                ("expiring", models.BooleanField(default=True)),
151                (
152                    "token_uuid",
153                    models.UUIDField(
154                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
155                    ),
156                ),
157                ("name", models.TextField()),
158                ("key", models.TextField(default=authentik.core.models.default_token_key)),
159                (
160                    "connector",
161                    models.ForeignKey(
162                        on_delete=django.db.models.deletion.CASCADE,
163                        to="authentik_endpoints_connectors_agent.agentconnector",
164                    ),
165                ),
166                (
167                    "device_group",
168                    models.ForeignKey(
169                        default=None,
170                        null=True,
171                        on_delete=django.db.models.deletion.SET_DEFAULT,
172                        to="authentik_endpoints.devicegroup",
173                    ),
174                ),
175            ],
176            options={
177                "verbose_name": "Enrollment Token",
178                "verbose_name_plural": "Enrollment Tokens",
179                "permissions": [("view_enrollment_token_key", "View token's key")],
180                "indexes": [
181                    models.Index(fields=["expires"], name="authentik_e_expires_98b99c_idx"),
182                    models.Index(fields=["expiring"], name="authentik_e_expirin_9a17f7_idx"),
183                    models.Index(
184                        fields=["expiring", "expires"], name="authentik_e_expirin_7ad82a_idx"
185                    ),
186                    models.Index(fields=["key"], name="authentik_e_key_8dafaf_idx"),
187                ],
188            },
189        ),
190    ]
class Migration(django.db.migrations.migration.Migration):
 12class Migration(migrations.Migration):
 13
 14    initial = True
 15
 16    dependencies = [
 17        ("authentik_crypto", "0004_alter_certificatekeypair_name"),
 18        ("authentik_endpoints", "0001_initial"),
 19        ("authentik_flows", "0028_flowtoken_revoke_on_execution"),
 20    ]
 21
 22    operations = [
 23        migrations.CreateModel(
 24            name="AgentDeviceConnection",
 25            fields=[
 26                (
 27                    "deviceconnection_ptr",
 28                    models.OneToOneField(
 29                        auto_created=True,
 30                        on_delete=django.db.models.deletion.CASCADE,
 31                        parent_link=True,
 32                        primary_key=True,
 33                        serialize=False,
 34                        to="authentik_endpoints.deviceconnection",
 35                    ),
 36                ),
 37                ("apple_signing_key", models.TextField()),
 38                ("apple_encryption_key", models.TextField()),
 39                ("apple_key_exchange_key", models.TextField()),
 40                ("apple_sign_key_id", models.TextField()),
 41                ("apple_enc_key_id", models.TextField()),
 42            ],
 43            options={
 44                "abstract": False,
 45            },
 46            bases=("authentik_endpoints.deviceconnection",),
 47        ),
 48        migrations.CreateModel(
 49            name="AgentDeviceUserBinding",
 50            fields=[
 51                (
 52                    "deviceuserbinding_ptr",
 53                    models.OneToOneField(
 54                        auto_created=True,
 55                        on_delete=django.db.models.deletion.CASCADE,
 56                        parent_link=True,
 57                        primary_key=True,
 58                        serialize=False,
 59                        to="authentik_endpoints.deviceuserbinding",
 60                    ),
 61                ),
 62                ("apple_secure_enclave_key", models.TextField()),
 63                ("apple_enclave_key_id", models.TextField()),
 64            ],
 65            options={
 66                "abstract": False,
 67            },
 68            bases=("authentik_endpoints.deviceuserbinding",),
 69        ),
 70        migrations.CreateModel(
 71            name="AgentConnector",
 72            fields=[
 73                (
 74                    "connector_ptr",
 75                    models.OneToOneField(
 76                        auto_created=True,
 77                        on_delete=django.db.models.deletion.CASCADE,
 78                        parent_link=True,
 79                        primary_key=True,
 80                        serialize=False,
 81                        to="authentik_endpoints.connector",
 82                    ),
 83                ),
 84                ("nss_uid_offset", models.PositiveIntegerField(default=1000)),
 85                ("nss_gid_offset", models.PositiveIntegerField(default=1000)),
 86                ("auth_terminate_session_on_expiry", models.BooleanField(default=False)),
 87                (
 88                    "refresh_interval",
 89                    models.TextField(
 90                        default="minutes=30",
 91                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 92                    ),
 93                ),
 94                (
 95                    "authentication_flow",
 96                    models.ForeignKey(
 97                        default=None,
 98                        null=True,
 99                        on_delete=django.db.models.deletion.SET_DEFAULT,
100                        to="authentik_flows.flow",
101                    ),
102                ),
103                (
104                    "challenge_key",
105                    models.ForeignKey(
106                        null=True,
107                        on_delete=django.db.models.deletion.CASCADE,
108                        to="authentik_crypto.certificatekeypair",
109                    ),
110                ),
111            ],
112            options={
113                "verbose_name": "Agent Connector",
114                "verbose_name_plural": "Agent Connectors",
115            },
116            bases=("authentik_endpoints.connector",),
117        ),
118        migrations.CreateModel(
119            name="DeviceToken",
120            fields=[
121                ("expires", models.DateTimeField(default=None, null=True)),
122                ("expiring", models.BooleanField(default=True)),
123                (
124                    "token_uuid",
125                    models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False),
126                ),
127                ("key", models.TextField(default=authentik.lib.generators.generate_key)),
128                (
129                    "device",
130                    models.ForeignKey(
131                        on_delete=django.db.models.deletion.CASCADE,
132                        to="authentik_endpoints_connectors_agent.agentdeviceconnection",
133                    ),
134                ),
135            ],
136            options={
137                "abstract": False,
138                "indexes": [
139                    models.Index(fields=["expires"], name="authentik_e_expires_675725_idx"),
140                    models.Index(fields=["expiring"], name="authentik_e_expirin_8eb6d1_idx"),
141                    models.Index(
142                        fields=["expiring", "expires"], name="authentik_e_expirin_bd42e6_idx"
143                    ),
144                ],
145            },
146        ),
147        migrations.CreateModel(
148            name="EnrollmentToken",
149            fields=[
150                ("expires", models.DateTimeField(default=None, null=True)),
151                ("expiring", models.BooleanField(default=True)),
152                (
153                    "token_uuid",
154                    models.UUIDField(
155                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
156                    ),
157                ),
158                ("name", models.TextField()),
159                ("key", models.TextField(default=authentik.core.models.default_token_key)),
160                (
161                    "connector",
162                    models.ForeignKey(
163                        on_delete=django.db.models.deletion.CASCADE,
164                        to="authentik_endpoints_connectors_agent.agentconnector",
165                    ),
166                ),
167                (
168                    "device_group",
169                    models.ForeignKey(
170                        default=None,
171                        null=True,
172                        on_delete=django.db.models.deletion.SET_DEFAULT,
173                        to="authentik_endpoints.devicegroup",
174                    ),
175                ),
176            ],
177            options={
178                "verbose_name": "Enrollment Token",
179                "verbose_name_plural": "Enrollment Tokens",
180                "permissions": [("view_enrollment_token_key", "View token's key")],
181                "indexes": [
182                    models.Index(fields=["expires"], name="authentik_e_expires_98b99c_idx"),
183                    models.Index(fields=["expiring"], name="authentik_e_expirin_9a17f7_idx"),
184                    models.Index(
185                        fields=["expiring", "expires"], name="authentik_e_expirin_7ad82a_idx"
186                    ),
187                    models.Index(fields=["key"], name="authentik_e_key_8dafaf_idx"),
188                ],
189            },
190        ),
191    ]

The base class for all migrations.

Migration files will import this from django.db.migrations.Migration and subclass it as a class called Migration. It will have one or more of the following attributes:

  • operations: A list of Operation instances, probably from django.db.migrations.operations
  • dependencies: A list of tuples of (app_path, migration_name)
  • run_before: A list of tuples of (app_path, migration_name)
  • replaces: A list of migration_names

Note that all migrations come out of migrations and into the Loader or Graph as instances, having been initialized with their app label and name.

initial = True
dependencies = [('authentik_crypto', '0004_alter_certificatekeypair_name'), ('authentik_endpoints', '0001_initial'), ('authentik_flows', '0028_flowtoken_revoke_on_execution')]
operations = [<CreateModel name='AgentDeviceConnection', fields=[('deviceconnection_ptr', <django.db.models.fields.related.OneToOneField>), ('apple_signing_key', <django.db.models.fields.TextField>), ('apple_encryption_key', <django.db.models.fields.TextField>), ('apple_key_exchange_key', <django.db.models.fields.TextField>), ('apple_sign_key_id', <django.db.models.fields.TextField>), ('apple_enc_key_id', <django.db.models.fields.TextField>)], options={'abstract': False}, bases=('authentik_endpoints.deviceconnection',)>, <CreateModel name='AgentDeviceUserBinding', fields=[('deviceuserbinding_ptr', <django.db.models.fields.related.OneToOneField>), ('apple_secure_enclave_key', <django.db.models.fields.TextField>), ('apple_enclave_key_id', <django.db.models.fields.TextField>)], options={'abstract': False}, bases=('authentik_endpoints.deviceuserbinding',)>, <CreateModel name='AgentConnector', fields=[('connector_ptr', <django.db.models.fields.related.OneToOneField>), ('nss_uid_offset', <django.db.models.fields.PositiveIntegerField>), ('nss_gid_offset', <django.db.models.fields.PositiveIntegerField>), ('auth_terminate_session_on_expiry', <django.db.models.fields.BooleanField>), ('refresh_interval', <django.db.models.fields.TextField>), ('authentication_flow', <django.db.models.fields.related.ForeignKey>), ('challenge_key', <django.db.models.fields.related.ForeignKey>)], options={'verbose_name': 'Agent Connector', 'verbose_name_plural': 'Agent Connectors'}, bases=('authentik_endpoints.connector',)>, <CreateModel name='DeviceToken', fields=[('expires', <django.db.models.fields.DateTimeField>), ('expiring', <django.db.models.fields.BooleanField>), ('token_uuid', <django.db.models.fields.UUIDField>), ('key', <django.db.models.fields.TextField>), ('device', <django.db.models.fields.related.ForeignKey>)], options={'abstract': False, 'indexes': [<Index: fields=['expires'] name='authentik_e_expires_675725_idx'>, <Index: fields=['expiring'] name='authentik_e_expirin_8eb6d1_idx'>, <Index: fields=['expiring', 'expires'] name='authentik_e_expirin_bd42e6_idx'>]}>, <CreateModel name='EnrollmentToken', fields=[('expires', <django.db.models.fields.DateTimeField>), ('expiring', <django.db.models.fields.BooleanField>), ('token_uuid', <django.db.models.fields.UUIDField>), ('name', <django.db.models.fields.TextField>), ('key', <django.db.models.fields.TextField>), ('connector', <django.db.models.fields.related.ForeignKey>), ('device_group', <django.db.models.fields.related.ForeignKey>)], options={'verbose_name': 'Enrollment Token', 'verbose_name_plural': 'Enrollment Tokens', 'permissions': [('view_enrollment_token_key', "View token's key")], 'indexes': [<Index: fields=['expires'] name='authentik_e_expires_98b99c_idx'>, <Index: fields=['expiring'] name='authentik_e_expirin_9a17f7_idx'>, <Index: fields=['expiring', 'expires'] name='authentik_e_expirin_7ad82a_idx'>, <Index: fields=['key'] name='authentik_e_key_8dafaf_idx'>]}>]