*/ | */ | ||||
package org.sonar.xoo; | package org.sonar.xoo; | ||||
import java.util.Arrays; | |||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.Configuration; | |||||
import org.sonar.api.resources.Language; | import org.sonar.api.resources.Language; | ||||
public class Xoo implements Language { | public class Xoo implements Language { | ||||
public static final String FILE_SUFFIXES_KEY = "sonar.xoo.file.suffixes"; | public static final String FILE_SUFFIXES_KEY = "sonar.xoo.file.suffixes"; | ||||
public static final String DEFAULT_FILE_SUFFIXES = ".xoo"; | public static final String DEFAULT_FILE_SUFFIXES = ".xoo"; | ||||
private final Settings settings; | |||||
private final Configuration config; | |||||
public Xoo(Settings settings) { | |||||
this.settings = settings; | |||||
public Xoo(Configuration config) { | |||||
this.config = config; | |||||
} | } | ||||
@Override | @Override | ||||
@Override | @Override | ||||
public String[] getFileSuffixes() { | public String[] getFileSuffixes() { | ||||
return Arrays.stream(settings.getStringArray(FILE_SUFFIXES_KEY)).filter(s -> s != null && !s.trim().isEmpty()).toArray(String[]::new); | |||||
return config.getStringArray(FILE_SUFFIXES_KEY); | |||||
} | } | ||||
} | } |
.description("Comma-separated list of suffixes for files to analyze. To not filter, leave the list empty.") | .description("Comma-separated list of suffixes for files to analyze. To not filter, leave the list empty.") | ||||
.subCategory("General") | .subCategory("General") | ||||
.onQualifiers(Qualifiers.PROJECT) | .onQualifiers(Qualifiers.PROJECT) | ||||
.multiValues(true) | |||||
.build(), | .build(), | ||||
// Used by DuplicationsTest and IssueFilterOnCommonRulesTest. If not declared it is not returned by api/settings | // Used by DuplicationsTest and IssueFilterOnCommonRulesTest. If not declared it is not returned by api/settings | ||||
PropertyDefinition.builder("sonar.cpd.xoo.minimumTokens") | PropertyDefinition.builder("sonar.cpd.xoo.minimumTokens") |
import java.io.File; | import java.io.File; | ||||
import org.sonar.api.batch.bootstrap.ProjectBuilder; | import org.sonar.api.batch.bootstrap.ProjectBuilder; | ||||
import org.sonar.api.batch.bootstrap.ProjectDefinition; | import org.sonar.api.batch.bootstrap.ProjectDefinition; | ||||
import org.sonar.api.config.Settings; | |||||
public class XooProjectBuilder extends ProjectBuilder { | public class XooProjectBuilder extends ProjectBuilder { | ||||
private Settings settings; | |||||
public XooProjectBuilder(Settings settings) { | |||||
this.settings = settings; | |||||
} | |||||
@Override | @Override | ||||
public void build(Context context) { | public void build(Context context) { | ||||
if (!settings.getBoolean("sonar.xoo.enableProjectBuilder")) { | |||||
if (!context.config().getBoolean("sonar.xoo.enableProjectBuilder").orElse(false)) { | |||||
return; | return; | ||||
} | } | ||||
ProjectDefinition root = context.projectReactor().getRoot(); | ProjectDefinition root = context.projectReactor().getRoot(); |
@Override | @Override | ||||
public void execute(SensorContext context) { | public void execute(SensorContext context) { | ||||
Checks<Check> checks = checkFactory.create(XooRulesDefinition.XOO_REPOSITORY); | Checks<Check> checks = checkFactory.create(XooRulesDefinition.XOO_REPOSITORY); | ||||
checks.addAnnotatedChecks(Check.ALL); | |||||
checks.addAnnotatedChecks((Object[]) Check.ALL); | |||||
FilePredicates p = context.fileSystem().predicates(); | FilePredicates p = context.fileSystem().predicates(); | ||||
for (InputFile file : context.fileSystem().inputFiles(p.and(p.hasLanguages(Xoo.KEY), p.hasType(Type.MAIN)))) { | for (InputFile file : context.fileSystem().inputFiles(p.and(p.hasLanguages(Xoo.KEY), p.hasType(Type.MAIN)))) { | ||||
for (Check check : checks.all()) { | for (Check check : checks.all()) { |
private static void createIssues(InputFile file, SensorContext context) { | private static void createIssues(InputFile file, SensorContext context) { | ||||
ActiveRule rule = context.activeRules().findByInternalKey(XooRulesDefinition.XOO_REPOSITORY, | ActiveRule rule = context.activeRules().findByInternalKey(XooRulesDefinition.XOO_REPOSITORY, | ||||
context.settings().getString(INTERNAL_KEY_PROPERTY)); | |||||
context.config().get(INTERNAL_KEY_PROPERTY).orElse(null)); | |||||
if (rule != null) { | if (rule != null) { | ||||
NewIssue newIssue = context.newIssue(); | NewIssue newIssue = context.newIssue(); | ||||
newIssue | newIssue |
NewIssue newIssue = context.newIssue(); | NewIssue newIssue = context.newIssue(); | ||||
newIssue | newIssue | ||||
.forRule(ruleKey) | .forRule(ruleKey) | ||||
.gap(context.settings().getDouble(EFFORT_TO_FIX_PROPERTY)) | |||||
.gap(context.config().getDouble(EFFORT_TO_FIX_PROPERTY).orElse(null)) | |||||
.at(newIssue.newLocation() | .at(newIssue.newLocation() | ||||
.on(inputFile) | .on(inputFile) | ||||
.at(inputFile.newRange(lineCounter[0], startIndex, lineCounter[0], startIndex + tag.length()))) | .at(inputFile.newRange(lineCounter[0], startIndex, lineCounter[0], startIndex + tag.length()))) |
private void createIssues(InputFile file, SensorContext context, String repo) { | private void createIssues(InputFile file, SensorContext context, String repo) { | ||||
RuleKey ruleKey = RuleKey.of(repo, RULE_KEY); | RuleKey ruleKey = RuleKey.of(repo, RULE_KEY); | ||||
String severity = context.settings().getString(FORCE_SEVERITY_PROPERTY); | |||||
String severity = context.config().get(FORCE_SEVERITY_PROPERTY).orElse(null); | |||||
for (int line = 1; line <= file.lines(); line++) { | for (int line = 1; line <= file.lines(); line++) { | ||||
NewIssue newIssue = context.newIssue(); | NewIssue newIssue = context.newIssue(); | ||||
newIssue | newIssue | ||||
.message("This issue is generated on each line")) | .message("This issue is generated on each line")) | ||||
.overrideSeverity(severity != null ? Severity.valueOf(severity) : null); | .overrideSeverity(severity != null ? Severity.valueOf(severity) : null); | ||||
if (context.getSonarQubeVersion().isGreaterThanOrEqual(Version.create(5, 5))) { | if (context.getSonarQubeVersion().isGreaterThanOrEqual(Version.create(5, 5))) { | ||||
newIssue.gap(context.settings().getDouble(EFFORT_TO_FIX_PROPERTY)); | |||||
newIssue.gap(context.config().getDouble(EFFORT_TO_FIX_PROPERTY).orElse(null)); | |||||
} else { | } else { | ||||
newIssue.gap(context.settings().getDouble(EFFORT_TO_FIX_PROPERTY)); | |||||
newIssue.gap(context.config().getDouble(EFFORT_TO_FIX_PROPERTY).orElse(null)); | |||||
} | } | ||||
newIssue.save(); | newIssue.save(); | ||||
} | } |
@Override | @Override | ||||
public void execute(SensorContext context) { | public void execute(SensorContext context) { | ||||
File f = new File(context.settings().getString(SONAR_XOO_RANDOM_ACCESS_ISSUE_PATHS)); | |||||
File f = new File(context.config().get(SONAR_XOO_RANDOM_ACCESS_ISSUE_PATHS).orElseThrow(() -> new IllegalStateException("Required property"))); | |||||
FileSystem fs = context.fileSystem(); | FileSystem fs = context.fileSystem(); | ||||
FilePredicates p = fs.predicates(); | FilePredicates p = fs.predicates(); | ||||
try { | try { |
import javax.security.auth.login.LoginContext; | import javax.security.auth.login.LoginContext; | ||||
import javax.security.auth.login.LoginException; | import javax.security.auth.login.LoginException; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; | ||||
import org.sonar.api.utils.log.Loggers; | import org.sonar.api.utils.log.Loggers; | ||||
private final String realm; | private final String realm; | ||||
private final String referral; | private final String referral; | ||||
public LdapContextFactory(Settings settings, String settingsPrefix, String ldapUrl) { | |||||
this.authentication = StringUtils.defaultString(settings.getString(settingsPrefix + ".authentication"), DEFAULT_AUTHENTICATION); | |||||
this.factory = StringUtils.defaultString(settings.getString(settingsPrefix + ".contextFactoryClass"), DEFAULT_FACTORY); | |||||
this.realm = settings.getString(settingsPrefix + ".realm"); | |||||
public LdapContextFactory(org.sonar.api.config.Configuration config, String settingsPrefix, String ldapUrl) { | |||||
this.authentication = StringUtils.defaultString(config.get(settingsPrefix + ".authentication").orElse(null), DEFAULT_AUTHENTICATION); | |||||
this.factory = StringUtils.defaultString(config.get(settingsPrefix + ".contextFactoryClass").orElse(null), DEFAULT_FACTORY); | |||||
this.realm = config.get(settingsPrefix + ".realm").orElse(null); | |||||
this.providerUrl = ldapUrl; | this.providerUrl = ldapUrl; | ||||
this.startTLS = settings.getBoolean(settingsPrefix + ".StartTLS"); | |||||
this.username = settings.getString(settingsPrefix + ".bindDn"); | |||||
this.password = settings.getString(settingsPrefix + ".bindPassword"); | |||||
this.referral = getReferralsMode(settings, settingsPrefix + ".followReferrals"); | |||||
this.startTLS = config.getBoolean(settingsPrefix + ".StartTLS").orElse(false); | |||||
this.username = config.get(settingsPrefix + ".bindDn").orElse(null); | |||||
this.password = config.get(settingsPrefix + ".bindPassword").orElse(null); | |||||
this.referral = getReferralsMode(config, settingsPrefix + ".followReferrals"); | |||||
} | } | ||||
/** | /** | ||||
return referral; | return referral; | ||||
} | } | ||||
private static String getReferralsMode(Settings settings, String followReferralsSettingKey) { | |||||
if (settings.hasKey(followReferralsSettingKey)) { | |||||
return settings.getBoolean(followReferralsSettingKey) ? REFERRALS_FOLLOW_MODE : REFERRALS_IGNORE_MODE; | |||||
} | |||||
private static String getReferralsMode(org.sonar.api.config.Configuration config, String followReferralsSettingKey) { | |||||
// By default follow referrals | // By default follow referrals | ||||
return REFERRALS_FOLLOW_MODE; | |||||
return config.getBoolean(followReferralsSettingKey).orElse(true) ? REFERRALS_FOLLOW_MODE : REFERRALS_IGNORE_MODE; | |||||
} | } | ||||
@Override | @Override |
import javax.naming.directory.Attribute; | import javax.naming.directory.Attribute; | ||||
import javax.naming.directory.SearchResult; | import javax.naming.directory.SearchResult; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.Configuration; | |||||
/** | /** | ||||
* @author Evgeny Mandrikov | * @author Evgeny Mandrikov | ||||
/** | /** | ||||
* Constructs mapping from Sonar settings. | * Constructs mapping from Sonar settings. | ||||
*/ | */ | ||||
public LdapGroupMapping(Settings settings, String settingsPrefix) { | |||||
this.baseDn = settings.getString(settingsPrefix + ".group.baseDn"); | |||||
this.idAttribute = StringUtils.defaultString(settings.getString(settingsPrefix + ".group.idAttribute"), DEFAULT_ID_ATTRIBUTE); | |||||
public LdapGroupMapping(Configuration config, String settingsPrefix) { | |||||
this.baseDn = config.get(settingsPrefix + ".group.baseDn").orElse(null); | |||||
this.idAttribute = StringUtils.defaultString(config.get(settingsPrefix + ".group.idAttribute").orElse(null), DEFAULT_ID_ATTRIBUTE); | |||||
String req = StringUtils.defaultString(settings.getString(settingsPrefix + ".group.request"), DEFAULT_REQUEST); | |||||
String req = StringUtils.defaultString(config.get(settingsPrefix + ".group.request").orElse(null), DEFAULT_REQUEST); | |||||
this.requiredUserAttributes = StringUtils.substringsBetween(req, "{", "}"); | this.requiredUserAttributes = StringUtils.substringsBetween(req, "{", "}"); | ||||
for (int i = 0; i < requiredUserAttributes.length; i++) { | for (int i = 0; i < requiredUserAttributes.length; i++) { | ||||
req = StringUtils.replace(req, "{" + requiredUserAttributes[i] + "}", "{" + i + "}"); | req = StringUtils.replace(req, "{" + requiredUserAttributes[i] + "}", "{" + i + "}"); |
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.Configuration; | |||||
import org.sonar.api.server.ServerSide; | import org.sonar.api.server.ServerSide; | ||||
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; | ||||
import org.sonar.api.utils.log.Loggers; | import org.sonar.api.utils.log.Loggers; | ||||
private static final String LDAP_SERVERS_PROPERTY = "ldap.servers"; | private static final String LDAP_SERVERS_PROPERTY = "ldap.servers"; | ||||
private static final String LDAP_PROPERTY_PREFIX = "ldap"; | private static final String LDAP_PROPERTY_PREFIX = "ldap"; | ||||
private static final String DEFAULT_LDAP_SERVER_KEY = "<default>"; | private static final String DEFAULT_LDAP_SERVER_KEY = "<default>"; | ||||
private final Settings settings; | |||||
private final Configuration config; | |||||
private final LdapAutodiscovery ldapAutodiscovery; | private final LdapAutodiscovery ldapAutodiscovery; | ||||
private Map<String, LdapUserMapping> userMappings = null; | private Map<String, LdapUserMapping> userMappings = null; | ||||
private Map<String, LdapGroupMapping> groupMappings = null; | private Map<String, LdapGroupMapping> groupMappings = null; | ||||
/** | /** | ||||
* Create an instance of the settings manager. | * Create an instance of the settings manager. | ||||
* | * | ||||
* @param settings The settings to use. | |||||
* @param config The config to use. | |||||
*/ | */ | ||||
public LdapSettingsManager(Settings settings, LdapAutodiscovery ldapAutodiscovery) { | |||||
this.settings = settings; | |||||
public LdapSettingsManager(Configuration config, LdapAutodiscovery ldapAutodiscovery) { | |||||
this.config = config; | |||||
this.ldapAutodiscovery = ldapAutodiscovery; | this.ldapAutodiscovery = ldapAutodiscovery; | ||||
} | } | ||||
if (userMappings == null) { | if (userMappings == null) { | ||||
// Use linked hash map to preserve order | // Use linked hash map to preserve order | ||||
userMappings = new LinkedHashMap<>(); | userMappings = new LinkedHashMap<>(); | ||||
String[] serverKeys = settings.getStringArray(LDAP_SERVERS_PROPERTY); | |||||
String[] serverKeys = config.getStringArray(LDAP_SERVERS_PROPERTY); | |||||
if (serverKeys.length > 0) { | if (serverKeys.length > 0) { | ||||
for (String serverKey : serverKeys) { | for (String serverKey : serverKeys) { | ||||
LdapUserMapping userMapping = new LdapUserMapping(settings, LDAP_PROPERTY_PREFIX + "." + serverKey); | |||||
LdapUserMapping userMapping = new LdapUserMapping(config, LDAP_PROPERTY_PREFIX + "." + serverKey); | |||||
if (StringUtils.isNotBlank(userMapping.getBaseDn())) { | if (StringUtils.isNotBlank(userMapping.getBaseDn())) { | ||||
LOG.info("User mapping for server {}: {}", serverKey, userMapping); | LOG.info("User mapping for server {}: {}", serverKey, userMapping); | ||||
userMappings.put(serverKey, userMapping); | userMappings.put(serverKey, userMapping); | ||||
} | } | ||||
} else { | } else { | ||||
// Backward compatibility with single server configuration | // Backward compatibility with single server configuration | ||||
LdapUserMapping userMapping = new LdapUserMapping(settings, LDAP_PROPERTY_PREFIX); | |||||
LdapUserMapping userMapping = new LdapUserMapping(config, LDAP_PROPERTY_PREFIX); | |||||
if (StringUtils.isNotBlank(userMapping.getBaseDn())) { | if (StringUtils.isNotBlank(userMapping.getBaseDn())) { | ||||
LOG.info("User mapping: {}", userMapping); | LOG.info("User mapping: {}", userMapping); | ||||
userMappings.put(DEFAULT_LDAP_SERVER_KEY, userMapping); | userMappings.put(DEFAULT_LDAP_SERVER_KEY, userMapping); | ||||
if (groupMappings == null) { | if (groupMappings == null) { | ||||
// Use linked hash map to preserve order | // Use linked hash map to preserve order | ||||
groupMappings = new LinkedHashMap<>(); | groupMappings = new LinkedHashMap<>(); | ||||
String[] serverKeys = settings.getStringArray(LDAP_SERVERS_PROPERTY); | |||||
String[] serverKeys = config.getStringArray(LDAP_SERVERS_PROPERTY); | |||||
if (serverKeys.length > 0) { | if (serverKeys.length > 0) { | ||||
for (String serverKey : serverKeys) { | for (String serverKey : serverKeys) { | ||||
LdapGroupMapping groupMapping = new LdapGroupMapping(settings, LDAP_PROPERTY_PREFIX + "." + serverKey); | |||||
LdapGroupMapping groupMapping = new LdapGroupMapping(config, LDAP_PROPERTY_PREFIX + "." + serverKey); | |||||
if (StringUtils.isNotBlank(groupMapping.getBaseDn())) { | if (StringUtils.isNotBlank(groupMapping.getBaseDn())) { | ||||
LOG.info("Group mapping for server {}: {}", serverKey, groupMapping); | LOG.info("Group mapping for server {}: {}", serverKey, groupMapping); | ||||
groupMappings.put(serverKey, groupMapping); | groupMappings.put(serverKey, groupMapping); | ||||
} | } | ||||
} else { | } else { | ||||
// Backward compatibility with single server configuration | // Backward compatibility with single server configuration | ||||
LdapGroupMapping groupMapping = new LdapGroupMapping(settings, LDAP_PROPERTY_PREFIX); | |||||
LdapGroupMapping groupMapping = new LdapGroupMapping(config, LDAP_PROPERTY_PREFIX); | |||||
if (StringUtils.isNotBlank(groupMapping.getBaseDn())) { | if (StringUtils.isNotBlank(groupMapping.getBaseDn())) { | ||||
LOG.info("Group mapping: {}", groupMapping); | LOG.info("Group mapping: {}", groupMapping); | ||||
groupMappings.put(DEFAULT_LDAP_SERVER_KEY, groupMapping); | groupMappings.put(DEFAULT_LDAP_SERVER_KEY, groupMapping); | ||||
if (contextFactories == null) { | if (contextFactories == null) { | ||||
// Use linked hash map to preserve order | // Use linked hash map to preserve order | ||||
contextFactories = new LinkedHashMap<>(); | contextFactories = new LinkedHashMap<>(); | ||||
String[] serverKeys = settings.getStringArray(LDAP_SERVERS_PROPERTY); | |||||
String[] serverKeys = config.getStringArray(LDAP_SERVERS_PROPERTY); | |||||
if (serverKeys.length > 0) { | if (serverKeys.length > 0) { | ||||
initMultiLdapConfiguration(serverKeys); | initMultiLdapConfiguration(serverKeys); | ||||
} else { | } else { | ||||
} | } | ||||
private void initSimpleLdapConfiguration() { | private void initSimpleLdapConfiguration() { | ||||
String realm = settings.getString(LDAP_PROPERTY_PREFIX + ".realm"); | |||||
String realm = config.get(LDAP_PROPERTY_PREFIX + ".realm").orElse(null); | |||||
String ldapUrlKey = LDAP_PROPERTY_PREFIX + ".url"; | String ldapUrlKey = LDAP_PROPERTY_PREFIX + ".url"; | ||||
String ldapUrl = settings.getString(ldapUrlKey); | |||||
String ldapUrl = config.get(ldapUrlKey).orElse(null); | |||||
if (ldapUrl == null && realm != null) { | if (ldapUrl == null && realm != null) { | ||||
LOG.warn("Auto-discovery feature is deprecated, please use '{}' to specify LDAP url", ldapUrlKey); | LOG.warn("Auto-discovery feature is deprecated, please use '{}' to specify LDAP url", ldapUrlKey); | ||||
List<LdapSrvRecord> ldapServers = ldapAutodiscovery.getLdapServers(realm); | List<LdapSrvRecord> ldapServers = ldapAutodiscovery.getLdapServers(realm); | ||||
for (LdapSrvRecord ldapSrvRecord : ldapServers) { | for (LdapSrvRecord ldapSrvRecord : ldapServers) { | ||||
if (StringUtils.isNotBlank(ldapSrvRecord.getServerUrl())) { | if (StringUtils.isNotBlank(ldapSrvRecord.getServerUrl())) { | ||||
LOG.info("Detected server: {}", ldapSrvRecord.getServerUrl()); | LOG.info("Detected server: {}", ldapSrvRecord.getServerUrl()); | ||||
LdapContextFactory contextFactory = new LdapContextFactory(settings, LDAP_PROPERTY_PREFIX, ldapSrvRecord.getServerUrl()); | |||||
LdapContextFactory contextFactory = new LdapContextFactory(config, LDAP_PROPERTY_PREFIX, ldapSrvRecord.getServerUrl()); | |||||
contextFactories.put(DEFAULT_LDAP_SERVER_KEY + index, contextFactory); | contextFactories.put(DEFAULT_LDAP_SERVER_KEY + index, contextFactory); | ||||
index++; | index++; | ||||
} | } | ||||
if (StringUtils.isBlank(ldapUrl)) { | if (StringUtils.isBlank(ldapUrl)) { | ||||
throw new LdapException(String.format("The property '%s' is empty and no realm configured to try auto-discovery.", ldapUrlKey)); | throw new LdapException(String.format("The property '%s' is empty and no realm configured to try auto-discovery.", ldapUrlKey)); | ||||
} | } | ||||
LdapContextFactory contextFactory = new LdapContextFactory(settings, LDAP_PROPERTY_PREFIX, ldapUrl); | |||||
LdapContextFactory contextFactory = new LdapContextFactory(config, LDAP_PROPERTY_PREFIX, ldapUrl); | |||||
contextFactories.put(DEFAULT_LDAP_SERVER_KEY, contextFactory); | contextFactories.put(DEFAULT_LDAP_SERVER_KEY, contextFactory); | ||||
} | } | ||||
} | } | ||||
private void initMultiLdapConfiguration(String[] serverKeys) { | private void initMultiLdapConfiguration(String[] serverKeys) { | ||||
if (settings.hasKey("ldap.url") || settings.hasKey("ldap.realm")) { | |||||
if (config.hasKey("ldap.url") || config.hasKey("ldap.realm")) { | |||||
throw new LdapException("When defining multiple LDAP servers with the property '" + LDAP_SERVERS_PROPERTY + "', " | throw new LdapException("When defining multiple LDAP servers with the property '" + LDAP_SERVERS_PROPERTY + "', " | ||||
+ "all LDAP properties must be linked to one of those servers. Please remove properties like 'ldap.url', 'ldap.realm', ..."); | + "all LDAP properties must be linked to one of those servers. Please remove properties like 'ldap.url', 'ldap.realm', ..."); | ||||
} | } | ||||
for (String serverKey : serverKeys) { | for (String serverKey : serverKeys) { | ||||
String prefix = LDAP_PROPERTY_PREFIX + "." + serverKey; | String prefix = LDAP_PROPERTY_PREFIX + "." + serverKey; | ||||
String ldapUrlKey = prefix + ".url"; | String ldapUrlKey = prefix + ".url"; | ||||
String ldapUrl = settings.getString(ldapUrlKey); | |||||
String ldapUrl = config.get(ldapUrlKey).orElse(null); | |||||
if (StringUtils.isBlank(ldapUrl)) { | if (StringUtils.isBlank(ldapUrl)) { | ||||
throw new LdapException(String.format("The property '%s' property is empty while it is mandatory.", ldapUrlKey)); | throw new LdapException(String.format("The property '%s' property is empty while it is mandatory.", ldapUrlKey)); | ||||
} | } | ||||
LdapContextFactory contextFactory = new LdapContextFactory(settings, prefix, ldapUrl); | |||||
LdapContextFactory contextFactory = new LdapContextFactory(config, prefix, ldapUrl); | |||||
contextFactories.put(serverKey, contextFactory); | contextFactories.put(serverKey, contextFactory); | ||||
} | } | ||||
} | } |
package org.sonar.auth.ldap; | package org.sonar.auth.ldap; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.Configuration; | |||||
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; | ||||
import org.sonar.api.utils.log.Loggers; | import org.sonar.api.utils.log.Loggers; | ||||
/** | /** | ||||
* Constructs mapping from Sonar settings. | * Constructs mapping from Sonar settings. | ||||
*/ | */ | ||||
public LdapUserMapping(Settings settings, String settingsPrefix) { | |||||
public LdapUserMapping(Configuration config, String settingsPrefix) { | |||||
String usesrBaseDnSettingKey = settingsPrefix + ".user.baseDn"; | String usesrBaseDnSettingKey = settingsPrefix + ".user.baseDn"; | ||||
String usersBaseDn = settings.getString(usesrBaseDnSettingKey); | |||||
String usersBaseDn = config.get(usesrBaseDnSettingKey).orElse(null); | |||||
if (usersBaseDn == null) { | if (usersBaseDn == null) { | ||||
String realm = settings.getString(settingsPrefix + ".realm"); | |||||
String realm = config.get(settingsPrefix + ".realm").orElse(null); | |||||
if (realm != null) { | if (realm != null) { | ||||
LOG.warn("Auto-discovery feature is deprecated, please use '{}' to specify user search dn", usesrBaseDnSettingKey); | LOG.warn("Auto-discovery feature is deprecated, please use '{}' to specify user search dn", usesrBaseDnSettingKey); | ||||
usersBaseDn = LdapAutodiscovery.getDnsDomainDn(realm); | usersBaseDn = LdapAutodiscovery.getDnsDomainDn(realm); | ||||
} | } | ||||
this.baseDn = usersBaseDn; | this.baseDn = usersBaseDn; | ||||
this.realNameAttribute = StringUtils.defaultString(settings.getString(settingsPrefix + ".user.realNameAttribute"), DEFAULT_NAME_ATTRIBUTE); | |||||
this.emailAttribute = StringUtils.defaultString(settings.getString(settingsPrefix + ".user.emailAttribute"), DEFAULT_EMAIL_ATTRIBUTE); | |||||
this.realNameAttribute = StringUtils.defaultString(config.get(settingsPrefix + ".user.realNameAttribute").orElse(null), DEFAULT_NAME_ATTRIBUTE); | |||||
this.emailAttribute = StringUtils.defaultString(config.get(settingsPrefix + ".user.emailAttribute").orElse(null), DEFAULT_EMAIL_ATTRIBUTE); | |||||
String req = StringUtils.defaultString(settings.getString(settingsPrefix + ".user.request"), DEFAULT_REQUEST); | |||||
String req = StringUtils.defaultString(config.get(settingsPrefix + ".user.request").orElse(null), DEFAULT_REQUEST); | |||||
req = StringUtils.replace(req, "{login}", "{0}"); | req = StringUtils.replace(req, "{login}", "{0}"); | ||||
this.request = req; | this.request = req; | ||||
} | } |
@Test | @Test | ||||
public void test() { | public void test() { | ||||
MapSettings settings = configure(); | MapSettings settings = configure(); | ||||
LdapRealm ldapRealm = new LdapRealm(new LdapSettingsManager(settings, new LdapAutodiscovery())); | |||||
LdapRealm ldapRealm = new LdapRealm(new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery())); | |||||
ldapRealm.init(); | ldapRealm.init(); | ||||
public void wrong_bind_password() { | public void wrong_bind_password() { | ||||
MapSettings settings = configure() | MapSettings settings = configure() | ||||
.setProperty("ldap.bindPassword", "wrong_bind_password"); | .setProperty("ldap.bindPassword", "wrong_bind_password"); | ||||
LdapRealm ldapRealm = new LdapRealm(new LdapSettingsManager(settings, new LdapAutodiscovery())); | |||||
LdapRealm ldapRealm = new LdapRealm(new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery())); | |||||
try { | try { | ||||
ldapRealm.init(); | ldapRealm.init(); | ||||
Assert.fail(); | Assert.fail(); |
public void testNoConnection() { | public void testNoConnection() { | ||||
exampleServer.disableAnonymousAccess(); | exampleServer.disableAnonymousAccess(); | ||||
try { | try { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_SIMPLE), | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_SIMPLE).asConfig(), | |||||
new LdapAutodiscovery()); | new LdapAutodiscovery()); | ||||
LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | ||||
authenticator.authenticate("godin", "secret1"); | authenticator.authenticate("godin", "secret1"); | ||||
@Test | @Test | ||||
public void testSimple() { | public void testSimple() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_SIMPLE), | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_SIMPLE).asConfig(), | |||||
new LdapAutodiscovery()); | new LdapAutodiscovery()); | ||||
LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | ||||
@Test | @Test | ||||
public void testSimpleMultiLdap() { | public void testSimpleMultiLdap() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
LdapSettingsFactory.generateAuthenticationSettings(exampleServer, infosupportServer, LdapContextFactory.AUTH_METHOD_SIMPLE), new LdapAutodiscovery()); | |||||
LdapSettingsFactory.generateAuthenticationSettings(exampleServer, infosupportServer, LdapContextFactory.AUTH_METHOD_SIMPLE).asConfig(), new LdapAutodiscovery()); | |||||
LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | ||||
assertThat(authenticator.authenticate("godin", "secret1")).isTrue(); | assertThat(authenticator.authenticate("godin", "secret1")).isTrue(); | ||||
@Test | @Test | ||||
public void testSasl() { | public void testSasl() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_CRAM_MD5), | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(LdapSettingsFactory.generateAuthenticationSettings(exampleServer, null, LdapContextFactory.AUTH_METHOD_CRAM_MD5).asConfig(), | |||||
new LdapAutodiscovery()); | new LdapAutodiscovery()); | ||||
LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | ||||
@Test | @Test | ||||
public void testSaslMultipleLdap() { | public void testSaslMultipleLdap() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
LdapSettingsFactory.generateAuthenticationSettings(exampleServer, infosupportServer, LdapContextFactory.AUTH_METHOD_CRAM_MD5), new LdapAutodiscovery()); | |||||
LdapSettingsFactory.generateAuthenticationSettings(exampleServer, infosupportServer, LdapContextFactory.AUTH_METHOD_CRAM_MD5).asConfig(), new LdapAutodiscovery()); | |||||
LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | LdapAuthenticator authenticator = new LdapAuthenticator(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | ||||
assertThat(authenticator.authenticate("godin", "secret1")).isTrue(); | assertThat(authenticator.authenticate("godin", "secret1")).isTrue(); |
public void does_not_display_log_when_not_using_auto_discovery() { | public void does_not_display_log_when_not_using_auto_discovery() { | ||||
MapSettings settings = new MapSettings() | MapSettings settings = new MapSettings() | ||||
.setProperty("ldap.url", server.getUrl()); | .setProperty("ldap.url", server.getUrl()); | ||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings, new LdapAutodiscovery())); | |||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery())); | |||||
assertThat(realm.getName()).isEqualTo("LDAP"); | assertThat(realm.getName()).isEqualTo("LDAP"); | ||||
realm.init(); | realm.init(); | ||||
LdapAutodiscovery ldapAutodiscovery = mock(LdapAutodiscovery.class); | LdapAutodiscovery ldapAutodiscovery = mock(LdapAutodiscovery.class); | ||||
when(ldapAutodiscovery.getLdapServers("example.org")).thenReturn(singletonList(new LdapAutodiscovery.LdapSrvRecord(server.getUrl(), 1, 1))); | when(ldapAutodiscovery.getLdapServers("example.org")).thenReturn(singletonList(new LdapAutodiscovery.LdapSrvRecord(server.getUrl(), 1, 1))); | ||||
// ldap.url setting is not set | // ldap.url setting is not set | ||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(new MapSettings().setProperty("ldap.realm", "example.org"), | |||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(new MapSettings().setProperty("ldap.realm", "example.org").asConfig(), | |||||
ldapAutodiscovery)); | ldapAutodiscovery)); | ||||
realm.init(); | realm.init(); | ||||
public void display_warning_log_when_using_auto_discovery_to_detect_user_baseDn_on_single_server() { | public void display_warning_log_when_using_auto_discovery_to_detect_user_baseDn_on_single_server() { | ||||
// ldap.user.baseDn setting is not set | // ldap.user.baseDn setting is not set | ||||
MapSettings settings = new MapSettings().setProperty("ldap.url", server.getUrl()).setProperty("ldap.realm", "example.org"); | MapSettings settings = new MapSettings().setProperty("ldap.url", server.getUrl()).setProperty("ldap.realm", "example.org"); | ||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings, new LdapAutodiscovery())); | |||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery())); | |||||
realm.init(); | realm.init(); | ||||
.setProperty("ldap.example.realm", "example.org") | .setProperty("ldap.example.realm", "example.org") | ||||
.setProperty("ldap.infosupport.url", server2.getUrl()) | .setProperty("ldap.infosupport.url", server2.getUrl()) | ||||
.setProperty("ldap.infosupport.realm", "infosupport.org"); | .setProperty("ldap.infosupport.realm", "infosupport.org"); | ||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings, new LdapAutodiscovery())); | |||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery())); | |||||
realm.init(); | realm.init(); | ||||
@Test | @Test | ||||
public void defaults() { | public void defaults() { | ||||
LdapGroupMapping groupMapping = new LdapGroupMapping(new MapSettings(), "ldap"); | |||||
LdapGroupMapping groupMapping = new LdapGroupMapping(new MapSettings().asConfig(), "ldap"); | |||||
assertThat(groupMapping.getBaseDn()).isNull(); | assertThat(groupMapping.getBaseDn()).isNull(); | ||||
assertThat(groupMapping.getIdAttribute()).isEqualTo("cn"); | assertThat(groupMapping.getIdAttribute()).isEqualTo("cn"); | ||||
public void custom_request() { | public void custom_request() { | ||||
MapSettings settings = new MapSettings() | MapSettings settings = new MapSettings() | ||||
.setProperty("ldap.group.request", "(&(|(objectClass=posixGroup)(objectClass=groupOfUniqueNames))(|(memberUid={uid})(uniqueMember={dn})))"); | .setProperty("ldap.group.request", "(&(|(objectClass=posixGroup)(objectClass=groupOfUniqueNames))(|(memberUid={uid})(uniqueMember={dn})))"); | ||||
LdapGroupMapping groupMapping = new LdapGroupMapping(settings, "ldap"); | |||||
LdapGroupMapping groupMapping = new LdapGroupMapping(settings.asConfig(), "ldap"); | |||||
assertThat(groupMapping.getRequest()).isEqualTo("(&(|(objectClass=posixGroup)(objectClass=groupOfUniqueNames))(|(memberUid={0})(uniqueMember={1})))"); | assertThat(groupMapping.getRequest()).isEqualTo("(&(|(objectClass=posixGroup)(objectClass=groupOfUniqueNames))(|(memberUid={0})(uniqueMember={1})))"); | ||||
assertThat(groupMapping.getRequiredUserAttributes()).isEqualTo(new String[] {"uid", "dn"}); | assertThat(groupMapping.getRequiredUserAttributes()).isEqualTo(new String[] {"uid", "dn"}); |
public void defaults() { | public void defaults() { | ||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, null); | MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, null); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | ||||
Collection<String> groups; | Collection<String> groups; | ||||
public void defaultsMultipleLdap() { | public void defaultsMultipleLdap() { | ||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | ||||
Collection<String> groups; | Collection<String> groups; | ||||
public void posix() { | public void posix() { | ||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, null); | MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, null); | ||||
settings.setProperty("ldap.group.request", "(&(objectClass=posixGroup)(memberUid={uid}))"); | settings.setProperty("ldap.group.request", "(&(objectClass=posixGroup)(memberUid={uid}))"); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | ||||
Collection<String> groups; | Collection<String> groups; | ||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | ||||
settings.setProperty("ldap.example.group.request", "(&(objectClass=posixGroup)(memberUid={uid}))"); | settings.setProperty("ldap.example.group.request", "(&(objectClass=posixGroup)(memberUid={uid}))"); | ||||
settings.setProperty("ldap.infosupport.group.request", "(&(objectClass=posixGroup)(memberUid={uid}))"); | settings.setProperty("ldap.infosupport.group.request", "(&(objectClass=posixGroup)(memberUid={uid}))"); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | ||||
Collection<String> groups; | Collection<String> groups; | ||||
public void mixed() { | public void mixed() { | ||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | ||||
settings.setProperty("ldap.example.group.request", "(&(|(objectClass=groupOfUniqueNames)(objectClass=posixGroup))(|(uniqueMember={dn})(memberUid={uid})))"); | settings.setProperty("ldap.example.group.request", "(&(|(objectClass=groupOfUniqueNames)(objectClass=posixGroup))(|(uniqueMember={dn})(memberUid={uid})))"); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | ||||
Collection<String> groups; | Collection<String> groups; | ||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | ||||
settings.setProperty("ldap.example.group.request", "(&(|(objectClass=groupOfUniqueNames)(objectClass=posixGroup))(|(uniqueMember={dn})(memberUid={uid})))"); | settings.setProperty("ldap.example.group.request", "(&(|(objectClass=groupOfUniqueNames)(objectClass=posixGroup))(|(uniqueMember={dn})(memberUid={uid})))"); | ||||
settings.setProperty("ldap.infosupport.group.request", "(&(|(objectClass=groupOfUniqueNames)(objectClass=posixGroup))(|(uniqueMember={dn})(memberUid={uid})))"); | settings.setProperty("ldap.infosupport.group.request", "(&(|(objectClass=groupOfUniqueNames)(objectClass=posixGroup))(|(uniqueMember={dn})(memberUid={uid})))"); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | LdapGroupsProvider groupsProvider = new LdapGroupsProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings(), settingsManager.getGroupMappings()); | ||||
Collection<String> groups; | Collection<String> groups; |
public void normal() { | public void normal() { | ||||
MapSettings settings = new MapSettings() | MapSettings settings = new MapSettings() | ||||
.setProperty("ldap.url", server.getUrl()); | .setProperty("ldap.url", server.getUrl()); | ||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings, new LdapAutodiscovery())); | |||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery())); | |||||
assertThat(realm.getName()).isEqualTo("LDAP"); | assertThat(realm.getName()).isEqualTo("LDAP"); | ||||
realm.init(); | realm.init(); | ||||
assertThat(realm.doGetAuthenticator()).isInstanceOf(LdapAuthenticator.class); | assertThat(realm.doGetAuthenticator()).isInstanceOf(LdapAuthenticator.class); | ||||
MapSettings settings = new MapSettings() | MapSettings settings = new MapSettings() | ||||
.setProperty("ldap.url", "ldap://no-such-host") | .setProperty("ldap.url", "ldap://no-such-host") | ||||
.setProperty("ldap.group.baseDn", "cn=groups,dc=example,dc=org"); | .setProperty("ldap.group.baseDn", "cn=groups,dc=example,dc=org"); | ||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings, new LdapAutodiscovery())); | |||||
LdapRealm realm = new LdapRealm(new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery())); | |||||
assertThat(realm.getName()).isEqualTo("LDAP"); | assertThat(realm.getName()).isEqualTo("LDAP"); | ||||
try { | try { | ||||
realm.init(); | realm.init(); |
import javax.annotation.Nullable; | import javax.annotation.Nullable; | ||||
import org.junit.ClassRule; | import org.junit.ClassRule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | |||||
import org.sonar.auth.ldap.server.LdapServer; | import org.sonar.auth.ldap.server.LdapServer; | ||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
} | } | ||||
private static Map<String, LdapContextFactory> createFactories(@Nullable String propertyKey, @Nullable String propertyValue) { | private static Map<String, LdapContextFactory> createFactories(@Nullable String propertyKey, @Nullable String propertyValue) { | ||||
Settings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(server, null); | |||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(server, null); | |||||
if (propertyKey != null) { | if (propertyKey != null) { | ||||
settings.setProperty(propertyKey, propertyValue); | settings.setProperty(propertyKey, propertyValue); | ||||
} | } | ||||
return new LdapSettingsManager(settings, new LdapAutodiscovery()).getContextFactories(); | |||||
return new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()).getContextFactories(); | |||||
} | } | ||||
} | } |
@BeforeClass | @BeforeClass | ||||
public static void init() { | public static void init() { | ||||
contextFactories = new LdapSettingsManager(LdapSettingsFactory.generateSimpleAnonymousAccessSettings(server, null), new LdapAutodiscovery()).getContextFactories(); | |||||
contextFactories = new LdapSettingsManager(LdapSettingsFactory.generateSimpleAnonymousAccessSettings(server, null).asConfig(), new LdapAutodiscovery()).getContextFactories(); | |||||
} | } | ||||
@Test | @Test |
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.ExpectedException; | import org.junit.rules.ExpectedException; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
@Test | @Test | ||||
public void shouldFailWhenNoLdapUrl() { | public void shouldFailWhenNoLdapUrl() { | ||||
Settings settings = generateMultipleLdapSettingsWithUserAndGroupMapping(); | |||||
MapSettings settings = generateMultipleLdapSettingsWithUserAndGroupMapping(); | |||||
settings.removeProperty("ldap.example.url"); | settings.removeProperty("ldap.example.url"); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
thrown.expect(LdapException.class); | thrown.expect(LdapException.class); | ||||
thrown.expectMessage("The property 'ldap.example.url' property is empty while it is mandatory."); | thrown.expectMessage("The property 'ldap.example.url' property is empty while it is mandatory."); | ||||
@Test | @Test | ||||
public void shouldFailWhenMixingSingleAndMultipleConfiguration() { | public void shouldFailWhenMixingSingleAndMultipleConfiguration() { | ||||
Settings settings = generateMultipleLdapSettingsWithUserAndGroupMapping(); | |||||
MapSettings settings = generateMultipleLdapSettingsWithUserAndGroupMapping(); | |||||
settings.setProperty("ldap.url", "ldap://foo"); | settings.setProperty("ldap.url", "ldap://foo"); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
thrown.expect(LdapException.class); | thrown.expect(LdapException.class); | ||||
thrown | thrown | ||||
@Test | @Test | ||||
public void testContextFactoriesWithSingleLdap() { | public void testContextFactoriesWithSingleLdap() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
generateSingleLdapSettingsWithUserAndGroupMapping(), new LdapAutodiscovery()); | |||||
generateSingleLdapSettingsWithUserAndGroupMapping().asConfig(), new LdapAutodiscovery()); | |||||
assertThat(settingsManager.getContextFactories().size()).isEqualTo(1); | assertThat(settingsManager.getContextFactories().size()).isEqualTo(1); | ||||
} | } | ||||
@Test | @Test | ||||
public void testContextFactoriesWithMultipleLdap() { | public void testContextFactoriesWithMultipleLdap() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
generateMultipleLdapSettingsWithUserAndGroupMapping(), new LdapAutodiscovery()); | |||||
generateMultipleLdapSettingsWithUserAndGroupMapping().asConfig(), new LdapAutodiscovery()); | |||||
assertThat(settingsManager.getContextFactories().size()).isEqualTo(2); | assertThat(settingsManager.getContextFactories().size()).isEqualTo(2); | ||||
// We do it twice to make sure the settings keep the same. | // We do it twice to make sure the settings keep the same. | ||||
assertThat(settingsManager.getContextFactories().size()).isEqualTo(2); | assertThat(settingsManager.getContextFactories().size()).isEqualTo(2); | ||||
LdapSrvRecord ldap2 = new LdapSrvRecord("ldap://localhost:1899", 1, 1); | LdapSrvRecord ldap2 = new LdapSrvRecord("ldap://localhost:1899", 1, 1); | ||||
when(ldapAutodiscovery.getLdapServers("example.org")).thenReturn(Arrays.asList(ldap1, ldap2)); | when(ldapAutodiscovery.getLdapServers("example.org")).thenReturn(Arrays.asList(ldap1, ldap2)); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
generateAutodiscoverSettings(), ldapAutodiscovery); | |||||
generateAutodiscoverSettings().asConfig(), ldapAutodiscovery); | |||||
assertThat(settingsManager.getContextFactories().size()).isEqualTo(2); | assertThat(settingsManager.getContextFactories().size()).isEqualTo(2); | ||||
} | } | ||||
LdapAutodiscovery ldapAutodiscovery = mock(LdapAutodiscovery.class); | LdapAutodiscovery ldapAutodiscovery = mock(LdapAutodiscovery.class); | ||||
when(ldapAutodiscovery.getLdapServers("example.org")).thenReturn(Collections.emptyList()); | when(ldapAutodiscovery.getLdapServers("example.org")).thenReturn(Collections.emptyList()); | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
generateAutodiscoverSettings(), ldapAutodiscovery); | |||||
generateAutodiscoverSettings().asConfig(), ldapAutodiscovery); | |||||
thrown.expect(LdapException.class); | thrown.expect(LdapException.class); | ||||
thrown.expectMessage("The property 'ldap.url' is empty and SonarQube is not able to auto-discover any LDAP server."); | thrown.expectMessage("The property 'ldap.url' is empty and SonarQube is not able to auto-discover any LDAP server."); | ||||
@Test | @Test | ||||
public void testUserMappings() { | public void testUserMappings() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
generateMultipleLdapSettingsWithUserAndGroupMapping(), new LdapAutodiscovery()); | |||||
generateMultipleLdapSettingsWithUserAndGroupMapping().asConfig(), new LdapAutodiscovery()); | |||||
assertThat(settingsManager.getUserMappings().size()).isEqualTo(2); | assertThat(settingsManager.getUserMappings().size()).isEqualTo(2); | ||||
// We do it twice to make sure the settings keep the same. | // We do it twice to make sure the settings keep the same. | ||||
assertThat(settingsManager.getUserMappings().size()).isEqualTo(2); | assertThat(settingsManager.getUserMappings().size()).isEqualTo(2); | ||||
@Test | @Test | ||||
public void testGroupMappings() { | public void testGroupMappings() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
generateMultipleLdapSettingsWithUserAndGroupMapping(), new LdapAutodiscovery()); | |||||
generateMultipleLdapSettingsWithUserAndGroupMapping().asConfig(), new LdapAutodiscovery()); | |||||
assertThat(settingsManager.getGroupMappings().size()).isEqualTo(2); | assertThat(settingsManager.getGroupMappings().size()).isEqualTo(2); | ||||
// We do it twice to make sure the settings keep the same. | // We do it twice to make sure the settings keep the same. | ||||
assertThat(settingsManager.getGroupMappings().size()).isEqualTo(2); | assertThat(settingsManager.getGroupMappings().size()).isEqualTo(2); | ||||
@Test | @Test | ||||
public void testEmptySettings() { | public void testEmptySettings() { | ||||
LdapSettingsManager settingsManager = new LdapSettingsManager( | LdapSettingsManager settingsManager = new LdapSettingsManager( | ||||
new MapSettings(), new LdapAutodiscovery()); | |||||
new MapSettings().asConfig(), new LdapAutodiscovery()); | |||||
thrown.expect(LdapException.class); | thrown.expect(LdapException.class); | ||||
thrown.expectMessage("The property 'ldap.url' is empty and no realm configured to try auto-discovery."); | thrown.expectMessage("The property 'ldap.url' is empty and no realm configured to try auto-discovery."); |
@Test | @Test | ||||
public void defaults() { | public void defaults() { | ||||
LdapUserMapping userMapping = new LdapUserMapping(new MapSettings(), "ldap"); | |||||
LdapUserMapping userMapping = new LdapUserMapping(new MapSettings().asConfig(), "ldap"); | |||||
assertThat(userMapping.getBaseDn()).isNull(); | assertThat(userMapping.getBaseDn()).isNull(); | ||||
assertThat(userMapping.getRequest()).isEqualTo("(&(objectClass=inetOrgPerson)(uid={0}))"); | assertThat(userMapping.getRequest()).isEqualTo("(&(objectClass=inetOrgPerson)(uid={0}))"); | ||||
assertThat(userMapping.getRealNameAttribute()).isEqualTo("cn"); | assertThat(userMapping.getRealNameAttribute()).isEqualTo("cn"); | ||||
.setProperty("ldap.user.baseDn", "cn=users") | .setProperty("ldap.user.baseDn", "cn=users") | ||||
.setProperty("ldap.user.request", "(&(objectClass=user)(sAMAccountName={0}))"); | .setProperty("ldap.user.request", "(&(objectClass=user)(sAMAccountName={0}))"); | ||||
LdapUserMapping userMapping = new LdapUserMapping(settings, "ldap"); | |||||
LdapUserMapping userMapping = new LdapUserMapping(settings.asConfig(), "ldap"); | |||||
LdapSearch search = userMapping.createSearch(null, "tester"); | LdapSearch search = userMapping.createSearch(null, "tester"); | ||||
assertThat(search.getBaseDn()).isEqualTo("cn=users"); | assertThat(search.getBaseDn()).isEqualTo("cn=users"); | ||||
assertThat(search.getRequest()).isEqualTo("(&(objectClass=user)(sAMAccountName={0}))"); | assertThat(search.getRequest()).isEqualTo("(&(objectClass=user)(sAMAccountName={0}))"); | ||||
.setProperty("ldap.userObjectClass", "user") | .setProperty("ldap.userObjectClass", "user") | ||||
.setProperty("ldap.loginAttribute", "sAMAccountName"); | .setProperty("ldap.loginAttribute", "sAMAccountName"); | ||||
LdapUserMapping userMapping = new LdapUserMapping(settings, "ldap"); | |||||
LdapUserMapping userMapping = new LdapUserMapping(settings.asConfig(), "ldap"); | |||||
assertThat(userMapping.getBaseDn()).isEqualTo("dc=example,dc=org"); | assertThat(userMapping.getBaseDn()).isEqualTo("dc=example,dc=org"); | ||||
} | } | ||||
import org.junit.ClassRule; | import org.junit.ClassRule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | |||||
import org.sonar.api.security.UserDetails; | import org.sonar.api.security.UserDetails; | ||||
import org.sonar.auth.ldap.server.LdapServer; | import org.sonar.auth.ldap.server.LdapServer; | ||||
@Test | @Test | ||||
public void test() { | public void test() { | ||||
Settings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings, new LdapAutodiscovery()); | |||||
MapSettings settings = LdapSettingsFactory.generateSimpleAnonymousAccessSettings(exampleServer, infosupportServer); | |||||
LdapSettingsManager settingsManager = new LdapSettingsManager(settings.asConfig(), new LdapAutodiscovery()); | |||||
LdapUsersProvider usersProvider = new LdapUsersProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | LdapUsersProvider usersProvider = new LdapUsersProvider(settingsManager.getContextFactories(), settingsManager.getUserMappings()); | ||||
UserDetails details; | UserDetails details; |
import org.sonar.api.ce.ComputeEngineSide; | import org.sonar.api.ce.ComputeEngineSide; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.ConfigurationBridge; | import org.sonar.api.config.internal.ConfigurationBridge; | ||||
import org.sonar.db.DbClient; | import org.sonar.db.DbClient; | ||||
import org.sonar.db.component.BranchType; | import org.sonar.db.component.BranchType; |
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.ExpectedException; | import org.junit.rules.ExpectedException; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.rule.RuleKey; | import org.sonar.api.rule.RuleKey; | ||||
import org.sonar.ce.task.projectanalysis.component.Component; | import org.sonar.ce.task.projectanalysis.component.Component; |
import org.picocontainer.Startable; | import org.picocontainer.Startable; | ||||
import org.sonar.api.ce.ComputeEngineSide; | import org.sonar.api.ce.ComputeEngineSide; | ||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.ce.task.container.EagerStart; | import org.sonar.ce.task.container.EagerStart; | ||||
import org.sonar.ce.task.container.TaskContainerImpl; | import org.sonar.ce.task.container.TaskContainerImpl; | ||||
import org.sonar.server.setting.ThreadLocalSettings; | import org.sonar.server.setting.ThreadLocalSettings; | ||||
/** | /** | ||||
* Add this class as the first components in the {@link TaskContainerImpl} | * Add this class as the first components in the {@link TaskContainerImpl} | ||||
* to trigger loading of Thread local specific {@link org.sonar.api.config.Settings} in {@link ThreadLocalSettings}. | |||||
* to trigger loading of Thread local specific {@link Settings} in {@link ThreadLocalSettings}. | |||||
*/ | */ | ||||
@EagerStart | @EagerStart | ||||
@ComputeEngineSide | @ComputeEngineSide |
import org.apache.commons.dbcp2.BasicDataSource; | import org.apache.commons.dbcp2.BasicDataSource; | ||||
import org.apache.commons.dbcp2.BasicDataSourceFactory; | import org.apache.commons.dbcp2.BasicDataSourceFactory; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; | ||||
import org.sonar.api.utils.log.Loggers; | import org.sonar.api.utils.log.Loggers; | ||||
import org.sonar.db.dialect.Dialect; | import org.sonar.db.dialect.Dialect; |
import javax.sql.DataSource; | import javax.sql.DataSource; | ||||
import org.apache.commons.codec.digest.DigestUtils; | import org.apache.commons.codec.digest.DigestUtils; | ||||
import org.junit.AssumptionViolatedException; | import org.junit.AssumptionViolatedException; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; | ||||
import org.sonar.api.utils.log.Loggers; | import org.sonar.api.utils.log.Loggers; |
import com.sonar.orchestrator.db.DatabaseFactory; | import com.sonar.orchestrator.db.DatabaseFactory; | ||||
import com.sonar.orchestrator.db.DefaultDatabase; | import com.sonar.orchestrator.db.DefaultDatabase; | ||||
import java.util.function.Consumer; | import java.util.function.Consumer; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; | ||||
import org.sonar.api.utils.log.Loggers; | import org.sonar.api.utils.log.Loggers; |
import org.apache.commons.io.FileUtils; | import org.apache.commons.io.FileUtils; | ||||
import org.apache.commons.io.IOUtils; | import org.apache.commons.io.IOUtils; | ||||
import org.apache.commons.lang.text.StrSubstitutor; | import org.apache.commons.lang.text.StrSubstitutor; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import static org.apache.commons.lang.StringUtils.isEmpty; | import static org.apache.commons.lang.StringUtils.isEmpty; | ||||
import org.apache.ibatis.jdbc.ScriptRunner; | import org.apache.ibatis.jdbc.ScriptRunner; | ||||
import org.sonar.api.SonarEdition; | import org.sonar.api.SonarEdition; | ||||
import org.sonar.api.SonarQubeSide; | import org.sonar.api.SonarQubeSide; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.internal.SonarRuntimeImpl; | import org.sonar.api.internal.SonarRuntimeImpl; | ||||
import org.sonar.api.utils.System2; | import org.sonar.api.utils.System2; |
import org.apache.commons.codec.digest.DigestUtils; | import org.apache.commons.codec.digest.DigestUtils; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.junit.AssumptionViolatedException; | import org.junit.AssumptionViolatedException; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.db.dialect.H2; | import org.sonar.db.dialect.H2; | ||||
import org.sonar.process.logging.LogbackHelper; | import org.sonar.process.logging.LogbackHelper; | ||||
import org.picocontainer.injectors.ProviderAdapter; | import org.picocontainer.injectors.ProviderAdapter; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.PropertyDefinition; | import org.sonar.api.config.PropertyDefinition; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import static java.util.function.Function.identity; | import static java.util.function.Function.identity; | ||||
import static org.sonar.api.config.internal.MultivalueProperty.parseAsCsv; | import static org.sonar.api.config.internal.MultivalueProperty.parseAsCsv; |
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.ConfigurationBridge; | import org.sonar.api.config.internal.ConfigurationBridge; | ||||
import static java.util.Objects.requireNonNull; | import static java.util.Objects.requireNonNull; |
import org.apache.ibatis.exceptions.PersistenceException; | import org.apache.ibatis.exceptions.PersistenceException; | ||||
import org.sonar.api.CoreProperties; | import org.sonar.api.CoreProperties; | ||||
import org.sonar.api.ce.ComputeEngineSide; | import org.sonar.api.ce.ComputeEngineSide; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinition; | import org.sonar.api.config.PropertyDefinition; | ||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.server.ServerSide; | import org.sonar.api.server.ServerSide; | ||||
import org.sonar.api.utils.System2; | import org.sonar.api.utils.System2; | ||||
import org.sonar.core.util.SettingFormatter; | import org.sonar.core.util.SettingFormatter; |
import java.util.function.Function; | import java.util.function.Function; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.db.DbClient; | import org.sonar.db.DbClient; | ||||
import org.sonar.db.DbSession; | import org.sonar.db.DbSession; | ||||
import org.sonar.db.component.ComponentDto; | import org.sonar.db.component.ComponentDto; |
import javax.annotation.CheckForNull; | import javax.annotation.CheckForNull; | ||||
import javax.annotation.Nullable; | import javax.annotation.Nullable; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.db.DbClient; | import org.sonar.db.DbClient; | ||||
import org.sonar.db.DbSession; | import org.sonar.db.DbSession; | ||||
import org.sonar.db.property.PropertyDto; | import org.sonar.db.property.PropertyDto; |
import org.sonar.api.PropertyType; | import org.sonar.api.PropertyType; | ||||
import org.sonar.api.config.PropertyDefinition; | import org.sonar.api.config.PropertyDefinition; | ||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.server.ServerSide; | import org.sonar.api.server.ServerSide; | ||||
import org.sonar.process.systeminfo.Global; | import org.sonar.process.systeminfo.Global; | ||||
import org.sonar.process.systeminfo.SystemInfoSection; | import org.sonar.process.systeminfo.SystemInfoSection; |
import org.mockito.invocation.InvocationOnMock; | import org.mockito.invocation.InvocationOnMock; | ||||
import org.mockito.stubbing.Answer; | import org.mockito.stubbing.Answer; | ||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.notifications.Notification; | import org.sonar.api.notifications.Notification; | ||||
import org.sonar.api.notifications.NotificationChannel; | import org.sonar.api.notifications.NotificationChannel; |
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.utils.System2; | import org.sonar.api.utils.System2; | ||||
import org.sonar.db.DbTester; | import org.sonar.db.DbTester; |
import org.sonar.api.PropertyType; | import org.sonar.api.PropertyType; | ||||
import org.sonar.api.config.PropertyDefinition; | import org.sonar.api.config.PropertyDefinition; | ||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.process.systeminfo.protobuf.ProtobufSystemInfo; | import org.sonar.process.systeminfo.protobuf.ProtobufSystemInfo; | ||||
*/ | */ | ||||
package org.sonar.server.setting.ws; | package org.sonar.server.setting.ws; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.server.ws.Request; | import org.sonar.api.server.ws.Request; | ||||
import org.sonar.api.server.ws.Response; | import org.sonar.api.server.ws.Response; | ||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; |
*/ | */ | ||||
package org.sonar.server.setting.ws; | package org.sonar.server.setting.ws; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.server.ws.Request; | import org.sonar.api.server.ws.Request; | ||||
import org.sonar.api.server.ws.Response; | import org.sonar.api.server.ws.Response; | ||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; |
*/ | */ | ||||
package org.sonar.server.setting.ws; | package org.sonar.server.setting.ws; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.server.ws.Request; | import org.sonar.api.server.ws.Request; | ||||
import org.sonar.api.server.ws.Response; | import org.sonar.api.server.ws.Response; | ||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; |
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.ExpectedException; | import org.junit.rules.ExpectedException; | ||||
import org.junit.rules.TemporaryFolder; | import org.junit.rules.TemporaryFolder; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; | ||||
import org.sonar.server.exceptions.ForbiddenException; | import org.sonar.server.exceptions.ForbiddenException; |
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.ExpectedException; | import org.junit.rules.ExpectedException; | ||||
import org.junit.rules.TemporaryFolder; | import org.junit.rules.TemporaryFolder; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; | ||||
import org.sonar.server.exceptions.BadRequestException; | import org.sonar.server.exceptions.BadRequestException; |
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.ExpectedException; | import org.junit.rules.ExpectedException; | ||||
import org.junit.rules.TemporaryFolder; | import org.junit.rules.TemporaryFolder; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; | ||||
import org.sonar.server.exceptions.ForbiddenException; | import org.sonar.server.exceptions.ForbiddenException; |
import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | ||||
import org.sonar.api.batch.sensor.symbol.internal.DefaultSymbolTable; | import org.sonar.api.batch.sensor.symbol.internal.DefaultSymbolTable; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.ConfigurationBridge; | import org.sonar.api.config.internal.ConfigurationBridge; | ||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.internal.MetadataLoader; | import org.sonar.api.internal.MetadataLoader; | ||||
*/ | */ | ||||
public class SensorContextTester implements SensorContext { | public class SensorContextTester implements SensorContext { | ||||
private Settings settings; | |||||
private MapSettings settings; | |||||
private DefaultFileSystem fs; | private DefaultFileSystem fs; | ||||
private ActiveRules activeRules; | private ActiveRules activeRules; | ||||
private InMemorySensorStorage sensorStorage; | private InMemorySensorStorage sensorStorage; | ||||
return new SensorContextTester(moduleBaseDir); | return new SensorContextTester(moduleBaseDir); | ||||
} | } | ||||
@Override | |||||
public Settings settings() { | |||||
public MapSettings settings() { | |||||
return settings; | return settings; | ||||
} | } | ||||
return new ConfigurationBridge(settings); | return new ConfigurationBridge(settings); | ||||
} | } | ||||
public SensorContextTester setSettings(Settings settings) { | |||||
public SensorContextTester setSettings(MapSettings settings) { | |||||
this.settings = settings; | this.settings = settings; | ||||
return this; | return this; | ||||
} | } |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.api.config; | |||||
package org.sonar.api.config.internal; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.IOException; | import java.io.IOException; |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.api.config; | |||||
package org.sonar.api.config.internal; | |||||
import org.apache.commons.codec.binary.Base64; | import org.apache.commons.codec.binary.Base64; | ||||
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.api.config; | |||||
package org.sonar.api.config.internal; | |||||
interface Cipher { | interface Cipher { | ||||
String encrypt(String clearText); | String encrypt(String clearText); |
package org.sonar.api.config.internal; | package org.sonar.api.config.internal; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
/** | /** |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.api.config; | |||||
package org.sonar.api.config.internal; | |||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Locale; | import java.util.Locale; |
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.config.Settings; | |||||
import static java.util.Collections.unmodifiableMap; | import static java.util.Collections.unmodifiableMap; | ||||
import static java.util.Objects.requireNonNull; | import static java.util.Objects.requireNonNull; |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.api.config; | |||||
package org.sonar.api.config.internal; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Arrays; | import java.util.Arrays; | ||||
import org.apache.commons.lang.ArrayUtils; | import org.apache.commons.lang.ArrayUtils; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.sonar.api.ce.ComputeEngineSide; | import org.sonar.api.ce.ComputeEngineSide; | ||||
import org.sonar.api.config.Configuration; | |||||
import org.sonar.api.config.PropertyDefinition; | |||||
import org.sonar.api.config.PropertyDefinitions; | |||||
import org.sonar.api.scanner.ScannerSide; | import org.sonar.api.scanner.ScannerSide; | ||||
import org.sonar.api.server.ServerSide; | import org.sonar.api.server.ServerSide; | ||||
import org.sonar.api.utils.DateUtils; | import org.sonar.api.utils.DateUtils; |
import org.junit.rules.TemporaryFolder; | import org.junit.rules.TemporaryFolder; | ||||
import org.sonar.api.batch.bootstrap.ProjectDefinition; | import org.sonar.api.batch.bootstrap.ProjectDefinition; | ||||
import org.sonar.api.batch.fs.InputFile; | import org.sonar.api.batch.fs.InputFile; | ||||
import org.sonar.api.batch.fs.internal.DefaultFileSystem; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputFile; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputModule; | |||||
import org.sonar.api.batch.fs.internal.DefaultTextPointer; | |||||
import org.sonar.api.batch.fs.internal.TestInputFileBuilder; | |||||
import org.sonar.api.batch.rule.ActiveRules; | import org.sonar.api.batch.rule.ActiveRules; | ||||
import org.sonar.api.batch.rule.Severity; | |||||
import org.sonar.api.batch.rule.internal.ActiveRulesBuilder; | import org.sonar.api.batch.rule.internal.ActiveRulesBuilder; | ||||
import org.sonar.api.batch.rule.internal.NewActiveRule; | import org.sonar.api.batch.rule.internal.NewActiveRule; | ||||
import org.sonar.api.batch.rule.Severity; | |||||
import org.sonar.api.batch.sensor.error.AnalysisError; | import org.sonar.api.batch.sensor.error.AnalysisError; | ||||
import org.sonar.api.batch.sensor.error.NewAnalysisError; | import org.sonar.api.batch.sensor.error.NewAnalysisError; | ||||
import org.sonar.api.batch.sensor.highlighting.TypeOfText; | import org.sonar.api.batch.sensor.highlighting.TypeOfText; | ||||
import org.sonar.api.batch.sensor.issue.NewExternalIssue; | import org.sonar.api.batch.sensor.issue.NewExternalIssue; | ||||
import org.sonar.api.batch.sensor.issue.NewIssue; | import org.sonar.api.batch.sensor.issue.NewIssue; | ||||
import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.batch.fs.internal.DefaultFileSystem; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputFile; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputModule; | |||||
import org.sonar.api.batch.fs.internal.DefaultTextPointer; | |||||
import org.sonar.api.batch.fs.internal.TestInputFileBuilder; | |||||
import org.sonar.api.measures.CoreMetrics; | import org.sonar.api.measures.CoreMetrics; | ||||
import org.sonar.api.rule.RuleKey; | import org.sonar.api.rule.RuleKey; | ||||
import org.sonar.api.rules.RuleType; | import org.sonar.api.rules.RuleType; | ||||
@Test | @Test | ||||
public void testSettings() { | public void testSettings() { | ||||
Settings settings = new MapSettings(); | |||||
MapSettings settings = new MapSettings(); | |||||
settings.setProperty("foo", "bar"); | settings.setProperty("foo", "bar"); | ||||
tester.setSettings(settings); | tester.setSettings(settings); | ||||
assertThat(tester.settings().getString("foo")).isEqualTo("bar"); | |||||
assertThat(tester.config().get("foo")).contains("bar"); | |||||
} | } | ||||
@Test | @Test |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.api.config; | |||||
package org.sonar.api.config.internal; | |||||
import java.io.File; | |||||
import java.net.URL; | |||||
import java.security.InvalidKeyException; | |||||
import java.security.Key; | |||||
import javax.crypto.BadPaddingException; | |||||
import org.apache.commons.codec.binary.Base64; | import org.apache.commons.codec.binary.Base64; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.ExpectedException; | import org.junit.rules.ExpectedException; | ||||
import javax.crypto.BadPaddingException; | |||||
import java.io.File; | |||||
import java.net.URL; | |||||
import java.security.InvalidKeyException; | |||||
import java.security.Key; | |||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
import static org.junit.Assert.fail; | import static org.junit.Assert.fail; | ||||
thrown.expect(RuntimeException.class); | thrown.expect(RuntimeException.class); | ||||
thrown.expectMessage("Invalid AES key"); | thrown.expectMessage("Invalid AES key"); | ||||
URL resource = getClass().getResource("/org/sonar/api/config/AesCipherTest/bad_secret_key.txt"); | |||||
URL resource = getClass().getResource("/org/sonar/api/config/internal/AesCipherTest/bad_secret_key.txt"); | |||||
AesCipher cipher = new AesCipher(new File(resource.toURI()).getCanonicalPath()); | AesCipher cipher = new AesCipher(new File(resource.toURI()).getCanonicalPath()); | ||||
cipher.encrypt("this is a secret"); | cipher.encrypt("this is a secret"); | ||||
public void decrypt() throws Exception { | public void decrypt() throws Exception { | ||||
AesCipher cipher = new AesCipher(pathToSecretKey()); | AesCipher cipher = new AesCipher(pathToSecretKey()); | ||||
// the following value has been encrypted with the key /org/sonar/api/config/AesCipherTest/aes_secret_key.txt | |||||
// the following value has been encrypted with the key /org/sonar/api/config/internal/AesCipherTest/aes_secret_key.txt | |||||
String clearText = cipher.decrypt("9mx5Zq4JVyjeChTcVjEide4kWCwusFl7P2dSVXtg9IY="); | String clearText = cipher.decrypt("9mx5Zq4JVyjeChTcVjEide4kWCwusFl7P2dSVXtg9IY="); | ||||
assertThat(clearText).isEqualTo("this is a secret"); | assertThat(clearText).isEqualTo("this is a secret"); | ||||
@Test | @Test | ||||
public void decrypt_bad_key() throws Exception { | public void decrypt_bad_key() throws Exception { | ||||
URL resource = getClass().getResource("/org/sonar/api/config/AesCipherTest/bad_secret_key.txt"); | |||||
URL resource = getClass().getResource("/org/sonar/api/config/internal/AesCipherTest/bad_secret_key.txt"); | |||||
AesCipher cipher = new AesCipher(new File(resource.toURI()).getCanonicalPath()); | AesCipher cipher = new AesCipher(new File(resource.toURI()).getCanonicalPath()); | ||||
try { | try { | ||||
@Test | @Test | ||||
public void decrypt_other_key() throws Exception { | public void decrypt_other_key() throws Exception { | ||||
URL resource = getClass().getResource("/org/sonar/api/config/AesCipherTest/other_secret_key.txt"); | |||||
URL resource = getClass().getResource("/org/sonar/api/config/internal/AesCipherTest/other_secret_key.txt"); | |||||
AesCipher cipher = new AesCipher(new File(resource.toURI()).getCanonicalPath()); | AesCipher cipher = new AesCipher(new File(resource.toURI()).getCanonicalPath()); | ||||
try { | try { | ||||
@Test | @Test | ||||
public void loadSecretKeyFromFile_trim_content() throws Exception { | public void loadSecretKeyFromFile_trim_content() throws Exception { | ||||
URL resource = getClass().getResource("/org/sonar/api/config/AesCipherTest/non_trimmed_secret_key.txt"); | |||||
URL resource = getClass().getResource("/org/sonar/api/config/internal/AesCipherTest/non_trimmed_secret_key.txt"); | |||||
String path = new File(resource.toURI()).getCanonicalPath(); | String path = new File(resource.toURI()).getCanonicalPath(); | ||||
AesCipher cipher = new AesCipher(null); | AesCipher cipher = new AesCipher(null); | ||||
} | } | ||||
private String pathToSecretKey() throws Exception { | private String pathToSecretKey() throws Exception { | ||||
URL resource = getClass().getResource("/org/sonar/api/config/AesCipherTest/aes_secret_key.txt"); | |||||
URL resource = getClass().getResource("/org/sonar/api/config/internal/AesCipherTest/aes_secret_key.txt"); | |||||
return new File(resource.toURI()).getCanonicalPath(); | return new File(resource.toURI()).getCanonicalPath(); | ||||
} | } | ||||
} | } |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.api.config; | |||||
package org.sonar.api.config.internal; | |||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.PropertyType; | import org.sonar.api.PropertyType; | ||||
import org.sonar.api.config.PropertyDefinition; | import org.sonar.api.config.PropertyDefinition; | ||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.utils.DateUtils; | import org.sonar.api.utils.DateUtils; | ||||
import static java.util.Collections.singletonList; | import static java.util.Collections.singletonList; |
dependencies { | dependencies { | ||||
// please keep the list grouped by configuration and ordered by name | // please keep the list grouped by configuration and ordered by name | ||||
compile 'commons-codec:commons-codec' | |||||
compile 'commons-io:commons-io' | compile 'commons-io:commons-io' | ||||
compile 'commons-lang:commons-lang' | compile 'commons-lang:commons-lang' | ||||
compile 'com.google.code.gson:gson' | compile 'com.google.code.gson:gson' |
package org.sonar.api.batch.bootstrap; | package org.sonar.api.batch.bootstrap; | ||||
import org.sonar.api.ExtensionPoint; | import org.sonar.api.ExtensionPoint; | ||||
import org.sonar.api.config.Configuration; | |||||
import org.sonar.api.scanner.ScannerSide; | import org.sonar.api.scanner.ScannerSide; | ||||
/** | /** | ||||
@Deprecated | @Deprecated | ||||
public abstract class ProjectBuilder { | public abstract class ProjectBuilder { | ||||
/** | |||||
* Plugins can use the implementation {@link org.sonar.api.batch.bootstrap.internal.ProjectBuilderContext} | |||||
* for their unit tests. | |||||
*/ | |||||
@Deprecated | @Deprecated | ||||
public interface Context { | public interface Context { | ||||
ProjectReactor projectReactor(); | ProjectReactor projectReactor(); | ||||
/** | |||||
* Global config (command line arguments, global scanner properties). | |||||
* @since 8.3 Only as a replacement for injecting Settings | |||||
*/ | |||||
Configuration config(); | |||||
} | } | ||||
/** | /** |
import org.sonar.api.batch.bootstrap.ProjectBuilder; | import org.sonar.api.batch.bootstrap.ProjectBuilder; | ||||
import org.sonar.api.batch.bootstrap.ProjectReactor; | import org.sonar.api.batch.bootstrap.ProjectReactor; | ||||
import org.sonar.api.config.Configuration; | |||||
/** | /** | ||||
* Context that is passed to {@link org.sonar.api.batch.bootstrap.ProjectBuilder} as parameter. | * Context that is passed to {@link org.sonar.api.batch.bootstrap.ProjectBuilder} as parameter. | ||||
public class ProjectBuilderContext implements ProjectBuilder.Context { | public class ProjectBuilderContext implements ProjectBuilder.Context { | ||||
private final ProjectReactor reactor; | private final ProjectReactor reactor; | ||||
private final Configuration configuration; | |||||
public ProjectBuilderContext(ProjectReactor reactor) { | |||||
public ProjectBuilderContext(ProjectReactor reactor, Configuration configuration) { | |||||
this.reactor = reactor; | this.reactor = reactor; | ||||
this.configuration = configuration; | |||||
} | } | ||||
@Override | @Override | ||||
return reactor; | return reactor; | ||||
} | } | ||||
@Override | |||||
public Configuration config() { | |||||
return configuration; | |||||
} | |||||
} | } |
import org.sonar.api.batch.AnalysisMode; | import org.sonar.api.batch.AnalysisMode; | ||||
import org.sonar.api.batch.postjob.issue.PostJobIssue; | import org.sonar.api.batch.postjob.issue.PostJobIssue; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
/** | /** | ||||
* See {@link PostJob#execute(PostJobContext)} | * See {@link PostJob#execute(PostJobContext)} | ||||
*/ | */ | ||||
public interface PostJobContext { | public interface PostJobContext { | ||||
/** | |||||
* @deprecated since 6.5 use {@link #config()} | |||||
*/ | |||||
@Deprecated | |||||
Settings settings(); | |||||
/** | /** | ||||
* Get configuration of the current project. | * Get configuration of the current project. | ||||
* @since 6.5 | * @since 6.5 |
import org.sonar.api.batch.sensor.rule.NewAdHocRule; | import org.sonar.api.batch.sensor.rule.NewAdHocRule; | ||||
import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.scanner.fs.InputProject; | import org.sonar.api.scanner.fs.InputProject; | ||||
import org.sonar.api.scanner.sensor.ProjectSensor; | import org.sonar.api.scanner.sensor.ProjectSensor; | ||||
import org.sonar.api.utils.Version; | import org.sonar.api.utils.Version; | ||||
*/ | */ | ||||
public interface SensorContext { | public interface SensorContext { | ||||
/** | |||||
* @deprecated since 6.5 use {@link #config()} | |||||
*/ | |||||
@Deprecated | |||||
Settings settings(); | |||||
/** | /** | ||||
* Get settings of the project. | * Get settings of the project. | ||||
* @since 6.5 | * @since 6.5 |
import java.io.File; | import java.io.File; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.batch.bootstrap.internal.ProjectBuilderContext; | import org.sonar.api.batch.bootstrap.internal.ProjectBuilderContext; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.Configuration; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
// this reactor is created and provided by Sonar | // this reactor is created and provided by Sonar | ||||
final ProjectReactor projectReactor = new ProjectReactor(ProjectDefinition.create()); | final ProjectReactor projectReactor = new ProjectReactor(ProjectDefinition.create()); | ||||
ProjectBuilder builder = new ProjectBuilderSample(new MapSettings()); | |||||
builder.build(new ProjectBuilderContext(projectReactor)); | |||||
ProjectBuilder builder = new ProjectBuilderSample(); | |||||
final MapSettings settings = new MapSettings(); | |||||
settings.setProperty("foo", "bar"); | |||||
final Configuration configuration = settings.asConfig(); | |||||
builder.build(new ProjectBuilderContext(projectReactor, configuration)); | |||||
assertThat(projectReactor.getProjects().size(), is(2)); | assertThat(projectReactor.getProjects().size(), is(2)); | ||||
ProjectDefinition root = projectReactor.getRoot(); | ProjectDefinition root = projectReactor.getRoot(); | ||||
} | } | ||||
final static class ProjectBuilderSample extends ProjectBuilder { | final static class ProjectBuilderSample extends ProjectBuilder { | ||||
private Settings conf; | |||||
public ProjectBuilderSample(Settings conf) { | |||||
// A real implementation should for example use the settings | |||||
this.conf = conf; | |||||
} | |||||
@Override | @Override | ||||
protected void build(ProjectReactor reactor) { | |||||
public void build(Context context) { | |||||
assertThat(context.config().get("foo")).contains("bar"); | |||||
// change name of root project | // change name of root project | ||||
ProjectDefinition root = reactor.getRoot(); | |||||
ProjectDefinition root = context.projectReactor().getRoot(); | |||||
root.setName("Name changed by plugin"); | root.setName("Name changed by plugin"); | ||||
// add sub-project | // add sub-project |
import java.util.Map; | import java.util.Map; | ||||
import javax.annotation.concurrent.Immutable; | import javax.annotation.concurrent.Immutable; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.scanner.config.DefaultConfiguration; | import org.sonar.scanner.config.DefaultConfiguration; | ||||
import java.util.Map; | import java.util.Map; | ||||
import javax.annotation.concurrent.Immutable; | import javax.annotation.concurrent.Immutable; | ||||
import org.sonar.api.CoreProperties; | import org.sonar.api.CoreProperties; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
/** | /** | ||||
* Properties that are coming from scanner. | * Properties that are coming from scanner. |
import javax.annotation.concurrent.Immutable; | import javax.annotation.concurrent.Immutable; | ||||
import org.apache.commons.lang.ArrayUtils; | import org.apache.commons.lang.ArrayUtils; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinition; | import org.sonar.api.config.PropertyDefinition; | ||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; |
import org.sonar.api.batch.postjob.PostJobContext; | import org.sonar.api.batch.postjob.PostJobContext; | ||||
import org.sonar.api.batch.postjob.issue.PostJobIssue; | import org.sonar.api.batch.postjob.issue.PostJobIssue; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
public class DefaultPostJobContext implements PostJobContext { | public class DefaultPostJobContext implements PostJobContext { | ||||
private final Configuration config; | private final Configuration config; | ||||
private final AnalysisMode analysisMode; | private final AnalysisMode analysisMode; | ||||
private final Settings mutableSettings; | |||||
public DefaultPostJobContext(Configuration config, Settings mutableSettings, AnalysisMode analysisMode) { | |||||
public DefaultPostJobContext(Configuration config, AnalysisMode analysisMode) { | |||||
this.config = config; | this.config = config; | ||||
this.mutableSettings = mutableSettings; | |||||
this.analysisMode = analysisMode; | this.analysisMode = analysisMode; | ||||
} | } | ||||
@Override | |||||
public Settings settings() { | |||||
return mutableSettings; | |||||
} | |||||
@Override | @Override | ||||
public Configuration config() { | public Configuration config() { | ||||
return config; | return config; |
package org.sonar.scanner.scan; | package org.sonar.scanner.scan; | ||||
import java.util.Map; | import java.util.Map; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.scanner.config.DefaultConfiguration; | import org.sonar.scanner.config.DefaultConfiguration; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import static java.util.Objects.requireNonNull; | import static java.util.Objects.requireNonNull; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.scanner.bootstrap.GlobalConfiguration; | import org.sonar.scanner.bootstrap.GlobalConfiguration; | ||||
import static java.util.Objects.requireNonNull; | import static java.util.Objects.requireNonNull; |
import org.sonar.api.utils.log.Logger; | import org.sonar.api.utils.log.Logger; | ||||
import org.sonar.api.utils.log.Loggers; | import org.sonar.api.utils.log.Loggers; | ||||
import org.sonar.api.utils.log.Profiler; | import org.sonar.api.utils.log.Profiler; | ||||
import org.sonar.scanner.bootstrap.GlobalConfiguration; | |||||
public class ProjectBuildersExecutor { | public class ProjectBuildersExecutor { | ||||
private static final Logger LOG = Loggers.get(ProjectBuildersExecutor.class); | private static final Logger LOG = Loggers.get(ProjectBuildersExecutor.class); | ||||
private final GlobalConfiguration globalConfig; | |||||
private final ProjectBuilder[] projectBuilders; | private final ProjectBuilder[] projectBuilders; | ||||
public ProjectBuildersExecutor(ProjectBuilder... projectBuilders) { | |||||
public ProjectBuildersExecutor(GlobalConfiguration globalConfig, ProjectBuilder... projectBuilders) { | |||||
this.globalConfig = globalConfig; | |||||
this.projectBuilders = projectBuilders; | this.projectBuilders = projectBuilders; | ||||
} | } | ||||
public ProjectBuildersExecutor() { | |||||
this(new ProjectBuilder[0]); | |||||
public ProjectBuildersExecutor(GlobalConfiguration globalConfig) { | |||||
this(globalConfig, new ProjectBuilder[0]); | |||||
} | } | ||||
public void execute(ProjectReactor reactor) { | public void execute(ProjectReactor reactor) { | ||||
if (projectBuilders.length > 0) { | if (projectBuilders.length > 0) { | ||||
Profiler profiler = Profiler.create(LOG).startInfo("Execute project builders"); | Profiler profiler = Profiler.create(LOG).startInfo("Execute project builders"); | ||||
ProjectBuilderContext context = new ProjectBuilderContext(reactor); | |||||
ProjectBuilderContext context = new ProjectBuilderContext(reactor, globalConfig); | |||||
for (ProjectBuilder projectBuilder : projectBuilders) { | for (ProjectBuilder projectBuilder : projectBuilders) { | ||||
try { | try { |
package org.sonar.scanner.scan; | package org.sonar.scanner.scan; | ||||
import java.util.Map; | import java.util.Map; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.scanner.config.DefaultConfiguration; | import org.sonar.scanner.config.DefaultConfiguration; | ||||
import org.sonar.api.SonarRuntime; | import org.sonar.api.SonarRuntime; | ||||
import org.sonar.api.batch.fs.FileSystem; | import org.sonar.api.batch.fs.FileSystem; | ||||
import org.sonar.api.batch.fs.InputModule; | import org.sonar.api.batch.fs.InputModule; | ||||
import org.sonar.api.batch.fs.internal.DefaultInputProject; | |||||
import org.sonar.api.batch.rule.ActiveRules; | import org.sonar.api.batch.rule.ActiveRules; | ||||
import org.sonar.api.batch.sensor.internal.SensorStorage; | import org.sonar.api.batch.sensor.internal.SensorStorage; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputProject; | |||||
@ThreadSafe | @ThreadSafe | ||||
public class ModuleSensorContext extends ProjectSensorContext { | public class ModuleSensorContext extends ProjectSensorContext { | ||||
private final InputModule module; | private final InputModule module; | ||||
public ModuleSensorContext(DefaultInputProject project, InputModule module, Configuration config, Settings mutableSettings, FileSystem fs, ActiveRules activeRules, | |||||
public ModuleSensorContext(DefaultInputProject project, InputModule module, Configuration config, FileSystem fs, ActiveRules activeRules, | |||||
SensorStorage sensorStorage, SonarRuntime sonarRuntime) { | SensorStorage sensorStorage, SonarRuntime sonarRuntime) { | ||||
super(project, config, mutableSettings, fs, activeRules, sensorStorage, sonarRuntime); | |||||
super(project, config, fs, activeRules, sensorStorage, sonarRuntime); | |||||
this.module = module; | this.module = module; | ||||
} | } | ||||
import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | import org.sonar.api.batch.sensor.symbol.NewSymbolTable; | ||||
import org.sonar.api.batch.sensor.symbol.internal.DefaultSymbolTable; | import org.sonar.api.batch.sensor.symbol.internal.DefaultSymbolTable; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.scanner.fs.InputProject; | import org.sonar.api.scanner.fs.InputProject; | ||||
import org.sonar.api.utils.Version; | import org.sonar.api.utils.Version; | ||||
import org.sonar.scanner.sensor.noop.NoOpNewAnalysisError; | import org.sonar.scanner.sensor.noop.NoOpNewAnalysisError; | ||||
static final NoOpNewAnalysisError NO_OP_NEW_ANALYSIS_ERROR = new NoOpNewAnalysisError(); | static final NoOpNewAnalysisError NO_OP_NEW_ANALYSIS_ERROR = new NoOpNewAnalysisError(); | ||||
private final Settings mutableSettings; | |||||
private final FileSystem fs; | private final FileSystem fs; | ||||
private final ActiveRules activeRules; | private final ActiveRules activeRules; | ||||
private final SensorStorage sensorStorage; | private final SensorStorage sensorStorage; | ||||
private final SonarRuntime sonarRuntime; | private final SonarRuntime sonarRuntime; | ||||
private final Configuration config; | private final Configuration config; | ||||
public ProjectSensorContext(DefaultInputProject project, Configuration config, Settings mutableSettings, FileSystem fs, ActiveRules activeRules, | |||||
public ProjectSensorContext(DefaultInputProject project, Configuration config, FileSystem fs, ActiveRules activeRules, | |||||
SensorStorage sensorStorage, SonarRuntime sonarRuntime) { | SensorStorage sensorStorage, SonarRuntime sonarRuntime) { | ||||
this.project = project; | this.project = project; | ||||
this.config = config; | this.config = config; | ||||
this.mutableSettings = mutableSettings; | |||||
this.fs = fs; | this.fs = fs; | ||||
this.activeRules = activeRules; | this.activeRules = activeRules; | ||||
this.sensorStorage = sensorStorage; | this.sensorStorage = sensorStorage; | ||||
this.sonarRuntime = sonarRuntime; | this.sonarRuntime = sonarRuntime; | ||||
} | } | ||||
@Override | |||||
public Settings settings() { | |||||
return mutableSettings; | |||||
} | |||||
@Override | @Override | ||||
public Configuration config() { | public Configuration config() { | ||||
return config; | return config; |
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.config.Configuration; | import org.sonar.api.config.Configuration; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinition; | import org.sonar.api.config.PropertyDefinition; | ||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.config.PropertyFieldDefinition; | import org.sonar.api.config.PropertyFieldDefinition; |
import java.util.Set; | import java.util.Set; | ||||
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.utils.log.LogTester; | import org.sonar.api.utils.log.LogTester; | ||||
import org.sonar.scanner.config.DefaultConfiguration; | import org.sonar.scanner.config.DefaultConfiguration; |
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.TemporaryFolder; | import org.junit.rules.TemporaryFolder; | ||||
import org.sonar.api.config.Encryption; | |||||
import org.sonar.api.config.internal.Encryption; | |||||
import org.sonar.api.config.PropertyDefinitions; | import org.sonar.api.config.PropertyDefinitions; | ||||
import org.sonar.api.utils.log.LogTester; | import org.sonar.api.utils.log.LogTester; | ||||
import org.sonar.api.utils.log.LoggerLevel; | import org.sonar.api.utils.log.LoggerLevel; |
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.CoreProperties; | import org.sonar.api.CoreProperties; | ||||
import org.sonar.api.SonarQubeSide; | import org.sonar.api.SonarQubeSide; | ||||
import org.sonar.api.config.Settings; | |||||
import org.sonar.api.config.internal.Settings; | |||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import org.sonar.api.internal.SonarRuntimeImpl; | import org.sonar.api.internal.SonarRuntimeImpl; | ||||
import org.sonar.api.utils.Version; | import org.sonar.api.utils.Version; |
import org.sonar.api.batch.AnalysisMode; | import org.sonar.api.batch.AnalysisMode; | ||||
import org.sonar.api.config.internal.MapSettings; | import org.sonar.api.config.internal.MapSettings; | ||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
import static org.mockito.Mockito.mock; | import static org.mockito.Mockito.mock; | ||||
public class DefaultPostJobContextTest { | public class DefaultPostJobContextTest { | ||||
public void setUp() { | public void setUp() { | ||||
settings = new MapSettings(); | settings = new MapSettings(); | ||||
AnalysisMode analysisMode = mock(AnalysisMode.class); | AnalysisMode analysisMode = mock(AnalysisMode.class); | ||||
context = new DefaultPostJobContext(settings.asConfig(), settings, analysisMode); | |||||
} | |||||
@Test | |||||
public void testSettings() { | |||||
assertThat(context.settings()).isSameAs(settings); | |||||
context = new DefaultPostJobContext(settings.asConfig(), analysisMode); | |||||
} | } | ||||
@Test(expected=UnsupportedOperationException.class) | @Test(expected=UnsupportedOperationException.class) |
import org.sonar.api.batch.bootstrap.ProjectBuilder.Context; | import org.sonar.api.batch.bootstrap.ProjectBuilder.Context; | ||||
import org.sonar.api.batch.bootstrap.ProjectReactor; | import org.sonar.api.batch.bootstrap.ProjectReactor; | ||||
import org.sonar.api.utils.MessageException; | import org.sonar.api.utils.MessageException; | ||||
import org.sonar.scanner.bootstrap.GlobalConfiguration; | |||||
import static org.mockito.ArgumentMatchers.any; | import static org.mockito.ArgumentMatchers.any; | ||||
import static org.mockito.Mockito.doThrow; | import static org.mockito.Mockito.doThrow; | ||||
exception.expectMessage("Failed to execute project builder: Mock for ProjectBuilder"); | exception.expectMessage("Failed to execute project builder: Mock for ProjectBuilder"); | ||||
exception.expect(MessageException.class); | exception.expect(MessageException.class); | ||||
new ProjectBuildersExecutor(projectBuilders).execute(reactor); | |||||
new ProjectBuildersExecutor(mock(GlobalConfiguration.class), projectBuilders).execute(reactor); | |||||
} | } | ||||
@Test | @Test | ||||
exception.expectMessage("Failed to execute project builder: org.sonar.scanner.scan.ProjectBuildersExecutorTest$MyProjectBuilder"); | exception.expectMessage("Failed to execute project builder: org.sonar.scanner.scan.ProjectBuildersExecutorTest$MyProjectBuilder"); | ||||
exception.expect(MessageException.class); | exception.expect(MessageException.class); | ||||
new ProjectBuildersExecutor(projectBuilders).execute(reactor); | |||||
new ProjectBuildersExecutor(mock(GlobalConfiguration.class), projectBuilders).execute(reactor); | |||||
} | } | ||||
static class MyProjectBuilder extends ProjectBuilder { | static class MyProjectBuilder extends ProjectBuilder { |
settings = new MapSettings(); | settings = new MapSettings(); | ||||
sensorStorage = mock(SensorStorage.class); | sensorStorage = mock(SensorStorage.class); | ||||
runtime = SonarRuntimeImpl.forSonarQube(Version.parse("5.5"), SonarQubeSide.SCANNER, SonarEdition.COMMUNITY); | runtime = SonarRuntimeImpl.forSonarQube(Version.parse("5.5"), SonarQubeSide.SCANNER, SonarEdition.COMMUNITY); | ||||
adaptor = new ModuleSensorContext(mock(DefaultInputProject.class), mock(InputModule.class), settings.asConfig(), settings, fs, activeRules, sensorStorage, runtime); | |||||
adaptor = new ModuleSensorContext(mock(DefaultInputProject.class), mock(InputModule.class), settings.asConfig(), fs, activeRules, sensorStorage, runtime); | |||||
} | } | ||||
@Test | @Test | ||||
public void shouldProvideComponents() { | public void shouldProvideComponents() { | ||||
assertThat(adaptor.activeRules()).isEqualTo(activeRules); | assertThat(adaptor.activeRules()).isEqualTo(activeRules); | ||||
assertThat(adaptor.fileSystem()).isEqualTo(fs); | assertThat(adaptor.fileSystem()).isEqualTo(fs); | ||||
assertThat(adaptor.settings()).isEqualTo(settings); | |||||
assertThat(adaptor.getSonarQubeVersion()).isEqualTo(Version.parse("5.5")); | assertThat(adaptor.getSonarQubeVersion()).isEqualTo(Version.parse("5.5")); | ||||
assertThat(adaptor.runtime()).isEqualTo(runtime); | assertThat(adaptor.runtime()).isEqualTo(runtime); | ||||