diff --git a/maxkey-common/src/main/java/org/maxkey/util/HttpEncoder.java b/maxkey-common/src/main/java/org/maxkey/util/HttpEncoder.java index d72ae7dfec4d172bd10928ce9cc97b54d96aef1d..d8664f470c07f35fd97b5ff4eb03a09a8472c88b 100644 --- a/maxkey-common/src/main/java/org/maxkey/util/HttpEncoder.java +++ b/maxkey-common/src/main/java/org/maxkey/util/HttpEncoder.java @@ -35,16 +35,17 @@ public abstract class HttpEncoder { ENCODING_RULES = Collections.unmodifiableMap(rules); } - public static String encode(String plain) throws Exception { - String encoded; + public static String encode(String plain) { + String encoded = null; try { encoded = URLEncoder.encode(plain, CHARSET); + for (Map.Entry rule : ENCODING_RULES.entrySet()) { + encoded = applyRule(encoded, rule.getKey(), rule.getValue()); + } } catch (UnsupportedEncodingException uee) { - throw new Exception("Charset not found while encoding string: " + CHARSET, uee); - } - for (Map.Entry rule : ENCODING_RULES.entrySet()) { - encoded = applyRule(encoded, rule.getKey(), rule.getValue()); + uee.printStackTrace(); } + return encoded; } diff --git a/maxkey-common/src/main/java/org/maxkey/util/Preconditions.java b/maxkey-common/src/main/java/org/maxkey/util/Preconditions.java new file mode 100644 index 0000000000000000000000000000000000000000..fc898ac4b9b8a3ee50dda6a8aa766ef61bd09971 --- /dev/null +++ b/maxkey-common/src/main/java/org/maxkey/util/Preconditions.java @@ -0,0 +1,93 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.maxkey.util; + + +import java.util.Locale; +import java.util.regex.Pattern; + +import org.maxkey.client.oauth.model.OAuthConstants; + +/** + * Utils for checking preconditions and invariants + */ +public abstract class Preconditions { + + private static final String DEFAULT_MESSAGE = "Received an invalid parameter"; + + // scheme = alpha *( alpha | digit | "+" | "-" | "." ) + private static final String URL_REGEXP = "^[a-zA-Z][a-zA-Z0-9+.-]*://\\S+"; + + /** + * Checks that an object is not null. + * + * @param object any object + * @param errorMsg error message + * + * @throws IllegalArgumentException if the object is null + */ + public static void checkNotNull(Object object, String errorMsg) { + check(object != null, errorMsg); + } + + /** + * Checks that a string is not null or empty + * + * @param string any string + * @param errorMsg error message + * + * @throws IllegalArgumentException if the string is null or empty + */ + public static void checkEmptyString(String string, String errorMsg) { + check(string != null && !string.trim().isEmpty(), errorMsg); + } + + /** + * Checks that a URL is valid + * + * @param url any string + * @param errorMsg error message + */ + public static void checkValidUrl(String url, String errorMsg) { + checkEmptyString(url, errorMsg); + check(isUrl(url), errorMsg); + } + + /** + * Checks that a URL is a valid OAuth callback + * + * @param url any string + * @param errorMsg error message + */ + public static void checkValidOAuthCallback(String url, String errorMsg) { + checkEmptyString(url, errorMsg); + if (url.toLowerCase(Locale.getDefault()).compareToIgnoreCase(OAuthConstants.OUT_OF_BAND) != 0) { + check(isUrl(url), errorMsg); + } + } + + private static boolean isUrl(String url) { + return Pattern.compile(URL_REGEXP).matcher(url).matches(); + } + + private static void check(boolean requirements, String error) { + if (!requirements) { + throw new IllegalArgumentException(error == null || error.trim().length() <= 0 ? DEFAULT_MESSAGE : error); + } + } + +} diff --git a/maxkey-common/src/main/java/org/maxkey/util/StreamUtils.java b/maxkey-common/src/main/java/org/maxkey/util/StreamUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..cae544c802b67a2cd4e00c2da45b09ea5cd39af5 --- /dev/null +++ b/maxkey-common/src/main/java/org/maxkey/util/StreamUtils.java @@ -0,0 +1,65 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.maxkey.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.zip.GZIPInputStream; + +/** + * Utils to deal with Streams. + */ +public abstract class StreamUtils { + + /** + * Returns the stream contents as an UTF-8 encoded string + * + * @param is input stream + * @return string contents + * @throws java.io.IOException in any. SocketTimeout in example + */ + public static String getStreamContents(InputStream is) throws IOException { + Preconditions.checkNotNull(is, "Cannot get String from a null object"); + final char[] buffer = new char[0x10000]; + final StringBuilder out = new StringBuilder(); + try (Reader in = new InputStreamReader(is, "UTF-8")) { + int read; + do { + read = in.read(buffer, 0, buffer.length); + if (read > 0) { + out.append(buffer, 0, read); + } + } while (read >= 0); + } + return out.toString(); + } + + /** + * Return String content from a gzip stream + * + * @param is input stream + * @return string contents + * @throws java.io.IOException in any. SocketTimeout in example + */ + public static String getGzipStreamContents(InputStream is) throws IOException { + Preconditions.checkNotNull(is, "Cannot get String from a null object"); + final GZIPInputStream gis = new GZIPInputStream(is); + return getStreamContents(gis); + } +} \ No newline at end of file diff --git a/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java b/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java index c950e8ceaa3f33c5cbd9b99749f1561ae3196c61..d0a726611cbc9f43cb6cf94f2b615314b7fb073c 100644 --- a/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java +++ b/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java @@ -54,9 +54,9 @@ public class MaxKeyApplication extends SpringBootServletInitializer { } catch (ServletException e) { _logger.error("ServletException", e); } - _logger.info("MaxKey at " + new DateTime()); - _logger.info("MaxKey Server Port " - + applicationContext.getBean(ApplicationConfig.class).getPort()); + _logger.info("MaxKey at {}" , new DateTime()); + _logger.info("MaxKey Server Port {}" + ,applicationContext.getBean(ApplicationConfig.class).getPort()); _logger.info("MaxKey started."); } diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtApplication.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtApplication.java index 92b5d4f9103a591ec305ef25da52c0d0cdaef122..9d65e8ef000a890790edbafc9d2b14750c943111 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtApplication.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtApplication.java @@ -61,16 +61,19 @@ public class MaxKeyMgtApplication extends SpringBootServletInitializer { public static void main(String[] args) { _logger.info("Start MaxKeyMgtApplication ..."); - ConfigurableApplicationContext applicationContext =SpringApplication.run(MaxKeyMgtApplication.class, args); - InitializeContext initWebContext=new InitializeContext(applicationContext); + ConfigurableApplicationContext applicationContext = + SpringApplication.run(MaxKeyMgtApplication.class, args); + InitializeContext initWebContext = + new InitializeContext(applicationContext); try { initWebContext.init(null); } catch (ServletException e) { _logger.error("Exception ",e); } - _logger.info("MaxKeyMgt at "+new DateTime()); - _logger.info("MaxKeyMgt Server Port "+applicationContext.getBean(ApplicationConfig.class).getPort()); + _logger.info("MaxKeyMgt at {}" , new DateTime()); + _logger.info("MaxKeyMgt Server Port {}" + ,applicationContext.getBean(ApplicationConfig.class).getPort()); _logger.info("MaxKeyMgt started."); }