Subversion Repositories Mediboard

Rev

Rev 41692 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
36692 kgrisel 1
<?php
2
/**
3
 * @package Mediboard\PasswordKeeper
4
 * @author  SAS OpenXtrem <dev@openxtrem.com>
5
 * @license https://www.gnu.org/licenses/gpl.html GNU General Public License
6
 * @license https://www.openxtrem.com/licenses/oxol.html OXOL OpenXtrem Open License
7
 */
8
 
9
/**
10
 * Description
11
 */
12
class CKeychainChallenge extends CMbObject {
13
  /** @var integer Primary key */
14
  public $keychain_challenge_id;
15
 
16
  /** @var integer CMediusers ID */
17
  public $user_id;
18
 
19
  /** @var integer CKeychain ID */
20
  public $keychain_id;
21
 
22
  /** @var dateTime Creation date */
23
  public $creation_date;
24
 
25
  /** @var dateTime Last modification date */
26
  public $last_modification_date;
27
 
28
  /** @var dateTime Last success date */
29
  public $last_success_date;
30
 
31
  /** @var CMediusers */
32
  public $_ref_user;
33
 
34
  /** @var CKeychain */
35
  public $_ref_keychain;
36
 
41667 kgrisel 37
  /** @var string */
38
  public $_rule;
39
 
41734 kgrisel 40
  /** @var array */
41
  public $_triggered_rules = array();
42
 
41667 kgrisel 43
  /** @var date */
44
  public $_date;
45
 
46
  /** @var date */
47
  public $_reference_date;
48
 
49
  // Order is important here; we perform a procedural check
50
  static $rules = array(
51
    'NoSuccess',
52
    'Weekly',
53
    'Daily',
54
  );
55
 
36692 kgrisel 56
  /**
57
   * @inheritdoc
58
   */
59
  function getSpec() {
60
    $spec                       = parent::getSpec();
61
    $spec->table                = 'keychain_challenge';
62
    $spec->key                  = 'keychain_challenge_id';
63
    $spec->uniques['challenge'] = array('user_id', 'keychain_id');
64
 
65
    return $spec;
66
  }
67
 
68
  /**
69
   * @inheritdoc
70
   */
71
  function getProps() {
72
    $props                           = parent::getProps();
73
    $props['user_id']                = 'ref class|CMediusers notNull';
74
    $props['keychain_id']            = 'ref class|CKeychain notNull';
75
    $props['creation_date']          = 'dateTime notNull';
76
    $props['last_modification_date'] = 'dateTime';
77
    $props['last_success_date']      = 'dateTime';
78
 
41667 kgrisel 79
    $props['_rule']           = 'enum list|' . implode('|', static::$rules);
80
    $props['_date']           = 'date';
81
    $props['_reference_date'] = 'date';
82
 
36692 kgrisel 83
    return $props;
84
  }
85
 
86
  /**
87
   * @inheritdoc
88
   */
89
  function store() {
90
    if (!$this->_id) {
91
      $this->creation_date = ($this->creation_date) ?: CMbDT::dateTime();
92
    }
93
 
94
    return parent::store();
95
  }
96
 
97
  /**
98
   * Charge l'utilisateur associé au challenge
99
   *
100
   * @param bool $cached Récupère l'objet en cache si possible
101
   *
102
   * @return CStoredObject|null
103
   */
104
  function loadRefUser($cached = true) {
105
    return $this->_ref_user = $this->loadFwdRef('user_id', $cached);
106
  }
107
 
108
  /**
109
   * Charge le trousseau associé au challenge
110
   *
111
   * @param bool $cached Récupère l'objet en cache si possible
112
   *
113
   * @return CStoredObject|null
114
   */
115
  function loadRefKeychain($cached = true) {
116
    return $this->_ref_keychain = $this->loadFwdRef('keychain_id', $cached);
117
  }
118
 
119
  /**
120
   * Vérifie si le challenge doit être envoyé à l'utilisateur
121
   *
122
   * @param date $date Date de référence
123
   *
124
   * @return bool
125
   */
126
  function checkToNotify($date = null) {
41667 kgrisel 127
    $this->_date           = ($date) ?: CMbDT::date();
128
    $reference_date        = ($this->last_modification_date) ?: $this->creation_date;
129
    $this->_reference_date = CMbDT::date($reference_date);
36692 kgrisel 130
 
41667 kgrisel 131
    $rules = $this->checkRules();
132
 
133
    foreach ($rules as $_rule => $_match) {
41734 kgrisel 134
      if ($this->inTriggeredRules($_rule)) {
135
        $this->_rule = $_rule;
136
 
137
        return $_match;
41667 kgrisel 138
      }
36692 kgrisel 139
    }
140
 
41667 kgrisel 141
    return false;
142
  }
36692 kgrisel 143
 
41667 kgrisel 144
  /**
145
   * Checks implemented rules
146
   *
147
   * @return array
148
   */
149
  private function checkRules() {
150
    $rules = array();
37555 kgrisel 151
 
41667 kgrisel 152
    foreach (static::$rules as $_rule) {
41692 kgrisel 153
      $rules[$_rule] = (is_callable(array($this, "checkRule{$_rule}"))) ? call_user_func(array($this, "checkRule{$_rule}"), $_rule) : false;
41667 kgrisel 154
    }
155
 
156
    return $rules;
157
  }
158
 
159
  /**
41692 kgrisel 160
   * Set a rule, meaning that it has been triggered
161
   *
162
   * @param string $rule Rule to trigger
163
   *
164
   * @return void
165
   */
166
  private function triggerRule($rule) {
41734 kgrisel 167
    $this->_triggered_rules[$rule] = true;
41692 kgrisel 168
  }
169
 
170
  /**
41734 kgrisel 171
   * Checks if given rule triggered
172
   *
173
   * @param string $rule Rule to check
174
   *
175
   * @return bool
176
   */
177
  private function inTriggeredRules($rule) {
178
    return ($rule && isset($this->_triggered_rules[$rule]) && $this->_triggered_rules[$rule]);
179
  }
180
 
181
  /**
41667 kgrisel 182
   * "No success" rule checking
183
   *
41692 kgrisel 184
   * @param string $rule Rule
185
   *
41667 kgrisel 186
   * @return bool
187
   */
41692 kgrisel 188
  private function checkRuleNoSuccess($rule) {
41734 kgrisel 189
    // Jamais utilisé à partir de l'abonnement
190
    if (!$this->last_success_date) {
191
      $this->triggerRule($rule);
41692 kgrisel 192
 
41734 kgrisel 193
      return true;
194
    }
195
 
196
    return false;
41667 kgrisel 197
  }
198
 
199
  /**
200
   * "Weekly" rule checking
201
   *
41692 kgrisel 202
   * @param string $rule Rule
203
   *
41667 kgrisel 204
   * @return bool
205
   */
41692 kgrisel 206
  private function checkRuleWeekly($rule) {
41667 kgrisel 207
    $week_after = CMbDT::date('+1 week', $this->_reference_date);
208
 
36692 kgrisel 209
    // Si le challenge a été créé ou modifié depuis au moins une semaine
41667 kgrisel 210
    if (CMbDT::daysRelative($week_after, $this->_date) >= 7) {
41692 kgrisel 211
      $this->triggerRule($rule);
212
 
36692 kgrisel 213
      // Si le dernier succès date d'au moins sept jours
41667 kgrisel 214
      return (CMbDT::daysRelative(CMbDT::date($this->last_success_date), $this->_date) >= 7);
36692 kgrisel 215
    }
216
 
41667 kgrisel 217
    return false;
218
  }
219
 
220
  /**
221
   * "Daily" rule checking
222
   *
41692 kgrisel 223
   * @param string $rule Rule
224
   *
41667 kgrisel 225
   * @return bool
226
   */
41692 kgrisel 227
  private function checkRuleDaily($rule) {
41667 kgrisel 228
    $day_after = CMbDT::date('+1 day', $this->_reference_date);
229
 
36692 kgrisel 230
    // Si le challenge a été créé ou modifié depuis au moins un jour
41667 kgrisel 231
    if (CMbDT::daysRelative($day_after, $this->_date) >= 1) {
41692 kgrisel 232
      $this->triggerRule($rule);
233
 
36692 kgrisel 234
      // Si le dernier succès date d'au moins un jour
41667 kgrisel 235
      return (CMbDT::daysRelative(CMbDT::date($this->last_success_date), $this->_date) >= 1);
36692 kgrisel 236
    }
237
 
238
    return false;
239
  }
240
}