// SPDX-FileCopyrightText: 2018 Paul Schaub // // SPDX-License-Identifier: Apache-2.0 package org.pgpainless.util.selection.keyring.impl; import java.util.Map; import java.util.Set; import org.bouncycastle.openpgp.PGPPublicKeyRing; import org.bouncycastle.openpgp.PGPSecretKeyRing; import org.pgpainless.util.selection.keyring.PublicKeyRingSelectionStrategy; import org.pgpainless.util.selection.keyring.SecretKeyRingSelectionStrategy; import org.pgpainless.util.MultiMap; /** * Implementations of {@link org.pgpainless.util.selection.keyring.KeyRingSelectionStrategy} which accept PGP KeyRings * based on a whitelist of acceptable keyIds. */ public final class Whitelist { private Whitelist() { } /** * {@link org.pgpainless.util.selection.keyring.KeyRingSelectionStrategy} which accepts * {@link PGPPublicKeyRing PGPPublicKeyRings} if the
whitelist
contains their primary key id. * * If the whitelist contains 123L for "alice@pgpainless.org", the key with primary key id 123L is * acceptable for "alice@pgpainless.org". * * @param Type of identifier for {@link org.bouncycastle.openpgp.PGPPublicKeyRingCollection PGPPublicKeyRingCollections}. */ public static class PubRingSelectionStrategy extends PublicKeyRingSelectionStrategy { private final MultiMap whitelist; public PubRingSelectionStrategy(MultiMap whitelist) { this.whitelist = whitelist; } public PubRingSelectionStrategy(Map> whitelist) { this(new MultiMap<>(whitelist)); } @Override public boolean accept(O identifier, PGPPublicKeyRing keyRing) { Set whitelistedKeyIds = whitelist.get(identifier); if (whitelistedKeyIds == null) { return false; } return whitelistedKeyIds.contains(keyRing.getPublicKey().getKeyID()); } } /** * {@link org.pgpainless.util.selection.keyring.KeyRingSelectionStrategy} which accepts * {@link PGPSecretKeyRing PGPSecretKeyRings} if the
whitelist
contains their primary key id. * * If the whitelist contains 123L for "alice@pgpainless.org", the key with primary key id 123L is * acceptable for "alice@pgpainless.org". * * @param Type of identifier for {@link org.bouncycastle.openpgp.PGPSecretKeyRingCollection PGPSecretKeyRingCollections}. */ public static class SecRingSelectionStrategy extends SecretKeyRingSelectionStrategy { private final MultiMap whitelist; public SecRingSelectionStrategy(MultiMap whitelist) { this.whitelist = whitelist; } public SecRingSelectionStrategy(Map> whitelist) { this(new MultiMap<>(whitelist)); } @Override public boolean accept(O identifier, PGPSecretKeyRing keyRing) { Set whitelistedKeyIds = whitelist.get(identifier); if (whitelistedKeyIds == null) { return false; } return whitelistedKeyIds.contains(keyRing.getPublicKey().getKeyID()); } } }