/**
* 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.cxf.rs.security.oidc.common;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.rs.security.jose.jwt.JwtClaims;
import org.apache.cxf.rs.security.oidc.utils.OidcUtils;
public abstract class AbstractUserInfo extends JwtClaims {
public static final String NAME_CLAIM = "name";
public static final String GIVEN_NAME_CLAIM = "given_name";
public static final String FAMILY_NAME_CLAIM = "family_name";
public static final String MIDDLE_NAME_CLAIM = "middle_name";
public static final String NICKNAME_CLAIM = "nickname";
public static final String PREFERRED_USERNAME_CLAIM = "preferred_username";
public static final String PROFILE_CLAIM = "profile";
public static final String PICTURE_CLAIM = "picture";
public static final String WEBSITE_CLAIM = "website";
public static final String EMAIL_CLAIM = "email";
public static final String EMAIL_VERIFIED_CLAIM = "email_verified";
public static final String GENDER_CLAIM = "gender";
public static final String ZONEINFO_CLAIM = "zoneinfo";
public static final String LOCALE_CLAIM = "locale";
public static final String BIRTHDATE_CLAIM = "birthdate";
public static final String PHONE_CLAIM = "phone_number";
public static final String PHONE_VERIFIED_CLAIM = "phone_number_verified";
public static final String ADDRESS_CLAIM = "address";
public static final String UPDATED_AT_CLAIM = "updated_at";
private static final long serialVersionUID = 4554501320190745304L;
public AbstractUserInfo() {
}
public AbstractUserInfo(JwtClaims claims) {
this(claims.asMap());
}
public AbstractUserInfo(Map<String, Object> claims) {
super(claims);
}
public void setName(String name) {
setProperty(NAME_CLAIM, name);
}
public String getName() {
return (String)getProperty(NAME_CLAIM);
}
public void setGivenName(String name) {
setProperty(GIVEN_NAME_CLAIM, name);
}
public String getGivenName() {
return (String)getProperty(GIVEN_NAME_CLAIM);
}
public void setFamilyName(String name) {
setProperty(FAMILY_NAME_CLAIM, name);
}
public String getFamilyName() {
return (String)getProperty(FAMILY_NAME_CLAIM);
}
public void setMiddleName(String name) {
setProperty(MIDDLE_NAME_CLAIM, name);
}
public String getMiddleName() {
return (String)getProperty(MIDDLE_NAME_CLAIM);
}
public void setNickName(String name) {
setProperty(NICKNAME_CLAIM, name);
}
public String getNickName() {
return (String)getProperty(NICKNAME_CLAIM);
}
public void setPreferredUserName(String name) {
setProperty(PREFERRED_USERNAME_CLAIM, name);
}
public String getPreferredUserName() {
return (String)getProperty(PREFERRED_USERNAME_CLAIM);
}
public void setProfile(String name) {
setProperty(PROFILE_CLAIM, name);
}
public String getProfile() {
return (String)getProperty(PROFILE_CLAIM);
}
public void setPicture(String name) {
setProperty(PICTURE_CLAIM, name);
}
public String getPicture() {
return (String)getProperty(PICTURE_CLAIM);
}
public void setWebsite(String name) {
setProperty(WEBSITE_CLAIM, name);
}
public String getWebsite() {
return (String)getProperty(WEBSITE_CLAIM);
}
public void setGender(String name) {
setProperty(GENDER_CLAIM, name);
}
public String getGender() {
return (String)getProperty(GENDER_CLAIM);
}
public void setZoneInfo(String name) {
setProperty(ZONEINFO_CLAIM, name);
}
public String getZoneInfo() {
return (String)getProperty(ZONEINFO_CLAIM);
}
public void setLocale(String name) {
setProperty(LOCALE_CLAIM, name);
}
public String getLocale() {
return (String)getProperty(LOCALE_CLAIM);
}
public void setEmail(String name) {
setProperty(EMAIL_CLAIM, name);
}
public String getEmail() {
return (String)getProperty(EMAIL_CLAIM);
}
public void setEmailVerified(Boolean verified) {
setProperty(EMAIL_VERIFIED_CLAIM, verified);
}
public Boolean getEmailVerified() {
return getBooleanProperty(EMAIL_VERIFIED_CLAIM);
}
public void setBirthDate(String date) {
setProperty(BIRTHDATE_CLAIM, date);
}
public String getBirthDate() {
return (String)getProperty(BIRTHDATE_CLAIM);
}
public String getPhoneNumber() {
return (String)getProperty(PHONE_CLAIM);
}
public void setPhoneNumber(String name) {
setProperty(PHONE_CLAIM, name);
}
public void setPhoneVerified(Boolean verified) {
setProperty(PHONE_VERIFIED_CLAIM, verified);
}
public Boolean getPhoneVerified() {
return getBooleanProperty(PHONE_VERIFIED_CLAIM);
}
public UserAddress getUserAddress() {
Object value = getProperty(ADDRESS_CLAIM);
if (value instanceof UserAddress) {
return (UserAddress)value;
} else if (value instanceof Map) {
Map<String, Object> map = CastUtils.cast((Map<?, ?>)value);
return new UserAddress(map);
} else {
return null;
}
}
public void setUserAddress(UserAddress address) {
setProperty(ADDRESS_CLAIM, address);
}
public void setUpdatedAt(Long time) {
setProperty(UPDATED_AT_CLAIM, time);
}
public Long getUpdatedAt() {
return getLongProperty(UPDATED_AT_CLAIM);
}
public void setAggregatedClaims(AggregatedClaims claims) {
setAddClaimNames(claims.getClaimNames());
Map<String, Map<String, String>> sources = new LinkedHashMap<String, Map<String, String>>();
for (Map.Entry<String, String> entry : claims.getClaimNames().entrySet()) {
String source = entry.getValue();
String jwt = claims.getClaimSources().get(source);
sources.put(source,
Collections.singletonMap(OidcUtils.JWT_CLAIM_SOURCE_PROPERTY, jwt));
}
setAddClaimSources(sources);
}
private void setAddClaimSources(Map<String, Map<String, String>> newSources) {
Map<String, Map<String, String>> sources =
CastUtils.cast((Map<?, ?>)getProperty(OidcUtils.CLAIM_SOURCES_PROPERTY));
if (sources == null) {
setProperty(OidcUtils.CLAIM_SOURCES_PROPERTY, sources);
} else {
sources.putAll(newSources);
}
}
private void setAddClaimNames(Map<String, String> claimNames) {
Map<String, String> names = CastUtils.cast((Map<?, ?>)getProperty(OidcUtils.CLAIM_NAMES_PROPERTY));
if (names == null) {
setProperty(OidcUtils.CLAIM_NAMES_PROPERTY, claimNames);
} else {
names.putAll(claimNames);
}
}
public AggregatedClaims getAggregatedClaims() {
Map<String, String> names = CastUtils.cast((Map<?, ?>)getProperty(OidcUtils.CLAIM_NAMES_PROPERTY));
Map<String, Map<String, String>> sources =
CastUtils.cast((Map<?, ?>)getProperty(OidcUtils.CLAIM_SOURCES_PROPERTY));
if (names == null || sources == null) {
return null;
}
AggregatedClaims claims = new AggregatedClaims();
Map<String, String> namesMap = new LinkedHashMap<String, String>();
Map<String, String> sourcesMap = new LinkedHashMap<String, String>();
for (Map.Entry<String, String> entry : names.entrySet()) {
String source = entry.getValue();
Map<String, String> sourceValue = sources.get(source);
if (sourceValue != null && sourceValue.containsKey(OidcUtils.JWT_CLAIM_SOURCE_PROPERTY)) {
namesMap.put(entry.getKey(), source);
String jwt = sourceValue.values().iterator().next();
sourcesMap.put(source, jwt);
}
}
claims.setClaimNames(namesMap);
claims.setClaimSources(sourcesMap);
return claims;
}
public void setDistributedClaims(DistributedClaims claims) {
setAddClaimNames(claims.getClaimNames());
Map<String, Map<String, String>> sources = new LinkedHashMap<String, Map<String, String>>();
for (Map.Entry<String, String> entry : claims.getClaimNames().entrySet()) {
String source = entry.getValue();
DistributedClaimSource distSource = claims.getClaimSources().get(source);
Map<String, String> mapSource = new LinkedHashMap<String, String>();
mapSource.put(OidcUtils.ENDPOINT_CLAIM_SOURCE_PROPERTY, distSource.getEndpoint());
if (distSource.getAccessToken() != null) {
mapSource.put(OidcUtils.TOKEN_CLAIM_SOURCE_PROPERTY, distSource.getAccessToken());
}
sources.put(source, mapSource);
}
setAddClaimSources(sources);
}
public DistributedClaims getDistributedClaims() {
Map<String, String> names = CastUtils.cast((Map<?, ?>)getProperty(OidcUtils.CLAIM_NAMES_PROPERTY));
Map<String, Map<String, String>> sources =
CastUtils.cast((Map<?, ?>)getProperty(OidcUtils.CLAIM_SOURCES_PROPERTY));
if (names == null || sources == null) {
return null;
}
DistributedClaims claims = new DistributedClaims();
Map<String, String> namesMap = new LinkedHashMap<String, String>();
Map<String, DistributedClaimSource> sourcesMap = new LinkedHashMap<String, DistributedClaimSource>();
for (Map.Entry<String, String> entry : names.entrySet()) {
String source = entry.getValue();
Map<String, String> sourceValue = sources.get(source);
if (sourceValue != null
&& !sourceValue.containsKey(OidcUtils.JWT_CLAIM_SOURCE_PROPERTY)) {
namesMap.put(entry.getKey(), source);
DistributedClaimSource distSource = new DistributedClaimSource();
distSource.setEndpoint(sourceValue.get(OidcUtils.ENDPOINT_CLAIM_SOURCE_PROPERTY));
distSource.setAccessToken(sourceValue.get(OidcUtils.TOKEN_CLAIM_SOURCE_PROPERTY));
sourcesMap.put(source, distSource);
}
}
claims.setClaimNames(namesMap);
claims.setClaimSources(sourcesMap);
return claims;
}
}