in classes/task/usersync.php [86:248]
public function execute() {
if (utils::is_configured() !== true) {
$this->mtrace('Microsoft 365 not configured');
return false;
}
if (main::is_enabled() !== true) {
$this->mtrace('Azure AD cron sync disabled. Nothing to do.');
return true;
}
$this->mtrace('Starting sync');
raise_memory_limit(MEMORY_HUGE);
$usersync = new main();
// Do not time out when syncing users.
@set_time_limit(0);
if (main::sync_option_enabled('nodelta') === true) {
$skiptoken = $this->get_token('skiptokenfull');
if (!empty($skiptoken)) {
$this->mtrace('Using skiptoken (full)');
} else {
$this->mtrace('No skiptoken (full) stored.');
}
$this->mtrace('Forcing full sync.');
$this->mtrace('Contacting Azure AD...');
$users = [];
try {
$continue = true;
while ($continue) {
[$returnedusers, $skiptoken] = $usersync->get_users('default', $skiptoken);
$users = array_merge($users, $returnedusers);
$continue = (!empty($skiptoken));
}
} catch (\Exception $e) {
$this->mtrace('Error in full usersync: ' . $e->getMessage());
utils::debug($e->getMessage(), 'usersync task', $e);
$this->mtrace('Resetting skip and delta tokens.');
$skiptoken = null;
}
$this->mtrace('Got response from Azure AD');
// Store skiptoken.
if (!empty($skiptoken)) {
$this->mtrace('Storing skiptoken (full)');
} else {
$this->mtrace('Clearing skiptoken (full) (none received)');
}
$this->store_token('skiptokenfull', $skiptoken);
} else {
$skiptoken = $this->get_token('skiptokendelta');
if (!empty($skiptoken)) {
$this->mtrace('Using skiptoken (delta)');
} else {
$this->mtrace('No skiptoken (delta) stored.');
}
$deltatoken = $this->get_token('deltatoken');
if (!empty($deltatoken)) {
$this->mtrace('Using deltatoken.');
} else {
$this->mtrace('No deltatoken stored.');
}
$this->mtrace('Using delta sync.');
$this->mtrace('Contacting Azure AD...');
$users = [];
try {
$continue = true;
while ($continue) {
[$returnedusers, $skiptoken, $deltatoken] = $usersync->get_users_delta('default', $skiptoken, $deltatoken);
$users = array_merge($users, $returnedusers);
$continue = (empty($deltatoken) && !empty($skiptoken));
}
} catch (\Exception $e) {
$this->mtrace('Error in delta usersync: ' . $e->getMessage());
utils::debug($e->getMessage(), 'usersync task', $e);
$this->mtrace('Resetting skip and delta tokens.');
$skiptoken = null;
$deltatoken = null;
}
$this->mtrace('Got response from Azure AD');
// Store deltatoken.
if (!empty($deltatoken)) {
$this->mtrace('Storing deltatoken');
} else {
$this->mtrace('Clearing deltatoken (none received)');
}
$this->store_token('deltatoken', $deltatoken);
// Store skiptoken.
if (!empty($skiptoken)) {
$this->mtrace('Storing skiptoken (delta)');
} else {
$this->mtrace('Clearing skiptoken (delta) (none received)');
}
$this->store_token('skiptokendelta', $skiptoken);
}
if (!empty($users)) {
$this->mtrace(count($users) . ' users received. Syncing...');
$this->sync_users($usersync, $users);
} else {
$this->mtrace('No users received to sync.');
}
if (main::sync_option_enabled('suspend') || main::sync_option_enabled('reenable')) {
$lastruntime = get_config('local_o365', 'task_usersync_lastdelete');
$rundelete = true;
if ($lastruntime === false) {
$lastruntime = strtotime('today midnight');
set_config('task_usersync_lastdelete', $lastruntime, 'local_o365');
} else {
if ($lastruntime + 24 * 60 * 60 > time()) {
$rundelete = false;
$this->mtrace('Suspend/delete users feature disabled because it was run less than 1 day ago.');
} else {
set_config('task_usersync_lastdelete', time(), 'local_o365');
}
}
if ($rundelete) {
$this->mtrace('Start suspend/delete users feature...');
if (main::sync_option_enabled('nodelta') !== true) {
// Make sure $users contains all aad users - if delta sync was used, do a full sync.
$skiptoken = '';
$users = [];
try {
$continue = true;
while ($continue) {
[$returnedusers, $skiptoken] = $usersync->get_users('default', $skiptoken);
$users = array_merge($users, $returnedusers);
$continue = (!empty($skiptoken));
}
} catch (\Exception $e) {
$this->mtrace('Error in full usersync: ' . $e->getMessage());
utils::debug($e->getMessage(), 'usersync task', $e);
$this->mtrace('Resetting skip and delta tokens.');
$skiptoken = null;
}
}
if (main::sync_option_enabled('suspend')) {
$this->mtrace('Suspending deleted users...');
$usersync->suspend_users($users, main::sync_option_enabled('delete'));
}
if (main::sync_option_enabled('reenable')) {
$this->mtrace('Re-enabling suspended users...');
$usersync->reenable_suspsend_users($users, main::sync_option_enabled('disabledsync'));
}
}
}
$this->mtrace('Sync process finished.');
return true;
}