|  | @@ -1,4 +1,4 @@
 | 
	
		
			
				|  |  | -import {addGroups, addGroupsWithAttributes, addEmail, changeFullname, changeUsername} from './loginHandler';
 | 
	
		
			
				|  |  | +import {addGroupsWithAttributes, addEmail, changeFullname, changeUsername} from './loginHandler';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Oidc = {};
 | 
	
		
			
				|  |  |  httpCa = false;
 | 
	
	
		
			
				|  | @@ -14,11 +14,13 @@ if (process.env.OAUTH2_CA_CERT !== undefined) {
 | 
	
		
			
				|  |  |  	console.log(e);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +var profile = {};
 | 
	
		
			
				|  |  | +var serviceData = {};
 | 
	
		
			
				|  |  | +var userinfo = {};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  OAuth.registerService('oidc', 2, null, function (query) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    var debug = process.env.DEBUG || false;
 | 
	
		
			
				|  |  | -  var propagateOidcData = process.env.PROPAGATE_OIDC_DATA || false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    var token = getToken(query);
 | 
	
		
			
				|  |  |    if (debug) console.log('XXX: register token:', token);
 | 
	
	
		
			
				|  | @@ -28,7 +30,6 @@ OAuth.registerService('oidc', 2, null, function (query) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    var claimsInAccessToken = (process.env.OAUTH2_ADFS_ENABLED === 'true' || process.env.OAUTH2_ADFS_ENABLED === true) || false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  var userinfo;
 | 
	
		
			
				|  |  |    if(claimsInAccessToken)
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  |      // hack when using custom claims in the accessToken. On premise ADFS
 | 
	
	
		
			
				|  | @@ -44,13 +45,13 @@ OAuth.registerService('oidc', 2, null, function (query) {
 | 
	
		
			
				|  |  |    if (userinfo.metadata) userinfo = userinfo.metadata // Openshift hack
 | 
	
		
			
				|  |  |    if (debug) console.log('XXX: userinfo:', userinfo);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  var serviceData = {};
 | 
	
		
			
				|  |  |    serviceData.id = userinfo[process.env.OAUTH2_ID_MAP]; // || userinfo["id"];
 | 
	
		
			
				|  |  |    serviceData.username = userinfo[process.env.OAUTH2_USERNAME_MAP]; // || userinfo["uid"];
 | 
	
		
			
				|  |  |    serviceData.fullname = userinfo[process.env.OAUTH2_FULLNAME_MAP]; // || userinfo["displayName"];
 | 
	
		
			
				|  |  |    serviceData.accessToken = accessToken;
 | 
	
		
			
				|  |  |    serviceData.expiresAt = expiresAt;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // If on Oracle OIM email is empty or null, get info from username
 | 
	
		
			
				|  |  |    if (process.env.ORACLE_OIM_ENABLED === 'true' || process.env.ORACLE_OIM_ENABLED === true) {
 | 
	
		
			
				|  |  |      if (userinfo[process.env.OAUTH2_EMAIL_MAP]) {
 | 
	
	
		
			
				|  | @@ -74,24 +75,37 @@ OAuth.registerService('oidc', 2, null, function (query) {
 | 
	
		
			
				|  |  |      serviceData.refreshToken = token.refresh_token;
 | 
	
		
			
				|  |  |    if (debug) console.log('XXX: serviceData:', serviceData);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  var profile = {};
 | 
	
		
			
				|  |  |    profile.name = userinfo[process.env.OAUTH2_FULLNAME_MAP]; // || userinfo["displayName"];
 | 
	
		
			
				|  |  |    profile.email = userinfo[process.env.OAUTH2_EMAIL_MAP]; // || userinfo["email"];
 | 
	
		
			
				|  |  | -  if (propagateOidcData)
 | 
	
		
			
				|  |  | +  if (debug) console.log('XXX: profile:', profile);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  //temporarily store data from oidc in user.services.oidc.groups to update groups
 | 
	
		
			
				|  |  | +  serviceData.groups = (userinfo["groups"] && userinfo["wekanGroups"]) ? userinfo["wekanGroups"] : userinfo["groups"];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // groups arriving as array of strings indicate there is no scope set in oidc privider
 | 
	
		
			
				|  |  | +  // to assign teams and keep admin privileges
 | 
	
		
			
				|  |  | +  // data needs to be treated  differently.
 | 
	
		
			
				|  |  | +  // use case: in oidc provider no scope is set, hence no group attributes.
 | 
	
		
			
				|  |  | +  //    therefore: keep admin privileges for wekan as before
 | 
	
		
			
				|  |  | +  if(typeof serviceData.groups[0] === "string" )
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  | +    user = Meteor.users.findOne({'_id':  serviceData.id});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    users= Meteor.users;
 | 
	
		
			
				|  |  | -    user = users.findOne({'services.oidc.id':  serviceData.id});
 | 
	
		
			
				|  |  | -    if(user)
 | 
	
		
			
				|  |  | +    serviceData.groups.forEach(function(groupName, i)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -      (!userinfo?.["wekanGroups"]?.length) ? addGroups(user, userinfo["groups"]): addGroupsWithAttributes(user, userinfo["wekanGroups"]);
 | 
	
		
			
				|  |  | -      if(profile.email) addEmail(user, profile.email);
 | 
	
		
			
				|  |  | -      if(profile.name) changeFullname(user, profile.name);
 | 
	
		
			
				|  |  | -      if(profile.username) changeUsername(user, profile.username);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +      if(user?.isAdmin && i == 0)
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        // keep information of user.isAdmin since in loginHandler the user will // be updated regarding group admin privileges provided via oidc
 | 
	
		
			
				|  |  | +        serviceData.groups[i] = {"isAdmin": true};
 | 
	
		
			
				|  |  | +        serviceData.groups[i]["displayName"]= groupName;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      else
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        serviceData.groups[i] = {"displayName": groupName};
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (debug) console.log('XXX: profile:', profile);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    return {
 | 
	
		
			
				|  |  |      serviceData: serviceData,
 | 
	
		
			
				|  |  |      options: { profile: profile }
 | 
	
	
		
			
				|  | @@ -208,6 +222,7 @@ if (process.env.ORACLE_OIM_ENABLED === 'true' || process.env.ORACLE_OIM_ENABLED
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  var getUserInfo = function (accessToken) {
 | 
	
		
			
				|  |  |    var debug = process.env.DEBUG || false;
 | 
	
		
			
				|  |  |    var config = getConfiguration();
 | 
	
	
		
			
				|  | @@ -263,6 +278,28 @@ var getTokenContent = function (token) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    return content;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +Meteor.methods({
 | 
	
		
			
				|  |  | +  'groupRoutineOnLogin': function(info, userId)
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    check(info, Object);
 | 
	
		
			
				|  |  | +    check(userId, String);
 | 
	
		
			
				|  |  | +    var propagateOidcData = process.env.PROPAGATE_OIDC_DATA || false;
 | 
	
		
			
				|  |  | +    if (propagateOidcData)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      users= Meteor.users;
 | 
	
		
			
				|  |  | +      user = users.findOne({'_id':  userId});
 | 
	
		
			
				|  |  | +      if(user)
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        //updates/creates Groups and user admin privileges accordingly
 | 
	
		
			
				|  |  | +        addGroupsWithAttributes(user, info.groups);
 | 
	
		
			
				|  |  | +        if(info.email) addEmail(user, info.email);
 | 
	
		
			
				|  |  | +        if(info.fullname) changeFullname(user, info.fullname);
 | 
	
		
			
				|  |  | +        if(info.username) changeUsername(user, info.username);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Oidc.retrieveCredential = function (credentialToken, credentialSecret) {
 | 
	
		
			
				|  |  |    return OAuth.retrieveCredential(credentialToken, credentialSecret);
 |