/*
* Copyright 2016 ThoughtWorks, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.thoughtworks.go.plugin.access.authorization;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.thoughtworks.go.config.PluginRoleConfig;
import com.thoughtworks.go.config.SecurityAuthConfig;
import com.thoughtworks.go.plugin.access.authentication.models.User;
import com.thoughtworks.go.plugin.access.authorization.models.AuthenticationResponse;
import com.thoughtworks.go.plugin.access.authorization.models.Capabilities;
import com.thoughtworks.go.plugin.access.common.handler.JSONResultMessageHandler;
import com.thoughtworks.go.plugin.access.common.models.Image;
import com.thoughtworks.go.plugin.access.common.models.PluginProfileMetadataKeys;
import com.thoughtworks.go.plugin.api.response.validation.ValidationResult;
import com.thoughtworks.go.plugin.domain.common.PluginConfiguration;
import com.thoughtworks.go.plugin.domain.common.VerifyConnectionResponse;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.lang.StringUtils;
import java.lang.reflect.Type;
import java.util.*;
public class AuthorizationMessageConverterV1 implements AuthorizationMessageConverter {
public static final String VERSION = "1.0";
private static final Gson GSON = new Gson();
@Override
public com.thoughtworks.go.plugin.domain.authorization.Capabilities getCapabilitiesFromResponseBody(String responseBody) {
return Capabilities.fromJSON(responseBody).toCapabilites();
}
@Override
public com.thoughtworks.go.plugin.domain.common.Image getImageResponseFromBody(String responseBody) {
return Image.fromJSON(responseBody).toDomainImage();
}
@Override
public List<PluginConfiguration> getPluginConfigMetadataResponseFromBody(String responseBody) {
return PluginProfileMetadataKeys.fromJSON(responseBody).toPluginConfigurations();
}
@Override
public String getPluginConfigurationViewFromResponseBody(String responseBody) {
return getTemplateFromResponse(responseBody, "Plugin configuration `template` was blank!");
}
@Override
public String validatePluginConfigurationRequestBody(Map<String, String> configuration) {
return GSON.toJson(configuration);
}
@Override
public ValidationResult getPluginConfigurationValidationResultFromResponseBody(String responseBody) {
return new JSONResultMessageHandler().toValidationResult(responseBody);
}
@Override
public List<PluginConfiguration> getRoleConfigMetadataResponseFromBody(String responseBody) {
return PluginProfileMetadataKeys.fromJSON(responseBody).toPluginConfigurations();
}
@Override
public String getRoleConfigurationViewFromResponseBody(String responseBody) {
return getTemplateFromResponse(responseBody, "Role configuration `template` was blank!");
}
@Override
public VerifyConnectionResponse getVerifyConnectionResultFromResponseBody(String responseBody) {
return com.thoughtworks.go.plugin.access.authorization.models.VerifyConnectionResponse.fromJSON(responseBody).response();
}
@Override
public String verifyConnectionRequestBody(Map<String, String> configuration) {
return validatePluginConfigurationRequestBody(configuration);
}
@Override
public String authenticateUserRequestBody(String username, String password, List<SecurityAuthConfig> authConfigs, List<PluginRoleConfig> roleConfigs) {
Map<String, Object> requestMap = new HashMap<>();
final Map<String, String> credentials = new HashedMap();
credentials.put("username", username);
credentials.put("password", password);
requestMap.put("credentials", credentials);
requestMap.put("auth_configs", getAuthConfigs(authConfigs));
requestMap.put("role_configs", getRoleConfigs(roleConfigs));
return GSON.toJson(requestMap);
}
private List<Map<String, Object>> getRoleConfigs(List<PluginRoleConfig> roleConfigs) {
List<Map<String, Object>> configs = new ArrayList<>();
if (roleConfigs == null) {
return configs;
}
for (PluginRoleConfig roleConfig : roleConfigs) {
Map<String, Object> config = new HashedMap();
config.put("name", roleConfig.getName().toString());
config.put("auth_config_id", roleConfig.getAuthConfigId());
config.put("configuration", roleConfig.getConfigurationAsMap(true));
configs.add(config);
}
return configs;
}
private List<Map<String, Object>> getAuthConfigs(List<SecurityAuthConfig> authConfigs) {
List<Map<String, Object>> configs = new ArrayList<>();
if (authConfigs == null) {
return configs;
}
for (SecurityAuthConfig securityAuthConfig : authConfigs) {
Map<String, Object> authConfig = new HashedMap();
authConfig.put("id", securityAuthConfig.getId());
authConfig.put("configuration", securityAuthConfig.getConfigurationAsMap(true));
configs.add(authConfig);
}
return configs;
}
@Override
public AuthenticationResponse getAuthenticatedUserFromResponseBody(String responseBody) {
return AuthenticationResponse.fromJSON(responseBody);
}
@Override
public List<User> getSearchUsersFromResponseBody(String responseBody) {
return User.fromJSONList(responseBody);
}
@Override
public String searchUsersRequestBody(String searchTerm, List<SecurityAuthConfig> authConfigs) {
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("search_term", searchTerm);
requestMap.put("auth_configs", getAuthConfigs(authConfigs));
return GSON.toJson(requestMap);
}
@Override
public String getProcessRoleConfigsResponseBody(List<PluginRoleConfig> roles) {
List<Map> list = new ArrayList<>();
for (PluginRoleConfig role : roles) {
LinkedHashMap<String, Object> e = new LinkedHashMap<>();
e.put("name", role.getName().toString());
e.put("configuration", role.getConfigurationAsMap(true));
list.add(e);
}
return GSON.toJson(list);
}
@Override
public String grantAccessRequestBody(List<SecurityAuthConfig> authConfigs) {
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("auth_configs", getAuthConfigs(authConfigs));
return GSON.toJson(requestMap);
}
@Override
public Map<String, String> getCredentials(String responseBody) {
Type type = new TypeToken<Map<String, String>>() {
}.getType();
return GSON.fromJson(responseBody, type);
}
@Override
public String authenticateUserRequestBody(Map<String, String> credentials, List<SecurityAuthConfig> authConfigs, List<PluginRoleConfig> roleConfigs) {
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("credentials", credentials);
requestMap.put("auth_configs", getAuthConfigs(authConfigs));
requestMap.put("role_configs", getRoleConfigs(roleConfigs));
return GSON.toJson(requestMap);
}
@Override
public String getAuthorizationServerUrl(String responseBody) {
return (String) new Gson().fromJson(responseBody, Map.class).get("authorization_server_url");
}
@Override
public String authorizationServerRedirectUrlRequestBody(String pluginId, List<SecurityAuthConfig> authConfigs, String siteUrl) {
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("auth_configs", getAuthConfigs(authConfigs));
requestMap.put("authorization_server_callback_url", authorizationServerCallbackUrl(pluginId, siteUrl));
return GSON.toJson(requestMap);
}
private String getTemplateFromResponse(String responseBody, String message) {
String template = (String) new Gson().fromJson(responseBody, Map.class).get("template");
if (StringUtils.isBlank(template)) {
throw new RuntimeException(message);
}
return template;
}
private String authorizationServerCallbackUrl(String pluginId, String siteUrl) {
return String.format("%s/go/plugin/%s/authenticate", siteUrl, pluginId);
}
}