2022-03-10 16:56:46 +01:00
|
|
|
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
2022-03-17 15:27:28 +01:00
|
|
|
package pgp.wkd.discovery;
|
2022-03-10 16:56:46 +01:00
|
|
|
|
|
|
|
import pgp.certificate_store.Certificate;
|
2022-03-17 15:27:28 +01:00
|
|
|
import pgp.wkd.CertificateAndUserIds;
|
2022-03-21 16:03:11 +01:00
|
|
|
import pgp.wkd.exception.MissingPolicyFileException;
|
2022-03-21 11:25:03 +01:00
|
|
|
import pgp.wkd.exception.RejectedCertificateException;
|
2022-03-17 15:27:28 +01:00
|
|
|
import pgp.wkd.RejectedCertificate;
|
|
|
|
import pgp.wkd.WKDAddress;
|
2022-03-10 16:56:46 +01:00
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2022-03-19 14:36:33 +01:00
|
|
|
public class DefaultCertificateDiscoverer implements CertificateDiscoverer {
|
2022-03-10 16:56:46 +01:00
|
|
|
|
2022-03-17 15:27:28 +01:00
|
|
|
protected final CertificateParser reader;
|
|
|
|
protected final CertificateFetcher fetcher;
|
2022-03-10 16:56:46 +01:00
|
|
|
|
2022-03-19 14:36:33 +01:00
|
|
|
public DefaultCertificateDiscoverer(CertificateParser reader, CertificateFetcher fetcher) {
|
2022-03-10 16:56:46 +01:00
|
|
|
this.reader = reader;
|
|
|
|
this.fetcher = fetcher;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2022-03-17 15:27:28 +01:00
|
|
|
public DiscoveryResponse discover(DiscoveryMethod method, WKDAddress address) {
|
2022-03-21 16:03:11 +01:00
|
|
|
DiscoveryResponse.Builder builder = DiscoveryResponse.builder(method, address);
|
|
|
|
|
|
|
|
fetchPolicy(method, address, builder);
|
|
|
|
fetchCertificates(method, address, builder);
|
|
|
|
|
|
|
|
return builder.build();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void fetchCertificates(DiscoveryMethod method, WKDAddress address, DiscoveryResponse.Builder builder) {
|
2022-03-10 16:56:46 +01:00
|
|
|
try {
|
2022-03-21 16:03:11 +01:00
|
|
|
InputStream certificateIn = fetcher.fetchCertificate(address, method);
|
|
|
|
List<CertificateAndUserIds> fetchedCertificates = reader.read(certificateIn);
|
2022-03-10 16:56:46 +01:00
|
|
|
|
|
|
|
List<RejectedCertificate> rejectedCertificates = new ArrayList<>();
|
|
|
|
List<Certificate> acceptableCertificates = new ArrayList<>();
|
|
|
|
|
|
|
|
String email = address.getEmail();
|
|
|
|
|
|
|
|
for (CertificateAndUserIds certAndUserIds : fetchedCertificates) {
|
|
|
|
Certificate certificate = certAndUserIds.getCertificate();
|
|
|
|
boolean containsEmail = false;
|
|
|
|
for (String userId : certAndUserIds.getUserIds()) {
|
|
|
|
if (userId.contains("<" + email + ">") || userId.equals(email)) {
|
|
|
|
containsEmail = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!containsEmail) {
|
|
|
|
rejectedCertificates.add(new RejectedCertificate(certificate,
|
2022-03-21 11:25:03 +01:00
|
|
|
new RejectedCertificateException.MissingUserId("Certificate " + certificate.getFingerprint() +
|
2022-03-10 16:56:46 +01:00
|
|
|
" does not contain user-id with email '" + email + "'")));
|
|
|
|
} else {
|
|
|
|
acceptableCertificates.add(certificate);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-21 16:03:11 +01:00
|
|
|
builder.setAcceptableCertificates(acceptableCertificates);
|
|
|
|
builder.setRejectedCertificates(rejectedCertificates);
|
2022-03-10 16:56:46 +01:00
|
|
|
|
|
|
|
} catch (IOException e) {
|
2022-03-21 16:03:11 +01:00
|
|
|
builder.setFetchingFailure(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void fetchPolicy(DiscoveryMethod method, WKDAddress address, DiscoveryResponse.Builder builder) {
|
|
|
|
try {
|
|
|
|
InputStream policyIn = fetcher.fetchPolicy(address, method);
|
|
|
|
WKDPolicy policy = WKDPolicy.fromInputStream(policyIn);
|
|
|
|
builder.setPolicy(policy);
|
|
|
|
} catch (IOException e) {
|
|
|
|
builder.setMissingPolicyFileException(new MissingPolicyFileException(e));
|
2022-03-10 16:56:46 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|