diff --git a/app/ldap/server/ldap.js b/app/ldap/server/ldap.js index c18370b09ce..0739e688027 100644 --- a/app/ldap/server/ldap.js +++ b/app/ldap/server/ldap.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); diff --git a/app/ldap/server/sync.js b/app/ldap/server/sync.js index e9ff3a30a45..5a17a64f9e8 100644 --- a/app/ldap/server/sync.js +++ b/app/ldap/server/sync.js @@ -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) { diff --git a/app/ldap/server/syncUsers.js b/app/ldap/server/syncUsers.js index 8713c8973e5..d1f873af86d 100644 --- a/app/ldap/server/syncUsers.js +++ b/app/ldap/server/syncUsers.js @@ -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', diff --git a/app/lib/server/functions/setUserActiveStatus.js b/app/lib/server/functions/setUserActiveStatus.js new file mode 100644 index 00000000000..5a432d8cb76 --- /dev/null +++ b/app/lib/server/functions/setUserActiveStatus.js @@ -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); +} diff --git a/server/methods/setUserActiveStatus.js b/server/methods/setUserActiveStatus.js index 2328d79d54c..d06e2aea0f3 100644 --- a/server/methods/setUserActiveStatus.js +++ b/server/methods/setUserActiveStatus.js @@ -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; },