PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/refapp-plugins/sal-trust-plugin/src/main/java/com/atlassian/refapp/trustedapps/internal/RefAppTrustedApplicationsManagerImpl.java

https://bitbucket.org/atlassian/atlassian-refapp
Java | 146 lines | 127 code | 19 blank | 0 comment | 19 complexity | 9d910b6a9ccb15d9d3677f8f8b40225b MD5 | raw file
  1. package com.atlassian.refapp.trustedapps.internal;
  2. import com.atlassian.sal.api.pluginsettings.PluginSettings;
  3. import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
  4. import com.atlassian.security.auth.trustedapps.Application;
  5. import com.atlassian.security.auth.trustedapps.ApplicationRetriever.RetrievalException;
  6. import com.atlassian.security.auth.trustedapps.CurrentApplication;
  7. import com.atlassian.security.auth.trustedapps.DefaultCurrentApplication;
  8. import com.atlassian.security.auth.trustedapps.DefaultTrustedApplication;
  9. import com.atlassian.security.auth.trustedapps.EncryptionProvider;
  10. import com.atlassian.security.auth.trustedapps.RequestConditions;
  11. import com.atlassian.security.auth.trustedapps.TrustedApplication;
  12. import com.atlassian.security.auth.trustedapps.TrustedApplicationsConfigurationManager;
  13. import com.atlassian.security.auth.trustedapps.TrustedApplicationsManager;
  14. import org.apache.commons.lang3.ObjectUtils;
  15. import org.apache.commons.lang3.StringUtils;
  16. import java.security.KeyPair;
  17. import java.util.ArrayList;
  18. import java.util.Collection;
  19. import java.util.List;
  20. import java.util.Properties;
  21. public class RefAppTrustedApplicationsManagerImpl implements TrustedApplicationsManager, TrustedApplicationsConfigurationManager {
  22. private static final String TRUSTED_APPS_KEY = "trustedapps";
  23. private static final String TRUSTED_APP_KEY_PREFIX = "trustedapp.";
  24. private static final String PUBLIC_KEY_KEY = "public.key";
  25. private static final String TIMEOUT_KEY = "timeout";
  26. private static final String URLS_KEY = "urls";
  27. private static final String IPS_KEY = "ips";
  28. private final EncryptionProvider encryptionProvider;
  29. private final CurrentApplication currentApplication;
  30. private final PluginSettingsFactory pluginSettingsFactory;
  31. public RefAppTrustedApplicationsManagerImpl(EncryptionProvider encryptionProvider, KeyFactory keyFactory,
  32. PluginSettingsFactory pluginSettingsFactory) {
  33. this.encryptionProvider = encryptionProvider;
  34. this.pluginSettingsFactory = pluginSettingsFactory;
  35. KeyPair keyPair = keyFactory.getKeyPair();
  36. currentApplication = new DefaultCurrentApplication(encryptionProvider, keyPair.getPublic(),
  37. keyPair.getPrivate(), keyFactory.getApplicationId());
  38. }
  39. public CurrentApplication getCurrentApplication() {
  40. return currentApplication;
  41. }
  42. public synchronized TrustedApplication getTrustedApplication(final String id) {
  43. return load(id);
  44. }
  45. public Application getApplicationCertificate(final String url) throws RetrievalException {
  46. return encryptionProvider.getApplicationCertificate(url);
  47. }
  48. public TrustedApplication addTrustedApplication(final Application app, final RequestConditions conditions) {
  49. final TrustedApplication trustedApp = new DefaultTrustedApplication(
  50. encryptionProvider,
  51. app.getPublicKey(),
  52. app.getID(),
  53. conditions);
  54. store(app, conditions);
  55. return trustedApp;
  56. }
  57. public Collection<TrustedApplication> getTrustedApplications() {
  58. final PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();
  59. final List<String> ids = (List<String>) pluginSettings.get(TRUSTED_APPS_KEY);
  60. final Collection<TrustedApplication> trustedApplications = new ArrayList<>();
  61. if (ids != null) {
  62. for (String id : ids) {
  63. TrustedApplication app = load(id);
  64. if (app != null) {
  65. trustedApplications.add(app);
  66. }
  67. }
  68. }
  69. return trustedApplications;
  70. }
  71. public boolean deleteApplication(final String id) {
  72. final PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();
  73. final List<String> ids = (List<String>) pluginSettings.get(TRUSTED_APPS_KEY);
  74. if (ids != null && ids.contains(id)) {
  75. ids.remove(id);
  76. if (ids.isEmpty()) {
  77. pluginSettings.remove(TRUSTED_APPS_KEY);
  78. } else {
  79. pluginSettings.put(TRUSTED_APPS_KEY, ids);
  80. }
  81. }
  82. return pluginSettings.remove(TRUSTED_APP_KEY_PREFIX + id) != null;
  83. }
  84. private void store(final Application application, final RequestConditions conditions) {
  85. final PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();
  86. final List<String> ids = (List<String>) ObjectUtils.defaultIfNull(
  87. pluginSettings.get(TRUSTED_APPS_KEY), new ArrayList<String>());
  88. if (!ids.contains(application.getID())) {
  89. ids.add(application.getID());
  90. }
  91. pluginSettings.put(TRUSTED_APPS_KEY, ids);
  92. Properties props = new Properties();
  93. props.put(PUBLIC_KEY_KEY, KeyUtils.encode(application.getPublicKey()));
  94. props.put(TIMEOUT_KEY, Long.toString(conditions.getCertificateTimeout()));
  95. props.put(URLS_KEY, iterableToString(conditions.getURLPatterns()));
  96. props.put(IPS_KEY, iterableToString(conditions.getIPPatterns()));
  97. pluginSettings.put(TRUSTED_APP_KEY_PREFIX + application.getID(), props);
  98. }
  99. private TrustedApplication load(final String id) {
  100. final PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();
  101. final Properties props = (Properties) pluginSettings.get(TRUSTED_APP_KEY_PREFIX + id);
  102. if (props == null) {
  103. return null;
  104. } else {
  105. final String publicKey = props.getProperty(PUBLIC_KEY_KEY);
  106. final long timeout = Long.parseLong(props.getProperty(TIMEOUT_KEY));
  107. final String[] urls = decodeCommaSeparatedString(props.getProperty(URLS_KEY));
  108. final String[] ips = decodeCommaSeparatedString(props.getProperty(IPS_KEY));
  109. return new DefaultTrustedApplication(encryptionProvider, KeyUtils.decodePublicKey(encryptionProvider,
  110. publicKey), id, RequestConditions
  111. .builder()
  112. .setCertificateTimeout(timeout)
  113. .addURLPattern(urls)
  114. .addIPPattern(ips)
  115. .build());
  116. }
  117. }
  118. private static String iterableToString(final Iterable<String> iterable) {
  119. return StringUtils.join(iterable.iterator(), ',');
  120. }
  121. private static String[] decodeCommaSeparatedString(final String str) {
  122. if (str == null || str.length() == 0) {
  123. return new String[]{};
  124. }
  125. return str.split(",");
  126. }
  127. }