18 private $cookie_prefix =
'';
21 public $new_user =
false;
24 public $errors = NULL;
33 function __construct(
User $user,
CuAdmin $cuAdmin, $cookie_prefix =
'usr'){
35 if (!$user instanceof
User) {
36 throw new InvalidArgumentException(static::class .
': User object required.');
38 if (!$cuAdmin instanceof
CuAdmin) {
39 throw new InvalidArgumentException(static::class .
': CuAdmin object required.');
43 $this->cuAdmin = $cuAdmin;
53 public function IsAccountLocked() {
54 if (!$this->user->isUserLoaded) {
55 throw new Exception(static::class .
': User is unvalidated.');
59 case (boolval($this->cuAdmin->admininfo[
'flagset3'] & CuAdmin::CU3_MFA_AUTHCODE) == 0 && ($this->user->data[
'freset'] === User::MEM_FORCE_RESET || $this->user->mfaquest[
'mfacount'] < $this->cuAdmin->admininfo[
'min_chlng_qst'])):
60 $this->new_user =
true;
64 case $this->user->data[
'fchange'] ===
'Y':
68 case (boolval($this->cuAdmin->admininfo[
'flagset'] & CuAdmin::CU_MEMRESET)):
72 case $this->user->data[
'userflags'] & User::MEM_FORCE_RESET:
76 case (boolval($this->cuAdmin->admininfo[
'flagset3'] & CuAdmin::CU3_MFA_AUTHCODE > 0
77 ) && ($this->user->data[
'freset'] === 2)):
81 case $this->cuAdmin->admininfo[
'flagset2'] & CuAdmin::CU2_ALIAS_REQ && !preg_match(
"/\D/",$this->user->user_name):
87 return $this->user->data[
'failedremain'] <= 0 || ($forceUpdate && $this->user->data[
'fremain'] <= 0);
98 public function IsValidDeviceCookie($cu) {
99 $cookiename = Return2FactorName($cu, Get2FactorKeyString(), $this->user->user_name);
100 $mfaMode = intval($this->cuAdmin->admininfo[
'flagset3'] & CuAdmin::CU3_MFA_AUTHCODE);
103 $mfaDate = $this->user->mfaquest[
'mfadate'];
105 if ($this->user->data[
'confidence'] !=
'') {
106 $cookiecontent = hash_hmac(
'sha384', GetDeviceCookieContentString(),trim($this->user->data[
'passwd']) . trim(strtolower($this->user->data[
'email'])) . trim(strtolower($this->user->data[
'confidence'])) . $mfaMode . $mfaDate);
108 $cookiecontent = hash_hmac(
'sha384', GetDeviceCookieContentString(),trim($this->user->data[
'passwd']) . trim(strtolower($this->user->data[
'email'])) . $mfaMode . $mfaDate);
111 if (!empty($_COOKIE[$cookiename]) && $cookiecontent == $_COOKIE[$cookiename] && $this->user->data[
'freset'] != User::MEM_FORCE_RESET) {
126 public function IsValidMammothDeviceCookie($cu, $hbenv) {
129 if (($this->cuAdmin->admininfo[
'flagset3'] & CuAdmin::CU3_ALLOW_COOKIE_MIGRATION) > 0 &&
130 $this->user->data[
'freset'] != User::MEM_FORCE_RESET) {
133 $username = $this->user->data[
'user_name'];
134 $sql =
"SELECT DISTINCT ua.accountnumber 136 INNER JOIN {$cu}useraccounts ua on ua.user_id = u.user_id 137 WHERE u.user_name = '{$username}'";
139 $rs = db_query($sql, $hbenv[
"dbh"]);
142 while ($aRow = db_fetch_array($rs, $row++)) {
143 $thisAccount = $aRow[
"accountnumber"];
144 $mammothCookieName = Return2FactorName($cu, $hbenv[
'2factorkey'], trim($thisAccount));
146 if (isset($_COOKIE[$mammothCookieName])) {
148 $mammothCookieContent = sha1(trim($this->user->data[
'passwd']) . trim($this->user->data[
'email']) . trim($this->user->data[
'confidence']));
150 $return_val = $mammothCookieContent == $_COOKIE[$mammothCookieName];
154 $this->UpdateMammothDeviceCookie($cu, $hbenv, $mammothCookieName);
169 private function UpdateMammothDeviceCookie($cu, $hbenv, $mammothCookieName){
172 $hbenv[
'confidence'] = trim($this->user->data[
'confidence']);
173 $hbenv[
"Cn"] = $this->user->data[
'user_name'];
174 $hbenv[
"Fset3"] = $this->cuAdmin->admininfo[
'flagset3'];
175 $hbenv[
"savepass"] = $this->user->data[
"passwd"];
176 $hbenv[
"savemail"] = $this->user->data[
"email"];
179 $inThePast = time() - 3600 * 24;
180 HCU_setcookie_env($hbenv[
'SYSENV'], $mammothCookieName,
"", $inThePast);
183 $this->SetLoginDeviceCookie($hbenv);
194 function SetLoginDeviceCookie($hbenv) {
198 if (
sizeof($_COOKIE) > 6
199 && !preg_match(
"/^199.184.207/",$_SERVER[
'REMOTE_ADDR'])
200 && !preg_match(
"/^192.168/",$_SERVER[
'REMOTE_ADDR'])) {
202 $emsg =
"{$_SERVER['REMOTE_ADDR']} {$hbenv['cu']}:{$hbenv['Cn']} " . date(
'Y-m-d H:i:s') .
" " .
sizeof($_COOKIE) .
" Cookies";
203 $hbenv[
'SYSENV'][
'logger']->warning($emsg);
209 if (
sizeof($_COOKIE) > 23) {
211 $persists = ($now - 3600);
212 foreach ($_COOKIE as $cookiename => $cookiecontent) {
213 if (!preg_match(
"/^(Tx_mURI|Ticket|webconnect)/",$cookiename)) {
214 HCU_setcookie_env($hbenv[
'SYSENV'], $cookiename,
"", $persists);
219 $cookiename = Return2FactorName($hbenv[
"cu"], Get2FactorKeyString(), $this->user->user_name);
220 $mfaMode = intval($this->cuAdmin->admininfo[
'flagset3'] & CuAdmin::CU3_MFA_AUTHCODE);
223 $mfaDate = $this->user->mfaquest[
'mfadate'];
225 if ($this->user->data[
'confidence'] !=
'') {
226 $cookiecontent = hash_hmac(
'sha384', GetDeviceCookieContentString(),trim($this->user->data[
'passwd']) . trim(strtolower($this->user->data[
'email'])) . trim(strtolower($this->user->data[
'confidence'])) . $mfaMode . $mfaDate);
228 $cookiecontent = hash_hmac(
'sha384', GetDeviceCookieContentString(),trim($this->user->data[
'passwd']) . trim(strtolower($this->user->data[
'email'])) . $mfaMode . $mfaDate);
231 $persists = $now + $hbenv[
'SYSENV'][
'ticket'][
'persists'];
233 HCU_setcookie_env($hbenv[
'SYSENV'], $cookiename, $cookiecontent, $persists);
242 $hbenv[
'platform'] = $hbenv[
'platform'];
243 $hbenv[
'Uid'] = $this->user->data[
'user_id'];
244 $hbenv[
'Cn'] = $this->user->data[
'user_name'];
245 $hbenv[
'Ce'] = time() + $hbenv[
'SYSENV'][
'ticket'][
'expires'];
246 $hbenv[
'Clw'] = $this->cuAdmin->admininfo[
'livewait'];
247 $hbenv[
'Clu'] = (empty($this->user->data[
'lastupdate']) ? $mc->msg(
"Unknown") : urlencode(trim($this->user->data[
'lastupdate'])));
248 $hbenv[
'lastupdate'] = (empty($this->user->data[
'lastupdate']) ?
"Unknown" : urlencode(trim($this->user->data[
'lastupdate'])));
249 $hbenv[
'Fplog'] = (empty($this->user->data[
'llog']) ? $mc->msg(
"None") : urlencode(trim($this->user->data[
'llog'])));
250 $hbenv[
'Fflog'] = (empty($this->user->data[
'flog']) ? $mc->msg(
"None") : urlencode(trim($this->user->data[
'flog'])));
251 $hbenv[
'Ffchg'] = (is_null($this->user->data[
'fchange']) ?
'N' : $this->user->data[
'fchange']);
252 $hbenv[
'Ffremain'] = (is_null($this->user->data[
'fremain']) || $this->user->data[
'fremain'] == 0 ? $this->cuAdmin->admininfo[
'grace'] : $this->user->data[
'fremain']);
253 $hbenv[
'Fmsg_tx'] = $this->user->data[
'msg_tx'];
254 $hbenv[
'Fset'] = $this->cuAdmin->admininfo[
'flagset'];
255 $hbenv[
'Fset2'] = $this->cuAdmin->admininfo[
'flagset2'];
256 $hbenv[
'Fset3'] = $this->cuAdmin->admininfo[
'flagset3'];
257 $hbenv[
'Fhdays'] = $this->cuAdmin->admininfo[
'fhdays'];
258 $hbenv[
'Ml'] = $this->user->data[
'email'];
259 $hbenv[
'Ffreset'] = $this->user->data[
'freset'];
262 $hbenv[
'savepass'] = $this->user->data[
'passwd'];
263 $hbenv[
'savemail'] = $this->user->data[
'email'];
266 $hbenv[
"sid"] = strval(time());
270 $baseCookie = BuildBaseSessionTicket($hbenv);
271 $mycookie =
"Ctime=$now&Cn={$this->user->data['user_name']}&Uid={$this->user->data['user_id']}&Ml=" . urlencode($this->user->data[
'email']) .
"&Ca=";
278 SetTicket($hbenv, $baseCookie, $mycookie);
292 function ValidateUser($password =
'', $remember_me =
false) {
293 if (empty($password)) {
294 throw new InvalidArgumentException(static::class .
': Invalid password.');
299 return password_verify($password, $this->user->data[
'passwd']);
308 function IsMFAMode() {
309 return boolval($this->cuAdmin->admininfo[
'flagset3'] & CuAdmin::CU3_MFA_AUTHCODE);
CreateSessionTicket($hbenv, $mc, $cu)