diff --git a/build.gradle b/build.gradle index 6ecf3d49b6ab902b77f12604aabad15a94dfc327..fe0e1637432d2d2d1ce0bb191a56aa4459a12c37 100644 --- a/build.gradle +++ b/build.gradle @@ -189,7 +189,6 @@ configurations { all*.exclude group: 'avalon-framework' all*.exclude group: 'avalon-logkit' all*.exclude group: 'com.metaparadigm' - all*.exclude group: 'com.sun.mail' all*.exclude group: 'commons-dbcp' all*.exclude group: 'commons-pool' all*.exclude group: 'excalibur-component' diff --git a/src/main/java/org/nrg/xapi/rest/notifications/NotificationsApi.java b/src/main/java/org/nrg/xapi/rest/notifications/NotificationsApi.java new file mode 100644 index 0000000000000000000000000000000000000000..3d0946570ab5f80cf05e734854ca2cd7741892f7 --- /dev/null +++ b/src/main/java/org/nrg/xapi/rest/notifications/NotificationsApi.java @@ -0,0 +1,170 @@ +package org.nrg.xapi.rest.notifications; + +import io.swagger.annotations.*; +import org.nrg.framework.annotations.XapiRestController; +import org.nrg.xdat.preferences.SiteConfigPreferences; +import org.nrg.xdat.rest.AbstractXnatRestApi; +import org.nrg.xdat.security.XDATUser; +import org.nrg.xft.security.UserI; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.inject.Inject; +import java.util.HashMap; +import java.util.Map; + +@Api(description = "XNAT Notifications management API") +@XapiRestController +@RequestMapping(value = "/notifications") +public class NotificationsApi extends AbstractXnatRestApi { + private static final Logger _log = LoggerFactory.getLogger(NotificationsApi.class); + + @ApiOperation(value = "Sets all the mail service properties.", notes = "Sets the mail service host, port, username, password, and protocol.", response = Void.class) + @ApiResponses({@ApiResponse(code = 200, message = "Mail service properties successfully set."), @ApiResponse(code = 401, message = "Must be authenticated to access the XNAT REST API."), @ApiResponse(code = 403, message = "Not authorized to set the mail service properties."), @ApiResponse(code = 500, message = "Unexpected error")}) + @RequestMapping(value = {"/all"}, produces = {"application/json"}, method = {RequestMethod.POST}) + public ResponseEntity<Void> setMailProperties(@ApiParam(value = "The value to set for the email host.", required = true) @RequestParam(value="host", required=false) final String host, + @ApiParam(value = "The value to set for the email port.", required = true) @RequestParam(value="port", required=false) final int port, + @ApiParam(value = "The value to set for the email username.", required = true) @RequestParam(value="username", required=false) final String username, + @ApiParam(value = "The value to set for the email password.", required = true) @RequestParam(value="password", required=false) final String password, + @ApiParam(value = "The value to set for the email protocol.", required = true) @RequestParam(value="protocol", required=false) final String protocol) { + HttpStatus status = null; + UserI sessionUser = getSessionUser(); + if (sessionUser == null) { + status = HttpStatus.UNAUTHORIZED; + } + else if ((sessionUser instanceof XDATUser)) { + status = ((XDATUser) sessionUser).isSiteAdmin() ? null : HttpStatus.FORBIDDEN; + } + if (status != null) { + return new ResponseEntity<>(status); + } + + _javaMailSender.setHost(host); + _javaMailSender.setPort(port); + _javaMailSender.setUsername(username); + _javaMailSender.setPassword(password); + _javaMailSender.setProtocol(protocol); + setSmtp(); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation(value = "Sets the mail service host.", notes = "Sets the mail service host.", response = Void.class) + @ApiResponses({@ApiResponse(code = 200, message = "Mail service host successfully set."), @ApiResponse(code = 401, message = "Must be authenticated to access the XNAT REST API."), @ApiResponse(code = 403, message = "Not authorized to set the mail service host."), @ApiResponse(code = 500, message = "Unexpected error")}) + @RequestMapping(value = {"/host"}, produces = {"application/json"}, method = {RequestMethod.POST}) + public ResponseEntity<Void> setHostProperty(@ApiParam(value = "The value to set for the email host.", required = true) @RequestParam(value="host", required=true) final String host) { + + + _javaMailSender.setHost(host); + setSmtp(); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation(value = "Sets the mail service port.", notes = "Sets the mail service port.", response = Void.class) + @ApiResponses({@ApiResponse(code = 200, message = "Mail service port successfully set."), @ApiResponse(code = 401, message = "Must be authenticated to access the XNAT REST API."), @ApiResponse(code = 403, message = "Not authorized to set the mail service port."), @ApiResponse(code = 500, message = "Unexpected error")}) + @RequestMapping(value = {"/port"}, produces = {"application/json"}, method = {RequestMethod.POST}) + public ResponseEntity<Void> setPortProperty(@ApiParam(value = "The value to set for the email port.", required = true) @RequestParam(value="port", required=true) final int port) { + HttpStatus status = null; + UserI sessionUser = getSessionUser(); + if (sessionUser == null) { + status = HttpStatus.UNAUTHORIZED; + } + else if ((sessionUser instanceof XDATUser)) { + status = ((XDATUser) sessionUser).isSiteAdmin() ? null : HttpStatus.FORBIDDEN; + } + if (status != null) { + return new ResponseEntity<>(status); + } + + _javaMailSender.setPort(port); + setSmtp(); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation(value = "Sets the mail service protocol.", notes = "Sets the mail service protocol.", response = Void.class) + @ApiResponses({@ApiResponse(code = 200, message = "Mail service protocol successfully set."), @ApiResponse(code = 401, message = "Must be authenticated to access the XNAT REST API."), @ApiResponse(code = 403, message = "Not authorized to set the mail service protocol."), @ApiResponse(code = 500, message = "Unexpected error")}) + @RequestMapping(value = {"/protocol"}, produces = {"application/json"}, method = {RequestMethod.POST}) + public ResponseEntity<Void> setProtocolProperty(@ApiParam(value = "The value to set for the email protocol.", required = true) @RequestParam(value="protocol", required=true) final String protocol) { + HttpStatus status = null; + UserI sessionUser = getSessionUser(); + if (sessionUser == null) { + status = HttpStatus.UNAUTHORIZED; + } + else if ((sessionUser instanceof XDATUser)) { + status = ((XDATUser) sessionUser).isSiteAdmin() ? null : HttpStatus.FORBIDDEN; + } + if (status != null) { + return new ResponseEntity<>(status); + } + + _javaMailSender.setProtocol(protocol); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation(value = "Sets the mail service username.", notes = "Sets the mail service username.", response = Void.class) + @ApiResponses({@ApiResponse(code = 200, message = "Mail service username successfully set."), @ApiResponse(code = 401, message = "Must be authenticated to access the XNAT REST API."), @ApiResponse(code = 403, message = "Not authorized to set the mail service username."), @ApiResponse(code = 500, message = "Unexpected error")}) + @RequestMapping(value = {"/username"}, produces = {"application/json"}, method = {RequestMethod.POST}) + public ResponseEntity<Void> setUsernameProperty(@ApiParam(value = "The value to set for the email username.", required = true) @RequestParam(value="username", required=true) final String username) { + HttpStatus status = null; + UserI sessionUser = getSessionUser(); + if (sessionUser == null) { + status = HttpStatus.UNAUTHORIZED; + } + else if ((sessionUser instanceof XDATUser)) { + status = ((XDATUser) sessionUser).isSiteAdmin() ? null : HttpStatus.FORBIDDEN; + } + if (status != null) { + return new ResponseEntity<>(status); + } + + _javaMailSender.setUsername(username); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation(value = "Sets the mail service password.", notes = "Sets the mail service password.", response = Void.class) + @ApiResponses({@ApiResponse(code = 200, message = "Mail service password successfully set."), @ApiResponse(code = 401, message = "Must be authenticated to access the XNAT REST API."), @ApiResponse(code = 403, message = "Not authorized to set the mail service password."), @ApiResponse(code = 500, message = "Unexpected error")}) + @RequestMapping(value = {"/password"}, produces = {"application/json"}, method = {RequestMethod.POST}) + public ResponseEntity<Void> setPasswordProperty(@ApiParam(value = "The value to set for the email password.", required = true) @RequestParam(value="password", required=true) final String password) { + HttpStatus status = null; + UserI sessionUser = getSessionUser(); + if (sessionUser == null) { + status = HttpStatus.UNAUTHORIZED; + } + else if ((sessionUser instanceof XDATUser)) { + status = ((XDATUser) sessionUser).isSiteAdmin() ? null : HttpStatus.FORBIDDEN; + } + if (status != null) { + return new ResponseEntity<>(status); + } + + _javaMailSender.setPassword(password); + return new ResponseEntity<>(HttpStatus.OK); + } + + private void setSmtp(){ + Map<String, String> smtp = new HashMap<String, String>(); + String host = _javaMailSender.getHost(); + if(host==null){ + host = ""; + } + smtp.put("host", host); + String port = ""+_javaMailSender.getPort(); + if(port==null){ + port = ""; + } + smtp.put("port", port); + _siteConfigPrefs.setSmtpServer(smtp); + } + + + @Inject + private SiteConfigPreferences _siteConfigPrefs; + + @Inject + private JavaMailSenderImpl _javaMailSender; +} diff --git a/src/main/java/org/nrg/xnat/configuration/NotificationsConfig.java b/src/main/java/org/nrg/xnat/configuration/NotificationsConfig.java index 41275904552c928f7b500ba7c39061862ff1d61f..55a521580cf91cccc82fb41730f1cf0fd41147df 100644 --- a/src/main/java/org/nrg/xnat/configuration/NotificationsConfig.java +++ b/src/main/java/org/nrg/xnat/configuration/NotificationsConfig.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Properties; @Configuration @ComponentScan({"org.nrg.mail.services", "org.nrg.notify.services.impl", "org.nrg.notify.daos"}) @@ -27,10 +28,18 @@ public class NotificationsConfig { public JavaMailSender mailSender() throws IOException, SiteConfigurationException { final Map<String, String> smtp = _preferences.getSmtpServer(); final JavaMailSenderImpl sender = new JavaMailSenderImpl(); - sender.setHost(StringUtils.defaultIfBlank(smtp.get("host"), "localhost")); - sender.setPort(Integer.parseInt(StringUtils.defaultIfBlank(smtp.get("port"), "25"))); - sender.setUsername(StringUtils.defaultIfBlank(smtp.get("username"), "")); - sender.setPassword(StringUtils.defaultIfBlank(smtp.get("password"), "")); + sender.setHost(StringUtils.defaultIfBlank(smtp.remove("host"), "localhost")); + sender.setPort(Integer.parseInt(StringUtils.defaultIfBlank(smtp.remove("port"), "25"))); + sender.setUsername(StringUtils.defaultIfBlank(smtp.remove("username"), "")); + sender.setPassword(StringUtils.defaultIfBlank(smtp.remove("password"), "")); + sender.setProtocol(StringUtils.defaultIfBlank(smtp.remove("protocol"), "smtp")); + if (smtp.size() > 0) { + final Properties properties = new Properties(); + for (final String property : smtp.keySet()) { + properties.setProperty(property, smtp.get(property)); + } + sender.setJavaMailProperties(properties); + } return sender; }