Skip to content

Commit 0f39a6c

Browse files
committed
OpenPGP key support
This adds a repository type as a keyring and content types to handle keys, keyids and key signatures. fixes #3024
1 parent 361392f commit 0f39a6c

File tree

13 files changed

+1638
-0
lines changed

13 files changed

+1638
-0
lines changed

CHANGES/3024.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Added OpenPGP keyring repository type and OpenPGP key content type.
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
# Generated by Django 4.2.4 on 2023-10-06 18:40
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import pulpcore.app.util
6+
7+
8+
class Migration(migrations.Migration):
9+
dependencies = [
10+
("core", "0123_upstreampulp_q_select"),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name="OpenPGPKeyring",
16+
fields=[
17+
(
18+
"repository_ptr",
19+
models.OneToOneField(
20+
auto_created=True,
21+
on_delete=django.db.models.deletion.CASCADE,
22+
parent_link=True,
23+
primary_key=True,
24+
serialize=False,
25+
to="core.repository",
26+
),
27+
),
28+
],
29+
options={
30+
"default_related_name": "%(app_label)s_%(model_name)s",
31+
},
32+
bases=("core.repository",),
33+
),
34+
migrations.CreateModel(
35+
name="OpenPGPPublicKey",
36+
fields=[
37+
(
38+
"content_ptr",
39+
models.OneToOneField(
40+
auto_created=True,
41+
on_delete=django.db.models.deletion.CASCADE,
42+
parent_link=True,
43+
primary_key=True,
44+
serialize=False,
45+
to="core.content",
46+
),
47+
),
48+
("raw_data", models.BinaryField()),
49+
("fingerprint", models.CharField(max_length=64)),
50+
("created", models.DateTimeField()),
51+
(
52+
"_pulp_domain",
53+
models.ForeignKey(
54+
default=pulpcore.app.util.get_domain_pk,
55+
on_delete=django.db.models.deletion.PROTECT,
56+
to="core.domain",
57+
),
58+
),
59+
],
60+
options={
61+
"default_related_name": "%(app_label)s_%(model_name)s",
62+
"unique_together": {("_pulp_domain", "fingerprint")},
63+
},
64+
bases=("core.content",),
65+
),
66+
migrations.CreateModel(
67+
name="OpenPGPUserID",
68+
fields=[
69+
(
70+
"content_ptr",
71+
models.OneToOneField(
72+
auto_created=True,
73+
on_delete=django.db.models.deletion.CASCADE,
74+
parent_link=True,
75+
primary_key=True,
76+
serialize=False,
77+
to="core.content",
78+
),
79+
),
80+
("raw_data", models.BinaryField()),
81+
("user_id", models.CharField()),
82+
(
83+
"public_key",
84+
models.ForeignKey(
85+
on_delete=django.db.models.deletion.PROTECT,
86+
related_name="user_ids",
87+
to="core.openpgppublickey",
88+
),
89+
),
90+
],
91+
options={
92+
"default_related_name": "%(app_label)s_%(model_name)s",
93+
"unique_together": {("public_key", "user_id")},
94+
},
95+
bases=("core.content",),
96+
),
97+
migrations.CreateModel(
98+
name="OpenPGPUserAttribute",
99+
fields=[
100+
(
101+
"content_ptr",
102+
models.OneToOneField(
103+
auto_created=True,
104+
on_delete=django.db.models.deletion.CASCADE,
105+
parent_link=True,
106+
primary_key=True,
107+
serialize=False,
108+
to="core.content",
109+
),
110+
),
111+
("raw_data", models.BinaryField()),
112+
("sha256", models.CharField(max_length=128)),
113+
(
114+
"public_key",
115+
models.ForeignKey(
116+
on_delete=django.db.models.deletion.PROTECT,
117+
related_name="user_attributes",
118+
to="core.openpgppublickey",
119+
),
120+
),
121+
],
122+
options={
123+
"default_related_name": "%(app_label)s_%(model_name)s",
124+
"unique_together": {("public_key", "sha256")},
125+
},
126+
bases=("core.content",),
127+
),
128+
migrations.CreateModel(
129+
name="OpenPGPSignature",
130+
fields=[
131+
(
132+
"content_ptr",
133+
models.OneToOneField(
134+
auto_created=True,
135+
on_delete=django.db.models.deletion.CASCADE,
136+
parent_link=True,
137+
primary_key=True,
138+
serialize=False,
139+
to="core.content",
140+
),
141+
),
142+
("raw_data", models.BinaryField()),
143+
("sha256", models.CharField(max_length=128)),
144+
("signature_type", models.PositiveSmallIntegerField()),
145+
("created", models.DateTimeField()),
146+
("expiration_time", models.DurationField(null=True)),
147+
("key_expiration_time", models.DurationField(null=True)),
148+
("issuer", models.CharField(max_length=16, null=True)),
149+
("signers_user_id", models.CharField(null=True)),
150+
(
151+
"signed_content",
152+
models.ForeignKey(
153+
on_delete=django.db.models.deletion.PROTECT,
154+
related_name="openpgp_signatures",
155+
to="core.content",
156+
),
157+
),
158+
],
159+
options={
160+
"default_related_name": "%(app_label)s_%(model_name)s",
161+
"unique_together": {("signed_content", "sha256")},
162+
},
163+
bases=("core.content",),
164+
),
165+
migrations.CreateModel(
166+
name="OpenPGPPublicSubkey",
167+
fields=[
168+
(
169+
"content_ptr",
170+
models.OneToOneField(
171+
auto_created=True,
172+
on_delete=django.db.models.deletion.CASCADE,
173+
parent_link=True,
174+
primary_key=True,
175+
serialize=False,
176+
to="core.content",
177+
),
178+
),
179+
("raw_data", models.BinaryField()),
180+
("fingerprint", models.CharField(max_length=64)),
181+
("created", models.DateTimeField()),
182+
(
183+
"public_key",
184+
models.ForeignKey(
185+
on_delete=django.db.models.deletion.PROTECT,
186+
related_name="public_subkeys",
187+
to="core.openpgppublickey",
188+
),
189+
),
190+
],
191+
options={
192+
"default_related_name": "%(app_label)s_%(model_name)s",
193+
"unique_together": {("public_key", "fingerprint")},
194+
},
195+
bases=("core.content",),
196+
),
197+
]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.2.4 on 2023-10-07 14:18
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("core", "0124_openpgpkeyring_openpgppublickey_openpgpuserid_and_more"),
9+
]
10+
11+
operations = [
12+
migrations.AlterModelOptions(
13+
name="openpgpkeyring",
14+
options={
15+
"default_related_name": "%(app_label)s_%(model_name)s",
16+
"permissions": [
17+
("modify_openpgpkeyring", "Can modify content of the keyring"),
18+
("manage_roles_openpgpkeyring", "Can manage roles on keyrings"),
19+
("repair_openpgpkeyring", "Can repair repository versions"),
20+
],
21+
},
22+
),
23+
]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 4.2.6 on 2023-10-13 13:01
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import pulpcore.app.models.access_policy
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('core', '0125_alter_openpgpkeyring_options'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='OpenPGPDistribution',
17+
fields=[
18+
('distribution_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.distribution')),
19+
],
20+
options={
21+
'permissions': [('manage_roles_openpgpdistribution', 'Can manage roles on gem distributions')],
22+
'default_related_name': '%(app_label)s_%(model_name)s',
23+
},
24+
bases=('core.distribution', pulpcore.app.models.access_policy.AutoAddObjPermsMixin),
25+
),
26+
]

pulpcore/app/models/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,13 @@
9292

9393
# Moved here to avoid a circular import with GroupProgressReport
9494
from .replica import UpstreamPulp
95+
96+
from .openpgp import (
97+
OpenPGPDistribution,
98+
OpenPGPKeyring,
99+
OpenPGPPublicKey,
100+
OpenPGPPublicSubkey,
101+
OpenPGPSignature,
102+
OpenPGPUserAttribute,
103+
OpenPGPUserID,
104+
)

0 commit comments

Comments
 (0)