| // Copyright (C) 2021 The Android Open Source Project | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| package com.google.gerrit.server.account.externalids; | |
| import com.google.common.annotations.VisibleForTesting; | |
| import com.google.gerrit.common.Nullable; | |
| import com.google.gerrit.server.config.AuthConfig; | |
| import com.google.inject.ImplementedBy; | |
| import javax.inject.Inject; | |
| import javax.inject.Singleton; | |
| @Singleton | |
| public class ExternalIdKeyFactory { | |
| @ImplementedBy(ConfigImpl.class) | |
| public interface Config { | |
| boolean isUserNameCaseInsensitive(); | |
| } | |
| /** | |
| * Default implementation {@link Config} | |
| * | |
| * <p>Internally in google we are using different implementation. | |
| */ | |
| @Singleton | |
| public static class ConfigImpl implements Config { | |
| private final boolean isUserNameCaseInsensitive; | |
| @VisibleForTesting | |
| @Inject | |
| public ConfigImpl(AuthConfig authConfig) { | |
| this.isUserNameCaseInsensitive = authConfig.isUserNameCaseInsensitive(); | |
| } | |
| @Override | |
| public boolean isUserNameCaseInsensitive() { | |
| return isUserNameCaseInsensitive; | |
| } | |
| } | |
| private final boolean isUserNameCaseInsensitive; | |
| @Inject | |
| public ExternalIdKeyFactory(Config config) { | |
| this.isUserNameCaseInsensitive = config.isUserNameCaseInsensitive(); | |
| } | |
| /** | |
| * Creates an external ID key. | |
| * | |
| * @param scheme the scheme name, must not contain colons (':'). E.g. {@link | |
| * ExternalId#SCHEME_USERNAME}. | |
| * @param id the external ID, must not contain colons (':') | |
| * @return the created external ID key | |
| */ | |
| public ExternalId.Key create(@Nullable String scheme, String id) { | |
| return create(scheme, id, isUserNameCaseInsensitive); | |
| } | |
| /** | |
| * Creates an external ID key. | |
| * | |
| * @param scheme the scheme name, must not contain colons (':'). E.g. {@link | |
| * ExternalId#SCHEME_USERNAME}. | |
| * @param id the external ID, must not contain colons (':') | |
| * @param userNameCaseInsensitive whether the external ID key is matched case insensitively | |
| * @return the created external ID key | |
| */ | |
| public ExternalId.Key create( | |
| @Nullable String scheme, String id, boolean userNameCaseInsensitive) { | |
| if (scheme != null | |
| && (scheme.equals(ExternalId.SCHEME_USERNAME) || scheme.equals(ExternalId.SCHEME_GERRIT))) { | |
| return ExternalId.Key.create(scheme, id, userNameCaseInsensitive); | |
| } | |
| return ExternalId.Key.create(scheme, id, false); | |
| } | |
| /** | |
| * Parses an external ID key from its String representation | |
| * | |
| * @param externalId String representation of external ID key (e.g. username:johndoe) | |
| * @return the external Id key object | |
| */ | |
| public ExternalId.Key parse(String externalId) { | |
| int c = externalId.indexOf(':'); | |
| if (c < 1 || c >= externalId.length() - 1) { | |
| return create(null, externalId); | |
| } | |
| return create(externalId.substring(0, c), externalId.substring(c + 1)); | |
| } | |
| } |