View Javadoc
1   package com.atlassian.refapp.trustedapps.internal;
2   
3   import com.atlassian.sal.api.pluginsettings.PluginSettings;
4   import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
5   import com.atlassian.security.auth.trustedapps.EncryptionProvider;
6   
7   import java.security.KeyPair;
8   import java.security.NoSuchAlgorithmException;
9   import java.security.NoSuchProviderException;
10  import java.security.PrivateKey;
11  import java.security.PublicKey;
12  import java.util.Random;
13  
14  /**
15   * Factory for getting key pairs to use in net applications.  Stores keys in the com.atlassian.refapp.sal.pluginsettings for possible
16   * persistence between restarts.
17   */
18  public class KeyFactory {
19      private static final String PRIVATE_KEY = "trustedapps.private-key";
20      private static final String PUBLIC_KEY = "trustedapps.public-key";
21      private static final String APPLICTAION_ID = "trustedapps.application-id";
22  
23      private EncryptionProvider encryptionProvider;
24      private PluginSettings pluginSettings;
25  
26      public KeyFactory(EncryptionProvider encryptionProvider, PluginSettingsFactory pluginSettingsFactory) {
27          this.encryptionProvider = encryptionProvider;
28          pluginSettings = pluginSettingsFactory.createGlobalSettings();
29      }
30  
31      public KeyPair getKeyPair() {
32          KeyPair keyPair;
33          if (pluginSettings.get(PRIVATE_KEY) != null) {
34              keyPair = fetchKeyPair();
35          } else {
36              keyPair = createKeyPair();
37              storeKeyPair(keyPair);
38          }
39          return keyPair;
40      }
41  
42      public String getApplicationId() {
43          return (String) pluginSettings.get(APPLICTAION_ID);
44      }
45  
46      private KeyPair createKeyPair() {
47          try {
48              return encryptionProvider.generateNewKeyPair();
49          } catch (NoSuchAlgorithmException e) {
50              throw new IllegalArgumentException("No such algorithm", e);
51          } catch (NoSuchProviderException e) {
52              throw new IllegalArgumentException("No such provider", e);
53          }
54      }
55  
56      private void storeKeyPair(KeyPair keyPair) {
57          pluginSettings.put(PUBLIC_KEY, KeyUtils.encode(keyPair.getPublic()));
58          pluginSettings.put(PRIVATE_KEY, KeyUtils.encode(keyPair.getPrivate()));
59          pluginSettings.put(APPLICTAION_ID, "refapp:" + Integer.toString(new Random().nextInt(90000) + 10000));
60      }
61  
62      private KeyPair fetchKeyPair() {
63          return new KeyPair(fetchPublicKey(), fetchPrivateKey());
64      }
65  
66      private PrivateKey fetchPrivateKey() {
67          String keyStr = (String) pluginSettings.get(PRIVATE_KEY);
68          return KeyUtils.decodePrivateKey(encryptionProvider, keyStr);
69      }
70  
71      private PublicKey fetchPublicKey() {
72          String keyStr = (String) pluginSettings.get(PUBLIC_KEY);
73          return KeyUtils.decodePublicKey(encryptionProvider, keyStr);
74      }
75  
76  }