diff --git a/common/src/main/java/ru/javaops/masterjava/config/Configs.java b/common/src/main/java/ru/javaops/masterjava/config/Configs.java index 1c9b1cc..0c928e7 100644 --- a/common/src/main/java/ru/javaops/masterjava/config/Configs.java +++ b/common/src/main/java/ru/javaops/masterjava/config/Configs.java @@ -11,8 +11,12 @@ public static Config getConfig(String resource) { return ConfigFactory.parseResources(resource).resolve(); } - public static Config getConfig(String resource, String domain) { - return getConfig(resource).getConfig(domain); + public static Config getConfig(String resource, String... domains ) { + Config config = getConfig(resource); + for (String domain: domains) { + config = config.getConfig(domain); + } + return config; } public static File getConfigFile(String path) { diff --git a/parent/pom.xml b/parent/pom.xml index 46400fa..4e8a004 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -19,7 +19,7 @@ 1.7.25 - /apps/masterjava/config/ + c:/apps/masterjava/config/ false diff --git a/services/common-ws/src/main/java/ru/javaops/web/HostConfig.java b/services/common-ws/src/main/java/ru/javaops/web/HostConfig.java new file mode 100644 index 0000000..d44b52f --- /dev/null +++ b/services/common-ws/src/main/java/ru/javaops/web/HostConfig.java @@ -0,0 +1,28 @@ +package ru.javaops.web; + +import com.typesafe.config.Config; +import lombok.Getter; +import org.slf4j.event.Level; +import ru.javaops.masterjava.config.Configs; + +/** + * Created by val on 2017-05-05. + */ +@Getter +public class HostConfig { + public static final HostConfig HOST = + new HostConfig(Configs.getConfig("hosts.conf", "hosts", "mail")); + + private final String endpoint; + private final Level debugLevel; + private final String user; + private final String password; + + private HostConfig(Config hosts) { + this.endpoint = hosts.getString("endpoint"); + this.debugLevel = Level.valueOf(hosts.getString("debug.client")); + this.user = hosts.getString("user"); + this.password = hosts.getString("password"); + } + +} diff --git a/services/common-ws/src/main/java/ru/javaops/web/WsClient.java b/services/common-ws/src/main/java/ru/javaops/web/WsClient.java index f2db3a9..30677d1 100644 --- a/services/common-ws/src/main/java/ru/javaops/web/WsClient.java +++ b/services/common-ws/src/main/java/ru/javaops/web/WsClient.java @@ -1,8 +1,7 @@ package ru.javaops.web; -import com.typesafe.config.Config; import ru.javaops.masterjava.ExceptionType; -import ru.javaops.masterjava.config.Configs; +import ru.javaops.web.handler.SoapClientLoggingHandler; import javax.xml.namespace.QName; import javax.xml.ws.Binding; @@ -14,24 +13,20 @@ import java.util.List; import java.util.Map; -public class WsClient { - private static Config HOSTS; +import static ru.javaops.web.HostConfig.HOST; +public class WsClient { private final Class serviceClass; private final Service service; private String endpointAddress; - static { - HOSTS = Configs.getConfig("hosts.conf", "hosts"); - } - public WsClient(URL wsdlUrl, QName qname, Class serviceClass) { this.serviceClass = serviceClass; this.service = Service.create(wsdlUrl, qname); } - public void init(String host, String endpointAddress) { - this.endpointAddress = HOSTS.getString(host) + endpointAddress; + public void init(String endpointAddress) { + this.endpointAddress = HOST.getEndpoint() + endpointAddress; } // Post is not thread-safe (http://stackoverflow.com/a/10601916/548473) @@ -43,16 +38,16 @@ public T getPort(WebServiceFeature... features) { return port; } - public static void setAuth(T port, String user, String password) { + public static void setAuth(T port) { Map requestContext = ((BindingProvider) port).getRequestContext(); - requestContext.put(BindingProvider.USERNAME_PROPERTY, user); - requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); + requestContext.put(BindingProvider.USERNAME_PROPERTY, HOST.getUser()); + requestContext.put(BindingProvider.PASSWORD_PROPERTY, HOST.getPassword()); } - public static void setHandler(T port, Handler handler) { + public static void setHandler(T port) { Binding binding = ((BindingProvider) port).getBinding(); List handlerList = binding.getHandlerChain(); - handlerList.add(handler); + handlerList.add(new SoapClientLoggingHandler(HOST.getDebugLevel())); binding.setHandlerChain(handlerList); } diff --git a/services/common-ws/src/main/java/ru/javaops/web/handler/SoapLoggingHandler.java b/services/common-ws/src/main/java/ru/javaops/web/handler/SoapLoggingHandler.java index b01f8da..66cd103 100644 --- a/services/common-ws/src/main/java/ru/javaops/web/handler/SoapLoggingHandler.java +++ b/services/common-ws/src/main/java/ru/javaops/web/handler/SoapLoggingHandler.java @@ -79,6 +79,7 @@ public void handleMessage(MessageHandlerContext context, boolean isRequest) { DEBUG { public void handleFault(MessageHandlerContext context) { log.error("Fault SOAP message:\n" + getMessageText(context.getMessage().copy())); + } public void handleMessage(MessageHandlerContext context, boolean isRequest) { diff --git a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailWSClient.java b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailWSClient.java index 63d8dc3..d0af717 100644 --- a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailWSClient.java +++ b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailWSClient.java @@ -5,11 +5,8 @@ import com.google.common.collect.Iterables; import com.google.common.io.Resources; import lombok.extern.slf4j.Slf4j; -import org.slf4j.event.Level; -import ru.javaops.web.AuthUtil; import ru.javaops.web.WebStateException; import ru.javaops.web.WsClient; -import ru.javaops.web.handler.SoapClientLoggingHandler; import javax.xml.namespace.QName; import javax.xml.ws.soap.MTOMFeature; @@ -19,21 +16,15 @@ @Slf4j public class MailWSClient { private static final WsClient WS_CLIENT; - public static final String USER = "user"; - public static final String PASSWORD = "password"; - private static final SoapClientLoggingHandler LOGGING_HANDLER = new SoapClientLoggingHandler(Level.DEBUG); - - public static String AUTH_HEADER = AuthUtil.encodeBasicAuthHeader(USER, PASSWORD); static { WS_CLIENT = new WsClient(Resources.getResource("wsdl/mailService.wsdl"), new QName("http://mail.javaops.ru/", "MailServiceImplService"), MailService.class); - WS_CLIENT.init("mail", "/mail/mailService?wsdl"); + WS_CLIENT.init("/mail/mailService?wsdl"); } - public static String sendToGroup(final Set to, final Set cc, final String subject, final String body, List attaches) throws WebStateException { log.info("Send mail to '" + to + "' cc '" + cc + "' subject '" + subject + (log.isDebugEnabled() ? "\nbody=" + body : "")); String status; @@ -62,8 +53,8 @@ public static GroupResult sendBulk(final Set to, final String subject private static MailService getPort() { MailService port = WS_CLIENT.getPort(new MTOMFeature(1024)); - WsClient.setAuth(port, USER, PASSWORD); - WsClient.setHandler(port, LOGGING_HANDLER); + WsClient.setAuth(port); + WsClient.setHandler(port); return port; } diff --git a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailServiceImpl.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailServiceImpl.java index 252b4f3..f69449e 100644 --- a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailServiceImpl.java +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailServiceImpl.java @@ -1,15 +1,12 @@ package ru.javaops.masterjava.service.mail; -import ru.javaops.web.AuthUtil; import ru.javaops.web.WebStateException; import javax.annotation.Resource; import javax.jws.HandlerChain; import javax.jws.WebService; import javax.xml.ws.WebServiceContext; -import javax.xml.ws.handler.MessageContext; import java.util.List; -import java.util.Map; import java.util.Set; @WebService(endpointInterface = "ru.javaops.masterjava.service.mail.MailService", targetNamespace = "http://mail.javaops.ru/" @@ -25,17 +22,6 @@ public class MailServiceImpl implements MailService { @Override public String sendToGroup(Set to, Set cc, String subject, String body, List attaches) throws WebStateException { - MessageContext mCtx = wsContext.getMessageContext(); - Map> headers = (Map>) mCtx.get(MessageContext.HTTP_REQUEST_HEADERS); - -// HttpServletRequest request = (HttpServletRequest) mCtx.get(MessageContext.SERVLET_REQUEST); -// HttpServletResponse response = (HttpServletResponse) mCtx.get(MessageContext.SERVLET_RESPONSE); - - int code = AuthUtil.checkBasicAuth(headers, MailWSClient.AUTH_HEADER); - if (code != 0) { - mCtx.put(MessageContext.HTTP_RESPONSE_CODE, code); - throw new SecurityException(); - } return MailSender.sendToGroup(to, cc, subject, body, attaches); } diff --git a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/handler/SoapServerSecurityHandler.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/handler/SoapServerSecurityHandler.java new file mode 100644 index 0000000..02fd423 --- /dev/null +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/handler/SoapServerSecurityHandler.java @@ -0,0 +1,52 @@ +package ru.javaops.masterjava.service.mail.handler; + +import com.sun.xml.ws.api.handler.MessageHandler; +import com.sun.xml.ws.api.handler.MessageHandlerContext; +import com.typesafe.config.Config; +import ru.javaops.masterjava.config.Configs; +import ru.javaops.web.AuthUtil; +import ru.javaops.web.Statistics; + +import javax.xml.namespace.QName; +import javax.xml.ws.handler.MessageContext; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Created by val on 2017-05-03. + */ +public class SoapServerSecurityHandler implements MessageHandler { + private final static Config MAIL = Configs.getConfig("hosts.conf", "hosts", "mail"); + private final static String AUTH_HEADER; + static { + AUTH_HEADER = AuthUtil.encodeBasicAuthHeader(MAIL.getString("user"), MAIL.getString("password")); + } + + @Override + public boolean handleMessage(MessageHandlerContext context) { + if (!(Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)){ + Map> headers = (Map>) context.get(MessageContext.HTTP_REQUEST_HEADERS); + int code = AuthUtil.checkBasicAuth(headers, AUTH_HEADER); + if (code != 0) { + context.put(MessageContext.HTTP_RESPONSE_CODE, code); + Statistics.count(context.getMessage().getPayloadLocalPart(), System.currentTimeMillis(), Statistics.RESULT.FAIL); + throw new SecurityException(); + } + } + return true; + } + + @Override + public boolean handleFault(MessageHandlerContext context) { + return true; + } + + @Override + public void close(MessageContext context) {} + + @Override + public Set getHeaders() { + return null; + } +} diff --git a/services/mail-service/src/main/resources/mailWsHandlers.xml b/services/mail-service/src/main/resources/mailWsHandlers.xml index 6415e80..786d0ea 100644 --- a/services/mail-service/src/main/resources/mailWsHandlers.xml +++ b/services/mail-service/src/main/resources/mailWsHandlers.xml @@ -1,8 +1,15 @@ + SoapLoggingHandler ru.javaops.web.handler.SoapServerLoggingHandler + + + SoapServerSecurityHandler + ru.javaops.masterjava.service.mail.handler.SoapServerSecurityHandler + + \ No newline at end of file