diff --git a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v1/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v1/core/NotificationSenderManagementService.java b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v1/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v1/core/NotificationSenderManagementService.java index b325dfa818..fab8422cc5 100644 --- a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v1/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v1/core/NotificationSenderManagementService.java +++ b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v1/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v1/core/NotificationSenderManagementService.java @@ -33,6 +33,7 @@ import org.wso2.carbon.identity.api.server.notification.sender.v1.model.SMSSender; import org.wso2.carbon.identity.api.server.notification.sender.v1.model.SMSSenderAdd; import org.wso2.carbon.identity.api.server.notification.sender.v1.model.SMSSenderUpdateRequest; +import org.wso2.carbon.identity.notification.sender.tenant.config.NotificationSenderManagementConstants; import org.wso2.carbon.identity.notification.sender.tenant.config.dto.EmailSenderDTO; import org.wso2.carbon.identity.notification.sender.tenant.config.dto.PushSenderDTO; import org.wso2.carbon.identity.notification.sender.tenant.config.dto.SMSSenderDTO; @@ -59,7 +60,7 @@ public class NotificationSenderManagementService { public NotificationSenderManagementService( org.wso2.carbon.identity.notification.sender.tenant.config.NotificationSenderManagementService - notificationSenderManagementService) { + notificationSenderManagementService) { this.notificationSenderManagementService = notificationSenderManagementService; } @@ -126,7 +127,7 @@ public void deleteNotificationSender(String notificationSenderName) { try { notificationSenderManagementService.deleteNotificationSender(notificationSenderName); } catch (NotificationSenderManagementException e) { - throw handleException(e); + throw handleException(e); } } @@ -264,7 +265,7 @@ public SMSSender updateSMSSender(String senderName, SMSSenderUpdateRequest smsSe /** * Update push sender details by name. * - * @param senderName Push sender's name. + * @param senderName Push sender's name. * @param pushSenderUpdateRequest Push sender's updated configurations. * @return Updated push sender. */ @@ -320,6 +321,10 @@ private EmailSender buildEmailSenderFromDTO(EmailSenderDTO dto) { emailSender.setSmtpServerHost(dto.getSmtpServerHost()); List properties = new ArrayList<>(); dto.getProperties().forEach((key, value) -> { + if (NotificationSenderManagementConstants.CLIENT_SECRET.equalsIgnoreCase(key)) { + log.debug("Skipping client secret property from email sender configuration"); + return; + } Properties prop = new Properties(); prop.setKey(key); prop.setValue(value); diff --git a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApi.java b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApi.java index 24b603eabb..c2912644b6 100644 --- a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApi.java +++ b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApi.java @@ -358,6 +358,31 @@ public Response getSMSSenders() { return delegate.getSMSSenders(); } + @Valid + @PATCH + @Path("/email/{sender-name}") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + @ApiOperation(value = "Update an email sender", notes = "This API provides the capability to update an email sender by name. The URL encoded email sender name is used as sender-name.
Permission required:
* /permission/admin/manage/identity/configmgt/update
Scope required:
* internal_config_mgt_update ", response = EmailSender.class, authorizations = { + @Authorization(value = "BasicAuth"), + @Authorization(value = "OAuth2", scopes = { + + }) + }, tags={ "Email Senders", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Successful Response", response = EmailSender.class), + @ApiResponse(code = 400, message = "Bad Request", response = Error.class), + @ApiResponse(code = 401, message = "Unauthorized", response = Void.class), + @ApiResponse(code = 403, message = "Forbidden", response = Void.class), + @ApiResponse(code = 404, message = "Not Found", response = Error.class), + @ApiResponse(code = 405, message = "Method Not Allowed.", response = Error.class), + @ApiResponse(code = 500, message = "Server Error", response = Error.class) + }) + public Response patchEmailSender(@ApiParam(value = "name of the email sender",required=true) @PathParam("sender-name") String senderName, @ApiParam(value = "" ,required=true) @Valid EmailSenderUpdateRequest emailSenderUpdateRequest) { + + return delegate.patchEmailSender(senderName, emailSenderUpdateRequest ); + } + @Valid @PUT @Path("/email/{sender-name}") diff --git a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApiService.java b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApiService.java index 4e786c6342..a878f40556 100644 --- a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApiService.java +++ b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/gen/java/org/wso2/carbon/identity/api/server/notification/sender/v2/NotificationSendersApiService.java @@ -63,6 +63,8 @@ public interface NotificationSendersApiService { public Response getSMSSenders(); + public Response patchEmailSender(String senderName, EmailSenderUpdateRequest emailSenderUpdateRequest); + public Response updateEmailSender(String senderName, EmailSenderUpdateRequest emailSenderUpdateRequest); public Response updatePushSender(String senderName, PushSenderUpdateRequest pushSenderUpdateRequest); diff --git a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/core/NotificationSenderManagementService.java b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/core/NotificationSenderManagementService.java index 2aea5ae5ea..ae115aa778 100644 --- a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/core/NotificationSenderManagementService.java +++ b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/core/NotificationSenderManagementService.java @@ -255,6 +255,24 @@ public EmailSender updateEmailSender(String senderName, EmailSenderUpdateRequest } } + /** + * Patch email sender details by name. + * + * @param senderName Email sender's name. + * @param emailSenderUpdateRequest Email sender's updated configurations. + * @return Updated email sender. + */ + public EmailSender patchEmailSender(String senderName, EmailSenderUpdateRequest emailSenderUpdateRequest) { + + try { + EmailSenderDTO dto = updateEmailSenderDTOFromPatchRequest(senderName, emailSenderUpdateRequest); + EmailSenderDTO emailSenderDTO = notificationSenderManagementService.updateEmailSender(dto); + return buildEmailSenderFromDTO(emailSenderDTO); + } catch (NotificationSenderManagementException e) { + throw handleException(e); + } + } + /** * Update sms sender details by name. * @@ -333,6 +351,43 @@ private EmailSenderDTO buildEmailSenderDTO(String senderName, EmailSenderUpdateR return dto; } + private EmailSenderDTO updateEmailSenderDTOFromPatchRequest(String senderName, + EmailSenderUpdateRequest emailSenderUpdateRequest) { + + EmailSenderDTO existingEmailSenderDTO; + try { + existingEmailSenderDTO = notificationSenderManagementService.getEmailSender(senderName); + } catch (NotificationSenderManagementException e) { + throw handleException(e); + } + existingEmailSenderDTO.setName(senderName); + if (emailSenderUpdateRequest == null) { + return existingEmailSenderDTO; + } + existingEmailSenderDTO.setFromAddress(emailSenderUpdateRequest.getFromAddress() != null ? + emailSenderUpdateRequest.getFromAddress() : existingEmailSenderDTO.getFromAddress()); + existingEmailSenderDTO.setSmtpPort(emailSenderUpdateRequest.getSmtpPort() != null ? + emailSenderUpdateRequest.getSmtpPort() : existingEmailSenderDTO.getSmtpPort()); + existingEmailSenderDTO.setSmtpServerHost(emailSenderUpdateRequest.getSmtpServerHost() != null ? + emailSenderUpdateRequest.getSmtpServerHost() : existingEmailSenderDTO.getSmtpServerHost()); + existingEmailSenderDTO.setAuthType(emailSenderUpdateRequest.getAuthType() != null ? + emailSenderUpdateRequest.getAuthType() : existingEmailSenderDTO.getAuthType()); + if (emailSenderUpdateRequest.getProperties() != null && !emailSenderUpdateRequest.getProperties().isEmpty()) { + emailSenderUpdateRequest.getProperties().forEach((prop) -> { + if (StringUtils.isNotBlank(prop.getKey()) && StringUtils.isNotBlank(prop.getValue())) { + existingEmailSenderDTO.getProperties().put(prop.getKey(), prop.getValue()); + } + }); + } + if (BASIC.equalsIgnoreCase(existingEmailSenderDTO.getAuthType())) { + existingEmailSenderDTO.getProperties().put(USERNAME, existingEmailSenderDTO.getUsername()); + existingEmailSenderDTO.getProperties().put(PASSWORD, existingEmailSenderDTO.getPassword()); + existingEmailSenderDTO.setUsername(null); + existingEmailSenderDTO.setPassword(null); + } + return existingEmailSenderDTO; + } + private EmailSender buildEmailSenderFromDTO(EmailSenderDTO dto) { EmailSender emailSender = new EmailSender(); diff --git a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/impl/NotificationSendersApiServiceImpl.java b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/impl/NotificationSendersApiServiceImpl.java index 6be40dc1e8..9e89218a68 100644 --- a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/impl/NotificationSendersApiServiceImpl.java +++ b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/java/org/wso2/carbon/identity/api/server/notification/sender/v2/impl/NotificationSendersApiServiceImpl.java @@ -192,6 +192,17 @@ public Response getSMSSenders() { return Response.ok().entity(notificationSenderManagementService.getSMSSenders()).build(); } + @Override + public Response patchEmailSender(String senderName, EmailSenderUpdateRequest emailSenderUpdateRequest) { + + if (StringUtils.equals(getTenantDomainFromContext(), MultitenantConstants.SUPER_TENANT_DOMAIN_NAME)) { + return Response.status(Response.Status.METHOD_NOT_ALLOWED).build(); + } + return Response.ok() + .entity(notificationSenderManagementService.patchEmailSender(senderName, emailSenderUpdateRequest)) + .build(); + } + @Override public Response updateEmailSender(String senderName, EmailSenderUpdateRequest emailSenderUpdateRequest) { diff --git a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/resources/notification-sender.yaml b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/resources/notification-sender.yaml index 52c08948a8..f7c0e2d3e4 100644 --- a/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/resources/notification-sender.yaml +++ b/components/org.wso2.carbon.identity.api.server.notification.sender/org.wso2.carbon.identity.api.server.notification.sender.v2/src/main/resources/notification-sender.yaml @@ -259,6 +259,73 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' + patch: + tags: + - Email Senders + summary: Update an email sender + description: | + This API provides the capability to update an email sender by name. + The URL encoded email sender name is used as sender-name.
+ Permission required:
+ * /permission/admin/manage/identity/configmgt/update
+ Scope required:
+ * internal_config_mgt_update + operationId: patchEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSenderUpdateRequest' + example: + fromAddress: iam@gmail.com + properties: + - key: mail.smtp.starttls.enable + value: true + required: true + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' delete: tags: - Email Senders