Merge lp:~wgrant/launchpad/gpgkey-fks-read into lp:launchpad
- gpgkey-fks-read
- Merge into devel
Proposed by
William Grant
Status: | Merged |
---|---|
Merged at revision: | 17941 |
Proposed branch: | lp:~wgrant/launchpad/gpgkey-fks-read |
Merge into: | lp:launchpad |
Prerequisite: | lp:~wgrant/launchpad/gpgkey-fks-no-garbo |
Diff against target: |
794 lines (+176/-73) 28 files modified
lib/lp/archivepublisher/archivesigningkey.py (+7/-4) lib/lp/archivepublisher/tests/archive-signing.txt (+18/-7) lib/lp/archivepublisher/tests/test_publishdistro.py (+3/-1) lib/lp/archiveuploader/tests/upload-karma.txt (+4/-1) lib/lp/registry/browser/tests/test_codeofconduct.py (+2/-1) lib/lp/registry/browser/tests/test_distroseries.py (+17/-6) lib/lp/registry/interfaces/gpg.py (+3/-0) lib/lp/registry/model/codeofconduct.py (+9/-2) lib/lp/registry/model/distroseries.py (+2/-2) lib/lp/registry/model/distroseriesdifference.py (+2/-6) lib/lp/registry/model/gpgkey.py (+6/-0) lib/lp/soyuz/configure.zcml (+3/-3) lib/lp/soyuz/doc/distroseriesqueue-notify.txt (+3/-1) lib/lp/soyuz/doc/publishing.txt (+7/-2) lib/lp/soyuz/interfaces/sourcepackagerelease.py (+0/-1) lib/lp/soyuz/model/archive.py (+22/-18) lib/lp/soyuz/model/queue.py (+8/-1) lib/lp/soyuz/model/sourcepackagerelease.py (+14/-3) lib/lp/soyuz/scripts/gina/handlers.py (+1/-1) lib/lp/soyuz/scripts/tests/test_ppakeygenerator.py (+6/-2) lib/lp/soyuz/stories/ppa/xx-private-ppa-subscriptions.txt (+3/-1) lib/lp/soyuz/stories/ppa/xx-ubuntu-ppas.txt (+3/-1) lib/lp/soyuz/stories/webservice/xx-archive.txt (+4/-1) lib/lp/soyuz/stories/webservice/xx-builds.txt (+4/-1) lib/lp/soyuz/stories/webservice/xx-source-package-publishing.txt (+5/-2) lib/lp/soyuz/tests/test_archive.py (+9/-2) lib/lp/soyuz/tests/test_build_notify.py (+9/-2) utilities/soyuz-sampledata-setup.py (+2/-1) |
To merge this branch: | bzr merge lp:~wgrant/launchpad/gpgkey-fks-read |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Colin Watson (community) | Approve | ||
Review via email: mp+287804@code.launchpad.net |
Commit message
Read GPGKey fingerprint columns rather than the integer FK.
Description of the change
Read GPGKey fingerprint columns rather than the integer FK.
Still setting the old columns until everything reads from the new.
To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'lib/lp/archivepublisher/archivesigningkey.py' | |||
2 | --- lib/lp/archivepublisher/archivesigningkey.py 2016-02-22 23:52:21 +0000 | |||
3 | +++ lib/lp/archivepublisher/archivesigningkey.py 2016-03-10 01:29:20 +0000 | |||
4 | @@ -27,6 +27,7 @@ | |||
5 | 27 | GPGKeyAlgorithm, | 27 | GPGKeyAlgorithm, |
6 | 28 | IGPGHandler, | 28 | IGPGHandler, |
7 | 29 | ) | 29 | ) |
8 | 30 | from lp.services.propertycache import get_property_cache | ||
9 | 30 | 31 | ||
10 | 31 | 32 | ||
11 | 32 | @implementer(IArchiveSigningKey) | 33 | @implementer(IArchiveSigningKey) |
12 | @@ -71,9 +72,10 @@ | |||
13 | 71 | if default_ppa.signing_key is None: | 72 | if default_ppa.signing_key is None: |
14 | 72 | IArchiveSigningKey(default_ppa).generateSigningKey() | 73 | IArchiveSigningKey(default_ppa).generateSigningKey() |
15 | 73 | key = default_ppa.signing_key | 74 | key = default_ppa.signing_key |
17 | 74 | self.archive.signing_key = key | 75 | self.archive._signing_key = key |
18 | 75 | self.archive.signing_key_owner = key.owner | 76 | self.archive.signing_key_owner = key.owner |
20 | 76 | self.archive._signing_key_fingerprint = key.fingerprint | 77 | self.archive.signing_key_fingerprint = key.fingerprint |
21 | 78 | del get_property_cache(self.archive).signing_key | ||
22 | 77 | return | 79 | return |
23 | 78 | 80 | ||
24 | 79 | key_displayname = ( | 81 | key_displayname = ( |
25 | @@ -111,9 +113,10 @@ | |||
26 | 111 | key = getUtility(IGPGKeySet).new( | 113 | key = getUtility(IGPGKeySet).new( |
27 | 112 | key_owner, pub_key.keyid, pub_key.fingerprint, pub_key.keysize, | 114 | key_owner, pub_key.keyid, pub_key.fingerprint, pub_key.keysize, |
28 | 113 | algorithm, active=True, can_encrypt=pub_key.can_encrypt) | 115 | algorithm, active=True, can_encrypt=pub_key.can_encrypt) |
30 | 114 | self.archive.signing_key = key | 116 | self.archive._signing_key = key |
31 | 115 | self.archive.signing_key_owner = key.owner | 117 | self.archive.signing_key_owner = key.owner |
33 | 116 | self.archive._signing_key_fingerprint = key.fingerprint | 118 | self.archive.signing_key_fingerprint = key.fingerprint |
34 | 119 | del get_property_cache(self.archive).signing_key | ||
35 | 117 | 120 | ||
36 | 118 | def signRepository(self, suite): | 121 | def signRepository(self, suite): |
37 | 119 | """See `IArchiveSigningKey`.""" | 122 | """See `IArchiveSigningKey`.""" |
38 | 120 | 123 | ||
39 | === modified file 'lib/lp/archivepublisher/tests/archive-signing.txt' | |||
40 | --- lib/lp/archivepublisher/tests/archive-signing.txt 2015-10-01 10:25:19 +0000 | |||
41 | +++ lib/lp/archivepublisher/tests/archive-signing.txt 2016-03-10 01:29:20 +0000 | |||
42 | @@ -104,8 +104,8 @@ | |||
43 | 104 | 104 | ||
44 | 105 | And use it as the Mark's PPA signing key. | 105 | And use it as the Mark's PPA signing key. |
45 | 106 | 106 | ||
48 | 107 | >>> mark.archive.signing_key = a_key | 107 | >>> mark.archive.signing_key_owner = a_key.owner |
49 | 108 | 108 | >>> mark.archive.signing_key_fingerprint = a_key.fingerprint | |
50 | 109 | >>> print mark.archive.signing_key_fingerprint | 109 | >>> print mark.archive.signing_key_fingerprint |
51 | 110 | ABCDEF0123456789ABCDDCBA0000111112345678 | 110 | ABCDEF0123456789ABCDDCBA0000111112345678 |
52 | 111 | 111 | ||
53 | @@ -286,8 +286,11 @@ | |||
54 | 286 | simulating the situation when a the default PPA and a named-ppas get | 286 | simulating the situation when a the default PPA and a named-ppas get |
55 | 287 | created within the same cycle of the key-generator process. | 287 | created within the same cycle of the key-generator process. |
56 | 288 | 288 | ||
57 | 289 | >>> from lp.services.propertycache import get_property_cache | ||
58 | 289 | >>> login('foo.bar@canonical.com') | 290 | >>> login('foo.bar@canonical.com') |
60 | 290 | >>> named_ppa.signing_key = None | 291 | >>> named_ppa.signing_key_owner = None |
61 | 292 | >>> named_ppa.signing_key_fingerprint = None | ||
62 | 293 | >>> del get_property_cache(named_ppa).signing_key | ||
63 | 291 | >>> login(ANONYMOUS) | 294 | >>> login(ANONYMOUS) |
64 | 292 | 295 | ||
65 | 293 | >>> print named_ppa.signing_key | 296 | >>> print named_ppa.signing_key |
66 | @@ -312,8 +315,12 @@ | |||
67 | 312 | We will reset the signing-keys for both PPA of Celso. | 315 | We will reset the signing-keys for both PPA of Celso. |
68 | 313 | 316 | ||
69 | 314 | >>> login('foo.bar@canonical.com') | 317 | >>> login('foo.bar@canonical.com') |
72 | 315 | >>> cprov.archive.signing_key = None | 318 | >>> cprov.archive.signing_key_owner = None |
73 | 316 | >>> named_ppa.signing_key = None | 319 | >>> cprov.archive.signing_key_fingerprint = None |
74 | 320 | >>> del get_property_cache(cprov.archive).signing_key | ||
75 | 321 | >>> named_ppa.signing_key_owner = None | ||
76 | 322 | >>> named_ppa.signing_key_fingerprint = None | ||
77 | 323 | >>> del get_property_cache(named_ppa).signing_key | ||
78 | 317 | >>> login(ANONYMOUS) | 324 | >>> login(ANONYMOUS) |
79 | 318 | 325 | ||
80 | 319 | >>> print cprov.archive.signing_key | 326 | >>> print cprov.archive.signing_key |
81 | @@ -365,7 +372,9 @@ | |||
82 | 365 | Celso's default PPA will uses the testing signing key. | 372 | Celso's default PPA will uses the testing signing key. |
83 | 366 | 373 | ||
84 | 367 | >>> login('foo.bar@canonical.com') | 374 | >>> login('foo.bar@canonical.com') |
86 | 368 | >>> cprov.archive.signing_key = signing_key | 375 | >>> cprov.archive.signing_key_owner = signing_key.owner |
87 | 376 | >>> cprov.archive.signing_key_fingerprint = signing_key.fingerprint | ||
88 | 377 | >>> del get_property_cache(cprov.archive).signing_key | ||
89 | 369 | >>> login(ANONYMOUS) | 378 | >>> login(ANONYMOUS) |
90 | 370 | 379 | ||
91 | 371 | When signing repositores we assert they contain the right format and | 380 | When signing repositores we assert they contain the right format and |
92 | @@ -437,7 +446,9 @@ | |||
93 | 437 | Finally, if we try to sign a repository for which the archive doesn't | 446 | Finally, if we try to sign a repository for which the archive doesn't |
94 | 438 | have a 'signing_key' set, it raises an error. | 447 | have a 'signing_key' set, it raises an error. |
95 | 439 | 448 | ||
97 | 440 | >>> cprov.archive.signing_key = None | 449 | >>> cprov.archive.signing_key_owner = None |
98 | 450 | >>> cprov.archive.signing_key_fingerprint = None | ||
99 | 451 | >>> del get_property_cache(cprov.archive).signing_key | ||
100 | 441 | 452 | ||
101 | 442 | >>> archive_signing_key.signRepository(test_suite) | 453 | >>> archive_signing_key.signRepository(test_suite) |
102 | 443 | Traceback (most recent call last): | 454 | Traceback (most recent call last): |
103 | 444 | 455 | ||
104 | === modified file 'lib/lp/archivepublisher/tests/test_publishdistro.py' | |||
105 | --- lib/lp/archivepublisher/tests/test_publishdistro.py 2016-02-04 19:46:52 +0000 | |||
106 | +++ lib/lp/archivepublisher/tests/test_publishdistro.py 2016-03-10 01:29:20 +0000 | |||
107 | @@ -246,7 +246,9 @@ | |||
108 | 246 | self.addCleanup(tac.tearDown) | 246 | self.addCleanup(tac.tearDown) |
109 | 247 | key_path = os.path.join(gpgkeysdir, 'ppa-sample@canonical.com.sec') | 247 | key_path = os.path.join(gpgkeysdir, 'ppa-sample@canonical.com.sec') |
110 | 248 | IArchiveSigningKey(cprov.archive).setSigningKey(key_path) | 248 | IArchiveSigningKey(cprov.archive).setSigningKey(key_path) |
112 | 249 | name16.archive.signing_key = cprov.archive.signing_key | 249 | name16.archive.signing_key_owner = cprov.archive.signing_key_owner |
113 | 250 | name16.archive.signing_key_fingerprint = ( | ||
114 | 251 | cprov.archive.signing_key_fingerprint) | ||
115 | 250 | 252 | ||
116 | 251 | self.layer.txn.commit() | 253 | self.layer.txn.commit() |
117 | 252 | 254 | ||
118 | 253 | 255 | ||
119 | === modified file 'lib/lp/archiveuploader/tests/upload-karma.txt' | |||
120 | --- lib/lp/archiveuploader/tests/upload-karma.txt 2016-03-01 12:40:37 +0000 | |||
121 | +++ lib/lp/archiveuploader/tests/upload-karma.txt 2016-03-10 01:29:20 +0000 | |||
122 | @@ -52,7 +52,10 @@ | |||
123 | 52 | >>> from lp.registry.interfaces.person import IPersonSet | 52 | >>> from lp.registry.interfaces.person import IPersonSet |
124 | 53 | >>> name16 = getUtility(IPersonSet).getByName('name16') | 53 | >>> name16 = getUtility(IPersonSet).getByName('name16') |
125 | 54 | >>> key = getUtility(IGPGKeySet).getGPGKeysForPerson(name16)[0] | 54 | >>> key = getUtility(IGPGKeySet).getGPGKeysForPerson(name16)[0] |
127 | 55 | >>> removeSecurityProxy(foo_src.queue_root).signing_key = key | 55 | >>> removeSecurityProxy(foo_src.queue_root).signing_key_owner = ( |
128 | 56 | ... key.owner) | ||
129 | 57 | >>> removeSecurityProxy(foo_src.queue_root).signing_key_fingerprint = ( | ||
130 | 58 | ... key.fingerprint) | ||
131 | 56 | >>> transaction.commit() | 59 | >>> transaction.commit() |
132 | 57 | >>> foo_src.queue_root.acceptFromQueue() | 60 | >>> foo_src.queue_root.acceptFromQueue() |
133 | 58 | Karma added: action=distributionuploadaccepted, distribution=ubuntu | 61 | Karma added: action=distributionuploadaccepted, distribution=ubuntu |
134 | 59 | 62 | ||
135 | === modified file 'lib/lp/registry/browser/tests/test_codeofconduct.py' | |||
136 | --- lib/lp/registry/browser/tests/test_codeofconduct.py 2012-11-08 10:48:29 +0000 | |||
137 | +++ lib/lp/registry/browser/tests/test_codeofconduct.py 2016-03-10 01:29:20 +0000 | |||
138 | @@ -70,7 +70,8 @@ | |||
139 | 70 | def sign_coc(self, user, gpg_key): | 70 | def sign_coc(self, user, gpg_key): |
140 | 71 | """Return a SignedCodeOfConduct using dummy text.""" | 71 | """Return a SignedCodeOfConduct using dummy text.""" |
141 | 72 | signed_coc = SignedCodeOfConduct( | 72 | signed_coc = SignedCodeOfConduct( |
143 | 73 | owner=user, signingkey=gpg_key, | 73 | owner=user, signing_key_fingerprint=gpg_key.fingerprint, |
144 | 74 | signing_key_owner=gpg_key.owner, | ||
145 | 74 | signedcode="Dummy CoC signed text.", active=True) | 75 | signedcode="Dummy CoC signed text.", active=True) |
146 | 75 | return signed_coc | 76 | return signed_coc |
147 | 76 | 77 | ||
148 | 77 | 78 | ||
149 | === modified file 'lib/lp/registry/browser/tests/test_distroseries.py' | |||
150 | --- lib/lp/registry/browser/tests/test_distroseries.py 2016-01-26 15:47:37 +0000 | |||
151 | +++ lib/lp/registry/browser/tests/test_distroseries.py 2016-03-10 01:29:20 +0000 | |||
152 | @@ -941,8 +941,11 @@ | |||
153 | 941 | sourcename=spr.sourcepackagename.name, | 941 | sourcename=spr.sourcepackagename.name, |
154 | 942 | distroseries=derived_series)) | 942 | distroseries=derived_series)) |
155 | 943 | else: | 943 | else: |
158 | 944 | removeSecurityProxy(spr).dscsigningkey = ( | 944 | key = self.factory.makeGPGKey(owner=spr.creator) |
159 | 945 | self.factory.makeGPGKey(owner=spr.creator)) | 945 | removeSecurityProxy(spr).signing_key_owner = key.owner |
160 | 946 | removeSecurityProxy(spr).signing_key_fingerprint = ( | ||
161 | 947 | key.fingerprint) | ||
162 | 948 | del get_property_cache(spr).dscsigningkey | ||
163 | 946 | 949 | ||
164 | 947 | def flush_and_render(): | 950 | def flush_and_render(): |
165 | 948 | flush_database_caches() | 951 | flush_database_caches() |
166 | @@ -1357,8 +1360,12 @@ | |||
167 | 1357 | # each difference row. | 1360 | # each difference row. |
168 | 1358 | dsd = self.makePackageUpgrade() | 1361 | dsd = self.makePackageUpgrade() |
169 | 1359 | uploader = self.factory.makePerson() | 1362 | uploader = self.factory.makePerson() |
172 | 1360 | removeSecurityProxy(dsd.source_package_release).dscsigningkey = ( | 1363 | key = self.factory.makeGPGKey(uploader) |
173 | 1361 | self.factory.makeGPGKey(uploader)) | 1364 | naked_spr = removeSecurityProxy( |
174 | 1365 | dsd.source_package_release.sourcepackagerelease) | ||
175 | 1366 | naked_spr.signing_key_fingerprint = key.fingerprint | ||
176 | 1367 | naked_spr.signing_key_owner = key.owner | ||
177 | 1368 | del get_property_cache(naked_spr).dscsigningkey | ||
178 | 1362 | view = self.makeView(dsd.derived_series) | 1369 | view = self.makeView(dsd.derived_series) |
179 | 1363 | root = html.fromstring(view()) | 1370 | root = html.fromstring(view()) |
180 | 1364 | [creator_cell] = root.cssselect( | 1371 | [creator_cell] = root.cssselect( |
181 | @@ -2433,8 +2440,12 @@ | |||
182 | 2433 | dsd = self.factory.makeDistroSeriesDifference( | 2440 | dsd = self.factory.makeDistroSeriesDifference( |
183 | 2434 | difference_type=missing_type) | 2441 | difference_type=missing_type) |
184 | 2435 | uploader = self.factory.makePerson() | 2442 | uploader = self.factory.makePerson() |
187 | 2436 | naked_spr = removeSecurityProxy(dsd.parent_source_package_release) | 2443 | key = self.factory.makeGPGKey(uploader) |
188 | 2437 | naked_spr.dscsigningkey = self.factory.makeGPGKey(uploader) | 2444 | naked_spr = removeSecurityProxy( |
189 | 2445 | dsd.parent_source_package_release.sourcepackagerelease) | ||
190 | 2446 | naked_spr.signing_key_fingerprint = key.fingerprint | ||
191 | 2447 | naked_spr.signing_key_owner = key.owner | ||
192 | 2448 | del get_property_cache(naked_spr).dscsigningkey | ||
193 | 2438 | with person_logged_in(self.simple_user): | 2449 | with person_logged_in(self.simple_user): |
194 | 2439 | view = create_initialized_view( | 2450 | view = create_initialized_view( |
195 | 2440 | dsd.derived_series, '+missingpackages', | 2451 | dsd.derived_series, '+missingpackages', |
196 | 2441 | 2452 | ||
197 | === modified file 'lib/lp/registry/interfaces/gpg.py' | |||
198 | --- lib/lp/registry/interfaces/gpg.py 2016-03-01 14:15:26 +0000 | |||
199 | +++ lib/lp/registry/interfaces/gpg.py 2016-03-10 01:29:20 +0000 | |||
200 | @@ -78,6 +78,9 @@ | |||
201 | 78 | inactive ones. | 78 | inactive ones. |
202 | 79 | """ | 79 | """ |
203 | 80 | 80 | ||
204 | 81 | def getByFingerprints(fingerprints): | ||
205 | 82 | """Get multiple OpenPGP keys by their fingerprints.""" | ||
206 | 83 | |||
207 | 81 | def getGPGKeysForPerson(person, active=True): | 84 | def getGPGKeysForPerson(person, active=True): |
208 | 82 | """Return OpenGPG keys for a person. | 85 | """Return OpenGPG keys for a person. |
209 | 83 | 86 | ||
210 | 84 | 87 | ||
211 | === modified file 'lib/lp/registry/model/codeofconduct.py' | |||
212 | --- lib/lp/registry/model/codeofconduct.py 2016-02-23 02:40:39 +0000 | |||
213 | +++ lib/lp/registry/model/codeofconduct.py 2016-03-10 01:29:20 +0000 | |||
214 | @@ -49,6 +49,7 @@ | |||
215 | 49 | format_address, | 49 | format_address, |
216 | 50 | simple_sendmail, | 50 | simple_sendmail, |
217 | 51 | ) | 51 | ) |
218 | 52 | from lp.services.propertycache import cachedproperty | ||
219 | 52 | from lp.services.webapp import canonical_url | 53 | from lp.services.webapp import canonical_url |
220 | 53 | 54 | ||
221 | 54 | 55 | ||
222 | @@ -180,7 +181,7 @@ | |||
223 | 180 | 181 | ||
224 | 181 | signedcode = StringCol(dbName='signedcode', notNull=False, default=None) | 182 | signedcode = StringCol(dbName='signedcode', notNull=False, default=None) |
225 | 182 | 183 | ||
227 | 183 | signingkey = ForeignKey(foreignKey="GPGKey", dbName="signingkey", | 184 | _signingkey = ForeignKey(foreignKey="GPGKey", dbName="signingkey", |
228 | 184 | notNull=False, default=None) | 185 | notNull=False, default=None) |
229 | 185 | signing_key_fingerprint = Unicode() | 186 | signing_key_fingerprint = Unicode() |
230 | 186 | 187 | ||
231 | @@ -195,6 +196,12 @@ | |||
232 | 195 | 196 | ||
233 | 196 | active = BoolCol(dbName='active', notNull=True, default=False) | 197 | active = BoolCol(dbName='active', notNull=True, default=False) |
234 | 197 | 198 | ||
235 | 199 | @cachedproperty | ||
236 | 200 | def signingkey(self): | ||
237 | 201 | if self.signing_key_fingerprint is not None: | ||
238 | 202 | return getUtility(IGPGKeySet).getByFingerprint( | ||
239 | 203 | self.signing_key_fingerprint) | ||
240 | 204 | |||
241 | 198 | @property | 205 | @property |
242 | 199 | def displayname(self): | 206 | def displayname(self): |
243 | 200 | """Build a Fancy Title for CoC.""" | 207 | """Build a Fancy Title for CoC.""" |
244 | @@ -308,7 +315,7 @@ | |||
245 | 308 | 315 | ||
246 | 309 | # Store the signature | 316 | # Store the signature |
247 | 310 | signed = SignedCodeOfConduct( | 317 | signed = SignedCodeOfConduct( |
249 | 311 | owner=user, signingkey=gpg, | 318 | owner=user, _signingkey=gpg, |
250 | 312 | signing_key_fingerprint=gpg.fingerprint if gpg else None, | 319 | signing_key_fingerprint=gpg.fingerprint if gpg else None, |
251 | 313 | signedcode=signedcode, active=True) | 320 | signedcode=signedcode, active=True) |
252 | 314 | 321 | ||
253 | 315 | 322 | ||
254 | === modified file 'lib/lp/registry/model/distroseries.py' | |||
255 | --- lib/lp/registry/model/distroseries.py 2016-02-23 02:27:23 +0000 | |||
256 | +++ lib/lp/registry/model/distroseries.py 2016-03-10 01:29:20 +0000 | |||
257 | @@ -1164,7 +1164,7 @@ | |||
258 | 1164 | architecturehintlist=architecturehintlist, component=component, | 1164 | architecturehintlist=architecturehintlist, component=component, |
259 | 1165 | creator=creator, urgency=urgency, changelog=changelog, | 1165 | creator=creator, urgency=urgency, changelog=changelog, |
260 | 1166 | changelog_entry=changelog_entry, dsc=dsc, | 1166 | changelog_entry=changelog_entry, dsc=dsc, |
262 | 1167 | dscsigningkey=dscsigningkey, | 1167 | _dscsigningkey=dscsigningkey, |
263 | 1168 | signing_key_owner=dscsigningkey.owner if dscsigningkey else None, | 1168 | signing_key_owner=dscsigningkey.owner if dscsigningkey else None, |
264 | 1169 | signing_key_fingerprint=( | 1169 | signing_key_fingerprint=( |
265 | 1170 | dscsigningkey.fingerprint if dscsigningkey else None), | 1170 | dscsigningkey.fingerprint if dscsigningkey else None), |
266 | @@ -1353,7 +1353,7 @@ | |||
267 | 1353 | return PackageUpload( | 1353 | return PackageUpload( |
268 | 1354 | distroseries=self, status=PackageUploadStatus.NEW, | 1354 | distroseries=self, status=PackageUploadStatus.NEW, |
269 | 1355 | pocket=pocket, archive=archive, changesfile=changes_file_alias, | 1355 | pocket=pocket, archive=archive, changesfile=changes_file_alias, |
271 | 1356 | signing_key=signing_key, | 1356 | _signing_key=signing_key, |
272 | 1357 | signing_key_owner=signing_key.owner if signing_key else None, | 1357 | signing_key_owner=signing_key.owner if signing_key else None, |
273 | 1358 | signing_key_fingerprint=( | 1358 | signing_key_fingerprint=( |
274 | 1359 | signing_key.fingerprint if signing_key else None), | 1359 | signing_key.fingerprint if signing_key else None), |
275 | 1360 | 1360 | ||
276 | === modified file 'lib/lp/registry/model/distroseriesdifference.py' | |||
277 | --- lib/lp/registry/model/distroseriesdifference.py 2015-07-08 16:05:11 +0000 | |||
278 | +++ lib/lp/registry/model/distroseriesdifference.py 2016-03-10 01:29:20 +0000 | |||
279 | @@ -330,17 +330,13 @@ | |||
280 | 330 | SourcePackageRecipeBuild, sprs, | 330 | SourcePackageRecipeBuild, sprs, |
281 | 331 | ("source_package_recipe_build_id",)) | 331 | ("source_package_recipe_build_id",)) |
282 | 332 | 332 | ||
283 | 333 | # SourcePackageRelease.uploader can end up getting the owner of | ||
284 | 334 | # the DSC signing key. | ||
285 | 335 | gpgkeys = bulk.load_related(GPGKey, sprs, ("dscsigningkeyID",)) | ||
286 | 336 | |||
287 | 337 | # Load DistroSeriesDifferenceComment owners, SourcePackageRecipeBuild | 333 | # Load DistroSeriesDifferenceComment owners, SourcePackageRecipeBuild |
288 | 338 | # requesters, GPGKey owners, and SourcePackageRelease creators. | 334 | # requesters, GPGKey owners, and SourcePackageRelease creators. |
289 | 339 | person_ids = set().union( | 335 | person_ids = set().union( |
290 | 340 | (dsdc.message.ownerID for dsdc in latest_comments), | 336 | (dsdc.message.ownerID for dsdc in latest_comments), |
291 | 341 | (sprb.requester_id for sprb in sprbs), | 337 | (sprb.requester_id for sprb in sprbs), |
294 | 342 | (gpgkey.ownerID for gpgkey in gpgkeys), | 338 | (spr.creatorID for spr in sprs), |
295 | 343 | (spr.creatorID for spr in sprs)) | 339 | (spr.signing_key_owner_id for spr in sprs)) |
296 | 344 | uploaders = getUtility(IPersonSet).getPrecachedPersonsFromIDs( | 340 | uploaders = getUtility(IPersonSet).getPrecachedPersonsFromIDs( |
297 | 345 | person_ids, need_validity=True) | 341 | person_ids, need_validity=True) |
298 | 346 | list(uploaders) | 342 | list(uploaders) |
299 | 347 | 343 | ||
300 | === modified file 'lib/lp/registry/model/gpgkey.py' | |||
301 | --- lib/lp/registry/model/gpgkey.py 2016-03-01 14:15:26 +0000 | |||
302 | +++ lib/lp/registry/model/gpgkey.py 2016-03-10 01:29:20 +0000 | |||
303 | @@ -19,6 +19,7 @@ | |||
304 | 19 | IGPGKeySet, | 19 | IGPGKeySet, |
305 | 20 | ) | 20 | ) |
306 | 21 | from lp.services.database.enumcol import EnumCol | 21 | from lp.services.database.enumcol import EnumCol |
307 | 22 | from lp.services.database.interfaces import IStore | ||
308 | 22 | from lp.services.database.sqlbase import ( | 23 | from lp.services.database.sqlbase import ( |
309 | 23 | SQLBase, | 24 | SQLBase, |
310 | 24 | sqlvalues, | 25 | sqlvalues, |
311 | @@ -95,6 +96,11 @@ | |||
312 | 95 | return default | 96 | return default |
313 | 96 | return result | 97 | return result |
314 | 97 | 98 | ||
315 | 99 | def getByFingerprints(self, fingerprints): | ||
316 | 100 | """See `IGPGKeySet`""" | ||
317 | 101 | return IStore(GPGKey).find( | ||
318 | 102 | GPGKey, GPGKey.fingerprint.is_in(fingerprints)) | ||
319 | 103 | |||
320 | 98 | def getGPGKeysForPerson(self, owner, active=True): | 104 | def getGPGKeysForPerson(self, owner, active=True): |
321 | 99 | if active is False: | 105 | if active is False: |
322 | 100 | query = """ | 106 | query = """ |
323 | 101 | 107 | ||
324 | === modified file 'lib/lp/soyuz/configure.zcml' | |||
325 | --- lib/lp/soyuz/configure.zcml 2016-02-24 01:30:06 +0000 | |||
326 | +++ lib/lp/soyuz/configure.zcml 2016-03-10 01:29:20 +0000 | |||
327 | @@ -389,9 +389,9 @@ | |||
328 | 389 | set_schema="lp.soyuz.interfaces.archive.IArchiveRestricted"/> | 389 | set_schema="lp.soyuz.interfaces.archive.IArchiveRestricted"/> |
329 | 390 | <require | 390 | <require |
330 | 391 | permission="launchpad.InternalScriptsOnly" | 391 | permission="launchpad.InternalScriptsOnly" |
334 | 392 | attributes="signing_key_owner _signing_key_fingerprint" | 392 | attributes="signing_key_owner" |
335 | 393 | set_attributes="distribution signing_key signing_key_owner | 393 | set_attributes="distribution _signing_key signing_key_owner |
336 | 394 | _signing_key_fingerprint"/> | 394 | signing_key_fingerprint"/> |
337 | 395 | </class> | 395 | </class> |
338 | 396 | <adapter | 396 | <adapter |
339 | 397 | for="lp.soyuz.interfaces.archive.IArchive" | 397 | for="lp.soyuz.interfaces.archive.IArchive" |
340 | 398 | 398 | ||
341 | === modified file 'lib/lp/soyuz/doc/distroseriesqueue-notify.txt' | |||
342 | --- lib/lp/soyuz/doc/distroseriesqueue-notify.txt 2016-02-29 18:48:23 +0000 | |||
343 | +++ lib/lp/soyuz/doc/distroseriesqueue-notify.txt 2016-03-10 01:29:20 +0000 | |||
344 | @@ -110,7 +110,9 @@ | |||
345 | 110 | >>> from zope.security.proxy import removeSecurityProxy | 110 | >>> from zope.security.proxy import removeSecurityProxy |
346 | 111 | >>> from lp.registry.interfaces.gpg import IGPGKeySet | 111 | >>> from lp.registry.interfaces.gpg import IGPGKeySet |
347 | 112 | >>> gpgkey = getUtility(IGPGKeySet).getByFingerprint('ABCDEF0123456789ABCDDCBA0000111112345678') | 112 | >>> gpgkey = getUtility(IGPGKeySet).getByFingerprint('ABCDEF0123456789ABCDDCBA0000111112345678') |
349 | 113 | >>> removeSecurityProxy(netapplet_upload).signing_key = gpgkey | 113 | >>> removeSecurityProxy(netapplet_upload).signing_key_owner = gpgkey.owner |
350 | 114 | >>> removeSecurityProxy(netapplet_upload).signing_key_fingerprint = ( | ||
351 | 115 | ... gpgkey.fingerprint) | ||
352 | 114 | 116 | ||
353 | 115 | Now request the email: | 117 | Now request the email: |
354 | 116 | 118 | ||
355 | 117 | 119 | ||
356 | === modified file 'lib/lp/soyuz/doc/publishing.txt' | |||
357 | --- lib/lp/soyuz/doc/publishing.txt 2015-02-19 01:35:33 +0000 | |||
358 | +++ lib/lp/soyuz/doc/publishing.txt 2016-03-10 01:29:20 +0000 | |||
359 | @@ -23,7 +23,9 @@ | |||
360 | 23 | >>> from lp.registry.model.gpgkey import GPGKey | 23 | >>> from lp.registry.model.gpgkey import GPGKey |
361 | 24 | >>> name16 = getUtility(IPersonSet).getByName('name16') | 24 | >>> name16 = getUtility(IPersonSet).getByName('name16') |
362 | 25 | >>> fake_signer = GPGKey.selectOneBy(owner=name16) | 25 | >>> fake_signer = GPGKey.selectOneBy(owner=name16) |
364 | 26 | >>> spph.sourcepackagerelease.dscsigningkey = fake_signer | 26 | >>> spph.sourcepackagerelease.signing_key_owner = fake_signer.owner |
365 | 27 | >>> spph.sourcepackagerelease.signing_key_fingerprint = ( | ||
366 | 28 | ... fake_signer.fingerprint) | ||
367 | 27 | 29 | ||
368 | 28 | Verify if the object follows its interface contracts: | 30 | Verify if the object follows its interface contracts: |
369 | 29 | 31 | ||
370 | @@ -86,7 +88,10 @@ | |||
371 | 86 | 88 | ||
372 | 87 | The signer can also be None for packages that were synced (e.g. from Debian): | 89 | The signer can also be None for packages that were synced (e.g. from Debian): |
373 | 88 | 90 | ||
375 | 89 | >>> spph.sourcepackagerelease.dscsigningkey = None | 91 | >>> from lp.services.propertycache import get_property_cache |
376 | 92 | >>> spph.sourcepackagerelease.signing_key_owner = None | ||
377 | 93 | >>> spph.sourcepackagerelease.signing_key_fingerprint = None | ||
378 | 94 | >>> del get_property_cache(spph.sourcepackagerelease).dscsigningkey | ||
379 | 90 | >>> print spph.package_signer | 95 | >>> print spph.package_signer |
380 | 91 | None | 96 | None |
381 | 92 | 97 | ||
382 | 93 | 98 | ||
383 | === modified file 'lib/lp/soyuz/interfaces/sourcepackagerelease.py' | |||
384 | --- lib/lp/soyuz/interfaces/sourcepackagerelease.py 2016-02-05 15:16:29 +0000 | |||
385 | +++ lib/lp/soyuz/interfaces/sourcepackagerelease.py 2016-03-10 01:29:20 +0000 | |||
386 | @@ -35,7 +35,6 @@ | |||
387 | 35 | version = Attribute("A version string") | 35 | version = Attribute("A version string") |
388 | 36 | dateuploaded = Attribute("Date of Upload") | 36 | dateuploaded = Attribute("Date of Upload") |
389 | 37 | urgency = Attribute("Source Package Urgency") | 37 | urgency = Attribute("Source Package Urgency") |
390 | 38 | dscsigningkeyID = Attribute("DB ID of the DSC Signing Key") | ||
391 | 39 | dscsigningkey = Attribute("DSC Signing Key") | 38 | dscsigningkey = Attribute("DSC Signing Key") |
392 | 40 | component = Attribute("Source Package Component") | 39 | component = Attribute("Source Package Component") |
393 | 41 | format = Attribute("The Source Package Format") | 40 | format = Attribute("The Source Package Format") |
394 | 42 | 41 | ||
395 | === modified file 'lib/lp/soyuz/model/archive.py' | |||
396 | --- lib/lp/soyuz/model/archive.py 2016-02-23 01:59:48 +0000 | |||
397 | +++ lib/lp/soyuz/model/archive.py 2016-03-10 01:29:20 +0000 | |||
398 | @@ -77,6 +77,7 @@ | |||
399 | 77 | from lp.registry.errors import NoSuchDistroSeries | 77 | from lp.registry.errors import NoSuchDistroSeries |
400 | 78 | from lp.registry.interfaces.distroseries import IDistroSeriesSet | 78 | from lp.registry.interfaces.distroseries import IDistroSeriesSet |
401 | 79 | from lp.registry.interfaces.distroseriesparent import IDistroSeriesParentSet | 79 | from lp.registry.interfaces.distroseriesparent import IDistroSeriesParentSet |
402 | 80 | from lp.registry.interfaces.gpg import IGPGKeySet | ||
403 | 80 | from lp.registry.interfaces.person import ( | 81 | from lp.registry.interfaces.person import ( |
404 | 81 | IPersonSet, | 82 | IPersonSet, |
405 | 82 | validate_person, | 83 | validate_person, |
406 | @@ -338,11 +339,11 @@ | |||
407 | 338 | 339 | ||
408 | 339 | date_created = UtcDateTimeCol(dbName='date_created') | 340 | date_created = UtcDateTimeCol(dbName='date_created') |
409 | 340 | 341 | ||
411 | 341 | signing_key = ForeignKey( | 342 | _signing_key = ForeignKey( |
412 | 342 | foreignKey='GPGKey', dbName='signing_key', notNull=False) | 343 | foreignKey='GPGKey', dbName='signing_key', notNull=False) |
413 | 343 | signing_key_owner_id = Int(name="signing_key_owner") | 344 | signing_key_owner_id = Int(name="signing_key_owner") |
414 | 344 | signing_key_owner = Reference(signing_key_owner_id, 'Person.id') | 345 | signing_key_owner = Reference(signing_key_owner_id, 'Person.id') |
416 | 345 | _signing_key_fingerprint = Unicode(name="signing_key_fingerprint") | 346 | signing_key_fingerprint = Unicode() |
417 | 346 | 347 | ||
418 | 347 | relative_build_score = IntCol( | 348 | relative_build_score = IntCol( |
419 | 348 | dbName='relative_build_score', notNull=True, default=0) | 349 | dbName='relative_build_score', notNull=True, default=0) |
420 | @@ -391,6 +392,13 @@ | |||
421 | 391 | """See `IArchive`.""" | 392 | """See `IArchive`.""" |
422 | 392 | return self.displayname | 393 | return self.displayname |
423 | 393 | 394 | ||
424 | 395 | @cachedproperty | ||
425 | 396 | def signing_key(self): | ||
426 | 397 | """See `IArchive`.""" | ||
427 | 398 | if self.signing_key_fingerprint is not None: | ||
428 | 399 | return getUtility(IGPGKeySet).getByFingerprint( | ||
429 | 400 | self.signing_key_fingerprint) | ||
430 | 401 | |||
431 | 394 | @property | 402 | @property |
432 | 395 | def is_ppa(self): | 403 | def is_ppa(self): |
433 | 396 | """See `IArchive`.""" | 404 | """See `IArchive`.""" |
434 | @@ -518,13 +526,6 @@ | |||
435 | 518 | return urlappend( | 526 | return urlappend( |
436 | 519 | db_pubconf.base_url, self.distribution.name + postfix) | 527 | db_pubconf.base_url, self.distribution.name + postfix) |
437 | 520 | 528 | ||
438 | 521 | @property | ||
439 | 522 | def signing_key_fingerprint(self): | ||
440 | 523 | if self.signing_key is not None: | ||
441 | 524 | return self.signing_key.fingerprint | ||
442 | 525 | |||
443 | 526 | return None | ||
444 | 527 | |||
445 | 528 | def getBuildRecords(self, build_state=None, name=None, pocket=None, | 529 | def getBuildRecords(self, build_state=None, name=None, pocket=None, |
446 | 529 | arch_tag=None, user=None, binary_only=True): | 530 | arch_tag=None, user=None, binary_only=True): |
447 | 530 | """See IHasBuildRecords""" | 531 | """See IHasBuildRecords""" |
448 | @@ -679,7 +680,6 @@ | |||
449 | 679 | def eager_load(rows): | 680 | def eager_load(rows): |
450 | 680 | # \o/ circular imports. | 681 | # \o/ circular imports. |
451 | 681 | from lp.registry.model.distroseries import DistroSeries | 682 | from lp.registry.model.distroseries import DistroSeries |
452 | 682 | from lp.registry.model.gpgkey import GPGKey | ||
453 | 683 | ids = set(map(attrgetter('distroseriesID'), rows)) | 683 | ids = set(map(attrgetter('distroseriesID'), rows)) |
454 | 684 | ids.discard(None) | 684 | ids.discard(None) |
455 | 685 | if ids: | 685 | if ids: |
456 | @@ -698,10 +698,14 @@ | |||
457 | 698 | ids.discard(None) | 698 | ids.discard(None) |
458 | 699 | if ids: | 699 | if ids: |
459 | 700 | list(getUtility(IPersonSet).getPrecachedPersonsFromIDs(ids)) | 700 | list(getUtility(IPersonSet).getPrecachedPersonsFromIDs(ids)) |
464 | 701 | ids = set(map(attrgetter('dscsigningkeyID'), releases)) | 701 | keys = { |
465 | 702 | ids.discard(None) | 702 | key.fingerprint: key for key in |
466 | 703 | if ids: | 703 | getUtility(IGPGKeySet).getByFingerprints( |
467 | 704 | list(store.find(GPGKey, GPGKey.id.is_in(ids))) | 704 | set(map(attrgetter('signing_key_fingerprint'), releases)) |
468 | 705 | - set([None]))} | ||
469 | 706 | for spr in releases: | ||
470 | 707 | get_property_cache(spr).dscsigningkey = keys.get( | ||
471 | 708 | spr.signing_key_fingerprint) | ||
472 | 705 | return DecoratedResultSet(resultset, pre_iter_hook=eager_load) | 709 | return DecoratedResultSet(resultset, pre_iter_hook=eager_load) |
473 | 706 | 710 | ||
474 | 707 | def getSourcesForDeletion(self, name=None, status=None, distroseries=None): | 711 | def getSourcesForDeletion(self, name=None, status=None, distroseries=None): |
475 | @@ -2537,9 +2541,9 @@ | |||
476 | 2537 | new_archive = Archive( | 2541 | new_archive = Archive( |
477 | 2538 | owner=owner, distribution=distribution, name=name, | 2542 | owner=owner, distribution=distribution, name=name, |
478 | 2539 | displayname=displayname, description=description, | 2543 | displayname=displayname, description=description, |
480 | 2540 | purpose=purpose, publish=publish, signing_key=signing_key, | 2544 | purpose=purpose, publish=publish, _signing_key=signing_key, |
481 | 2541 | signing_key_owner=signing_key.owner if signing_key else None, | 2545 | signing_key_owner=signing_key.owner if signing_key else None, |
483 | 2542 | _signing_key_fingerprint=( | 2546 | signing_key_fingerprint=( |
484 | 2543 | signing_key.fingerprint if signing_key else None), | 2547 | signing_key.fingerprint if signing_key else None), |
485 | 2544 | require_virtualized=require_virtualized) | 2548 | require_virtualized=require_virtualized) |
486 | 2545 | 2549 | ||
487 | @@ -2631,8 +2635,8 @@ | |||
488 | 2631 | SourcePackagePublishingHistory.archive == Archive.id)) | 2635 | SourcePackagePublishingHistory.archive == Archive.id)) |
489 | 2632 | results = IStore(Archive).using(*origin).find( | 2636 | results = IStore(Archive).using(*origin).find( |
490 | 2633 | Archive, | 2637 | Archive, |
493 | 2634 | Archive.signing_key == None, Archive.purpose == ArchivePurpose.PPA, | 2638 | Archive.signing_key_fingerprint == None, |
494 | 2635 | Archive._enabled == True) | 2639 | Archive.purpose == ArchivePurpose.PPA, Archive._enabled == True) |
495 | 2636 | results.order_by(Archive.date_created) | 2640 | results.order_by(Archive.date_created) |
496 | 2637 | return results.config(distinct=True) | 2641 | return results.config(distinct=True) |
497 | 2638 | 2642 | ||
498 | 2639 | 2643 | ||
499 | === modified file 'lib/lp/soyuz/model/queue.py' | |||
500 | --- lib/lp/soyuz/model/queue.py 2016-02-23 02:00:00 +0000 | |||
501 | +++ lib/lp/soyuz/model/queue.py 2016-03-10 01:29:20 +0000 | |||
502 | @@ -46,6 +46,7 @@ | |||
503 | 46 | from lp.archivepublisher.config import getPubConfig | 46 | from lp.archivepublisher.config import getPubConfig |
504 | 47 | from lp.archivepublisher.customupload import CustomUploadError | 47 | from lp.archivepublisher.customupload import CustomUploadError |
505 | 48 | from lp.archiveuploader.tagfiles import parse_tagfile_content | 48 | from lp.archiveuploader.tagfiles import parse_tagfile_content |
506 | 49 | from lp.registry.interfaces.gpg import IGPGKeySet | ||
507 | 49 | from lp.registry.interfaces.pocket import PackagePublishingPocket | 50 | from lp.registry.interfaces.pocket import PackagePublishingPocket |
508 | 50 | from lp.registry.model.sourcepackagename import SourcePackageName | 51 | from lp.registry.model.sourcepackagename import SourcePackageName |
509 | 51 | from lp.services.auditor.client import AuditorClient | 52 | from lp.services.auditor.client import AuditorClient |
510 | @@ -184,7 +185,7 @@ | |||
511 | 184 | 185 | ||
512 | 185 | archive = ForeignKey(dbName="archive", foreignKey="Archive", notNull=True) | 186 | archive = ForeignKey(dbName="archive", foreignKey="Archive", notNull=True) |
513 | 186 | 187 | ||
515 | 187 | signing_key = ForeignKey( | 188 | _signing_key = ForeignKey( |
516 | 188 | foreignKey='GPGKey', dbName='signing_key', notNull=False) | 189 | foreignKey='GPGKey', dbName='signing_key', notNull=False) |
517 | 189 | signing_key_owner_id = Int(name="signing_key_owner") | 190 | signing_key_owner_id = Int(name="signing_key_owner") |
518 | 190 | signing_key_owner = Reference(signing_key_owner_id, 'Person.id') | 191 | signing_key_owner = Reference(signing_key_owner_id, 'Person.id') |
519 | @@ -291,6 +292,12 @@ | |||
520 | 291 | }) | 292 | }) |
521 | 292 | return properties | 293 | return properties |
522 | 293 | 294 | ||
523 | 295 | @cachedproperty | ||
524 | 296 | def signing_key(self): | ||
525 | 297 | if self.signing_key_fingerprint is not None: | ||
526 | 298 | return getUtility(IGPGKeySet).getByFingerprint( | ||
527 | 299 | self.signing_key_fingerprint) | ||
528 | 300 | |||
529 | 294 | @property | 301 | @property |
530 | 295 | def copy_source_archive(self): | 302 | def copy_source_archive(self): |
531 | 296 | """See `IPackageUpload`.""" | 303 | """See `IPackageUpload`.""" |
532 | 297 | 304 | ||
533 | === modified file 'lib/lp/soyuz/model/sourcepackagerelease.py' | |||
534 | --- lib/lp/soyuz/model/sourcepackagerelease.py 2016-02-23 02:27:23 +0000 | |||
535 | +++ lib/lp/soyuz/model/sourcepackagerelease.py 2016-03-10 01:29:20 +0000 | |||
536 | @@ -35,10 +35,12 @@ | |||
537 | 35 | from storm.store import Store | 35 | from storm.store import Store |
538 | 36 | from zope.component import getUtility | 36 | from zope.component import getUtility |
539 | 37 | from zope.interface import implementer | 37 | from zope.interface import implementer |
540 | 38 | from zope.security.proxy import removeSecurityProxy | ||
541 | 38 | 39 | ||
542 | 39 | from lp.app.errors import NotFoundError | 40 | from lp.app.errors import NotFoundError |
543 | 40 | from lp.archiveuploader.utils import determine_source_file_type | 41 | from lp.archiveuploader.utils import determine_source_file_type |
544 | 41 | from lp.buildmaster.enums import BuildStatus | 42 | from lp.buildmaster.enums import BuildStatus |
545 | 43 | from lp.registry.interfaces.gpg import IGPGKeySet | ||
546 | 42 | from lp.registry.interfaces.person import validate_public_person | 44 | from lp.registry.interfaces.person import validate_public_person |
547 | 43 | from lp.registry.interfaces.sourcepackage import ( | 45 | from lp.registry.interfaces.sourcepackage import ( |
548 | 44 | SourcePackageType, | 46 | SourcePackageType, |
549 | @@ -89,7 +91,7 @@ | |||
550 | 89 | maintainer = ForeignKey( | 91 | maintainer = ForeignKey( |
551 | 90 | dbName='maintainer', foreignKey='Person', | 92 | dbName='maintainer', foreignKey='Person', |
552 | 91 | storm_validator=validate_public_person, notNull=True) | 93 | storm_validator=validate_public_person, notNull=True) |
554 | 92 | dscsigningkey = ForeignKey(foreignKey='GPGKey', dbName='dscsigningkey') | 94 | _dscsigningkey = ForeignKey(foreignKey='GPGKey', dbName='dscsigningkey') |
555 | 93 | signing_key_owner_id = Int(name="signing_key_owner") | 95 | signing_key_owner_id = Int(name="signing_key_owner") |
556 | 94 | signing_key_owner = Reference(signing_key_owner_id, 'Person.id') | 96 | signing_key_owner = Reference(signing_key_owner_id, 'Person.id') |
557 | 95 | signing_key_fingerprint = Unicode() | 97 | signing_key_fingerprint = Unicode() |
558 | @@ -172,6 +174,15 @@ | |||
559 | 172 | "UPDATE sourcepackagerelease SET copyright=%s WHERE id=%s", | 174 | "UPDATE sourcepackagerelease SET copyright=%s WHERE id=%s", |
560 | 173 | (content, self.id)) | 175 | (content, self.id)) |
561 | 174 | 176 | ||
562 | 177 | @cachedproperty | ||
563 | 178 | def dscsigningkey(self): | ||
564 | 179 | if self.signing_key_fingerprint is not None: | ||
565 | 180 | # Stripping proxy as some tests expect this former FK to | ||
566 | 181 | # hold an unsecured object. self is always proxied by things | ||
567 | 182 | # that hold it, so no issue here. | ||
568 | 183 | return removeSecurityProxy(getUtility(IGPGKeySet).getByFingerprint( | ||
569 | 184 | self.signing_key_fingerprint)) | ||
570 | 185 | |||
571 | 175 | @property | 186 | @property |
572 | 176 | def user_defined_fields(self): | 187 | def user_defined_fields(self): |
573 | 177 | """See `IBinaryPackageRelease`.""" | 188 | """See `IBinaryPackageRelease`.""" |
574 | @@ -364,8 +375,8 @@ | |||
575 | 364 | """See `ISourcePackageRelease`""" | 375 | """See `ISourcePackageRelease`""" |
576 | 365 | if self.source_package_recipe_build is not None: | 376 | if self.source_package_recipe_build is not None: |
577 | 366 | return self.source_package_recipe_build.requester | 377 | return self.source_package_recipe_build.requester |
580 | 367 | if self.dscsigningkey is not None: | 378 | if self.signing_key_owner is not None: |
581 | 368 | return self.dscsigningkey.owner | 379 | return self.signing_key_owner |
582 | 369 | return None | 380 | return None |
583 | 370 | 381 | ||
584 | 371 | @property | 382 | @property |
585 | 372 | 383 | ||
586 | === modified file 'lib/lp/soyuz/scripts/gina/handlers.py' | |||
587 | --- lib/lp/soyuz/scripts/gina/handlers.py 2016-02-23 02:27:23 +0000 | |||
588 | +++ lib/lp/soyuz/scripts/gina/handlers.py 2016-03-10 01:29:20 +0000 | |||
589 | @@ -615,7 +615,7 @@ | |||
590 | 615 | component=componentID, | 615 | component=componentID, |
591 | 616 | sourcepackagename=name.id, | 616 | sourcepackagename=name.id, |
592 | 617 | maintainer=maintainer.id, | 617 | maintainer=maintainer.id, |
594 | 618 | dscsigningkey=key, | 618 | _dscsigningkey=key, |
595 | 619 | signing_key_owner=key.owner if key else None, | 619 | signing_key_owner=key.owner if key else None, |
596 | 620 | signing_key_fingerprint=key.fingerprint if key else None, | 620 | signing_key_fingerprint=key.fingerprint if key else None, |
597 | 621 | urgency=ChangesFile.urgency_map[src.urgency], | 621 | urgency=ChangesFile.urgency_map[src.urgency], |
598 | 622 | 622 | ||
599 | === modified file 'lib/lp/soyuz/scripts/tests/test_ppakeygenerator.py' | |||
600 | --- lib/lp/soyuz/scripts/tests/test_ppakeygenerator.py 2016-02-29 18:48:23 +0000 | |||
601 | +++ lib/lp/soyuz/scripts/tests/test_ppakeygenerator.py 2016-03-10 01:29:20 +0000 | |||
602 | @@ -10,6 +10,7 @@ | |||
603 | 10 | from lp.registry.interfaces.distribution import IDistributionSet | 10 | from lp.registry.interfaces.distribution import IDistributionSet |
604 | 11 | from lp.registry.interfaces.gpg import IGPGKeySet | 11 | from lp.registry.interfaces.gpg import IGPGKeySet |
605 | 12 | from lp.registry.interfaces.person import IPersonSet | 12 | from lp.registry.interfaces.person import IPersonSet |
606 | 13 | from lp.services.propertycache import get_property_cache | ||
607 | 13 | from lp.services.scripts.base import LaunchpadScriptFailure | 14 | from lp.services.scripts.base import LaunchpadScriptFailure |
608 | 14 | from lp.soyuz.interfaces.archive import IArchiveSet | 15 | from lp.soyuz.interfaces.archive import IArchiveSet |
609 | 15 | from lp.soyuz.scripts.ppakeygenerator import PPAKeyGenerator | 16 | from lp.soyuz.scripts.ppakeygenerator import PPAKeyGenerator |
610 | @@ -52,7 +53,9 @@ | |||
611 | 52 | def fake_key_generation(archive): | 53 | def fake_key_generation(archive): |
612 | 53 | a_key = getUtility(IGPGKeySet).getByFingerprint( | 54 | a_key = getUtility(IGPGKeySet).getByFingerprint( |
613 | 54 | 'ABCDEF0123456789ABCDDCBA0000111112345678') | 55 | 'ABCDEF0123456789ABCDDCBA0000111112345678') |
615 | 55 | archive.signing_key = a_key | 56 | archive.signing_key_fingerprint = a_key.fingerprint |
616 | 57 | archive.signing_key_owner = a_key.owner | ||
617 | 58 | del get_property_cache(archive).signing_key | ||
618 | 56 | 59 | ||
619 | 57 | key_generator.generateKey = fake_key_generation | 60 | key_generator.generateKey = fake_key_generation |
620 | 58 | 61 | ||
621 | @@ -71,7 +74,8 @@ | |||
622 | 71 | cprov = getUtility(IPersonSet).getByName('cprov') | 74 | cprov = getUtility(IPersonSet).getByName('cprov') |
623 | 72 | a_key = getUtility(IGPGKeySet).getByFingerprint( | 75 | a_key = getUtility(IGPGKeySet).getByFingerprint( |
624 | 73 | 'ABCDEF0123456789ABCDDCBA0000111112345678') | 76 | 'ABCDEF0123456789ABCDDCBA0000111112345678') |
626 | 74 | cprov.archive.signing_key = a_key | 77 | cprov.archive.signing_key_fingerprint = a_key.fingerprint |
627 | 78 | cprov.archive.signing_key_owner = a_key.owner | ||
628 | 75 | 79 | ||
629 | 76 | key_generator = self._getKeyGenerator( | 80 | key_generator = self._getKeyGenerator( |
630 | 77 | archive_reference='~cprov/ubuntu/ppa') | 81 | archive_reference='~cprov/ubuntu/ppa') |
631 | 78 | 82 | ||
632 | === modified file 'lib/lp/soyuz/stories/ppa/xx-private-ppa-subscriptions.txt' | |||
633 | --- lib/lp/soyuz/stories/ppa/xx-private-ppa-subscriptions.txt 2016-02-29 18:48:23 +0000 | |||
634 | +++ lib/lp/soyuz/stories/ppa/xx-private-ppa-subscriptions.txt 2016-03-10 01:29:20 +0000 | |||
635 | @@ -174,7 +174,9 @@ | |||
636 | 174 | >>> login('foo.bar@canonical.com') | 174 | >>> login('foo.bar@canonical.com') |
637 | 175 | >>> mark = getUtility(IPersonSet).getByName('mark') | 175 | >>> mark = getUtility(IPersonSet).getByName('mark') |
638 | 176 | >>> a_key = getUtility(IGPGKeySet).getByFingerprint('ABCDEF0123456789ABCDDCBA0000111112345678') | 176 | >>> a_key = getUtility(IGPGKeySet).getByFingerprint('ABCDEF0123456789ABCDDCBA0000111112345678') |
640 | 177 | >>> removeSecurityProxy(mark_private_ppa).signing_key = a_key | 177 | >>> removeSecurityProxy(mark_private_ppa).signing_key_fingerprint = ( |
641 | 178 | ... a_key.fingerprint) | ||
642 | 179 | >>> removeSecurityProxy(mark_private_ppa).signing_key_owner = a_key.owner | ||
643 | 178 | >>> logout() | 180 | >>> logout() |
644 | 179 | 181 | ||
645 | 180 | >>> joe_browser.reload() | 182 | >>> joe_browser.reload() |
646 | 181 | 183 | ||
647 | === modified file 'lib/lp/soyuz/stories/ppa/xx-ubuntu-ppas.txt' | |||
648 | --- lib/lp/soyuz/stories/ppa/xx-ubuntu-ppas.txt 2016-02-29 18:48:23 +0000 | |||
649 | +++ lib/lp/soyuz/stories/ppa/xx-ubuntu-ppas.txt 2016-03-10 01:29:20 +0000 | |||
650 | @@ -557,7 +557,9 @@ | |||
651 | 557 | >>> login('foo.bar@canonical.com') | 557 | >>> login('foo.bar@canonical.com') |
652 | 558 | >>> no_priv = getUtility(IPersonSet).getByName('no-priv') | 558 | >>> no_priv = getUtility(IPersonSet).getByName('no-priv') |
653 | 559 | >>> a_key = getUtility(IGPGKeySet).getByFingerprint('ABCDEF0123456789ABCDDCBA0000111112345678') | 559 | >>> a_key = getUtility(IGPGKeySet).getByFingerprint('ABCDEF0123456789ABCDDCBA0000111112345678') |
655 | 560 | >>> removeSecurityProxy(no_priv.archive).signing_key = a_key | 560 | >>> removeSecurityProxy(no_priv.archive).signing_key_fingerprint = ( |
656 | 561 | ... a_key.fingerprint) | ||
657 | 562 | >>> removeSecurityProxy(no_priv.archive).signing_key_owner = a_key.owner | ||
658 | 561 | >>> logout() | 563 | >>> logout() |
659 | 562 | 564 | ||
660 | 563 | Now that 'No privileges' PPA has a signing key, a text with the key | 565 | Now that 'No privileges' PPA has a signing key, a text with the key |
661 | 564 | 566 | ||
662 | === modified file 'lib/lp/soyuz/stories/webservice/xx-archive.txt' | |||
663 | --- lib/lp/soyuz/stories/webservice/xx-archive.txt 2016-01-05 15:06:24 +0000 | |||
664 | +++ lib/lp/soyuz/stories/webservice/xx-archive.txt 2016-03-10 01:29:20 +0000 | |||
665 | @@ -80,7 +80,10 @@ | |||
666 | 80 | ABCDEF0123456789ABCDDCBA0000111112345678 | 80 | ABCDEF0123456789ABCDDCBA0000111112345678 |
667 | 81 | 81 | ||
668 | 82 | >>> cprov = getUtility(IPersonSet).getByName('cprov') | 82 | >>> cprov = getUtility(IPersonSet).getByName('cprov') |
670 | 83 | >>> removeSecurityProxy(cprov.archive).signing_key = a_key | 83 | >>> removeSecurityProxy(cprov.archive).signing_key_fingerprint = ( |
671 | 84 | ... a_key.fingerprint) | ||
672 | 85 | >>> removeSecurityProxy(cprov.archive).signing_key_owner = ( | ||
673 | 86 | ... a_key.owner) | ||
674 | 84 | >>> print cprov.archive.signing_key_fingerprint | 87 | >>> print cprov.archive.signing_key_fingerprint |
675 | 85 | ABCDEF0123456789ABCDDCBA0000111112345678 | 88 | ABCDEF0123456789ABCDDCBA0000111112345678 |
676 | 86 | 89 | ||
677 | 87 | 90 | ||
678 | === modified file 'lib/lp/soyuz/stories/webservice/xx-builds.txt' | |||
679 | --- lib/lp/soyuz/stories/webservice/xx-builds.txt 2016-01-06 12:24:47 +0000 | |||
680 | +++ lib/lp/soyuz/stories/webservice/xx-builds.txt 2016-03-10 01:29:20 +0000 | |||
681 | @@ -22,7 +22,10 @@ | |||
682 | 22 | >>> ppa = getUtility(IPersonSet).getByName('cprov').archive | 22 | >>> ppa = getUtility(IPersonSet).getByName('cprov').archive |
683 | 23 | >>> for pub in ppa.getPublishedSources(): | 23 | >>> for pub in ppa.getPublishedSources(): |
684 | 24 | ... pub = removeSecurityProxy(pub) | 24 | ... pub = removeSecurityProxy(pub) |
686 | 25 | ... pub.sourcepackagerelease.dscsigningkey = fake_signer | 25 | ... pub.sourcepackagerelease.signing_key_owner = ( |
687 | 26 | ... fake_signer.owner) | ||
688 | 27 | ... pub.sourcepackagerelease.signing_key_fingerprint = ( | ||
689 | 28 | ... fake_signer.fingerprint) | ||
690 | 26 | >>> transaction.commit() | 29 | >>> transaction.commit() |
691 | 27 | >>> logout() | 30 | >>> logout() |
692 | 28 | 31 | ||
693 | 29 | 32 | ||
694 | === modified file 'lib/lp/soyuz/stories/webservice/xx-source-package-publishing.txt' | |||
695 | --- lib/lp/soyuz/stories/webservice/xx-source-package-publishing.txt 2015-04-09 05:16:37 +0000 | |||
696 | +++ lib/lp/soyuz/stories/webservice/xx-source-package-publishing.txt 2016-03-10 01:29:20 +0000 | |||
697 | @@ -23,7 +23,9 @@ | |||
698 | 23 | >>> cprov_ppa = cprov_db.archive | 23 | >>> cprov_ppa = cprov_db.archive |
699 | 24 | >>> for pub in cprov_ppa.getPublishedSources(): | 24 | >>> for pub in cprov_ppa.getPublishedSources(): |
700 | 25 | ... pub = removeSecurityProxy(pub) | 25 | ... pub = removeSecurityProxy(pub) |
702 | 26 | ... pub.sourcepackagerelease.dscsigningkey = fake_signer | 26 | ... pub.sourcepackagerelease.signing_key_owner = fake_signer.owner |
703 | 27 | ... pub.sourcepackagerelease.signing_key_fingerprint = ( | ||
704 | 28 | ... fake_signer.fingerprint) | ||
705 | 27 | >>> logout() | 29 | >>> logout() |
706 | 28 | >>> cprov_webservice = webservice_for_person( | 30 | >>> cprov_webservice = webservice_for_person( |
707 | 29 | ... cprov_db, permission=OAuthPermission.WRITE_PUBLIC) | 31 | ... cprov_db, permission=OAuthPermission.WRITE_PUBLIC) |
708 | @@ -159,7 +161,8 @@ | |||
709 | 159 | >>> login("foo.bar@canonical.com") | 161 | >>> login("foo.bar@canonical.com") |
710 | 160 | >>> for pub in cprov_ppa.getPublishedSources(): | 162 | >>> for pub in cprov_ppa.getPublishedSources(): |
711 | 161 | ... pub = removeSecurityProxy(pub) | 163 | ... pub = removeSecurityProxy(pub) |
713 | 162 | ... pub.sourcepackagerelease.dscsigningkey = None | 164 | ... pub.sourcepackagerelease.signing_key_owner = None |
714 | 165 | ... pub.sourcepackagerelease.signing_key_fingerprint = None | ||
715 | 163 | >>> logout() | 166 | >>> logout() |
716 | 164 | 167 | ||
717 | 165 | Query the source again: | 168 | Query the source again: |
718 | 166 | 169 | ||
719 | === modified file 'lib/lp/soyuz/tests/test_archive.py' | |||
720 | --- lib/lp/soyuz/tests/test_archive.py 2016-01-05 15:06:24 +0000 | |||
721 | +++ lib/lp/soyuz/tests/test_archive.py 2016-03-10 01:29:20 +0000 | |||
722 | @@ -42,7 +42,10 @@ | |||
723 | 42 | from lp.services.database.interfaces import IStore | 42 | from lp.services.database.interfaces import IStore |
724 | 43 | from lp.services.database.sqlbase import sqlvalues | 43 | from lp.services.database.sqlbase import sqlvalues |
725 | 44 | from lp.services.job.interfaces.job import JobStatus | 44 | from lp.services.job.interfaces.job import JobStatus |
727 | 45 | from lp.services.propertycache import clear_property_cache | 45 | from lp.services.propertycache import ( |
728 | 46 | clear_property_cache, | ||
729 | 47 | get_property_cache, | ||
730 | 48 | ) | ||
731 | 46 | from lp.services.webapp.interfaces import OAuthPermission | 49 | from lp.services.webapp.interfaces import OAuthPermission |
732 | 47 | from lp.services.worlddata.interfaces.country import ICountrySet | 50 | from lp.services.worlddata.interfaces.country import ICountrySet |
733 | 48 | from lp.soyuz.adapters.archivedependencies import ( | 51 | from lp.soyuz.adapters.archivedependencies import ( |
734 | @@ -3456,7 +3459,11 @@ | |||
735 | 3456 | owner=person, purpose=ArchivePurpose.PPA, name="ppa") | 3459 | owner=person, purpose=ArchivePurpose.PPA, name="ppa") |
736 | 3457 | self.assertEqual(ppa, person.archive) | 3460 | self.assertEqual(ppa, person.archive) |
737 | 3458 | self.factory.makeGPGKey(person) | 3461 | self.factory.makeGPGKey(person) |
739 | 3459 | removeSecurityProxy(person.archive).signing_key = person.gpg_keys[0] | 3462 | key = person.gpg_keys[0] |
740 | 3463 | removeSecurityProxy(person.archive).signing_key_owner = key.owner | ||
741 | 3464 | removeSecurityProxy(person.archive).signing_key_fingerprint = ( | ||
742 | 3465 | key.fingerprint) | ||
743 | 3466 | del get_property_cache(person.archive).signing_key | ||
744 | 3460 | ppa_with_key = self.factory.makeArchive( | 3467 | ppa_with_key = self.factory.makeArchive( |
745 | 3461 | owner=person, purpose=ArchivePurpose.PPA) | 3468 | owner=person, purpose=ArchivePurpose.PPA) |
746 | 3462 | self.assertEqual(person.gpg_keys[0], ppa_with_key.signing_key) | 3469 | self.assertEqual(person.gpg_keys[0], ppa_with_key.signing_key) |
747 | 3463 | 3470 | ||
748 | === modified file 'lib/lp/soyuz/tests/test_build_notify.py' | |||
749 | --- lib/lp/soyuz/tests/test_build_notify.py 2015-09-11 12:20:23 +0000 | |||
750 | +++ lib/lp/soyuz/tests/test_build_notify.py 2016-03-10 01:29:20 +0000 | |||
751 | @@ -15,6 +15,7 @@ | |||
752 | 15 | from lp.registry.interfaces.person import IPersonSet | 15 | from lp.registry.interfaces.person import IPersonSet |
753 | 16 | from lp.services.config import config | 16 | from lp.services.config import config |
754 | 17 | from lp.services.mail.sendmail import format_address_for_person | 17 | from lp.services.mail.sendmail import format_address_for_person |
755 | 18 | from lp.services.propertycache import get_property_cache | ||
756 | 18 | from lp.services.webapp import canonical_url | 19 | from lp.services.webapp import canonical_url |
757 | 19 | from lp.soyuz.enums import ArchivePurpose | 20 | from lp.soyuz.enums import ArchivePurpose |
758 | 20 | from lp.soyuz.interfaces.publishing import PackagePublishingPocket | 21 | from lp.soyuz.interfaces.publishing import PackagePublishingPocket |
759 | @@ -83,7 +84,11 @@ | |||
760 | 83 | self.factory.getUniqueInteger(), status.value), | 84 | self.factory.getUniqueInteger(), status.value), |
761 | 84 | distroseries=self.distroseries, architecturehintlist='any', | 85 | distroseries=self.distroseries, architecturehintlist='any', |
762 | 85 | creator=self.creator, archive=archive) | 86 | creator=self.creator, archive=archive) |
764 | 86 | spph.sourcepackagerelease.dscsigningkey = self.gpgkey | 87 | spph.sourcepackagerelease._dscsigningkey = self.gpgkey |
765 | 88 | spph.sourcepackagerelease.signing_key_fingerprint = ( | ||
766 | 89 | self.gpgkey.fingerprint) | ||
767 | 90 | spph.sourcepackagerelease.signing_key_owner = ( | ||
768 | 91 | self.gpgkey.owner) | ||
769 | 87 | [build] = spph.createMissingBuilds() | 92 | [build] = spph.createMissingBuilds() |
770 | 88 | with person_logged_in(self.admin): | 93 | with person_logged_in(self.admin): |
771 | 89 | build.updateStatus(BuildStatus.BUILDING, builder=self.builder) | 94 | build.updateStatus(BuildStatus.BUILDING, builder=self.builder) |
772 | @@ -432,7 +437,9 @@ | |||
773 | 432 | build = self.builds[BuildStatus.FAILEDTOBUILD.value] | 437 | build = self.builds[BuildStatus.FAILEDTOBUILD.value] |
774 | 433 | spr = build.current_source_publication.sourcepackagerelease | 438 | spr = build.current_source_publication.sourcepackagerelease |
775 | 434 | # Push past the security proxy | 439 | # Push past the security proxy |
777 | 435 | removeSecurityProxy(spr).dscsigningkey = key | 440 | removeSecurityProxy(spr).signing_key_owner = key.owner |
778 | 441 | removeSecurityProxy(spr).signing_key_fingerprint = key.fingerprint | ||
779 | 442 | del get_property_cache(spr).dscsigningkey | ||
780 | 436 | with dbuser(config.builddmaster.dbuser): | 443 | with dbuser(config.builddmaster.dbuser): |
781 | 437 | build.notify() | 444 | build.notify() |
782 | 438 | expected_reasons = [ | 445 | expected_reasons = [ |
783 | 439 | 446 | ||
784 | === modified file 'utilities/soyuz-sampledata-setup.py' | |||
785 | --- utilities/soyuz-sampledata-setup.py 2015-10-13 13:22:08 +0000 | |||
786 | +++ utilities/soyuz-sampledata-setup.py 2016-03-10 01:29:20 +0000 | |||
787 | @@ -316,7 +316,8 @@ | |||
788 | 316 | if signedcocset.searchByUser(person_id).count() == 0: | 316 | if signedcocset.searchByUser(person_id).count() == 0: |
789 | 317 | fake_gpg_key = LaunchpadObjectFactory().makeGPGKey(person) | 317 | fake_gpg_key = LaunchpadObjectFactory().makeGPGKey(person) |
790 | 318 | Store.of(person).add(SignedCodeOfConduct( | 318 | Store.of(person).add(SignedCodeOfConduct( |
792 | 319 | owner=person, signingkey=fake_gpg_key, | 319 | owner=person, signing_key_fingerprint=fake_gpg_key.fingerprint, |
793 | 320 | signing_key_owner=fake_gpg_key.owner, | ||
794 | 320 | signedcode="Normally a signed CoC would go here.", active=True)) | 321 | signedcode="Normally a signed CoC would go here.", active=True)) |
795 | 321 | 322 | ||
796 | 322 | 323 |