| 
					
				 | 
			
			
				@@ -2294,6 +2294,7 @@ function identity_provider($_action = null, $_data = null, $_extra = null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           break;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           case "use_ssl":
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           case "use_tls":
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          case "login_provisioning":
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           case "ignore_ssl_errors":
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             $settings[$row["key"]] = boolval($row["value"]);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           break;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2302,6 +2303,10 @@ function identity_provider($_action = null, $_data = null, $_extra = null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           break;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // set login_provisioning if not exists
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!array_key_exists('login_provisioning', $settings)) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $settings['login_provisioning'] = 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // return default client_scopes for generic-oidc if none is set
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if ($settings["authsource"] == "generic-oidc" && empty($settings["client_scopes"])){
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $settings["client_scopes"] = "openid profile email mailcow_template";
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2366,7 +2371,8 @@ function identity_provider($_action = null, $_data = null, $_extra = null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $_data['ignore_ssl_error']  = isset($_data['ignore_ssl_error']) ? boolval($_data['ignore_ssl_error']) : false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $_data['ignore_ssl_error']    = isset($_data['ignore_ssl_error']) ? boolval($_data['ignore_ssl_error']) : false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $_data['login_provisioning']  = isset($_data['login_provisioning']) ? boolval($_data['login_provisioning']) : false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       switch ($_data['authsource']) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         case "keycloak":
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['server_url']        = (!empty($_data['server_url'])) ? rtrim($_data['server_url'], '/') : null;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2375,14 +2381,14 @@ function identity_provider($_action = null, $_data = null, $_extra = null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['import_users']      = isset($_data['import_users']) ? intval($_data['import_users']) : 0;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['sync_interval']     = (!empty($_data['sync_interval'])) ? intval($_data['sync_interval']) : 15;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['sync_interval']     = $_data['sync_interval'] < 1 ? 1 : $_data['sync_interval'];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $required_settings          = array('authsource', 'server_url', 'realm', 'client_id', 'client_secret', 'redirect_url', 'version', 'mailpassword_flow', 'periodic_sync', 'import_users', 'sync_interval', 'ignore_ssl_error');
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $required_settings          = array('authsource', 'server_url', 'realm', 'client_id', 'client_secret', 'redirect_url', 'version', 'mailpassword_flow', 'periodic_sync', 'import_users', 'sync_interval', 'ignore_ssl_error', 'login_provisioning');
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         break;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         case "generic-oidc":
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['authorize_url']     = (!empty($_data['authorize_url'])) ? $_data['authorize_url'] : null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['token_url']         = (!empty($_data['token_url'])) ? $_data['token_url'] : null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['userinfo_url']      = (!empty($_data['userinfo_url'])) ? $_data['userinfo_url'] : null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['client_scopes']     = (!empty($_data['client_scopes'])) ? $_data['client_scopes'] : "openid profile email mailcow_template";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $required_settings          = array('authsource', 'authorize_url', 'token_url', 'client_id', 'client_secret', 'redirect_url', 'userinfo_url', 'client_scopes', 'ignore_ssl_error');
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $required_settings          = array('authsource', 'authorize_url', 'token_url', 'client_id', 'client_secret', 'redirect_url', 'userinfo_url', 'client_scopes', 'ignore_ssl_error', 'login_provisioning');
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         break;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         case "ldap":
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['host']              = (!empty($_data['host'])) ? str_replace(" ", "", $_data['host']) : "";
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2396,7 +2402,7 @@ function identity_provider($_action = null, $_data = null, $_extra = null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['use_tls']           = isset($_data['use_tls']) && !$_data['use_ssl'] ? boolval($_data['use_tls']) : false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['sync_interval']     = (!empty($_data['sync_interval'])) ? intval($_data['sync_interval']) : 15;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $_data['sync_interval']     = $_data['sync_interval'] < 1 ? 1 : $_data['sync_interval'];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $required_settings          = array('authsource', 'host', 'port', 'basedn', 'username_field', 'filter', 'attribute_field', 'binddn', 'bindpass', 'periodic_sync', 'import_users', 'sync_interval', 'use_ssl', 'use_tls', 'ignore_ssl_error');
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $required_settings          = array('authsource', 'host', 'port', 'basedn', 'username_field', 'filter', 'attribute_field', 'binddn', 'bindpass', 'periodic_sync', 'import_users', 'sync_interval', 'use_ssl', 'use_tls', 'ignore_ssl_error', 'login_provisioning');
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         break;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2766,6 +2772,16 @@ function identity_provider($_action = null, $_data = null, $_extra = null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return true;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // user doesn't exist, check if login provisioning is enabled
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!$iam_settings['login_provisioning']){
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $_SESSION['return'][] =  array(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          'type' => 'danger',
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          'log' => array(__FUNCTION__, "Auto-create users on login is deactivated"),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          'msg' => 'login_failed'
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (empty($iam_settings['mappers']) || empty($user_template) || $mapper_key === false){
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!empty($iam_settings['default_template'])) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $mbox_template = $iam_settings['default_template'];
 
			 |