View Javadoc
1   /*
2    * Copyright (c) 2008 Sonatype, Inc. All rights reserved.
3    *
4    * This program is licensed to you under the Apache License Version 2.0,
5    * and you may not use this file except in compliance with the Apache License Version 2.0.
6    * You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0.
7    *
8    * Unless required by applicable law or agreed to in writing,
9    * software distributed under the Apache License Version 2.0 is distributed on an
10   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11   * See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
12   */
13  
14  package org.codehaus.plexus.components.secdispatcher;
15  
16  import java.io.IOException;
17  import java.util.List;
18  import java.util.Map;
19  import java.util.Set;
20  
21  import org.codehaus.plexus.components.secdispatcher.model.SettingsSecurity;
22  
23  /**
24   * This component decrypts a string, passed to it using various dispatchers.
25   *
26   * @author Oleg Gusakov
27   */
28  public interface SecDispatcher {
29      /**
30       * Attribute that selects a dispatcher. If not present in {@link #encrypt(String, Map)} attributes, the
31       * configured "default dispatcher" is used.
32       *
33       * @see #availableDispatchers()
34       */
35      String DISPATCHER_NAME_ATTR = "name";
36  
37      /**
38       * Attribute for version, added by SecDispatcher for possible upgrade path.
39       */
40      String DISPATCHER_VERSION_ATTR = "version";
41  
42      /**
43       * Returns the set of available dispatcher metadata, never {@code null}.
44       */
45      Set<DispatcherMeta> availableDispatchers();
46  
47      /**
48       * Encrypt given plaintext string.
49       *
50       * @param str the plaintext to encrypt
51       * @param attr the attributes, may be {@code null}
52       * @return encrypted string
53       * @throws SecDispatcherException in case of problem
54       */
55      String encrypt(String str, Map<String, String> attr) throws SecDispatcherException, IOException;
56  
57      /**
58       * Decrypt given encrypted string.
59       *
60       * @param str the encrypted string
61       * @return decrypted string
62       * @throws SecDispatcherException in case of problem
63       */
64      String decrypt(String str) throws SecDispatcherException, IOException;
65  
66      /**
67       * Returns {@code true} if passed in string adheres to "encrypted string" format (current or legacy).
68       *
69       * @since 4.0.1
70       */
71      default boolean isAnyEncryptedString(String str) {
72          return isEncryptedString(str) || isLegacyEncryptedString(str);
73      }
74  
75      /**
76       * Returns {@code true} if passed in string adheres "encrypted string" format.
77       */
78      boolean isEncryptedString(String str);
79  
80      /**
81       * Returns {@code true} if passed in string adheres to "legacy encrypted string" format.
82       */
83      boolean isLegacyEncryptedString(String str);
84  
85      /**
86       * Reads the effective configuration, eventually creating new instance if not present.
87       *
88       * @param createIfMissing If {@code true}, it will create a new empty instance
89       * @return the configuration, of {@code null} if it does not exist in {@code createIfMissing} is {@code false}
90       * @throws IOException In case of IO problem
91       */
92      SettingsSecurity readConfiguration(boolean createIfMissing) throws IOException;
93  
94      /**
95       * Writes the effective configuration.
96       *
97       * @param configuration The configuration to write, may not be {@code null}
98       * @throws IOException In case of IO problem
99       */
100     void writeConfiguration(SettingsSecurity configuration) throws IOException;
101 
102     /**
103      * The validation response.
104      */
105     final class ValidationResponse {
106         public enum Level {
107             INFO,
108             WARNING,
109             ERROR
110         };
111 
112         private final String source;
113         private final boolean valid;
114         private final Map<Level, List<String>> report;
115         private final List<ValidationResponse> subsystems;
116 
117         public ValidationResponse(
118                 String source, boolean valid, Map<Level, List<String>> report, List<ValidationResponse> subsystems) {
119             this.source = source;
120             this.valid = valid;
121             this.report = report;
122             this.subsystems = subsystems;
123         }
124 
125         public String getSource() {
126             return source;
127         }
128 
129         public boolean isValid() {
130             return valid;
131         }
132 
133         public Map<Level, List<String>> getReport() {
134             return report;
135         }
136 
137         public List<ValidationResponse> getSubsystems() {
138             return subsystems;
139         }
140     }
141 
142     /**
143      * Performs a "deep validation" and reports the status. If return instance {@link ValidationResponse#isValid()}
144      * is {@code true}, configuration is usable.
145      */
146     ValidationResponse validateConfiguration();
147 }