ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilCronDeleteInactiveUserAccounts.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once "Services/Cron/classes/class.ilCronJob.php";
5 include_once 'Services/Mail/classes/class.ilMimeMail.php';
6 include_once 'Services/User/classes/class.ilCronDeleteInactiveUserReminderMail.php';
7 
18 {
21 
22  private $period = null;
23  private $reminderTimer = null;
24  private $include_roles = null;
25 
26  public function __construct()
27  {
28  global $DIC;
29 
30  $ilSetting = $DIC['ilSetting'];
31 
32  if (is_object($ilSetting)) {
33  $this->include_roles = $ilSetting->get(
34  'cron_inactive_user_delete_include_roles',
35  null
36  );
37  if ($this->include_roles === null) {
38  $this->include_roles = array();
39  } else {
40  $this->include_roles = explode(',', $this->include_roles);
41  }
42 
43  $this->period = $ilSetting->get(
44  'cron_inactive_user_delete_period',
45  self::DEFAULT_INACTIVITY_PERIOD
46  );
47  $this->reminderTimer = $ilSetting->get(
48  'cron_inactive_user_reminder_period',
49  self::DEFAULT_REMINDER_PERIOD
50  );
51  }
52  }
53 
59  protected function getTimeDifferenceBySchedule($schedule_time, $multiplier)
60  {
61  $time_difference = 0;
62  switch ($schedule_time) {
64  $time_difference = 86400;
65  break;
67  $time_difference = 60 * $multiplier;
68  break;
70  $time_difference = 3600 * $multiplier;
71  break;
73  $time_difference = 86400 * $multiplier;
74  break;
76  $time_difference = 604800;
77  break;
79  $time_difference = 2629743;
80  break;
82  $time_difference = 7889229;
83  break;
85  $time_difference = 31556926;
86  break;
87  }
88  return $time_difference;
89  }
90 
91  public function getId()
92  {
93  return "user_inactive";
94  }
95 
96  public function getTitle()
97  {
98  global $DIC;
99 
100  $lng = $DIC['lng'];
101 
102  return $lng->txt("delete_inactive_user_accounts");
103  }
104 
105  public function getDescription()
106  {
107  global $DIC;
108 
109  $lng = $DIC['lng'];
110 
111  return $lng->txt("delete_inactive_user_accounts_desc");
112  }
113 
114  public function getDefaultScheduleType()
115  {
116  return self::SCHEDULE_TYPE_DAILY;
117  }
118 
119  public function getDefaultScheduleValue()
120  {
121  return;
122  }
123 
124  public function hasAutoActivation()
125  {
126  return false;
127  }
128 
129  public function hasFlexibleSchedule()
130  {
131  return true;
132  }
133 
134  public function hasCustomSettings()
135  {
136  return true;
137  }
138 
139  public function run()
140  {
141  global $DIC;
142 
143  $rbacreview = $DIC['rbacreview'];
144  $ilLog = $DIC['ilLog'];
145 
147  $reminder_time = (int) $this->reminderTimer;
148  $checkMail = (int) $this->period - $reminder_time;
149  $usr_ids = ilObjUser::_getUserIdsByInactivityPeriod($checkMail);
150  $counter = 0;
151  $userDeleted = 0;
152  $userMailsDelivered = 0;
153  foreach ($usr_ids as $usr_id) {
154  if ($usr_id == ANONYMOUS_USER_ID || $usr_id == SYSTEM_USER_ID) {
155  continue;
156  }
157 
158  $continue = true;
159  foreach ($this->include_roles as $role_id) {
160  if ($rbacreview->isAssigned($usr_id, $role_id)) {
161  $continue = false;
162  break;
163  }
164  }
165  if ($continue) {
166  continue;
167  }
168 
174  $timestamp_last_login = strtotime($user->getLastLogin());
175  $grace_period_over = time() - ((int) $this->period * 24 * 60 * 60);
176  if ($timestamp_last_login < $grace_period_over) {
177  $user->delete();
178  $userDeleted++;
179  } elseif ($reminder_time > 0) {
180  $timestamp_for_deletion = $timestamp_last_login - $grace_period_over;
181  $account_will_be_deleted_on = $this->calculateDeletionData($timestamp_for_deletion);
182  $mailSent = ilCronDeleteInactiveUserReminderMail::checkIfReminderMailShouldBeSend($user, $reminder_time, $account_will_be_deleted_on);
183  if ($mailSent) {
184  $userMailsDelivered++;
185  }
186  }
187  $counter++;
188  }
189 
190  if ($counter) {
191  $status = ilCronJobResult::STATUS_OK;
192  }
194  $ilLog->write("CRON - ilCronDeleteInactiveUserAccounts::run(), deleted => $userDeleted User(s), sent reminder mail to $userMailsDelivered User(s)");
195  $result = new ilCronJobResult();
196  $result->setStatus($status);
197  return $result;
198  }
199 
200  protected function calculateDeletionData($date_for_deletion)
201  {
202  $cron_timing = ilCronManager::getCronJobData($this->getId());
203  $time_difference = 0;
204  $multiplier = 1;
205 
206  if (!is_array($cron_timing) || !is_array($cron_timing[0])) {
207  return time() + $date_for_deletion + $time_difference;
208  }
209 
210  if (array_key_exists('schedule_type', $cron_timing[0])) {
211  if ((array_key_exists('schedule_type', $cron_timing[0]) && $cron_timing[0]['schedule_value'] != null)) {
212  $multiplier = $cron_timing[0]['schedule_value'];
213  }
214  $time_difference = $this->getTimeDifferenceBySchedule($cron_timing[0]['schedule_type'], $multiplier);
215  }
216  return time() + $date_for_deletion + $time_difference;
217  }
218 
220  {
221  global $DIC;
222 
223  $lng = $DIC['lng'];
224  $rbacreview = $DIC['rbacreview'];
225  $ilObjDataCache = $DIC['ilObjDataCache'];
226  $ilSetting = $DIC['ilSetting'];
227  $lng->loadLanguageModule("user");
228 
229  $schedule = $a_form->getItemByPostVar('type');
230  $schedule->setTitle(
231  $lng->txt('delete_inactive_user_accounts_frequency'),
232  'delete_inactive_user_accounts_frequency'
233  );
234  $schedule->setInfo(
235  $lng->txt('delete_inactive_user_accounts_frequency_desc'),
236  'delete_inactive_user_accounts_frequency_desc'
237  );
238 
239  include_once('Services/Form/classes/class.ilMultiSelectInputGUI.php');
240  $sub_mlist = new ilMultiSelectInputGUI(
241  $lng->txt('delete_inactive_user_accounts_include_roles'),
242  'cron_inactive_user_delete_include_roles'
243  );
244  $sub_mlist->setInfo($lng->txt('delete_inactive_user_accounts_include_roles_desc'));
245  $roles = array();
246  foreach ($rbacreview->getGlobalRoles() as $role_id) {
247  if ($role_id != ANONYMOUS_ROLE_ID) {
248  $roles[$role_id] = $ilObjDataCache->lookupTitle($role_id);
249  }
250  }
251  $sub_mlist->setOptions($roles);
252  $setting = $ilSetting->get('cron_inactive_user_delete_include_roles', null);
253  if ($setting === null) {
254  $setting = array();
255  } else {
256  $setting = explode(',', $setting);
257  }
258  $sub_mlist->setValue($setting);
259  $sub_mlist->setWidth(300);
260  #$sub_mlist->setHeight(100);
261  $a_form->addItem($sub_mlist);
262 
263  $default_setting = self::DEFAULT_INACTIVITY_PERIOD;
264  $sub_text = new ilNumberInputGUI(
265  $lng->txt('delete_inactive_user_accounts_period'),
266  'cron_inactive_user_delete_period'
267  );
268  $sub_text->setInfo($lng->txt('delete_inactive_user_accounts_period_desc'));
269  $sub_text->setValue($ilSetting->get("cron_inactive_user_delete_period", $default_setting));
270  $sub_text->setSize(4);
271  $sub_text->setMaxLength(4);
272  $sub_text->setRequired(true);
273  $a_form->addItem($sub_text);
274 
275  $sub_period = new ilNumberInputGUI(
276  $lng->txt('send_mail_to_inactive_users'),
277  'cron_inactive_user_reminder_period'
278  );
279  $sub_period->setInfo($lng->txt("send_mail_to_inactive_users_desc"));
280  $sub_period->setValue($ilSetting->get("cron_inactive_user_reminder_period", $default_setting));
281  $sub_period->setSuffix($lng->txt("send_mail_to_inactive_users_suffix"));
282  $sub_period->setSize(4);
283  $sub_period->setMaxLength(4);
284  $sub_period->setRequired(false);
285  $sub_period->setMinValue(0);
286  $a_form->addItem($sub_period);
287  /*
288  $default_setting = ilCronDeleteInactiveUserAccounts::DEFAULT_SETTING_INCLUDE_ADMINS;
289  $sub_cb = new ilCheckboxInputGUI($lng->txt('delete_inactive_user_accounts_include_admins'),'cron_inactive_user_delete_include_admins');
290  $sub_cb->setChecked($ilSetting->get("cron_inactive_user_delete_include_admins", $default_setting) ? 1 : 0 );
291  //$sub_cb->setOptionTitle($lng->txt('delete_inactive_user_accounts_include_admins'));
292  $sub_cb->setInfo($lng->txt('delete_inactive_user_accounts_include_admins_desc'));
293  $a_form->addItem($sub_cb);
294  */
295  }
296 
297  public function saveCustomSettings(ilPropertyFormGUI $a_form)
298  {
299  global $DIC;
300 
301  $ilSetting = $DIC['ilSetting'];
302  $lng = $DIC['lng'];
303  $lng->loadLanguageModule("user");
304  $setting = implode(',', $_POST['cron_inactive_user_delete_include_roles']);
305  if (!strlen($setting)) {
306  $setting = null;
307  }
308 
309  $valid = true;
310  $delete_period = ilUtil::stripSlashes($_POST['cron_inactive_user_delete_period']);
311  $reminder_period = ilUtil::stripSlashes($_POST['cron_inactive_user_reminder_period']);
312  $cron_period = (int) ilUtil::stripSlashes($_POST['type']);
313  $cron_period_custom = (int) ilUtil::stripSlashes($_POST['sdyi']);
314 
315  if ($this->isDecimal($delete_period)) {
316  $valid = false;
317  $a_form->getItemByPostVar('cron_inactive_user_delete_period')->setAlert($lng->txt('send_mail_to_inactive_users_numbers_only'), 'send_mail_to_inactive_users_numbers_only');
318  }
319  if ($this->isDecimal($reminder_period)) {
320  $valid = false;
321  $a_form->getItemByPostVar('cron_inactive_user_reminder_period')->setAlert($lng->txt('send_mail_to_inactive_users_numbers_only'), 'send_mail_to_inactive_users_numbers_only');
322  }
323  if ($reminder_period >= $delete_period) {
324  $valid = false;
325  $a_form->getItemByPostVar('cron_inactive_user_reminder_period')->setAlert($lng->txt('send_mail_to_inactive_users_must_be_smaller_than'), 'send_mail_to_inactive_users_must_be_smaller_than');
326  }
327  if ($cron_period >= ilCronJob::SCHEDULE_TYPE_IN_DAYS && $cron_period <= ilCronJob::SCHEDULE_TYPE_YEARLY && $reminder_period > 0) {
328  $logic = true;
329  $check_window_logic = $delete_period - $reminder_period;
330  if ($cron_period == ilCronJob::SCHEDULE_TYPE_IN_DAYS) {
331  if ($check_window_logic < $cron_period_custom) {
332  $logic = false;
333  }
334  } elseif ($cron_period == ilCronJob::SCHEDULE_TYPE_WEEKLY) {
335  if ($check_window_logic <= 7) {
336  $logic = false;
337  }
338  } elseif ($cron_period == ilCronJob::SCHEDULE_TYPE_MONTHLY) {
339  if ($check_window_logic <= 31) {
340  $logic = false;
341  }
342  } elseif ($cron_period == ilCronJob::SCHEDULE_TYPE_QUARTERLY) {
343  if ($check_window_logic <= 92) {
344  $logic = false;
345  }
346  } elseif ($cron_period == ilCronJob::SCHEDULE_TYPE_YEARLY) {
347  if ($check_window_logic <= 366) {
348  $logic = false;
349  }
350  }
351  if (!$logic) {
352  $valid = false;
353  $a_form->getItemByPostVar('cron_inactive_user_reminder_period')->setAlert($lng->txt('send_mail_reminder_window_too_small'), 'send_mail_reminder_window_too_small');
354  }
355  }
356  if ($_POST['cron_inactive_user_delete_period']) {
357  $ilSetting->set('cron_inactive_user_delete_include_roles', $setting);
358  $ilSetting->set('cron_inactive_user_delete_period', $_POST['cron_inactive_user_delete_period']);
359  }
360  if ($this->reminderTimer > $reminder_period) {
362  }
363  $ilSetting->set('cron_inactive_user_reminder_period', $reminder_period);
364 
365  if (!$valid) {
366  ilUtil::sendFailure($lng->txt("form_input_not_valid"));
367  return false;
368  }
369 
370  return true;
371  }
372 
373  protected function isDecimal($number)
374  {
375  if (strpos($number, ',') || strpos($number, '.')) {
376  return true;
377  }
378  return false;
379  }
380 }
run()
Run job.
getItemByPostVar($a_post_var)
Get Item by POST variable.
$result
This class represents a property form user interface.
global $DIC
Definition: saml.php:7
Cron job application base class.
$valid
const SCHEDULE_TYPE_IN_MINUTES
static _getUserIdsByInactivityPeriod($period)
get ids of all users that have been inactive for at least the given period
addItem($a_item)
Add Item (Property, SectionHeader).
const SCHEDULE_TYPE_MONTHLY
const SCHEDULE_TYPE_WEEKLY
setInfo($a_info)
Set Information Text.
This class represents a multi selection list property in a property form.
static getCronJobData($a_id=null, $a_include_inactive=true)
Get cron job configuration/execution data.
static checkIfReminderMailShouldBeSend(ilObjUser $user, $reminderTime, $time_frame_for_deletion)
$lng
This class represents a number property in a property form.
const SCHEDULE_TYPE_IN_DAYS
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
$user
Definition: migrateto20.php:57
static getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
const SCHEDULE_TYPE_YEARLY
global $ilSetting
Definition: privfeed.php:17
const SCHEDULE_TYPE_DAILY
const SCHEDULE_TYPE_QUARTERLY
Cron job result data container.
const SCHEDULE_TYPE_IN_HOURS
$_POST["username"]