/** * * Copyright 2018 Paul Schaub. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.smackx.ox.chat; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smackx.ox.OpenPgpV4Fingerprint; import org.jxmpp.jid.BareJid; /** * Metadata about a contacts OpenPGP fingerprints. */ public class OpenPgpFingerprints { private final BareJid jid; private final Set announcedKeys; private final Set availableKeys; private final Map unfetchableKeys; /** * Constructor. * * @param announcedKeys keys the contact currently announces via their metadata node. * @param availableKeys keys which contain the contacts {@link BareJid} as user ID. * @param unfetchableKeys keys that are announced, but cannot be fetched fro PubSub. */ public OpenPgpFingerprints(BareJid jid, Set announcedKeys, Set availableKeys, Map unfetchableKeys) { this.jid = jid; this.announcedKeys = Collections.unmodifiableSet(Objects.requireNonNull(announcedKeys, "Set of announced keys MUST NOT be null.")); this.availableKeys = Collections.unmodifiableSet(Objects.requireNonNull(availableKeys, "Set of available keys MUST NOT be null.")); this.unfetchableKeys = Collections.unmodifiableMap(Objects.requireNonNull(unfetchableKeys, "Map of unfetchable keys MUST NOT be null.")); } /** * Return the {@link BareJid} of the user. * @return jid */ public BareJid getJid() { return jid; } /** * Return a {@link Set} of {@link OpenPgpV4Fingerprint}s, which the contact in question announced via their * metadata node. * * @see * XEP-0373 ยง4.2 about the Public Key Metadata Node * * @return announced keys. */ public Set getAnnouncedKeys() { return announcedKeys; } /** * Return a {@link Set} of {@link OpenPgpV4Fingerprint}s, which are available in the local key ring, which contain * the users {@link BareJid} as user-id (eg. "xmpp:juliet@capulet.lit"). *
* Note: As everybody can publish a key with an arbitrary user-id, the keys contained in the result set MAY be keys * of an potential attacker. NEVER use these keys for encryption without collating them with the users announced * keys. * * @return locally available keys with users user-id. */ public Set getAvailableKeys() { return availableKeys; } /** * Return a {@link Map}, which maps {@link OpenPgpV4Fingerprint}s which the user announced, but that cannot be fetched * via PubSub to {@link Throwable}s which were thrown when we tried to fetch them. * * @return unfetchable keys. */ public Map getUnfetchableKeys() { return unfetchableKeys; } /** * Return a {@link Set} of {@link OpenPgpV4Fingerprint}s, which are both announced, as well as available. * It is recommended to use those keys for encryption. * * @return active keys. */ public Set getActiveKeys() { Set active = new HashSet<>(); for (OpenPgpV4Fingerprint fingerprint : getAvailableKeys()) { if (getAnnouncedKeys().contains(fingerprint)) { active.add(fingerprint); } } return Collections.unmodifiableSet(active); } }