View Javadoc
1   /*
2    * Copyright 2012-2021 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.codelibs.fess.util;
17  
18  import java.util.HashMap;
19  import java.util.LinkedHashMap;
20  import java.util.Map;
21  import java.util.regex.Pattern;
22  
23  import org.codelibs.core.lang.StringUtil;
24  import org.codelibs.core.misc.Pair;
25  import org.codelibs.fess.es.config.exentity.CrawlingConfig.ConfigName;
26  import org.lastaflute.core.security.PrimaryCipher;
27  
28  public class ParameterUtil {
29      private static final String CIPHER_PREFIX = "{cipher}";
30  
31      protected static final String XPATH_PREFIX = "field.xpath.";
32  
33      protected static final String META_PREFIX = "field.meta.";
34  
35      protected static final String VALUE_PREFIX = "field.value.";
36  
37      protected static final String SCRIPT_PREFIX = "field.script.";
38  
39      protected static final String CLIENT_PREFIX = "client.";
40  
41      protected static final String CONFIG_PREFIX = "config.";
42  
43      protected static final String FIELD_PREFIX = "field.config.";
44  
45      protected ParameterUtil() {
46          // nothing
47      }
48  
49      public static Map<String, String> parse(final String value) {
50          final Map<String, String> paramMap = new LinkedHashMap<>();
51          if (value != null) {
52              int unknownKey = 0;
53              final Pattern properyPattern = Pattern.compile(ComponentUtil.getFessConfig().getAppEncryptPropertyPattern());
54              final PrimaryCipher cipher = ComponentUtil.getPrimaryCipher();
55              final String[] lines = value.split("[\r\n]");
56              for (final String line : lines) {
57                  if (StringUtil.isNotBlank(line)) {
58                      final int pos = line.indexOf('=');
59                      if (pos == 0) {
60                          paramMap.put("unknown." + (unknownKey + 1), line.substring(pos + 1).trim());
61                          unknownKey++;
62                      } else if (pos > 0) {
63                          final String key = line.substring(0, pos).trim();
64                          if (pos < line.length()) {
65                              String data = line.substring(pos + 1).trim();
66                              if (properyPattern.matcher(key).matches() && data.startsWith(CIPHER_PREFIX)) {
67                                  data = cipher.decrypt(data.substring(CIPHER_PREFIX.length()));
68                              }
69                              paramMap.put(key, data);
70                          } else {
71                              paramMap.put(key, StringUtil.EMPTY);
72                          }
73                      } else {
74                          paramMap.put(line.trim(), StringUtil.EMPTY);
75                      }
76                  }
77              }
78          }
79          return paramMap;
80      }
81  
82      public static String encrypt(final String value) {
83          final StringBuilder buf = new StringBuilder();
84          final Pattern properyPattern = Pattern.compile(ComponentUtil.getFessConfig().getAppEncryptPropertyPattern());
85          final PrimaryCipher cipher = ComponentUtil.getPrimaryCipher();
86          ParameterUtil.parse(value).entrySet().stream().map(e -> {
87              final String k = e.getKey();
88              final String v = e.getValue();
89              if (properyPattern.matcher(k).matches() && !v.startsWith(CIPHER_PREFIX)) {
90                  return new Pair<>(k, CIPHER_PREFIX + cipher.encrypt(v));
91              }
92              return new Pair<>(k, v);
93          }).forEach(e -> {
94              if (buf.length() > 0) {
95                  buf.append('\n');
96              }
97              buf.append(e.getFirst());
98              buf.append('=');
99              buf.append(e.getSecond());
100         });
101         return buf.toString();
102     }
103 
104     public static void loadConfigParams(final Map<String, Object> paramMap, final String configParam) {
105         final Map<String, String> map = ParameterUtil.parse(configParam);
106         if (!map.isEmpty()) {
107             paramMap.putAll(map);
108         }
109     }
110 
111     public static Map<ConfigName, Map<String, String>> createConfigParameterMap(final String configParameters) {
112         final Map<ConfigName, Map<String, String>> map = new HashMap<>();
113         final Map<String, String> configConfigMap = new LinkedHashMap<>();
114         final Map<String, String> clientConfigMap = new LinkedHashMap<>();
115         final Map<String, String> xpathConfigMap = new LinkedHashMap<>();
116         final Map<String, String> metaConfigMap = new LinkedHashMap<>();
117         final Map<String, String> valueConfigMap = new LinkedHashMap<>();
118         final Map<String, String> scriptConfigMap = new LinkedHashMap<>();
119         final Map<String, String> fieldConfigMap = new LinkedHashMap<>();
120         map.put(ConfigName.CONFIG, configConfigMap);
121         map.put(ConfigName.CLIENT, clientConfigMap);
122         map.put(ConfigName.XPATH, xpathConfigMap);
123         map.put(ConfigName.META, metaConfigMap);
124         map.put(ConfigName.VALUE, valueConfigMap);
125         map.put(ConfigName.SCRIPT, scriptConfigMap);
126         map.put(ConfigName.FIELD, fieldConfigMap);
127         for (final Map.Entry<String, String> entry : ParameterUtil.parse(configParameters).entrySet()) {
128             final String key = entry.getKey();
129             if (key.startsWith(CONFIG_PREFIX)) {
130                 configConfigMap.put(key.substring(CONFIG_PREFIX.length()), entry.getValue());
131             } else if (key.startsWith(CLIENT_PREFIX)) {
132                 clientConfigMap.put(key.substring(CLIENT_PREFIX.length()), entry.getValue());
133             } else if (key.startsWith(XPATH_PREFIX)) {
134                 xpathConfigMap.put(key.substring(XPATH_PREFIX.length()), entry.getValue());
135             } else if (key.startsWith(META_PREFIX)) {
136                 metaConfigMap.put(key.substring(META_PREFIX.length()), entry.getValue());
137             } else if (key.startsWith(VALUE_PREFIX)) {
138                 valueConfigMap.put(key.substring(VALUE_PREFIX.length()), entry.getValue());
139             } else if (key.startsWith(SCRIPT_PREFIX)) {
140                 scriptConfigMap.put(key.substring(SCRIPT_PREFIX.length()), entry.getValue());
141             } else if (key.startsWith(FIELD_PREFIX)) {
142                 fieldConfigMap.put(key.substring(FIELD_PREFIX.length()), entry.getValue());
143             }
144         }
145 
146         return map;
147     }
148 }