From e53fbccfe10a3953ddfdaa8caf94f5671adace61 Mon Sep 17 00:00:00 2001 From: Ashan Thamara Palihakkara <75057725+ashanthamara@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:04:36 +0530 Subject: [PATCH 1/3] Integrate secret-management to action-management component --- .../action/management/v1/ActionResponse.java | 10 +- .../management/v1/ActionUpdateModel.java | 140 ++++++++++++ .../action/management/v1/ActionsApi.java | 71 +++++-- .../management/v1/ActionsApiService.java | 8 +- .../management/v1/AuthenticationType.java | 2 +- .../v1/AuthenticationTypeProperties.java | 111 ++++++++++ .../v1/AuthenticationTypeResponse.java | 133 ++++++++++++ .../management/v1/EndpointResponse.java | 124 +++++++++++ .../constants/ActionMgtEndpointConstants.java | 5 +- .../core/ServerActionManagementService.java | 107 ++++++++-- .../v1/impl/ActionsApiServiceImpl.java | 14 +- .../v1/util/ActionMgtEndpointUtil.java | 33 --- .../src/main/resources/Actions.yaml | 199 ++++++++++++++---- 13 files changed, 841 insertions(+), 116 deletions(-) create mode 100644 components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionUpdateModel.java create mode 100644 components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeProperties.java create mode 100644 components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeResponse.java create mode 100644 components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/EndpointResponse.java diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionResponse.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionResponse.java index b29729d834..0cb5a5cc11 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionResponse.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionResponse.java @@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import org.wso2.carbon.identity.api.server.action.management.v1.Endpoint; +import org.wso2.carbon.identity.api.server.action.management.v1.EndpointResponse; import javax.validation.constraints.*; @@ -104,7 +104,7 @@ public static StatusEnum fromValue(String value) { } private StatusEnum status; - private Endpoint endpoint; + private EndpointResponse endpoint; /** **/ @@ -198,7 +198,7 @@ public void setStatus(StatusEnum status) { /** **/ - public ActionResponse endpoint(Endpoint endpoint) { + public ActionResponse endpoint(EndpointResponse endpoint) { this.endpoint = endpoint; return this; @@ -207,10 +207,10 @@ public ActionResponse endpoint(Endpoint endpoint) { @ApiModelProperty(value = "") @JsonProperty("endpoint") @Valid - public Endpoint getEndpoint() { + public EndpointResponse getEndpoint() { return endpoint; } - public void setEndpoint(Endpoint endpoint) { + public void setEndpoint(EndpointResponse endpoint) { this.endpoint = endpoint; } diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionUpdateModel.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionUpdateModel.java new file mode 100644 index 0000000000..4869c18244 --- /dev/null +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionUpdateModel.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you 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.wso2.carbon.identity.api.server.action.management.v1; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; + + +import io.swagger.annotations.*; +import java.util.Objects; +import javax.validation.Valid; +import javax.xml.bind.annotation.*; + +public class ActionUpdateModel { + + private String name; + private String description; + private String endpointUri; + + /** + **/ + public ActionUpdateModel name(String name) { + + this.name = name; + return this; + } + + @ApiModelProperty(example = "Access Token Pre Issue", value = "") + @JsonProperty("name") + @Valid + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + /** + **/ + public ActionUpdateModel description(String description) { + + this.description = description; + return this; + } + + @ApiModelProperty(example = "This is the configuration of pre-action for issuing access token.", value = "") + @JsonProperty("description") + @Valid + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + + /** + **/ + public ActionUpdateModel endpointUri(String endpointUri) { + + this.endpointUri = endpointUri; + return this; + } + + @ApiModelProperty(example = "https://abcd.com/token", value = "") + @JsonProperty("endpointUri") + @Valid + public String getEndpointUri() { + return endpointUri; + } + public void setEndpointUri(String endpointUri) { + this.endpointUri = endpointUri; + } + + + + @Override + public boolean equals(java.lang.Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ActionUpdateModel actionUpdateModel = (ActionUpdateModel) o; + return Objects.equals(this.name, actionUpdateModel.name) && + Objects.equals(this.description, actionUpdateModel.description) && + Objects.equals(this.endpointUri, actionUpdateModel.endpointUri); + } + + @Override + public int hashCode() { + return Objects.hash(name, description, endpointUri); + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("class ActionUpdateModel {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" description: ").append(toIndentedString(description)).append("\n"); + sb.append(" endpointUri: ").append(toIndentedString(endpointUri)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n"); + } +} + diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApi.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApi.java index 5f7ade7dc4..0e9433dab0 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApi.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApi.java @@ -28,6 +28,8 @@ import org.wso2.carbon.identity.api.server.action.management.v1.ActionModel; import org.wso2.carbon.identity.api.server.action.management.v1.ActionResponse; import org.wso2.carbon.identity.api.server.action.management.v1.ActionTypesResponseItem; +import org.wso2.carbon.identity.api.server.action.management.v1.ActionUpdateModel; +import org.wso2.carbon.identity.api.server.action.management.v1.AuthenticationTypeProperties; import org.wso2.carbon.identity.api.server.action.management.v1.Error; import org.wso2.carbon.identity.api.server.action.management.v1.ActionsApiService; @@ -51,7 +53,7 @@ public class ActionsApi { @Path("/{actionType}/{actionId}/activate") @Produces({ "application/json" }) - @ApiOperation(value = "Activates the action by given Id. ", notes = "This API provides the capability to activate an action by action Id.
Permission required:
* /permission/admin/manage/identity/actionmgt/update
Scope required:
* internal_action_mgt_update ", response = ActionBasicResponse.class, authorizations = { + @ApiOperation(value = "Activates the action by given Id. ", notes = "This API provides the capability to activate an action by action Id.
Scope required:
* internal_action_mgt_update ", response = ActionBasicResponse.class, authorizations = { @Authorization(value = "BasicAuth"), @Authorization(value = "OAuth2", scopes = { @@ -65,7 +67,7 @@ public class ActionsApi { @ApiResponse(code = 404, message = "Not Found", response = Error.class), @ApiResponse(code = 500, message = "Server Error", response = Error.class) }) - public Response activateAction(@ApiParam(value = "Name of the Action Type.",required=true) @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId) { + public Response activateAction(@ApiParam(value = "Name of the Action Type.",required=true, allowableValues="PreIssueAccessToken, PreUpdatePassword, PreUpdateProfile, PreRegistration") @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId) { return delegate.activateAction(actionType, actionId ); } @@ -75,7 +77,7 @@ public Response activateAction(@ApiParam(value = "Name of the Action Type.",requ @Path("/{actionType}") @Consumes({ "application/json" }) @Produces({ "application/json" }) - @ApiOperation(value = "Add action ", notes = "This API provides the capability to store the action information that is provided by users.
Permission required:
* /permission/admin/manage/identity/actionmgt/create
Scope required:
* internal_action_mgt_create ", response = ActionResponse.class, authorizations = { + @ApiOperation(value = "Add action ", notes = "This API provides the capability to store the action information that is provided by users.
Scope required:
* internal_action_mgt_create ", response = ActionResponse.class, authorizations = { @Authorization(value = "BasicAuth"), @Authorization(value = "OAuth2", scopes = { @@ -90,7 +92,7 @@ public Response activateAction(@ApiParam(value = "Name of the Action Type.",requ @ApiResponse(code = 500, message = "Server Error", response = Error.class), @ApiResponse(code = 501, message = "Not Implemented", response = Error.class) }) - public Response createAction(@ApiParam(value = "Name of the Action Type.",required=true) @PathParam("actionType") String actionType, @ApiParam(value = "This represents the action to be created." ,required=true) @Valid ActionModel actionModel) { + public Response createAction(@ApiParam(value = "Name of the Action Type.",required=true, allowableValues="PreIssueAccessToken, PreUpdatePassword, PreUpdateProfile, PreRegistration") @PathParam("actionType") String actionType, @ApiParam(value = "This represents the action to be created." ,required=true) @Valid ActionModel actionModel) { return delegate.createAction(actionType, actionModel ); } @@ -100,7 +102,7 @@ public Response createAction(@ApiParam(value = "Name of the Action Type.",requir @Path("/{actionType}/{actionId}/deactivate") @Produces({ "application/json" }) - @ApiOperation(value = "Deactivates the action by given Id. ", notes = "This API provides the capability to deactivate an action by action Id.
Permission required:
* /permission/admin/manage/identity/actionmgt/update
Scope required:
* internal_action_mgt_update ", response = ActionBasicResponse.class, authorizations = { + @ApiOperation(value = "Deactivates the action by given Id. ", notes = "This API provides the capability to deactivate an action by action Id.
Scope required:
* internal_action_mgt_update ", response = ActionBasicResponse.class, authorizations = { @Authorization(value = "BasicAuth"), @Authorization(value = "OAuth2", scopes = { @@ -114,7 +116,7 @@ public Response createAction(@ApiParam(value = "Name of the Action Type.",requir @ApiResponse(code = 404, message = "Not Found", response = Error.class), @ApiResponse(code = 500, message = "Server Error", response = Error.class) }) - public Response deactivateAction(@ApiParam(value = "Name of the Action Type.",required=true) @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId) { + public Response deactivateAction(@ApiParam(value = "Name of the Action Type.",required=true, allowableValues="PreIssueAccessToken, PreUpdatePassword, PreUpdateProfile, PreRegistration") @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId) { return delegate.deactivateAction(actionType, actionId ); } @@ -124,7 +126,7 @@ public Response deactivateAction(@ApiParam(value = "Name of the Action Type.",re @Path("/{actionType}/{actionId}") @Produces({ "application/json" }) - @ApiOperation(value = "Delete action by action type and action id. ", notes = "This API provides the capability to delete an action by action type.
Permission required:
* /permission/admin/manage/identity/actionmgt/delete
Scope required:
* internal_action_mgt_delete ", response = Void.class, authorizations = { + @ApiOperation(value = "Delete action by action type and action id. ", notes = "This API provides the capability to delete an action by action type.
Scope required:
* internal_action_mgt_delete ", response = Void.class, authorizations = { @Authorization(value = "BasicAuth"), @Authorization(value = "OAuth2", scopes = { @@ -138,24 +140,24 @@ public Response deactivateAction(@ApiParam(value = "Name of the Action Type.",re @ApiResponse(code = 404, message = "Not Found", response = Error.class), @ApiResponse(code = 500, message = "Server Error", response = Error.class) }) - public Response deleteAction(@ApiParam(value = "Name of the Action Type.",required=true) @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId) { + public Response deleteAction(@ApiParam(value = "Name of the Action Type.",required=true, allowableValues="PreIssueAccessToken, PreUpdatePassword, PreUpdateProfile, PreRegistration") @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId) { return delegate.deleteAction(actionType, actionId ); } @Valid @GET - @Path("/{actionType}") + @Path("/types") @Produces({ "application/json" }) - @ApiOperation(value = "List action ", notes = "This API provides the capability to retrieve the action by action type.
Permission required:
* /permission/admin/manage/identity/actionmgt/view
Scope required:
* internal_action_mgt_view ", response = ActionResponse.class, responseContainer = "List", authorizations = { + @ApiOperation(value = "Detailed summary of the Action Types ", notes = "This API provides the capability to retrieve the detailed summary of the action types.
Scope required:
* internal_action_mgt_view ", response = ActionTypesResponseItem.class, responseContainer = "List", authorizations = { @Authorization(value = "BasicAuth"), @Authorization(value = "OAuth2", scopes = { }) }, tags={ "Actions", }) @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK", response = ActionResponse.class, responseContainer = "List"), + @ApiResponse(code = 200, message = "OK", response = ActionTypesResponseItem.class, responseContainer = "List"), @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), @@ -163,24 +165,24 @@ public Response deleteAction(@ApiParam(value = "Name of the Action Type.",requir @ApiResponse(code = 500, message = "Server Error", response = Error.class), @ApiResponse(code = 501, message = "Not Implemented", response = Error.class) }) - public Response getActionsByActionType(@ApiParam(value = "Name of the Action Type.",required=true) @PathParam("actionType") String actionType) { + public Response getActionTypes() { - return delegate.getActionsByActionType(actionType ); + return delegate.getActionTypes(); } @Valid @GET - @Path("/types") + @Path("/{actionType}") @Produces({ "application/json" }) - @ApiOperation(value = "Detailed summary of the Action Types ", notes = "This API provides the capability to retrieve the detailed summary of the action types.
Permission required:
* /permission/admin/manage/identity/actionmgt/view
Scope required:
* internal_action_mgt_view ", response = ActionTypesResponseItem.class, responseContainer = "List", authorizations = { + @ApiOperation(value = "List action ", notes = "This API provides the capability to retrieve the action by action type.
Scope required:
* internal_action_mgt_view ", response = ActionResponse.class, responseContainer = "List", authorizations = { @Authorization(value = "BasicAuth"), @Authorization(value = "OAuth2", scopes = { }) }, tags={ "Actions", }) @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK", response = ActionTypesResponseItem.class, responseContainer = "List"), + @ApiResponse(code = 200, message = "OK", response = ActionResponse.class, responseContainer = "List"), @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), @@ -188,17 +190,41 @@ public Response getActionsByActionType(@ApiParam(value = "Name of the Action Typ @ApiResponse(code = 500, message = "Server Error", response = Error.class), @ApiResponse(code = 501, message = "Not Implemented", response = Error.class) }) - public Response getActionTypes() { + public Response getActionsByActionType(@ApiParam(value = "Name of the Action Type.",required=true, allowableValues="PreIssueAccessToken, PreUpdatePassword, PreUpdateProfile, PreRegistration") @PathParam("actionType") String actionType) { - return delegate.getActionTypes(); + return delegate.getActionsByActionType(actionType ); } @Valid - @PUT + @PATCH @Path("/{actionType}/{actionId}") @Consumes({ "application/json" }) @Produces({ "application/json" }) - @ApiOperation(value = "Update action by action type and action id. ", notes = "This API provides the capability to update an action by action type.
Permission required:
* /permission/admin/manage/identity/actionmgt/update
Scope required:
* internal_action_mgt_update ", response = ActionResponse.class, authorizations = { + @ApiOperation(value = "Update Action information by given Id. ", notes = "This API provides the capability to update Action information by given Id.
Scope required:
* internal_action_mgt_update ", response = ActionResponse.class, authorizations = { + @Authorization(value = "BasicAuth"), + @Authorization(value = "OAuth2", scopes = { + + }) + }, tags={ "Actions", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK", response = ActionResponse.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 = 500, message = "Server Error", response = Error.class) + }) + public Response updateAction(@ApiParam(value = "Name of the Action Type.",required=true, allowableValues="PreIssueAccessToken, PreUpdatePassword, PreUpdateProfile, PreRegistration") @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId, @ApiParam(value = "This represents the action information to be updated." ,required=true) @Valid ActionUpdateModel actionUpdateModel) { + + return delegate.updateAction(actionType, actionId, actionUpdateModel ); + } + + @Valid + @PUT + @Path("/{actionType}/{actionId}/{authType}") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + @ApiOperation(value = "Update Action endpoint authentication information by given Id. ", notes = "This API provides the capability to update Action endpoint authentication information by given Id.
Scope required:
* internal_action_mgt_update ", response = ActionResponse.class, authorizations = { @Authorization(value = "BasicAuth"), @Authorization(value = "OAuth2", scopes = { @@ -210,12 +236,11 @@ public Response getActionTypes() { @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 = 409, message = "Conflict", response = Error.class), @ApiResponse(code = 500, message = "Server Error", response = Error.class) }) - public Response updateAction(@ApiParam(value = "Name of the Action Type.",required=true) @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId, @ApiParam(value = "This represents the action to be updated." ,required=true) @Valid ActionModel actionModel) { + public Response updateActionEndpointAuthentication(@ApiParam(value = "Name of the Action Type.",required=true, allowableValues="PreIssueAccessToken, PreUpdatePassword, PreUpdateProfile, PreRegistration") @PathParam("actionType") String actionType, @ApiParam(value = "Id of the Action.",required=true) @PathParam("actionId") String actionId, @ApiParam(value = "Authentication Type of the Action Endpoint.",required=true, allowableValues="none, basic, apiKey, bearer") @PathParam("authType") String authType, @ApiParam(value = "This represents the action endpoint authentication to be updated." ,required=true) @Valid AuthenticationTypeProperties authenticationTypeProperties) { - return delegate.updateAction(actionType, actionId, actionModel ); + return delegate.updateActionEndpointAuthentication(actionType, actionId, authType, authenticationTypeProperties ); } } diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApiService.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApiService.java index 9494ee1333..3d0d3941e5 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApiService.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/ActionsApiService.java @@ -28,6 +28,8 @@ import org.wso2.carbon.identity.api.server.action.management.v1.ActionModel; import org.wso2.carbon.identity.api.server.action.management.v1.ActionResponse; import org.wso2.carbon.identity.api.server.action.management.v1.ActionTypesResponseItem; +import org.wso2.carbon.identity.api.server.action.management.v1.ActionUpdateModel; +import org.wso2.carbon.identity.api.server.action.management.v1.AuthenticationTypeProperties; import org.wso2.carbon.identity.api.server.action.management.v1.Error; import javax.ws.rs.core.Response; @@ -42,9 +44,11 @@ public interface ActionsApiService { public Response deleteAction(String actionType, String actionId); + public Response getActionTypes(); + public Response getActionsByActionType(String actionType); - public Response getActionTypes(); + public Response updateAction(String actionType, String actionId, ActionUpdateModel actionUpdateModel); - public Response updateAction(String actionType, String actionId, ActionModel actionModel); + public Response updateActionEndpointAuthentication(String actionType, String actionId, String authType, AuthenticationTypeProperties authenticationTypeProperties); } diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationType.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationType.java index a9dd1ae24f..621104d224 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationType.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationType.java @@ -100,7 +100,7 @@ public AuthenticationType properties(Map properties) { return this; } - @ApiModelProperty(example = "{\"username\":\"auth_username\",\"password\":\"auth_username\"}", value = "") + @ApiModelProperty(example = "{\"username\":\"auth_username\",\"password\":\"auth_password\"}", value = "") @JsonProperty("properties") @Valid public Map getProperties() { diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeProperties.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeProperties.java new file mode 100644 index 0000000000..1d5f34bb2d --- /dev/null +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeProperties.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you 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.wso2.carbon.identity.api.server.action.management.v1; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.validation.constraints.*; + + +import io.swagger.annotations.*; +import java.util.Objects; +import javax.validation.Valid; +import javax.xml.bind.annotation.*; + +public class AuthenticationTypeProperties { + + private Map properties = null; + + + /** + **/ + public AuthenticationTypeProperties properties(Map properties) { + + this.properties = properties; + return this; + } + + @ApiModelProperty(example = "{\"username\":\"auth_username\",\"password\":\"auth_username\"}", value = "") + @JsonProperty("properties") + @Valid + public Map getProperties() { + return properties; + } + public void setProperties(Map properties) { + this.properties = properties; + } + + + public AuthenticationTypeProperties putPropertiesItem(String key, Object propertiesItem) { + if (this.properties == null) { + this.properties = new HashMap(); + } + this.properties.put(key, propertiesItem); + return this; + } + + + + @Override + public boolean equals(java.lang.Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AuthenticationTypeProperties authenticationTypeProperties = (AuthenticationTypeProperties) o; + return Objects.equals(this.properties, authenticationTypeProperties.properties); + } + + @Override + public int hashCode() { + return Objects.hash(properties); + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("class AuthenticationTypeProperties {\n"); + + sb.append(" properties: ").append(toIndentedString(properties)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n"); + } +} + diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeResponse.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeResponse.java new file mode 100644 index 0000000000..91056333bc --- /dev/null +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/AuthenticationTypeResponse.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you 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.wso2.carbon.identity.api.server.action.management.v1; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; + + +import io.swagger.annotations.*; +import java.util.Objects; +import javax.validation.Valid; +import javax.xml.bind.annotation.*; + +public class AuthenticationTypeResponse { + + +@XmlType(name="TypeEnum") +@XmlEnum(String.class) +public enum TypeEnum { + + @XmlEnumValue("NONE") NONE(String.valueOf("NONE")), @XmlEnumValue("BEARER") BEARER(String.valueOf("BEARER")), @XmlEnumValue("API_KEY") API_KEY(String.valueOf("API_KEY")), @XmlEnumValue("BASIC") BASIC(String.valueOf("BASIC")); + + + private String value; + + TypeEnum(String v) { + value = v; + } + + public String value() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + public static TypeEnum fromValue(String value) { + for (TypeEnum b : TypeEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } +} + + private TypeEnum type; + + /** + **/ + public AuthenticationTypeResponse type(TypeEnum type) { + + this.type = type; + return this; + } + + @ApiModelProperty(example = "BASIC", required = true, value = "") + @JsonProperty("type") + @Valid + @NotNull(message = "Property type cannot be null.") + + public TypeEnum getType() { + return type; + } + public void setType(TypeEnum type) { + this.type = type; + } + + + + @Override + public boolean equals(java.lang.Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AuthenticationTypeResponse authenticationTypeResponse = (AuthenticationTypeResponse) o; + return Objects.equals(this.type, authenticationTypeResponse.type); + } + + @Override + public int hashCode() { + return Objects.hash(type); + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("class AuthenticationTypeResponse {\n"); + + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n"); + } +} + diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/EndpointResponse.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/EndpointResponse.java new file mode 100644 index 0000000000..4ff56cf3f0 --- /dev/null +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/gen/java/org/wso2/carbon/identity/api/server/action/management/v1/EndpointResponse.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you 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.wso2.carbon.identity.api.server.action.management.v1; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.wso2.carbon.identity.api.server.action.management.v1.AuthenticationTypeResponse; +import javax.validation.constraints.*; + + +import io.swagger.annotations.*; +import java.util.Objects; +import javax.validation.Valid; +import javax.xml.bind.annotation.*; + +public class EndpointResponse { + + private String uri; + private AuthenticationTypeResponse authentication; + + /** + **/ + public EndpointResponse uri(String uri) { + + this.uri = uri; + return this; + } + + @ApiModelProperty(example = "https://abc.com/token", required = true, value = "") + @JsonProperty("uri") + @Valid + @NotNull(message = "Property uri cannot be null.") + + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + + /** + **/ + public EndpointResponse authentication(AuthenticationTypeResponse authentication) { + + this.authentication = authentication; + return this; + } + + @ApiModelProperty(required = true, value = "") + @JsonProperty("authentication") + @Valid + @NotNull(message = "Property authentication cannot be null.") + + public AuthenticationTypeResponse getAuthentication() { + return authentication; + } + public void setAuthentication(AuthenticationTypeResponse authentication) { + this.authentication = authentication; + } + + + + @Override + public boolean equals(java.lang.Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EndpointResponse endpointResponse = (EndpointResponse) o; + return Objects.equals(this.uri, endpointResponse.uri) && + Objects.equals(this.authentication, endpointResponse.authentication); + } + + @Override + public int hashCode() { + return Objects.hash(uri, authentication); + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("class EndpointResponse {\n"); + + sb.append(" uri: ").append(toIndentedString(uri)).append("\n"); + sb.append(" authentication: ").append(toIndentedString(authentication)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n"); + } +} + diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java index 72cbff0436..7cb4b8d585 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java @@ -38,7 +38,10 @@ public enum ErrorMessage { // Client errors. ERROR_INVALID_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES("60001", "Unable to perform the operation.", - "Required authentication properties are not provided or invalid."); + "Required authentication properties are not provided or invalid."), + ERROR_INVALID_ACTION_ENDPOINT_AUTH_TYPE("60002", + "Invalid Authentication Type for Action Endpoint.", + "Invalid authentication type used for path parameter."); private final String code; private final String message; diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java index 892f914476..6189c4b2a5 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java @@ -23,6 +23,7 @@ import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.identity.action.management.exception.ActionMgtException; import org.wso2.carbon.identity.action.management.model.Action; +import org.wso2.carbon.identity.action.management.model.AuthProperty; import org.wso2.carbon.identity.action.management.model.AuthType; import org.wso2.carbon.identity.action.management.model.EndpointConfig; import org.wso2.carbon.identity.api.server.action.management.common.ActionManagementServiceHolder; @@ -30,14 +31,22 @@ import org.wso2.carbon.identity.api.server.action.management.v1.ActionModel; import org.wso2.carbon.identity.api.server.action.management.v1.ActionResponse; import org.wso2.carbon.identity.api.server.action.management.v1.ActionTypesResponseItem; -import org.wso2.carbon.identity.api.server.action.management.v1.AuthenticationType; -import org.wso2.carbon.identity.api.server.action.management.v1.Endpoint; +import org.wso2.carbon.identity.api.server.action.management.v1.ActionUpdateModel; +import org.wso2.carbon.identity.api.server.action.management.v1.AuthenticationTypeProperties; +import org.wso2.carbon.identity.api.server.action.management.v1.AuthenticationTypeResponse; +import org.wso2.carbon.identity.api.server.action.management.v1.EndpointResponse; import org.wso2.carbon.identity.api.server.action.management.v1.util.ActionMgtEndpointUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; +import javax.ws.rs.core.Response; + +import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.ErrorMessage.ERROR_INVALID_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES; +import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.ErrorMessage.ERROR_INVALID_ACTION_ENDPOINT_AUTH_TYPE; + /** * Server Action Management Service. */ @@ -73,11 +82,19 @@ public List getActionsByActionType(String actionType) { } } - public ActionResponse updateAction(String actionType, String actionId, ActionModel actionModel) { + public ActionResponse updateAction(String actionType, String actionId, ActionUpdateModel actionUpdateModel) { try { + Action updatingAction = new Action.ActionRequestBuilder() + .name(actionUpdateModel.getName()) + .description(actionUpdateModel.getDescription()) + .endpoint(new EndpointConfig.EndpointConfigBuilder() + .uri(actionUpdateModel.getEndpointUri()) + .build()) + .build(); + return buildActionResponse(ActionManagementServiceHolder.getActionManagementService() - .updateAction(actionType, actionId, buildAction(actionModel), + .updateAction(actionType, actionId, updatingAction, CarbonContext.getThreadLocalCarbonContext().getTenantDomain())); } catch (ActionMgtException e) { throw ActionMgtEndpointUtil.handleActionMgtException(e); @@ -86,7 +103,6 @@ public ActionResponse updateAction(String actionType, String actionId, ActionMod public void deleteAction(String actionType, String actionId) { - try { ActionManagementServiceHolder.getActionManagementService().deleteAction(actionType, actionId, CarbonContext.getThreadLocalCarbonContext().getTenantDomain()); @@ -143,6 +159,24 @@ public List getActionTypes() { } } + public ActionResponse updateActionEndpointAuthentication(String actionType, String actionId, String authType, + AuthenticationTypeProperties authenticationTypeProperties) { + + try { + String resolvedAuthType = getAuthTypeFromPath(authType); + AuthType authentication = new AuthType.AuthTypeBuilder() + .type(AuthType.AuthenticationType.valueOf(resolvedAuthType)) + .properties(getActionEndpointAuthProperties(resolvedAuthType, + authenticationTypeProperties.getProperties())) + .build(); + return buildActionResponse(ActionManagementServiceHolder.getActionManagementService() + .updateActionEndpointAuthentication(actionType, actionId, authentication, + CarbonContext.getThreadLocalCarbonContext().getTenantDomain())); + } catch (ActionMgtException e) { + throw ActionMgtEndpointUtil.handleActionMgtException(e); + } + } + /** * Build ActionResponse from Action. * @@ -157,12 +191,11 @@ private ActionResponse buildActionResponse(Action action) { .name(action.getName()) .description(action.getDescription()) .status(ActionResponse.StatusEnum.valueOf(action.getStatus().toString())) - .endpoint(new Endpoint() + .endpoint(new EndpointResponse() .uri(action.getEndpoint().getUri()) - .authentication(new AuthenticationType() - .type(AuthenticationType.TypeEnum.valueOf(action.getEndpoint() - .getAuthentication().getType().toString())) - .properties(action.getEndpoint().getAuthentication().getProperties()))); + .authentication(new AuthenticationTypeResponse() + .type(AuthenticationTypeResponse.TypeEnum.valueOf(action.getEndpoint() + .getAuthentication().getType().toString())))); } /** @@ -184,12 +217,11 @@ private ActionBasicResponse buildActionBasicResponse(Action activatedAction) { /** * Create Action from the Action model. * - * @param actionModel API model. + * @param actionModel Action model. * @return Action. */ private Action buildAction(ActionModel actionModel) { - ActionMgtEndpointUtil.validateActionEndpointAuthProperties(actionModel); Action.ActionRequestBuilder actionRequestBuilder = new Action.ActionRequestBuilder() .name(actionModel.getName()) .description(actionModel.getDescription()) @@ -198,10 +230,59 @@ private Action buildAction(ActionModel actionModel) { .authentication(new AuthType.AuthTypeBuilder() .type(AuthType.AuthenticationType.valueOf(actionModel.getEndpoint().getAuthentication() .getType().toString())) - .properties(actionModel.getEndpoint().getAuthentication().getProperties()) + .properties(getActionEndpointAuthProperties( + actionModel.getEndpoint().getAuthentication().getType().name(), + actionModel.getEndpoint().getAuthentication().getProperties())) .build()) .build()); return actionRequestBuilder.build(); } + + /** + * Build Action Endpoint Authentication properties. + * + * @param authType Authentication Type. + * @param authPropertiesMap Authentication properties. + * @return List of AuthProperty. + */ + private List getActionEndpointAuthProperties(String authType, Map authPropertiesMap) { + + List authProperties = new ArrayList<>(); + for (AuthType.AuthenticationType type: AuthType.AuthenticationType.values()) { + if (type.getType().equals(authType)) { + for (AuthProperty property: type.getProperties()) { + if (authPropertiesMap == null || !authPropertiesMap.containsKey(property.getName())) { + throw ActionMgtEndpointUtil.handleException(Response.Status.BAD_REQUEST, + ERROR_INVALID_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES); + } + property.setValue(authPropertiesMap.get(property.getName()).toString()); + authProperties.add(property); + } + if (authPropertiesMap.size() > type.getProperties().size()) { + if (LOG.isDebugEnabled()) { + LOG.debug("Removing the given unnecessary properties from the Action Endpoint " + + "authentication properties of Authentication Type: " + authType); + } + } + } + } + return authProperties; + } + + /** + * Get AuthType from path. + * + * @param authType Authentication Type. + * @return Auth Type resolved from the path param. + */ + private String getAuthTypeFromPath(String authType) { + + return Arrays.stream(AuthType.AuthenticationType.values()) + .filter(type -> type.getPathParam().equals(authType)) + .map(AuthType.AuthenticationType::getType) + .findFirst() + .orElseThrow(() -> ActionMgtEndpointUtil.handleException(Response.Status.BAD_REQUEST, + ERROR_INVALID_ACTION_ENDPOINT_AUTH_TYPE)); + } } diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/impl/ActionsApiServiceImpl.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/impl/ActionsApiServiceImpl.java index 64f4f66c4e..682fa283ac 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/impl/ActionsApiServiceImpl.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/impl/ActionsApiServiceImpl.java @@ -21,7 +21,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.wso2.carbon.identity.api.server.action.management.v1.ActionModel; import org.wso2.carbon.identity.api.server.action.management.v1.ActionResponse; +import org.wso2.carbon.identity.api.server.action.management.v1.ActionUpdateModel; import org.wso2.carbon.identity.api.server.action.management.v1.ActionsApiService; +import org.wso2.carbon.identity.api.server.action.management.v1.AuthenticationTypeProperties; import org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants; import org.wso2.carbon.identity.api.server.action.management.v1.core.ServerActionManagementService; import org.wso2.carbon.identity.api.server.common.ContextLoader; @@ -56,9 +58,9 @@ public Response getActionsByActionType(String actionType) { } @Override - public Response updateAction(String actionType, String actionId, ActionModel actionModel) { + public Response updateAction(String actionType, String actionId, ActionUpdateModel actionUpdateModel) { - return Response.ok().entity(serverActionManagementService.updateAction(actionType, actionId, actionModel)) + return Response.ok().entity(serverActionManagementService.updateAction(actionType, actionId, actionUpdateModel)) .build(); } @@ -86,4 +88,12 @@ public Response getActionTypes() { return Response.ok().entity(serverActionManagementService.getActionTypes()).build(); } + + @Override + public Response updateActionEndpointAuthentication(String actionType, String actionId, String authType, + AuthenticationTypeProperties authenticationTypeProperties) { + + return Response.ok().entity(serverActionManagementService.updateActionEndpointAuthentication(actionType, + actionId, authType, authenticationTypeProperties)).build(); + } } diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/util/ActionMgtEndpointUtil.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/util/ActionMgtEndpointUtil.java index 7e4d49aea5..e1cc382a4d 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/util/ActionMgtEndpointUtil.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/util/ActionMgtEndpointUtil.java @@ -23,22 +23,16 @@ import org.wso2.carbon.identity.action.management.exception.ActionMgtClientException; import org.wso2.carbon.identity.action.management.exception.ActionMgtException; import org.wso2.carbon.identity.action.management.model.Action; -import org.wso2.carbon.identity.action.management.model.AuthType; -import org.wso2.carbon.identity.api.server.action.management.v1.ActionModel; import org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants; import org.wso2.carbon.identity.api.server.common.Constants; import org.wso2.carbon.identity.api.server.common.ContextLoader; import org.wso2.carbon.identity.api.server.common.error.APIError; import org.wso2.carbon.identity.api.server.common.error.ErrorDTO; -import java.util.HashMap; -import java.util.Map; - import javax.ws.rs.core.Response; import static org.wso2.carbon.identity.action.management.constant.ActionMgtConstants.ErrorMessages.ERROR_NO_ACTION_CONFIGURED_ON_GIVEN_ID; import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.ACTION_PATH_COMPONENT; -import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.ErrorMessage.ERROR_INVALID_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES; import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.PATH_CONSTANT; import static org.wso2.carbon.identity.api.server.common.Constants.ERROR_CODE_DELIMITER; @@ -51,33 +45,6 @@ public class ActionMgtEndpointUtil { private static final String ACTION_TYPE_LINK_FORMAT = Constants.V1_API_PATH_COMPONENT + ACTION_PATH_COMPONENT + PATH_CONSTANT; - public static void validateActionEndpointAuthProperties(ActionModel actionModel) { - - String authnType = actionModel.getEndpoint().getAuthentication().getType().toString(); - Map authnProperties = actionModel.getEndpoint().getAuthentication().getProperties(); - Map validatedAuthnProperties = new HashMap<>(); - - for (AuthType.AuthenticationType type: AuthType.AuthenticationType.values()) { - if (type.getType().equals(authnType)) { - for (String property: type.getProperties()) { - if (authnProperties == null || authnProperties.get(property) == null) { - throw handleException(Response.Status.BAD_REQUEST, - ERROR_INVALID_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES); - } - validatedAuthnProperties.put(property, authnProperties.get(property)); - } - if (authnProperties.size() > type.getProperties().length) { - if (LOG.isDebugEnabled()) { - LOG.debug("Removing the given unnecessary properties from the Action Endpoint " + - "authentication properties of Authentication Type: " + authnType); - } - actionModel.getEndpoint().getAuthentication().setProperties(validatedAuthnProperties); - } - return; - } - } - } - public static String buildURIForActionType(String actionType) { return ContextLoader.buildURIForBody(ACTION_TYPE_LINK_FORMAT + diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml index 08fd7ef0d2..110d8279ad 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml @@ -22,13 +22,11 @@ paths: get: tags: - Actions - operationId: getActions + operationId: getActionTypes summary: | Detailed summary of the Action Types description: | This API provides the capability to retrieve the detailed summary of the action types.
- Permission required:
- * /permission/admin/manage/identity/actionmgt/view
Scope required:
* internal_action_mgt_view responses: @@ -77,8 +75,6 @@ paths: description: > This API provides the capability to store the action information that is provided by users.
- Permission required:
- * /permission/admin/manage/identity/actionmgt/create
Scope required:
* internal_action_mgt_create parameters: @@ -87,7 +83,11 @@ paths: description: Name of the Action Type. required: true schema: - type: string + enum: + - PreIssueAccessToken + - PreUpdatePassword + - PreUpdateProfile + - PreRegistration requestBody: content: application/json: @@ -134,13 +134,11 @@ paths: get: tags: - Actions - operationId: getAction + operationId: getActionsByActionType summary: | List action description: | This API provides the capability to retrieve the action by action type.
- Permission required:
- * /permission/admin/manage/identity/actionmgt/view
Scope required:
* internal_action_mgt_view parameters: @@ -149,7 +147,11 @@ paths: description: Name of the Action Type. required: true schema: - type: string + enum: + - PreIssueAccessToken + - PreUpdatePassword + - PreUpdateProfile + - PreRegistration responses: '200': description: OK @@ -187,16 +189,14 @@ paths: $ref: '#/components/schemas/Error' /actions/{actionType}/{actionId}: - put: + patch: tags: - Actions summary: | - Update action by action type and action id. + Update Action information by given Id. operationId: updateAction description: | - This API provides the capability to update an action by action type.
- Permission required:
- * /permission/admin/manage/identity/actionmgt/update
+ This API provides the capability to update Action information by given Id.
Scope required:
* internal_action_mgt_update parameters: @@ -205,7 +205,11 @@ paths: description: Name of the Action Type. required: true schema: - type: string + enum: + - PreIssueAccessToken + - PreUpdatePassword + - PreUpdateProfile + - PreRegistration - name: actionId in: path description: Id of the Action. @@ -216,8 +220,8 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/ActionModel' - description: This represents the action to be updated. + $ref: '#/components/schemas/ActionUpdateModel' + description: This represents the action information to be updated. required: true responses: '200': @@ -242,12 +246,6 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '409': - description: Conflict - content: - application/json: - schema: - $ref: '#/components/schemas/Error' '500': description: Server Error content: @@ -263,8 +261,6 @@ paths: operationId: deleteAction description: | This API provides the capability to delete an action by action type.
- Permission required:
- * /permission/admin/manage/identity/actionmgt/delete
Scope required:
* internal_action_mgt_delete parameters: @@ -273,7 +269,11 @@ paths: description: Name of the Action Type. required: true schema: - type: string + enum: + - PreIssueAccessToken + - PreUpdatePassword + - PreUpdateProfile + - PreRegistration - name: actionId in: path description: Id of the Action. @@ -315,8 +315,6 @@ paths: operationId: activateAction description: | This API provides the capability to activate an action by action Id.
- Permission required:
- * /permission/admin/manage/identity/actionmgt/update
Scope required:
* internal_action_mgt_update parameters: @@ -325,7 +323,11 @@ paths: description: Name of the Action Type. required: true schema: - type: string + enum: + - PreIssueAccessToken + - PreUpdatePassword + - PreUpdateProfile + - PreRegistration - name: actionId in: path description: Id of the Action. @@ -371,8 +373,6 @@ paths: operationId: deactivateAction description: | This API provides the capability to deactivate an action by action Id.
- Permission required:
- * /permission/admin/manage/identity/actionmgt/update
Scope required:
* internal_action_mgt_update parameters: @@ -381,7 +381,11 @@ paths: description: Name of the Action Type. required: true schema: - type: string + enum: + - PreIssueAccessToken + - PreUpdatePassword + - PreUpdateProfile + - PreRegistration - name: actionId in: path description: Id of the Action. @@ -418,6 +422,81 @@ paths: schema: $ref: '#/components/schemas/Error' + /actions/{actionType}/{actionId}/{authType}: + put: + tags: + - Actions + summary: | + Update Action endpoint authentication information by given Id. + operationId: updateActionEndpointAuthentication + description: | + This API provides the capability to update Action endpoint authentication information by given Id.
+ Scope required:
+ * internal_action_mgt_update + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - PreIssueAccessToken + - PreUpdatePassword + - PreUpdateProfile + - PreRegistration + - name: actionId + in: path + description: Id of the Action. + required: true + schema: + type: string + - name: authType + in: path + description: Authentication Type of the Action Endpoint. + required: true + schema: + enum: + - none + - basic + - apiKey + - bearer + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AuthenticationTypeProperties' + description: This represents the action endpoint authentication to be updated. + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponse' + '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' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + components: securitySchemes: BasicAuth: @@ -459,6 +538,17 @@ components: authentication: $ref: '#/components/schemas/AuthenticationType' + EndpointResponse: + type: object + required: + - uri + - authentication + properties: + uri: + type: string + example: https://abc.com/token + authentication: + $ref: '#/components/schemas/AuthenticationTypeResponse' ActionResponse: type: object @@ -487,7 +577,7 @@ components: - ACTIVE - INACTIVE endpoint: - $ref: '#/components/schemas/Endpoint' + $ref: '#/components/schemas/EndpointResponse' ActionBasicResponse: type: object @@ -569,7 +659,44 @@ components: additionalProperties: true example: username: "auth_username" - password: "auth_username" + password: "auth_password" + + AuthenticationTypeProperties: + type: object + properties: + properties: + type: object + additionalProperties: true + example: + username: "auth_username" + password: "auth_password" + + AuthenticationTypeResponse: + type: object + required: + - type + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + example: BASIC + + ActionUpdateModel: + type: object + properties: + name: + type: string + example: Access Token Pre Issue + description: + type: string + example: This is the configuration of pre-action for issuing access token. + endpointUri: + type: string + example: https://abcd.com/token Error: type: object @@ -593,4 +720,4 @@ servers: tenant-domain: default: "carbon.super" server-url: - default: "localhost:9443" \ No newline at end of file + default: "localhost:9443" From 7e50249a44c35ebeda96b3ce655c4af5949014bb Mon Sep 17 00:00:00 2001 From: Ashan Thamara Palihakkara <75057725+ashanthamara@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:44:12 +0530 Subject: [PATCH 2/3] Improve validation for auth prop values --- .../constants/ActionMgtEndpointConstants.java | 5 +- .../core/ServerActionManagementService.java | 15 ++++- .../src/main/resources/Actions.yaml | 56 +++++++++---------- 3 files changed, 44 insertions(+), 32 deletions(-) diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java index 7cb4b8d585..c936a13aae 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/constants/ActionMgtEndpointConstants.java @@ -41,7 +41,10 @@ public enum ErrorMessage { "Required authentication properties are not provided or invalid."), ERROR_INVALID_ACTION_ENDPOINT_AUTH_TYPE("60002", "Invalid Authentication Type for Action Endpoint.", - "Invalid authentication type used for path parameter."); + "Invalid authentication type used for path parameter."), + ERROR_EMPTY_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES("60003", + "Unable to perform the operation.", + "Authentication property values cannot be empty."); private final String code; private final String message; diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java index 6189c4b2a5..430707b434 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/java/org/wso2/carbon/identity/api/server/action/management/v1/core/ServerActionManagementService.java @@ -18,6 +18,7 @@ package org.wso2.carbon.identity.api.server.action.management.v1.core; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.CarbonContext; @@ -44,6 +45,7 @@ import javax.ws.rs.core.Response; +import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.ErrorMessage.ERROR_EMPTY_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES; import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.ErrorMessage.ERROR_INVALID_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES; import static org.wso2.carbon.identity.api.server.action.management.v1.constants.ActionMgtEndpointConstants.ErrorMessage.ERROR_INVALID_ACTION_ENDPOINT_AUTH_TYPE; @@ -251,13 +253,20 @@ private List getActionEndpointAuthProperties(String authType, Map< List authProperties = new ArrayList<>(); for (AuthType.AuthenticationType type: AuthType.AuthenticationType.values()) { if (type.getType().equals(authType)) { - for (AuthProperty property: type.getProperties()) { + for (AuthType.AuthenticationType.AuthenticationProperty property: type.getProperties()) { if (authPropertiesMap == null || !authPropertiesMap.containsKey(property.getName())) { throw ActionMgtEndpointUtil.handleException(Response.Status.BAD_REQUEST, ERROR_INVALID_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES); } - property.setValue(authPropertiesMap.get(property.getName()).toString()); - authProperties.add(property); + String propValue = (String) authPropertiesMap.get(property.getName()); + if (StringUtils.isEmpty(propValue)) { + throw ActionMgtEndpointUtil.handleException(Response.Status.BAD_REQUEST, + ERROR_EMPTY_ACTION_ENDPOINT_AUTHENTICATION_PROPERTIES); + } + authProperties.add(new AuthProperty.AuthPropertyBuilder() + .name(property.getName()) + .value(propValue) + .isConfidential(property.getIsConfidential()).build()); } if (authPropertiesMap.size() > type.getProperties().size()) { if (LOG.isDebugEnabled()) { diff --git a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml index 110d8279ad..c11c1b95d7 100644 --- a/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml +++ b/components/org.wso2.carbon.identity.api.server.action.management/org.wso2.carbon.identity.api.server.action.management.v1/src/main/resources/Actions.yaml @@ -84,10 +84,10 @@ paths: required: true schema: enum: - - PreIssueAccessToken - - PreUpdatePassword - - PreUpdateProfile - - PreRegistration + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration requestBody: content: application/json: @@ -148,10 +148,10 @@ paths: required: true schema: enum: - - PreIssueAccessToken - - PreUpdatePassword - - PreUpdateProfile - - PreRegistration + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration responses: '200': description: OK @@ -206,10 +206,10 @@ paths: required: true schema: enum: - - PreIssueAccessToken - - PreUpdatePassword - - PreUpdateProfile - - PreRegistration + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration - name: actionId in: path description: Id of the Action. @@ -270,10 +270,10 @@ paths: required: true schema: enum: - - PreIssueAccessToken - - PreUpdatePassword - - PreUpdateProfile - - PreRegistration + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration - name: actionId in: path description: Id of the Action. @@ -324,10 +324,10 @@ paths: required: true schema: enum: - - PreIssueAccessToken - - PreUpdatePassword - - PreUpdateProfile - - PreRegistration + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration - name: actionId in: path description: Id of the Action. @@ -382,10 +382,10 @@ paths: required: true schema: enum: - - PreIssueAccessToken - - PreUpdatePassword - - PreUpdateProfile - - PreRegistration + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration - name: actionId in: path description: Id of the Action. @@ -440,10 +440,10 @@ paths: required: true schema: enum: - - PreIssueAccessToken - - PreUpdatePassword - - PreUpdateProfile - - PreRegistration + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration - name: actionId in: path description: Id of the Action. From 7f83def2d44fb7d9bdd1c7ce893ade5f65fca340 Mon Sep 17 00:00:00 2001 From: Ashan Thamara Palihakkara <75057725+ashanthamara@users.noreply.github.com> Date: Wed, 17 Jul 2024 09:11:09 +0530 Subject: [PATCH 3/3] Bump framework version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9a7337238b..9ffd80ef34 100644 --- a/pom.xml +++ b/pom.xml @@ -803,7 +803,7 @@ 1.4 1.2.4 1.9.17 - 7.3.28 + 7.3.37 3.0.5 1.12.0 **/gen/**/*