001// SPDX-FileCopyrightText: 2018 Paul Schaub <vanitasvitae@fsfe.org>
002//
003// SPDX-License-Identifier: Apache-2.0
004
005package org.pgpainless.util.selection.keyring.impl;
006
007import java.util.Map;
008import java.util.Set;
009
010import org.bouncycastle.openpgp.PGPPublicKeyRing;
011import org.bouncycastle.openpgp.PGPSecretKeyRing;
012import org.pgpainless.util.selection.keyring.PublicKeyRingSelectionStrategy;
013import org.pgpainless.util.selection.keyring.SecretKeyRingSelectionStrategy;
014import org.pgpainless.util.MultiMap;
015
016public final class Whitelist {
017
018    private Whitelist() {
019
020    }
021
022    public static class PubRingSelectionStrategy<O> extends PublicKeyRingSelectionStrategy<O> {
023
024        private final MultiMap<O, Long> whitelist;
025
026        public PubRingSelectionStrategy(MultiMap<O, Long> whitelist) {
027            this.whitelist = whitelist;
028        }
029
030        public PubRingSelectionStrategy(Map<O, Set<Long>> whitelist) {
031            this(new MultiMap<>(whitelist));
032        }
033
034        @Override
035        public boolean accept(O identifier, PGPPublicKeyRing keyRing) {
036            Set<Long> whitelistedKeyIds = whitelist.get(identifier);
037
038            if (whitelistedKeyIds == null) {
039                return false;
040            }
041
042            return whitelistedKeyIds.contains(keyRing.getPublicKey().getKeyID());
043        }
044    }
045
046    public static class SecRingSelectionStrategy<O> extends SecretKeyRingSelectionStrategy<O> {
047
048        private final MultiMap<O, Long> whitelist;
049
050        public SecRingSelectionStrategy(MultiMap<O, Long> whitelist) {
051            this.whitelist = whitelist;
052        }
053
054        public SecRingSelectionStrategy(Map<O, Set<Long>> whitelist) {
055            this(new MultiMap<>(whitelist));
056        }
057
058        @Override
059        public boolean accept(O identifier, PGPSecretKeyRing keyRing) {
060            Set<Long> whitelistedKeyIds = whitelist.get(identifier);
061
062            if (whitelistedKeyIds == null) {
063                return false;
064            }
065
066            return whitelistedKeyIds.contains(keyRing.getPublicKey().getKeyID());
067        }
068
069    }
070}