| 
					
				 | 
			
			
				@@ -178,25 +178,40 @@ function user_login($user, $pass, $extra = null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $stmt = $pdo->prepare("SELECT * FROM `mailbox` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $stmt = $pdo->prepare("SELECT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      mailbox.*, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      domain.active AS d_active 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      FROM `mailbox` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       INNER JOIN domain on mailbox.domain = domain.domain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       WHERE `kind` NOT REGEXP 'location|thing|group' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        AND `domain`.`active`='1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         AND `username` = :user"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $stmt->execute(array(':user' => $user)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $row = $stmt->fetch(PDO::FETCH_ASSOC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // user does not exist, try call idp login and create user if possible via rest flow 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!$row){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $result = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if ($iam_settings['authsource'] == 'keycloak' && intval($iam_settings['mailpassword_flow']) == 1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $result = keycloak_mbox_login_rest($user, $pass, array('is_internal' => $is_internal, 'create' => true)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($result !== false) return $result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else if ($iam_settings['authsource'] == 'ldap') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $result = ldap_mbox_login($user, $pass, array('is_internal' => $is_internal, 'create' => true)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($result !== false) return $result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($row['active'] != 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if ($result !== false){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // double check if mailbox is active 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $stmt = $pdo->prepare("SELECT * FROM `mailbox` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      INNER JOIN domain on mailbox.domain = domain.domain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      WHERE `kind` NOT REGEXP 'location|thing|group' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AND `mailbox`.`active`='1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AND `domain`.`active`='1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AND `username` = :user"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $stmt->execute(array(':user' => $user)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $row = $stmt->fetch(PDO::FETCH_ASSOC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!empty($row)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    clear_session(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -206,6 +221,19 @@ function user_login($user, $pass, $extra = null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (intval($iam_settings['mailpassword_flow']) == 1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $result = keycloak_mbox_login_rest($user, $pass, array('is_internal' => $is_internal)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if ($result !== false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // double check if mailbox and domain is active 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $stmt = $pdo->prepare("SELECT * FROM `mailbox` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          INNER JOIN domain on mailbox.domain = domain.domain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          WHERE `kind` NOT REGEXP 'location|thing|group' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AND `mailbox`.`active`='1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AND `domain`.`active`='1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AND `username` = :user"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $stmt->execute(array(':user' => $user)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $row = $stmt->fetch(PDO::FETCH_ASSOC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (empty($row)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           // check for tfa authenticators 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $authenticators = get_tfa($user); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           if (isset($authenticators['additional']) && is_array($authenticators['additional']) && count($authenticators['additional']) > 0 && !$is_internal) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -245,6 +273,19 @@ function user_login($user, $pass, $extra = null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // user authsource is ldap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $result = ldap_mbox_login($user, $pass, array('is_internal' => $is_internal)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if ($result !== false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // double check if mailbox and domain is active 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $stmt = $pdo->prepare("SELECT * FROM `mailbox` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        INNER JOIN domain on mailbox.domain = domain.domain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        WHERE `kind` NOT REGEXP 'location|thing|group' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          AND `mailbox`.`active`='1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          AND `domain`.`active`='1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          AND `username` = :user"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $stmt->execute(array(':user' => $user)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $row = $stmt->fetch(PDO::FETCH_ASSOC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (empty($row)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // check for tfa authenticators 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $authenticators = get_tfa($user); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (isset($authenticators['additional']) && is_array($authenticators['additional']) && count($authenticators['additional']) > 0 && !$is_internal) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -278,6 +319,9 @@ function user_login($user, $pass, $extra = null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return $result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case 'mailcow': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if ($row['active'] != 1 || $row['d_active'] != 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // verify password 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (verify_hash($row['password'], $pass) !== false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // check for tfa authenticators 
			 |