[FIX] LDAP sync admin action was not syncing exisent users (#16671)

pull/16770/head
Rodrigo Nascimento 5 years ago committed by Diego Sampaio
parent 9d7150b574
commit 661ad361bd
No known key found for this signature in database
GPG Key ID: E060152B30502562
  1. 7
      app/ldap/server/ldap.js
  2. 9
      app/ldap/server/sync.js
  3. 4
      app/ldap/server/syncUsers.js
  4. 46
      app/lib/server/functions/setUserActiveStatus.js
  5. 42
      server/methods/setUserActiveStatus.js

@ -2,6 +2,7 @@ import { Meteor } from 'meteor/meteor';
import ldapjs from 'ldapjs';
import Bunyan from 'bunyan';
import { callbacks } from '../../callbacks/server';
import { settings } from '../../settings';
import { Logger } from '../../logger';
@ -376,6 +377,8 @@ export default class LDAP {
searchAllPaged(BaseDN, options, page) {
this.bindIfNecessary();
({ BaseDN, options } = callbacks.run('ldap.beforeSearchAll', { BaseDN, options }));
const processPage = ({ entries, title, end, next }) => {
logger.search.info(title);
// Force LDAP idle to wait the record processing
@ -425,8 +428,8 @@ export default class LDAP {
title: 'Final Page',
end: true,
});
entries = [];
} else if (entries.length) {
logger.search.info('Page');
processPage({
entries,
title: 'Page',
@ -453,6 +456,8 @@ export default class LDAP {
searchAllAsync(BaseDN, options, callback) {
this.bindIfNecessary();
({ BaseDN, options } = callbacks.run('ldap.beforeSearchAll', { BaseDN, options }));
this.client.search(BaseDN, options, (error, res) => {
if (error) {
logger.search.error(error);

@ -5,6 +5,7 @@ import { SyncedCron } from 'meteor/littledata:synced-cron';
import _ from 'underscore';
import LDAP from './ldap';
import { callbacks } from '../../callbacks/server';
import { RocketChatFile } from '../../file';
import { settings } from '../../settings';
import { Notifications } from '../../notifications';
@ -16,7 +17,7 @@ import { FileUpload } from '../../file-upload';
import { addUserToRoom, removeUserFromRoom, createRoom } from '../../lib/server/functions';
const logger = new Logger('LDAPSync', {});
export const logger = new Logger('LDAPSync', {});
export function isUserInLDAPGroup(ldap, ldapUser, user, ldapGroup) {
const syncUserRolesFilter = settings.get('LDAP_Sync_User_Data_Groups_Filter').trim();
@ -531,7 +532,7 @@ export function importNewUsers(ldap) {
}));
}
function sync() {
export function sync() {
if (settings.get('LDAP_Enable') !== true) {
return;
}
@ -562,9 +563,9 @@ function sync() {
if (ldapUser) {
syncUserData(user, ldapUser, ldap);
} else {
logger.info('Can\'t sync user', user.username);
}
callbacks.run('ldap.afterSyncExistentUser', { ldapUser, user });
});
}
} catch (error) {

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
import { importNewUsers } from './sync';
import { sync } from './sync';
import { hasRole } from '../../authorization';
import { settings } from '../../settings';
@ -21,7 +21,7 @@ Meteor.methods({
this.unblock();
importNewUsers();
sync();
return {
message: 'Sync_in_progress',

@ -0,0 +1,46 @@
import { check } from 'meteor/check';
import { Accounts } from 'meteor/accounts-base';
import * as Mailer from '../../../mailer';
import { Users, Subscriptions } from '../../../models';
import { settings } from '../../../settings';
export function setUserActiveStatus(userId, active) {
check(userId, String);
check(active, Boolean);
const user = Users.findOneById(userId);
if (!user) {
return false;
}
Users.setUserActive(userId, active);
if (user.username) {
Subscriptions.setArchivedByUsername(user.username, !active);
}
if (active === false) {
Users.unsetLoginTokens(userId);
} else {
Users.unsetReason(userId);
}
if (active && !settings.get('Accounts_Send_Email_When_Activating')) {
return true;
}
if (!active && !settings.get('Accounts_Send_Email_When_Deactivating')) {
return true;
}
const destinations = Array.isArray(user.emails) && user.emails.map((email) => `${ user.name || user.username }<${ email.address }>`);
const email = {
to: destinations,
from: settings.get('From_Email'),
subject: Accounts.emailTemplates.userActivated.subject({ active }),
html: Accounts.emailTemplates.userActivated.html({ active, name: user.name, username: user.username }),
};
Mailer.sendNoWrap(email);
}

@ -1,11 +1,8 @@
import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
import { Accounts } from 'meteor/accounts-base';
import * as Mailer from '../../app/mailer';
import { hasPermission } from '../../app/authorization';
import { Users, Subscriptions } from '../../app/models';
import { settings } from '../../app/settings';
import { setUserActiveStatus } from '../../app/lib/server/functions/setUserActiveStatus';
Meteor.methods({
setUserActiveStatus(userId, active) {
@ -24,42 +21,7 @@ Meteor.methods({
});
}
const user = Users.findOneById(userId);
if (!user) {
return false;
}
Users.setUserActive(userId, active);
if (user.username) {
Subscriptions.setArchivedByUsername(user.username, !active);
}
if (active === false) {
Users.unsetLoginTokens(userId);
} else {
Users.unsetReason(userId);
}
if (active && !settings.get('Accounts_Send_Email_When_Activating')) {
return true;
}
if (!active && !settings.get('Accounts_Send_Email_When_Deactivating')) {
return true;
}
const destinations = Array.isArray(user.emails) && user.emails.map((email) => `${ user.name || user.username }<${ email.address }>`);
const email = {
to: destinations,
from: settings.get('From_Email'),
subject: Accounts.emailTemplates.userActivated.subject({ active }),
html: Accounts.emailTemplates.userActivated.html({ active, name: user.name, username: user.username }),
};
Mailer.sendNoWrap(email);
setUserActiveStatus(userId, active);
return true;
},

Loading…
Cancel
Save