Intégration de Nextcloud côté serveur

Et de son application user_external…

Voici ici ma contribution à l’extension user_external de Nextcloud qui permet l’authentification externe des utilisateurs et notamment à sa classe OC_User_IMAP… Je m’y suis attaqué à l’époque où mon intranet était sous Owncloud-Roundcube-Jappix (après eGroupware !), et où j’avais besoin que cette classe fasse le distinguo entre les domaines pour ceux dont les mails sont gérés par les serveurs imap mutualisés de Gandi, ou d’OVH par exemple… Depuis, la classe a été « corrigée » par ses auteurs, mais j’en ai profité pour continuer à travailler dessus pour ma plate-forme de cloud collaboratif (Nextcloud + Collabora). En créant une classe OC_User_DOMAIN qui prend comme arguments, le serveur imap, le nom de domaine, mais aussi un groupe (auquel rajouter l’utilisateur), et un quota (par défaut)…

Elle ressemble à ceci

 * Copyright (c) 2016 Jérôme Bourgeois <jerome@xlinfo.fr>
 * Based on the work of Robin Appelman <icewind@owncloud.com>
 * This file is licensed under the Affero General Public License version 3 or
 * later.
 * See the COPYING-README file from Robin Appelman.
 */

class OC_User_DOMAIN extends \OCA\user_external\Base {
	private $mailbox;
	private $domainName;
        private $group;
        private $quota;

	public function __construct($mailbox,$domainName='',$group='',$quota='') {
		parent::__construct($mailbox);
		$this->mailbox=$mailbox;
		$this->domainName=$domainName;
		$this->group=$group;
		$this->quota=$quota;

	}

	/**
	 ** @brief Check if the password is correct
	 ** @param $uid The username
	 ** @param $password The password
	 ** @returns true/false
	 **
	 ** Check if the password is correct without logging in the user
	 **/
	public function checkPassword($uid, $password) {
		if (!function_exists('imap_open')) {
			OCP\Util::writeLog('user_external', 'ERROR: PHP imap extension is not installed', OCP\Util::ERROR);
			return false;
		}
		if($this->domainName != '')
			$uid = $uid . "@". $this->domainName;

		$mbox = @imap_open($this->mailbox, $uid, $password);
		imap_errors();
		imap_alerts();
		if($mbox) {
			imap_close($mbox);
			$uid = explode("@", $uid)[0];
			$this->storeUser($uid);
			$userManager=\OC::$server->getUserManager();
			$user=$userManager->get($uid);
			if($user->getEMailAddress()== "")
				$user->setEMailAddress($uid .'@'. $this->domainName);

			if(! \OC::$server->getGroupManager()->groupExists($this->group))
				\OC::$server->getGroupManager()->createGroup($this->group);
			$group = \OC::$server->getGroupManager()->get($this->group);
			if(!$group->inGroup($user))
				$group->addUser($user);
			$config = \OC::$server->getConfig();
			//jusqu'a nextcloud 12
			//if($config->getUserValue($uid, 'files', 'quota') === null) 
                        //à partir de nextcloud 13
			if(!$config->getUserValue($uid, 'files', 'quota')) 
				$config->setUserValue($uid, 'files', 'quota', $this->quota);
			return $uid;
		}else{
			return false;
		}
	}

}

Elle s’utilise ainsi : dans config.php

 'user_backends' => 
  array (
    0 => 
    array (
      'class' => 'OC_User_DOMAIN',
      'arguments' => 
      array (
        0 => '{serveur_imap:993/imap/ssl/novalidate-cert}',
        1 => 'domain.tld',
        2 => 'nom_du_groupe',
        3 => '512 MB',
      ),
    ),
  ),

Et pour configurer automatiquement l’application mail des utilisateurs par défaut : toujours dans le config.php

'app.mail.accounts.default' => 
  array (
    'email' => '%EMAIL%',
    'imapHost' => 'serveur_imap',
    'imapPort' => 993,
    'imapUser' => '%EMAIL%',
    'imapSslMode' => 'ssl',
    'smtpHost' => 'serveur_smtp',
    'smtpPort' => 465,
    'smtpUser' => '%EMAIL%',
    'smtpSslMode' => 'ssl',
  ),

Pour les feignants, mon extension user_imap se trouve ici. Attention l’application user_external doit être préalablement activée, sinon, elle est inopérante :
cf. app.php :

if (\OCP\App::isEnabled('user_external'))
	OC::$CLASSPATH['OC_User_DOMAIN']='user_imap/lib/user_domain.php';

Enfin, pour être tout à fait complet, ayant également besoin que mon serveur xmpp (ejabberd) ait la même authentification imap, je joins à ceux que ça intéresse mon script ejabberd_imap-auth.php. Attention sur ubuntu à désactiver le profil apparmor correspondant qui interdit les authentifications externes de ejabberd…

Je tiens également à la disposition de ceux qui les souhaitent d’anciennes extensions pour eGroupware, Roundcube…

Ah au fait, je vous ai dit ? Je suis formateur en développements web open source.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *