blob: 314e47f7c29f9f20377c8ee39c2f2f96a14eec0d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.oak.spi.security.authentication.external;
import org.apache.jackrabbit.util.Text;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* {@code ExternalIdentityRef} defines a reference to an external identity.
*/
public class ExternalIdentityRef {
private final String id;
private final String providerName;
private final String string;
/**
* Creates a new external identity ref with the given id and provider name
* @param id the id of the identity.
* @param providerName the name of the identity provider
*/
public ExternalIdentityRef(@NotNull String id, @Nullable String providerName) {
this.id = id;
this.providerName = (providerName == null || providerName.isEmpty()) ? null : providerName;
StringBuilder b = new StringBuilder();
escape(b, id);
if (this.providerName != null) {
b.append(';');
escape(b, this.providerName);
}
string = b.toString();
}
/**
* Returns the name of the identity provider.
* @return the name of the identity provider.
*/
@Nullable
public String getProviderName() {
return providerName;
}
/**
* Returns the id of the external identity. for example the DN of an LDAP user.
* @return the id
*/
@NotNull
public String getId() {
return id;
}
/**
* Returns a string representation of this external identity reference
* @return a string representation.
*/
@NotNull
public String getString() {
return string;
}
/**
* Creates an external identity reference from a string representation.
* @param str the string
* @return the reference
*/
@NotNull
public static ExternalIdentityRef fromString(@NotNull String str) {
int idx = str.indexOf(';');
if (idx < 0) {
return new ExternalIdentityRef(Text.unescape(str), null);
} else {
return new ExternalIdentityRef(
Text.unescape(str.substring(0, idx)),
Text.unescape(str.substring(idx+1))
);
}
}
/**
* Escapes the given string and appends it to the builder.
* @param builder the builder
* @param str the string
*/
private static void escape(@NotNull StringBuilder builder, @NotNull CharSequence str) {
final int len = str.length();
for (int i=0; i<len; i++) {
char c = str.charAt(i);
if (c == '%') {
builder.append("%25");
} else if (c == ';') {
builder.append("%3b");
} else {
builder.append(c);
}
}
}
@Override
public String toString() {
return "ExternalIdentityRef{" + "id='" + id + '\'' + ", providerName='" + providerName + '\'' + '}';
}
/**
* Tests if the given object is an external identity reference and if it's
* getString() is equal to this. Note, that there is no need to
* include {@code id} and {@code provider} fields in the comparison as
* the string representation already incorporates both.
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof ExternalIdentityRef) {
return string.equals(((ExternalIdentityRef) o).string);
}
return false;
}
/**
* @return same as {@code this.getString().hashCode()}
*/
@Override
public int hashCode() {
return string.hashCode();
}
}