From 75d632ce5f5d1677fd5e7677c5d4d308695c1b0b Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 28 Feb 2019 01:43:05 +0100 Subject: [PATCH 1/6] add ldap (Not working yet) --- conf/class.auth.ldap.php | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 conf/class.auth.ldap.php diff --git a/conf/class.auth.ldap.php b/conf/class.auth.ldap.php new file mode 100644 index 0000000..5e07dfe --- /dev/null +++ b/conf/class.auth.ldap.php @@ -0,0 +1,82 @@ +con->begin(); + $cur = $this->con->openCursor($this->user_table); + + # parmetre de configuration pour l'interface PHP pour administrer + # notre annuaire LDAP + $server = "localhost"; + $port = "389"; + $racine = "dc=yunohost,dc=org"; + + #connection au serveur ldap + $ds=@ldap_connect($server) or die("Could not connect to LDAP server."); + ldap_set_option ($ds, LDAP_OPT_PROTOCOL_VERSION, 3); + if (ldap_bind($ds,"uid=".$user_id.",ou=users,dc=yunohost,dc=org",$pwd)) + { + + # On définit le mot de passe, il est inséré dans tous les cas. + $cur->user_pwd = $pwd; + + # Si l'utilisateur existe, nous allons uniquement mettre à jour + # son mot de passe dans la table utilisateur de Dotclear. + if ($this->core->userExists($user_id)) + { + $this->sudo(array($this->core,'updUser'),$user_id,$cur); + $this->con->commit(); + } + # Si l'utilisateur n'existe pas, nous allons le créer. + # Afin qu'il puisse se connecter, il est nécessaire de lui donner + # au moins une permission "usage" sur le blog "default". + else + { + $sr=ldap_search($ds,$racine,"cn=$user_id",array( "dn", "cn", "sn", "mail", "givenName")); + $info = ldap_get_entries($ds, $sr); + + #on recherche l'utilisateur dans le ldap pour recuperer toutes les informations + $sr=ldap_search($ds,$racine,"cn=$user_id",array( "dn", "cn", "sn", "mail", "givenName")); + $info = ldap_get_entries($ds, $sr); + + + #si le ldap ne ramene qu'un seul utilisateur + if ($info["count"] ==1) + { + $cur->user_id = $info[0]['cn'][0]; + $cur->user_email = $info[0]['mail'][0]; + $cur->user_name = $info[0]['givenName'][0]; + $cur->user_firstname = $info[0]['sn'][0]; + $cur->user_lang = 'fr'; + $cur->user_tz = 'Europe/Paris'; + $cur->user_default_blog = 'default'; + $this->sudo(array($this->core,'addUser'),$cur); + $this->sudo(array($this->core,'setUserBlogPermissions'),$user_id,$user_id,array('admin'=>true)); + $this->con->commit(); + } + } + + # Les opérations précédentes se sont déroulées sans erreur, nous + # pouvons maintenant appeler la méthode parente afin d'initialiser + # l'utilisateur dans l'object $core->auth + return parent::checkUser($user_id,$pwd); + } + # En cas d'erreur on annule la transaction et on renvoie "false" + $this->con->rollback(); + return false; + } +} +?> \ No newline at end of file From f751d455cdb19ea4c3a287ef3d612e58a5242e20 Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 1 Mar 2019 02:05:03 +0100 Subject: [PATCH 2/6] Fix LDAP connection --- conf/class.auth.ldap.php | 136 +++++++++++++++++++-------------------- scripts/install | 8 +++ scripts/upgrade | 8 +++ 3 files changed, 82 insertions(+), 70 deletions(-) diff --git a/conf/class.auth.ldap.php b/conf/class.auth.ldap.php index 5e07dfe..e7afbf9 100644 --- a/conf/class.auth.ldap.php +++ b/conf/class.auth.ldap.php @@ -1,82 +1,78 @@ -con->begin(); - $cur = $this->con->openCursor($this->user_table); + # On démarre une transaction et on ouvre un curseur sur la + # table utilisateur de Dotclear pour créer ou modifier + # l'utilisateur. + $this->con->begin(); + $cur = $this->con->openCursor($this->user_table); - # parmetre de configuration pour l'interface PHP pour administrer - # notre annuaire LDAP - $server = "localhost"; - $port = "389"; - $racine = "dc=yunohost,dc=org"; + # parmetre de configuration pour l'interface PHP pour administrer + # notre annuaire LDAP + $server = "localhost"; + $port = "389"; + $racine = "dc=yunohost,dc=org"; - #connection au serveur ldap - $ds=@ldap_connect($server) or die("Could not connect to LDAP server."); - ldap_set_option ($ds, LDAP_OPT_PROTOCOL_VERSION, 3); - if (ldap_bind($ds,"uid=".$user_id.",ou=users,dc=yunohost,dc=org",$pwd)) - { + #connection au serveur ldap + $ds=ldap_connect($server); + ldap_set_option ($ds, LDAP_OPT_PROTOCOL_VERSION, 3); + if (ldap_bind($ds,"uid=".$user_id.",ou=users,dc=yunohost,dc=org",$pwd)) + { + # On définit le mot de passe, il est inséré dans tous les cas. + $cur->user_pwd = $pwd; - # On définit le mot de passe, il est inséré dans tous les cas. - $cur->user_pwd = $pwd; - - # Si l'utilisateur existe, nous allons uniquement mettre à jour - # son mot de passe dans la table utilisateur de Dotclear. - if ($this->core->userExists($user_id)) - { - $this->sudo(array($this->core,'updUser'),$user_id,$cur); - $this->con->commit(); - } - # Si l'utilisateur n'existe pas, nous allons le créer. - # Afin qu'il puisse se connecter, il est nécessaire de lui donner - # au moins une permission "usage" sur le blog "default". - else - { - $sr=ldap_search($ds,$racine,"cn=$user_id",array( "dn", "cn", "sn", "mail", "givenName")); - $info = ldap_get_entries($ds, $sr); - - #on recherche l'utilisateur dans le ldap pour recuperer toutes les informations - $sr=ldap_search($ds,$racine,"cn=$user_id",array( "dn", "cn", "sn", "mail", "givenName")); - $info = ldap_get_entries($ds, $sr); + # Si l'utilisateur existe, nous allons uniquement mettre à jour + # son mot de passe dans la table utilisateur de Dotclear. + if ($this->core->userExists($user_id)) + { + $this->sudo(array($this->core,'updUser'),$user_id,$cur); + $this->con->commit(); + } + # Si l'utilisateur n'existe pas, nous allons le créer. + # Afin qu'il puisse se connecter, il est nécessaire de lui donner + # au moins une permission "usage" sur le blog "default". + else + { + #on recherche l'utilisateur dans le ldap pour recuperer toutes les informations + $sr=ldap_search($ds,$racine,"uid=$user_id",array( "dn", "cn", "sn", "mail", "givenName")); + $info = ldap_get_entries($ds, $sr); - #si le ldap ne ramene qu'un seul utilisateur - if ($info["count"] ==1) - { - $cur->user_id = $info[0]['cn'][0]; - $cur->user_email = $info[0]['mail'][0]; - $cur->user_name = $info[0]['givenName'][0]; - $cur->user_firstname = $info[0]['sn'][0]; - $cur->user_lang = 'fr'; - $cur->user_tz = 'Europe/Paris'; - $cur->user_default_blog = 'default'; - $this->sudo(array($this->core,'addUser'),$cur); - $this->sudo(array($this->core,'setUserBlogPermissions'),$user_id,$user_id,array('admin'=>true)); - $this->con->commit(); - } - } + #si le ldap ne ramene qu'un seul utilisateur + if ($info["count"] ==1) + { + $cur->user_id = $user_id; + $cur->user_email = $info[0]['mail'][0]; + $cur->user_name = $info[0]['givenName'][0]; + $cur->user_firstname = $info[0]['sn'][0]; + $cur->user_lang = 'fr'; + $cur->user_tz = 'Europe/Paris'; + $cur->user_default_blog = 'default'; + $this->sudo(array($this->core,'addUser'),$cur); + $this->sudo(array($this->core,'setUserBlogPermissions'),$user_id,'default',array('admin'=>true)); + $this->con->commit(); + } + } - # Les opérations précédentes se sont déroulées sans erreur, nous - # pouvons maintenant appeler la méthode parente afin d'initialiser - # l'utilisateur dans l'object $core->auth - return parent::checkUser($user_id,$pwd); - } - # En cas d'erreur on annule la transaction et on renvoie "false" - $this->con->rollback(); - return false; - } + # Les opérations précédentes se sont déroulées sans erreur, nous + # pouvons maintenant appeler la méthode parente afin d'initialiser + # l'utilisateur dans l'object $core->auth + return parent::checkUser($user_id, $pwd, $user_key, $check_blog); + } + # En cas d'erreur on annule la transaction et on renvoie "false" + $this->con->rollback(); + return false; + } } ?> \ No newline at end of file diff --git a/scripts/install b/scripts/install index 40ab25d..a6d3aec 100755 --- a/scripts/install +++ b/scripts/install @@ -105,6 +105,7 @@ email=$(yunohost user info $admin | grep mail: | cut -d' ' -f2 | tr -d '\n') ynh_app_setting_set $app master_key $master_key cp $php_config.in $php_config +cp ../conf/class.auth.ldap.php $final_path/inc/class.auth.ldap.php admin_url=$(ynh_url_join $path_url admin/index.php) @@ -128,6 +129,13 @@ ynh_replace_string "'DC_MASTER_KEY', ''" "'DC_MASTER_KEY', '$master_key'" $php_c ynh_replace_string "'DC_ADMIN_URL', ''" "'DC_ADMIN_URL', 'https://$domain$admin_url'" $php_config ynh_replace_string "'DC_ADMIN_MAILFROM', ''" "'DC_ADMIN_MAILFROM', '$email'" $php_config +# Adding LDAP login +cat << EOF >> $php_config + +\$__autoload['myDcAuth'] = dirname(__FILE__).'/class.auth.ldap.php'; +define('DC_AUTH_CLASS','myDcAuth'); +EOF + ynh_store_file_checksum $php_config #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index e5b8e49..c719239 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -125,6 +125,7 @@ ynh_add_fpm_config #================================================= cp $php_config.in $php_config +cp ../conf/class.auth.ldap.php $final_path/inc/class.auth.ldap.php firstname=$(yunohost user info $admin | grep firstname: | cut -d' ' -f2 | tr -d '\n') lastname=$(yunohost user info $admin | grep lastname: | cut -d' ' -f2 | tr -d '\n') @@ -151,6 +152,13 @@ ynh_replace_string "'DC_MASTER_KEY', ''" "'DC_MASTER_KEY', '$master_key'" $php_c ynh_replace_string "'DC_ADMIN_URL', ''" "'DC_ADMIN_URL', 'https://$domain$admin_url'" $php_config ynh_replace_string "'DC_ADMIN_MAILFROM', ''" "'DC_ADMIN_MAILFROM', '$email'" $php_config +# Adding LDAP login +cat << EOF >> $php_config + +\$__autoload['myDcAuth'] = dirname(__FILE__).'/class.auth.ldap.php'; +define('DC_AUTH_CLASS','myDcAuth'); +EOF + # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum "$php_config" From 4d5a55d0d868f4d0eccc867581635a1da6371be1 Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 1 Mar 2019 02:15:21 +0100 Subject: [PATCH 3/6] add possible permissions --- conf/class.auth.ldap.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/conf/class.auth.ldap.php b/conf/class.auth.ldap.php index e7afbf9..681af23 100644 --- a/conf/class.auth.ldap.php +++ b/conf/class.auth.ldap.php @@ -60,6 +60,16 @@ class myDcAuth extends dcAuth $cur->user_tz = 'Europe/Paris'; $cur->user_default_blog = 'default'; $this->sudo(array($this->core,'addUser'),$cur); + #admin "administrator" + #usage "manage their own entries and comments" + #publish "publish entries and comments" + #delete "delete entries and comments" + #contentadmin "manage all entries and comments" + #categories "manage categories" + #media "manage their own media items" + #media_admin "manage all media items" + #pages "manage pages" + #blogroll "manage blogroll" $this->sudo(array($this->core,'setUserBlogPermissions'),$user_id,'default',array('admin'=>true)); $this->con->commit(); } From 45f92cbd06d090ddaf91737a1393f4156a7a3d71 Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 1 Mar 2019 15:38:17 +0100 Subject: [PATCH 4/6] Update check_process --- check_process | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/check_process b/check_process index aebf186..c638892 100644 --- a/check_process +++ b/check_process @@ -27,9 +27,7 @@ Level 1=auto Level 2=auto Level 3=auto -# Level 4: If the app supports LDAP and SSOwat, turn level 4 to '1' and add a link to an issue or a part of your code to show it. -# If the app does not use LDAP nor SSOwat, and can't use them, turn level 4 to 'na' and explain as well. - Level 4=0 + Level 4=1 Level 5=auto Level 6=auto Level 7=auto From bf2cf589d6bf920b906eee36397dea895acf82d5 Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 1 Mar 2019 22:48:44 +0100 Subject: [PATCH 5/6] fix ldap --- conf/class.auth.ldap.php | 47 +++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/conf/class.auth.ldap.php b/conf/class.auth.ldap.php index 681af23..1d753c4 100644 --- a/conf/class.auth.ldap.php +++ b/conf/class.auth.ldap.php @@ -1,65 +1,59 @@ con->begin(); $cur = $this->con->openCursor($this->user_table); - # parmetre de configuration pour l'interface PHP pour administrer - # notre annuaire LDAP + # LDAP parameter $server = "localhost"; $port = "389"; $racine = "dc=yunohost,dc=org"; - #connection au serveur ldap + # LDAP connection $ds=ldap_connect($server); ldap_set_option ($ds, LDAP_OPT_PROTOCOL_VERSION, 3); if (ldap_bind($ds,"uid=".$user_id.",ou=users,dc=yunohost,dc=org",$pwd)) { - # On définit le mot de passe, il est inséré dans tous les cas. + # Store the password $cur->user_pwd = $pwd; - # Si l'utilisateur existe, nous allons uniquement mettre à jour - # son mot de passe dans la table utilisateur de Dotclear. + # If the user exist, then we just update his password. if ($this->core->userExists($user_id)) { $this->sudo(array($this->core,'updUser'),$user_id,$cur); $this->con->commit(); } - # Si l'utilisateur n'existe pas, nous allons le créer. - # Afin qu'il puisse se connecter, il est nécessaire de lui donner - # au moins une permission "usage" sur le blog "default". + # If not, we create him. + # In order for him to connect, + # it is necessary to give him at least + # a permission "usage" on the blog "default". else { - #on recherche l'utilisateur dans le ldap pour recuperer toutes les informations - $sr=ldap_search($ds,$racine,"uid=$user_id",array( "dn", "cn", "sn", "mail", "givenName")); + # search the user in ldap, and get infos + $sr=ldap_search($ds,$racine,"uid=$user_id",array( "dn", "cn", "sn", "mail", "givenname")); # /!\ fields have to be in lowercase $info = ldap_get_entries($ds, $sr); - #si le ldap ne ramene qu'un seul utilisateur if ($info["count"] ==1) { $cur->user_id = $user_id; $cur->user_email = $info[0]['mail'][0]; - $cur->user_name = $info[0]['givenName'][0]; + $cur->user_name = $info[0]['givenname'][0]; $cur->user_firstname = $info[0]['sn'][0]; - $cur->user_lang = 'fr'; - $cur->user_tz = 'Europe/Paris'; - $cur->user_default_blog = 'default'; + $cur->user_lang = 'fr'; # Can change this, PR are welcome + $cur->user_tz = 'Europe/Paris'; # Can change this, PR are welcome + $cur->user_default_blog = 'default'; # Can change this, PR are welcome $this->sudo(array($this->core,'addUser'),$cur); + # Possible roles: #admin "administrator" #usage "manage their own entries and comments" #publish "publish entries and comments" @@ -70,17 +64,16 @@ class myDcAuth extends dcAuth #media_admin "manage all media items" #pages "manage pages" #blogroll "manage blogroll" - $this->sudo(array($this->core,'setUserBlogPermissions'),$user_id,'default',array('admin'=>true)); + $this->sudo(array($this->core,'setUserBlogPermissions'),$user_id,'default',array('usage'=>true)); # Can change this, PR are welcome $this->con->commit(); } } - # Les opérations précédentes se sont déroulées sans erreur, nous - # pouvons maintenant appeler la méthode parente afin d'initialiser - # l'utilisateur dans l'object $core->auth + # The previous operations proceeded without error, + # we can now call the parent method return parent::checkUser($user_id, $pwd, $user_key, $check_blog); } - # En cas d'erreur on annule la transaction et on renvoie "false" + # In case of error we cancel and return "false" $this->con->rollback(); return false; } From b3c403a1a8207c05e8475ee14059ba89330a4d96 Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 1 Mar 2019 23:46:01 +0100 Subject: [PATCH 6/6] Protect admin area if the app is public --- scripts/install | 2 ++ scripts/upgrade | 2 ++ 2 files changed, 4 insertions(+) diff --git a/scripts/install b/scripts/install index a6d3aec..61828ba 100755 --- a/scripts/install +++ b/scripts/install @@ -169,6 +169,8 @@ ynh_app_setting_delete $app skipped_uris if [ $is_public -eq 1 ]; then # unprotected_uris allows SSO credentials to be passed anyway. ynh_app_setting_set $app unprotected_uris "/" + # protect admin area + ynh_app_setting_set $app protected_uris "/admin" fi #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index c719239..9302134 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -181,6 +181,8 @@ if [ $is_public -eq 1 ] then # unprotected_uris allows SSO credentials to be passed anyway ynh_app_setting_set $app unprotected_uris "/" + # protect admin area + ynh_app_setting_set $app protected_uris "/admin" fi #=================================================