001/**
002 *
003 * Copyright 2018 Paul Schaub.
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.jivesoftware.smackx.ox.store.abstr;
018
019import java.io.IOException;
020import java.security.InvalidAlgorithmParameterException;
021import java.security.NoSuchAlgorithmException;
022import java.security.NoSuchProviderException;
023import java.util.Date;
024import java.util.HashMap;
025import java.util.Map;
026
027import org.jivesoftware.smack.util.Objects;
028
029import org.jivesoftware.smackx.ox.OpenPgpContact;
030import org.jivesoftware.smackx.ox.callback.SecretKeyPassphraseCallback;
031import org.jivesoftware.smackx.ox.exception.MissingUserIdOnKeyException;
032import org.jivesoftware.smackx.ox.store.definition.OpenPgpKeyStore;
033import org.jivesoftware.smackx.ox.store.definition.OpenPgpMetadataStore;
034import org.jivesoftware.smackx.ox.store.definition.OpenPgpStore;
035import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
036
037import org.bouncycastle.openpgp.PGPException;
038import org.bouncycastle.openpgp.PGPPublicKeyRing;
039import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
040import org.bouncycastle.openpgp.PGPSecretKeyRing;
041import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
042import org.jxmpp.jid.BareJid;
043import org.pgpainless.key.OpenPgpV4Fingerprint;
044import org.pgpainless.key.collection.PGPKeyRing;
045import org.pgpainless.key.protection.SecretKeyRingProtector;
046import org.pgpainless.key.protection.UnprotectedKeysProtector;
047
048public abstract class AbstractOpenPgpStore implements OpenPgpStore {
049
050    protected final OpenPgpKeyStore keyStore;
051    protected final OpenPgpMetadataStore metadataStore;
052    protected final OpenPgpTrustStore trustStore;
053
054    protected SecretKeyPassphraseCallback secretKeyPassphraseCallback;
055    protected SecretKeyRingProtector unlocker = new UnprotectedKeysProtector();
056    protected final Map<BareJid, OpenPgpContact> contacts = new HashMap<>();
057
058    @Override
059    public void deletePublicKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException {
060        keyStore.deletePublicKeyRing(owner, fingerprint);
061    }
062
063    @Override
064    public void deleteSecretKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException {
065        keyStore.deleteSecretKeyRing(owner, fingerprint);
066    }
067
068    protected AbstractOpenPgpStore(OpenPgpKeyStore keyStore,
069                                   OpenPgpMetadataStore metadataStore,
070                                   OpenPgpTrustStore trustStore) {
071        this.keyStore = Objects.requireNonNull(keyStore);
072        this.metadataStore = Objects.requireNonNull(metadataStore);
073        this.trustStore = Objects.requireNonNull(trustStore);
074    }
075
076    @Override
077    public OpenPgpContact getOpenPgpContact(BareJid jid) {
078        OpenPgpContact contact = contacts.get(jid);
079        if (contact == null) {
080            contact = new OpenPgpContact(jid, this);
081            contacts.put(jid, contact);
082        }
083        return contact;
084    }
085
086    @Override
087    public void setKeyRingProtector(SecretKeyRingProtector protector) {
088        this.unlocker = protector;
089    }
090
091    @Override
092    public SecretKeyRingProtector getKeyRingProtector() {
093        return unlocker;
094    }
095
096    @Override
097    public void setSecretKeyPassphraseCallback(SecretKeyPassphraseCallback callback) {
098        this.secretKeyPassphraseCallback = callback;
099    }
100
101    /*
102    OpenPgpKeyStore
103     */
104
105    @Override
106    public PGPPublicKeyRingCollection getPublicKeysOf(BareJid owner) throws IOException, PGPException {
107        return keyStore.getPublicKeysOf(owner);
108    }
109
110    @Override
111    public PGPSecretKeyRingCollection getSecretKeysOf(BareJid owner) throws IOException, PGPException {
112        return keyStore.getSecretKeysOf(owner);
113    }
114
115    @Override
116    public PGPPublicKeyRing getPublicKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException {
117        return keyStore.getPublicKeyRing(owner, fingerprint);
118    }
119
120    @Override
121    public PGPSecretKeyRing getSecretKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException {
122        return keyStore.getSecretKeyRing(owner, fingerprint);
123    }
124
125    @Override
126    public PGPKeyRing generateKeyRing(BareJid owner) throws PGPException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
127        return keyStore.generateKeyRing(owner);
128    }
129
130    @Override
131    public void importSecretKey(BareJid owner, PGPSecretKeyRing secretKeys) throws IOException, PGPException, MissingUserIdOnKeyException {
132        keyStore.importSecretKey(owner, secretKeys);
133    }
134
135    @Override
136    public void importPublicKey(BareJid owner, PGPPublicKeyRing publicKeys) throws IOException, PGPException, MissingUserIdOnKeyException {
137        keyStore.importPublicKey(owner, publicKeys);
138    }
139
140    @Override
141    public Map<OpenPgpV4Fingerprint, Date> getPublicKeyFetchDates(BareJid contact) throws IOException {
142        return keyStore.getPublicKeyFetchDates(contact);
143    }
144
145    @Override
146    public void setPublicKeyFetchDates(BareJid contact, Map<OpenPgpV4Fingerprint, Date> dates) throws IOException {
147        keyStore.setPublicKeyFetchDates(contact, dates);
148    }
149
150    /*
151    OpenPgpMetadataStore
152     */
153
154    @Override
155    public Map<OpenPgpV4Fingerprint, Date> getAnnouncedFingerprintsOf(BareJid contact) throws IOException {
156        return metadataStore.getAnnouncedFingerprintsOf(contact);
157    }
158
159    @Override
160    public void setAnnouncedFingerprintsOf(BareJid contact, Map<OpenPgpV4Fingerprint, Date> data) throws IOException {
161        metadataStore.setAnnouncedFingerprintsOf(contact, data);
162    }
163
164    /*
165    OpenPgpTrustStore
166     */
167
168    @Override
169    public Trust getTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException {
170        return trustStore.getTrust(owner, fingerprint);
171    }
172
173    @Override
174    public void setTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust) throws IOException {
175        trustStore.setTrust(owner, fingerprint, trust);
176    }
177}