Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding new features and refactoring #52

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
12 changes: 6 additions & 6 deletions dxp-oidc-filter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
<name>OpenID Connect DXP filter</name>

<parent>
<artifactId>oidc-parent</artifactId>
<groupId>nl.finalist.liferay.oidc</groupId>
<version>0.5.3-SNAPSHOT</version>
</parent>
<artifactId>oidc-parent</artifactId>
<groupId>nl.finalist.liferay.oidc</groupId>
<version>0.5.3-RELEASE</version>
</parent>
<dependencies>

<dependency>
Expand Down Expand Up @@ -61,8 +61,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,25 @@
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.model.UserGroup;
import com.liferay.portal.kernel.module.configuration.ConfigurationException;
import com.liferay.portal.kernel.module.configuration.ConfigurationProvider;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.UserGroupLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.service.persistence.UserGroupUtil;
import com.liferay.portal.kernel.service.persistence.UserUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.PwdGenerator;
import com.liferay.portal.kernel.util.StringPool;

import java.util.Calendar;
import java.util.Locale;
import nl.finalist.liferay.oidc.configuration.OpenIDConnectOCDConfiguration;
import nl.finalist.liferay.oidc.dto.PersonGroupDto;
import nl.finalist.liferay.oidc.dto.UserDto;

import javax.servlet.http.HttpServletRequest;

import nl.finalist.liferay.oidc.configuration.OpenIDConnectOCDConfiguration;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;


