| 
					
				 | 
			
			
				@@ -807,7 +807,7 @@ function verify_hash($hash, $password) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function check_login($user, $pass, $app_passwd_data = false) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function check_login($user, $pass, $app_passwd_data = false, $skip_tfa = false) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   global $pdo;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   global $redis;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   global $imap_server;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -938,19 +938,22 @@ function check_login($user, $pass, $app_passwd_data = false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   foreach ($rows as $row) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // verify password
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (verify_hash($row['password'], $pass) !== false) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // check for tfa authenticators
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $authenticators = get_tfa($user);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (isset($authenticators['additional']) && is_array($authenticators['additional']) && count($authenticators['additional']) > 0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $_SESSION['pending_mailcow_cc_username'] = $user;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $_SESSION['pending_mailcow_cc_role'] = "user";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $_SESSION['pending_tfa_methods'] = $authenticators['additional'];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        unset($_SESSION['ldelay']);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $_SESSION['return'][] =  array(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'type' => 'success',
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'log' => array(__FUNCTION__, $user, '*'),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'msg' => array('logged_in_as', $user)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return "pending";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if ($app_passwd_data['eas'] !== true && $app_passwd_data['dav'] !== true && !$skip_tfa){
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // check for tfa authenticators
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $authenticators = get_tfa($user);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (isset($authenticators['additional']) && is_array($authenticators['additional']) && count($authenticators['additional']) > 0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $_SESSION['pending_mailcow_cc_username'] = $user;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $_SESSION['pending_mailcow_cc_role'] = "user";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $_SESSION['pending_tfa_methods'] = $authenticators['additional'];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          unset($_SESSION['ldelay']);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $_SESSION['return'][] =  array(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'type' => 'success',
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'log' => array(__FUNCTION__, $user, '*'),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'msg' => array('logged_in_as', $user)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return "pending";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if ($app_passwd_data['eas'] === true || $app_passwd_data['dav'] === true) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $service = ($app_passwd_data['eas'] === true) ? 'EAS' : 'DAV';
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -961,12 +964,13 @@ function check_login($user, $pass, $app_passwd_data = false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ':username' => $user,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ':remote_addr' => ($_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'])
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           ));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } elseif (!$skip_tfa) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // Reactivate TFA if it was set to "deactivate TFA for next login"
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $stmt = $pdo->prepare("UPDATE `tfa` SET `active`='1' WHERE `username` = :user");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $stmt->execute(array(':user' => $user));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         unset($_SESSION['ldelay']);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Reactivate TFA if it was set to "deactivate TFA for next login"
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $stmt = $pdo->prepare("UPDATE `tfa` SET `active`='1' WHERE `username` = :user");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $stmt->execute(array(':user' => $user));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return "user";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }
 
			 |