public class Liferay70Adapter implements LiferayAdapter {
Expand All @@ -31,8 +35,8 @@ public class Liferay70Adapter implements LiferayAdapter {


public Liferay70Adapter(UserLocalService userLocalService, ConfigurationProvider
configurationProvider) {
this.userLocalService = userLocalService;
configurationProvider) {
this.userLocalService = userLocalService;
this.configurationProvider = configurationProvider;
}

Expand All @@ -43,7 +47,7 @@ public OIDCConfiguration getOIDCConfiguration(long companyId) {
throw new SystemException(e);
}
}

@Override
public void trace(String s) {
LOG.trace(s);
Expand Down Expand Up @@ -90,79 +94,148 @@ public long getCompanyId(HttpServletRequest request) {


@Override
public String createOrUpdateUser(long companyId, String emailAddress, String firstName, String lastName) {

public Long createOrUpdateUser(long companyId, UserDto userDto) {
try {
User user = userLocalService.fetchUserByEmailAddress(companyId, emailAddress);

User user = userLocalService.fetchUserByUuidAndCompanyId(userDto.getUuid(), companyId);
if (user == null) {
LOG.debug("No Liferay user found with email address " + emailAddress + ", will create one.");
user = addUser(companyId, emailAddress, firstName, lastName);
user = addUser(companyId, userDto);
} else {
LOG.debug("User found, updating name details with info from userinfo");
updateUser(user, firstName, lastName);
updateUser(user, userDto);
}
return String.valueOf(user.getUserId());
return user.getUserId();

} catch (SystemException | PortalException e) {
throw new RuntimeException(e);
}
}

@Override
public Set<Long> createOrUpdateUserGroup(long companyId, long userId, Set<PersonGroupDto> personGroupDtos) {
Set<Long> groupIds = new HashSet<>();
for (PersonGroupDto personGroupDto : personGroupDtos) {
try {
final UserGroup userGroup = UserGroupLocalServiceUtil.fetchUserGroupByUuidAndCompanyId(personGroupDto.getUuid(), companyId);
if (userGroup == null) {
groupIds.add(addNewUserGroup(companyId, userId, personGroupDto).getUserGroupId());
} else {
groupIds.add(updateUserGroup(userGroup, personGroupDto).getUserGroupId());
}
} catch (SystemException e) {
LOG.error(e.getMessage());
}
}
return groupIds;
}

private UserGroup updateUserGroup(UserGroup userGroup, PersonGroupDto personGroupDto) {
try {
userGroup.setName(personGroupDto.getName());
return UserGroupLocalServiceUtil.updateUserGroup(userGroup);
} catch (SystemException e) {
throw new RuntimeException(e);
}
}

private UserGroup addNewUserGroup(long companyId, long userId, PersonGroupDto personGroupDto) {
try {
final UserGroup userGroup = UserGroupLocalServiceUtil.addUserGroup(userId, companyId, personGroupDto.getName(), null, null);
userGroup.setUuid(personGroupDto.getUuid());
return UserGroupLocalServiceUtil.updateUserGroup(userGroup);
} catch (PortalException | SystemException e) {
throw new RuntimeException(e);
}
}

@Override
public void addUserInUserGroup(Long userId, Set<Long> newUserGroupIds) {
try {
final Set<Long> oldUserGroupIds = UserGroupLocalServiceUtil.getUserUserGroups(userId).stream()
.map(getUserGroupLongFunction())
.collect(Collectors.toSet());
final long[] newIdsArray = newUserGroupIds.stream()
.filter(id -> !oldUserGroupIds.contains(id))
.mapToLong(Long::longValue)
.toArray();
final long[] deleteIds = oldUserGroupIds.stream()
.filter(id -> !newUserGroupIds.contains(id))
.mapToLong(Long::longValue)
.toArray();
if (newIdsArray != null && newIdsArray.length > 0) {
UserUtil.addUserGroups(userId, newIdsArray);
UserGroupUtil.clearCache();
}
if (deleteIds != null && deleteIds.length > 0) {
UserUtil.removeUserGroups(userId, deleteIds);
UserGroupUtil.clearCache();
}
} catch (SystemException e) {
throw new RuntimeException(e);
}
}

private Function<UserGroup, Long> getUserGroupLongFunction() {
return userGroup -> {
try {
return userGroup.getUserGroupId();
} catch (SystemException e) {
throw new RuntimeException(e);
}
};
}


// Copied from OpenSSOAutoLogin.java
protected User addUser(
long companyId, String emailAddress, String firstName, String lastName)
throws SystemException, PortalException {

Locale locale = LocaleUtil.getMostRelevantLocale();
long creatorUserId = 0;
boolean autoPassword = false;
String password1 = PwdGenerator.getPassword();
String password2 = password1;
boolean autoScreenName = true;
String screenName = "not_used_but_autogenerated_instead";
long facebookId = 0;
String openId = StringPool.BLANK;
String middleName = StringPool.BLANK;
int prefixId = 0;
int suffixId = 0;
boolean male = true;
int birthdayMonth = Calendar.JANUARY;
int birthdayDay = 1;
int birthdayYear = 1970;
String jobTitle = StringPool.BLANK;
long[] groupIds = null;
long[] organizationIds = null;
long[] roleIds = null;
long[] userGroupIds = null;
boolean sendEmail = false;
protected User addUser(long companyId, UserDto userDto) throws SystemException, PortalException {
ServiceContext serviceContext = new ServiceContext();

User user = userLocalService.addUser(
creatorUserId, companyId, autoPassword, password1, password2,
autoScreenName, screenName, emailAddress, facebookId, openId,
locale, firstName, middleName, lastName, prefixId, suffixId, male,
birthdayMonth, birthdayDay, birthdayYear, jobTitle, groupIds,
organizationIds, roleIds, userGroupIds, sendEmail, serviceContext);

// No password
user.setPasswordReset(false);
// No reminder query at first login.
user.setReminderQueryQuestion("x");
user.setReminderQueryAnswer("y");
User user = UserLocalServiceUtil.addUser(
userDto.getCreatorUserId(),
companyId,
userDto.isAutoPassword(),
userDto.getPassword1(),
userDto.getPassword2(),
userDto.isAutoScreenName(),
userDto.getScreenName(),
userDto.getEmail(),
userDto.getFacebookId(),
userDto.getOpenId(),
userDto.getLocale(),
userDto.getFirstName(),
userDto.getMiddleName(),
userDto.getLastName(),
userDto.getPrefixId(),
userDto.getSuffixId(),
userDto.isMale(),
userDto.getBirthdayMonth(),
userDto.getBirthdayDay(),
userDto.getBirthdayYear(),
userDto.getJobTitle(),
userDto.getGroupIds(),
userDto.getOrganizationIds(),
userDto.getRoleIds(),
null,
userDto.isSendEmail(),
serviceContext
);
user.setUuid(userDto.getUuid());
user.setPasswordReset(userDto.isPasswordReset());
user.setReminderQueryQuestion(userDto.getQueryQuestion());
user.setReminderQueryAnswer(userDto.getQueryAnswer());
userLocalService.updateUser(user);
return user;
}

private void updateUser(User user, UserDto userDto) {
user.setFirstName(userDto.getFirstName());
user.setLastName(userDto.getLastName());
user.setMiddleName(userDto.getMiddleName());
user.setEmailAddress(userDto.getEmail());

private void updateUser(User user, String firstName, String lastName) {
user.setFirstName(firstName);
user.setLastName(lastName);
try {
userLocalService.updateUser(user);
} catch (SystemException e) {
LOG.error("Could not update user with new name attributes", e);
}
}


}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package nl.finalist.liferay.oidc.configuration;

import com.liferay.portal.configuration.metatype.annotations.ExtendedObjectClassDefinition;

import aQute.bnd.annotation.metatype.Meta;
import com.liferay.portal.configuration.metatype.annotations.ExtendedObjectClassDefinition;
import nl.finalist.liferay.oidc.OIDCConfiguration;

/**
Expand Down Expand Up @@ -39,22 +38,27 @@ public interface OpenIDConnectOCDConfiguration extends OIDCConfiguration {
String tokenLocation();

@Meta.AD(
required = true
required = true
)
String profileUri();

@Meta.AD(
required = false
required = false
)
String ssoLogoutUri();

@Meta.AD(
required = false
required = false
)
String ssoLogoutToken();

@Meta.AD(
required = false
)
String ssoLogoutParam();

@Meta.AD(
required = false
required = false
)
String ssoLogoutValue();

Expand Down
2 changes: 1 addition & 1 deletion dxp-oidc-portalsettings-web/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<parent>
<artifactId>oidc-parent</artifactId>
<groupId>nl.finalist.liferay.oidc</groupId>
<version>0.5.3-SNAPSHOT</version>
<version>0.5.3-RELEASE</version>
</parent>
<dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
String tokenLocation = oidcConfiguration.tokenLocation();
String profileUri = oidcConfiguration.profileUri();
String ssoLogoutUri = oidcConfiguration.ssoLogoutUri();
String ssoLogoutToken = oidcConfiguration.ssoLogoutToken();
String ssoLogoutParam = oidcConfiguration.ssoLogoutParam();
String ssoLogoutValue = oidcConfiguration.ssoLogoutValue();
String issuer = oidcConfiguration.issuer();
Expand All @@ -39,6 +40,8 @@
<aui:option label="azure" value="azure" />
</aui:select>
<aui:input cssClass="lfr-input-text-container" label="ssoLogoutUri" name='<%= ns + "ssoLogoutUri" %>' type="text" value="<%= ssoLogoutUri %>" />
<aui:input cssClass="lfr-input-text-container" label="ssoLogoutToken" name='<%= ns + "ssoLogoutToken" %>'
type="text" value="<%= ssoLogoutToken %>"/>
<aui:input cssClass="lfr-input-text-container" label="ssoLogoutParam" name='<%= ns + "ssoLogoutParam" %>' type="text" value="<%= ssoLogoutParam %>" />
<aui:input cssClass="lfr-input-text-container" label="ssoLogoutValue" name='<%= ns + "ssoLogoutValue" %>' type="text" value="<%= ssoLogoutValue %>" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
authorizationLocation=Location of the authorization service (example: https://accounts.google.com/o/oauth2/v2/auth)
tokenLocation=Location of the token service (example: https://www.googleapis.com/oauth2/v4/token)
profileUri = UserInfo endpoint (example: https://www.googleapis.com/plus/v1/people/me/openIdConnect)
ssoLogoutUri = SSO logout endpoint (optional)
ssoLogoutParam = Parameter name supplied to SSO logout endpoint (optional)
ssoLogoutUri=SSO logout endpoint (optional)
ssoLogoutToken=Access token that allows you to log out any user
ssoLogoutParam=Parameter name supplied to SSO logout endpoint (optional)
ssoLogoutValue = Parameter value supplied to SSO logout endpoint (optional)
issuer = Issuer
issuer-helpMessage=Name of the issuer, to be confirmed with the contents of the ID token
Expand Down
10 changes: 9 additions & 1 deletion oidc-hook/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>oidc-parent</artifactId>
<groupId>nl.finalist.liferay.oidc</groupId>
<version>0.5.3-SNAPSHOT</version>
<version>0.5.3-RELEASE</version>
</parent>

<artifactId>oidc-hook</artifactId>
Expand Down Expand Up @@ -34,6 +34,14 @@
<outputFileNameMapping>@{artifactId}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>

Expand Down
Loading