Comment se connecter à  LDAP avec Xcode (vérification login + password)

roukanoroukano Membre
juillet 2013 modifié dans API AppKit #1

Bonjour à  tous,

 

Je suis sur Mac OS X 10.8.3 MountainLion et je travaille sur Xcode 4.5.1.

 

J'ai une page de connexion avec des textfields "Nom d'utilisateur" et "Mot de passe" sur une page de login.

 

De l'autre côté, j'ai lancé Ubuntu Server sur VMware Fusion qui me permet de communiquer avec LDAP.

 

J'ai également lancé LDAPManager où je peux voir l'arborescence d'un certain nombre d'informations dont celles du login et mot de passe.

 

J'essaie de me connecter à  LDAP via Xcode en suivant un tuto datant de quelques années mais qui ne marche plus.

 

Dans mon projet j'ai importer les fichiers ldap.h, lber.h, ldap_features.h, ldap_defaults.h... ainsi que les fichiers RHLDAPSearch.h et RHLDAPSearch.m qui permettent d'instancier des objets RHLDAPSearch pour exécuter des requêtes vers un serveur LDAP (en Objective-C).

 

Avez-vous une idée de la façon avec laquelle on peut se connecter au serveur LDAP afin de vérifier que les champs saisis (login + mot de passe) sont corrects ?

 

Merci d'avance.


 


 


Modération: J'ai déplacé le sujet dans une section qui me semble plus appropriée.


Réponses

  • Bonjour,


     


    Tout d'abord merci de commencer par la case présentation dans la section approprié du forum. N'oublie pas de décrire ton expérience en développement et ton domaine d'activité histoire que l'on saches à  qui on parle...


     


    Pour ton problème, la moindre des choses aurait été de donner un lien source pour tes clases "RHLDAPSearch" histoire qu'on sache quelle version tu utilise...


     


    Pour ce que je viens de trouver sur le net, ta classe porte bien son nom, elle permet de faire des recherches, et c'est tout. Elle est assez mal foutue et ne semble pas supporter le bind LDAP, ce que tu cherche.


     


    Le plus simple serait de lire la doc de l'API native OpenLDAP et de t'en servir...


  • Merci de ta réponse,


    C'est vrai que j'ai posté un peu trop rapidement ma question sans m'être au préalable présentation, c'est maintenant chose faite :)


    Voici le lien vers le petit tuto en anglais que j'ai trouvé pour pouvoir faire l'intégration LDAP dans une application iPhone :
    http://www.rhussmann.com/2009/08/integrating-ldap-into-an-iphone-application/


    J'ai tout d'abord créé un nouveau projet "Single View Application".


    Dans "MainStoryboard.storyboard", j'ai insérer les labels, les text fields pour le nom d'utilisateur et le mot de passe, et un bouton pour valider.


     


    3678181MainStoryboard.png


     


     


     J'ai télécharger l'archive "openldap-2.4.30" et une archive provenant de http://www.rhussmann.com/code/RHLDAPSearch/ contenant les fichiers :


    - fat_build.sh (qui permet de créer une librairie)


    - RHLDAPSearch.h (qui contient l'URL de connexion)


    - RHLDAPSearch.m


    - SampleUsage.m (un exemple d'utilisation permettant d'implémanter un objet RHLDAPSearch avec un URL donné en utilisant un DN et un scope spécifiques)


     


    A partir de là , j'ai copié le fichier "fat_build.sh" dans le répertoire "openldap-2.4.30" que j'ai extrait.


    Ensuite, j'ai exécuté ce script (sh fat_build.sh).


     


    8574982fatbuildsh.png


     


    On peut voir que des fichiers et répertoires ont été ajoutés (à  part fat_build.sh que j'ai copié manuellement) :


     


    5050613AvantApresfatbuildsh.png


     


    Voici le contenu du répertoire "Insout" avec les fichiers :


    - liblber.a.i386


    - libldap.a.i386


     


    9897484Insout.png


     


    J'ai ensuite copié les fichiers "libldap.a.i386", "RHLDAPSearch.h" et "RHLDAPSearch.m" dans mon projet (en faisant un glisser-déposer dans Xcode), puis j'ai pris exemple sur le morceau de code du fichier "SampleUsage.m" :


     


    1637315libldapai386.png


     


    Puis j'ai copié tous les fichiers .h présents dns le répertoire "include" du dossier "openldap-2.4.30" dans mon projet :


     


    9254376Fichiersh.png


     


    Quand je compile le projet, j'obtiens des erreurs, notamment d'import du fichier "lber.h" alors qu'il est bien présent :


     


    6973307lberhnotfound.png


     


     


    3595118lberhbienpresent.png


     


    Tu aurais une idée concernant le bind LDAP dont j'aurais besoin ? Merci


     


    Je me suis mis sur la doc de l'API...


     


    Voilà  un peu l'ensemble du code :


     


    3949889ensemble.png

  • Je te recommande cette lecture http://www.ibm.com/developerworks/aix/library/au-iphoneapp/?ca=drs-


     


    Et sinon tu peux utiliser ce projet https://github.com/bindle/iOSPorts qui dispose d'un portage déjà  fonctionnel de OpenLDAP, ce qui n'est pas ton cas ici. La cross-compilation semble être faites à  moitié. Tu ne génère que des binaires OS X or il semble que tu essaye de faire une application iOS...


  • Merci de ta réponse, j'étais en train d'essayer de configurer Xcode pour faire fonctionner LDAP en suivant le 1er lien que tu as mis, mais j'ai obtenu tout un tas d'erreurs que j'ai essayé de corriger depuis ces derniers jours mais il y a des choses que je ne comprends toujours pas.


     


    En suivant ce tuto (http://www.ibm.com/developerworks/aix/library/au-iphoneapp/?ca=drs-), j'ai tout d'abord créé un nouveau projet : New > Projet... > Cocoa Touch Static Library (dans Framework & Library de iOS) que j'ai nommé "ldap".


     


    J'ai ensuite importé le code source de OpenLDAP (openldap-2.4.35) en allant dans : File > Add Files to "ldap"... (en laissant coché "ldap" dans la partie "Add to targets" en bas de la nouvelle fênetre qui s'ouvre).


     


    Il y a des éléments qu'on ne retrouve pas sur la version actuelle de Xcode que j'ai comme la case à  cocher "Recursively create groups for any added folders", ou comme la partie "Groups & Files" même s'il y a l'équivalent.


     


    Voici la vue d'ensemble du projet :


    5195650VueProjet.png


     


    Après avoir attendu l'indexation des fichiers importés (assez long), j'ai compilé le projet et j'ai obtenu diverses erreurs : des fichiers .h non trouvés, des #include <ldap.h> au lieu de #include "ldap.h", des #include <ac/stdlib.h> au lieu de #include <stdlib.h>...


     


    Vue des fichiers :


    7079371VueEnsemble.png


     


     


    Les fichiers .h :


    2394002Fichiersh.png


     


     


    Voici quelques captures des erreurs d'imports et autres :


     


    685903acerrnohnotfound.png


     


     


    985543commonc.png


     


    866184LDAPMessageQueueh.png


     


    809510ldapmodifyc.png


     


    229279LDAPSearchResultsh.png


     


    196290LDAPUrlh.png


     


    486815stdlibhnotfound.png


     


    Je pense qu'il faudrait modifier tous les imports par exemple taper :


    #include <stdlib.h> au lieu de #include <ac/stdlib.h>


    #include <sys/socket.h> au lieu de #include <ac/socket.h>


    #include "lber_types.h" au lieu de #include <lber_types.h>


    et d'autres encore...


     


    Autre remarque : il y a 556 fichiers dans le projet à  compiler, mais la compilation ralentie de plus en plus quand on approche du 330ème fichier compilé puis ça rame (le ventillo tourne à  fond, la CPU ralentie).


     


    Que penses-tu de tout ça ?


  • Ne touche pas les include de ton projet. Va dans tes build settings et met HEADER_SEARCH_PATHS à  $(SRCROOT)


  • roukanoroukano Membre
    juillet 2013 modifié #7

    Ok, j'ai recréé un projet avec openldap-2.4.22 cette fois (l'ancienne release).


     


    J'ai ajouté les sources au projet (en laissant bien décoché "ldap" dans "Add to targets").


     


    Je suis allé dans "Build Setting" du projet et dans Header Search Paths j'ai mis $(SRCROOT), ça a affiché un chemin absolu avec le projet :


    819281HeaderSearchPaths.png


     


    J'ai renommé le fichier "lber_types.hin" en "lber_types.h", et j'y ai modifié les "#undef ..." par des "#define .... int".


     


    J'ai ensuite renommé le fichier "ldap_config.hin" en "ldap_config.h".


     


    Puis, j'ai renommé le fichier "ldap_features.hin" en "ldap_features.h", et j'y ai modifié les infos concernant les différentes versions :



    #define LDAP-VENDOR_VERSION 20422
    #define LDAP-VENDOR_VERSION_MAJOR 2
    #define LDAP-VENDOR_VERSION_MINOR 4
    #define LDAP-VENDOR_VERSION_PATCH 22

    J'ai exécuté le script "autoconf" pour générer les valeurs pour "portable.hin" en allant sur un terminal en naviguant jusqu'au dossier openldap-2.4.22 du projet :



    ./configure CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld --host=arm-apple-darwin --disable-slapd --without-cyrus-sasl --without-tls --no-create

    Mais j'obtiens l'erreur :



    configure: error: C compiler cannot create executables

    Une capture :


    833246ErreurScript.png


     


    Je ne voie pas ce qui cloche.


     


    Le fichier config.log indique :


    This file contains any messages produced by compilers while

    running configure, to aid debugging if configure makes a mistake.


    It was created by configure, which was

    generated by GNU Autoconf 2.61. Invocation command line was


    $ ./configure CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld --host=arm-apple-darwin --disable-slapd --without-cyrus-sasl --without-tls --no-create


    ##
    ##

    ## Platform. ##

    ##
    ##


    hostname = sam-2.local

    uname -m = x86_64

    uname -r = 12.3.0

    uname -s = Darwin

    uname -v = Darwin Kernel Version 12.3.0: Sun Jan 6 22:37:10 PST 2013; root:xnu-2050.22.13~1/RELEASE_X86_64


    /usr/bin/uname -p = i386

    /bin/uname -X = unknown


    /bin/arch = unknown

    /usr/bin/arch -k = unknown

    /usr/convex/getsysinfo = unknown

    /usr/bin/hostinfo = Mach kernel version:

    Darwin Kernel Version 12.3.0: Sun Jan 6 22:37:10 PST 2013; root:xnu-2050.22.13~1/RELEASE_X86_64

    Kernel configured for up to 2 processors.

    2 processors are physically available.

    2 processors are logically available.

    Processor type: i486 (Intel 80486)

    Processors active: 0 1

    Primary memory available: 2.00 gigabytes

    Default processor set: 84 tasks, 475 threads, 2 processors

    Load average: 1.29, Mach factor: 0.78

    /bin/machine = unknown

    /usr/bin/oslevel = unknown

    /bin/universe = unknown


    PATH: /usr/bin

    PATH: /bin

    PATH: /usr/sbin

    PATH: /sbin

    PATH: /usr/local/bin



    ##
    ##

    ## Core tests. ##

    ##
    ##


    configure:2150: checking build system type

    configure:2168: result: i686-apple-darwin12.3.0

    configure:2190: checking host system type

    configure:2205: result: arm-apple-darwin

    configure:2227: checking target system type

    configure:2242: result: arm-apple-darwin

    configure:2285: checking for a BSD-compatible install

    configure:2341: result: /usr/bin/install -c

    configure:2352: checking whether build environment is sane

    configure:2395: result: yes

    configure:2460: checking for gawk

    configure:2490: result: no

    configure:2460: checking for mawk

    configure:2490: result: no

    configure:2460: checking for nawk

    configure:2490: result: no

    configure:2460: checking for awk

    configure:2476: found /usr/bin/awk

    configure:2487: result: awk

    configure:2498: checking whether make sets $(MAKE)

    configure:2519: result: yes

    configure:2586: checking for arm-apple-darwin-strip

    configure:2616: result: no

    configure:2626: checking for strip

    configure:2642: found /usr/bin/strip

    configure:2653: result: strip

    configure:2744: checking configure arguments

    configure:4341: WARNING: slapd disabled, ignoring --enable-bdb argument

    configure:4341: WARNING: slapd disabled, ignoring --enable-hdb argument

    configure:4341: WARNING: slapd disabled, ignoring --enable-monitor argument

    configure:4341: WARNING: slapd disabled, ignoring --enable-relay argument

    configure:4377: WARNING: slapd disabled, ignoring --enable-syncprov argument

    configure:4446: result: done

    configure:4674: checking for ar

    configure:4690: found /usr/bin/ar

    configure:4701: result: ar

    configure:4761: checking for style of include used by make

    configure:4789: result: GNU

    configure:4822: checking for arm-apple-darwin-gcc

    configure:4849: result: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc

    configure:5127: checking for C compiler version

    configure:5134: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc --version >&5

    ./configure: line 5135: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: No such file or directory

    configure:5137: $? = 127

    configure:5144: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -v >&5

    ./configure: line 5145: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: No such file or directory

    configure:5147: $? = 127

    configure:5154: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -V >&5

    ./configure: line 5155: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: No such file or directory

    configure:5157: $? = 127

    configure:5180: checking for C compiler default output file name

    configure:5207: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc conftest.c >&5

    ./configure: line 5208: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: No such file or directory

    configure:5210: $? = 127

    configure:5248: result:

    configure: failed program was:

    | /* confdefs.h. */

    | #define PACKAGE_NAME ""

    | #define PACKAGE_TARNAME ""

    | #define PACKAGE_VERSION ""

    | #define PACKAGE_STRING ""

    | #define PACKAGE_BUGREPORT ""

    | #define OPENLDAP_PACKAGE "OpenLDAP"

    | #define OPENLDAP_VERSION "2.4.22"

    | #define LDAP_VENDOR_VERSION 20422

    | #define LDAP_VENDOR_VERSION_MAJOR 2

    | #define LDAP_VENDOR_VERSION_MINOR 4

    | #define LDAP_VENDOR_VERSION_PATCH 22

    | #define HAVE_MKVERSION 1

    | /* end confdefs.h. */

    |

    | int

    | main ()

    | {

    |

    | ;

    | return 0;

    | }

    configure:5255: error: C compiler cannot create executables

    See `config.log' for more details.


    ##
    ##

    ## Cache variables. ##

    ##
    ##


    ac_cv_build=i686-apple-darwin12.3.0

    ac_cv_env_CC_set=set

    ac_cv_env_CC_value=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc

    ac_cv_env_CFLAGS_set=

    ac_cv_env_CFLAGS_value=

    ac_cv_env_CPPFLAGS_set=

    ac_cv_env_CPPFLAGS_value=

    ac_cv_env_CPP_set=

    ac_cv_env_CPP_value=

    ac_cv_env_LDFLAGS_set=

    ac_cv_env_LDFLAGS_value=

    ac_cv_env_LIBS_set=

    ac_cv_env_LIBS_value=

    ac_cv_env_build_alias_set=

    ac_cv_env_build_alias_value=

    ac_cv_env_host_alias_set=set

    ac_cv_env_host_alias_value=arm-apple-darwin

    ac_cv_env_target_alias_set=

    ac_cv_env_target_alias_value=

    ac_cv_host=arm-apple-darwin

    ac_cv_path_install='/usr/bin/install -c'

    ac_cv_prog_AR=ar

    ac_cv_prog_AWK=awk

    ac_cv_prog_CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc

    ac_cv_prog_ac_ct_STRIP=strip

    ac_cv_prog_make_make_set=yes

    ac_cv_shtool=build/shtool

    ac_cv_target=arm-apple-darwin


    ##
    ##

    ## Output variables. ##

    ##
    ##


    ACLOCAL='${SHELL} /Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22/build/missing --run aclocal-1.9'

    AMDEPBACKSLASH='\'

    AMDEP_FALSE='#'

    AMDEP_TRUE=''

    AMTAR='${SHELL} /Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22/build/missing --run tar'

    AR='ar'

    AS=''

    AUTH_LIBS=''

    AUTOCONF='${SHELL} /Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22/build/missing --run autoconf'

    AUTOHEADER='${SHELL} /Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22/build/missing --run autoheader'

    AUTOMAKE='${SHELL} /Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22/build/missing --run automake-1.9'

    AWK='awk'

    BDB_LIBS=''

    BUILD_ACCESSLOG='no'

    BUILD_AUDITLOG='no'

    BUILD_BDB='no'

    BUILD_COLLECT=''

    BUILD_CONSTRAINT='no'

    BUILD_DDS='no'

    BUILD_DENYOP='no'

    BUILD_DEREF='no'

    BUILD_DNSSRV='no'

    BUILD_DYNGROUP='no'

    BUILD_DYNLIST='no'

    BUILD_HDB='no'

    BUILD_LASTMOD='no'

    BUILD_LDAP='no'

    BUILD_LIBS_DYNAMIC=''

    BUILD_MEMBEROF='no'

    BUILD_META='no'

    BUILD_MONITOR='no'

    BUILD_NDB='no'

    BUILD_NULL='no'

    BUILD_PASSWD='no'

    BUILD_PERL='no'

    BUILD_PPOLICY='no'

    BUILD_PROXYCACHE='no'

    BUILD_REFINT='no'

    BUILD_RELAY='no'

    BUILD_RETCODE='no'

    BUILD_RWM='no'

    BUILD_SEQMOD='no'

    BUILD_SHELL='no'

    BUILD_SLAPD='no'

    BUILD_SLAPI='no'

    BUILD_SOCK='no'

    BUILD_SQL='no'

    BUILD_SSSVLV='no'

    BUILD_SYNCPROV='no'

    BUILD_THREAD='no'

    BUILD_TRANSLUCENT='no'

    BUILD_UNIQUE='no'

    BUILD_VALSORT='no'

    CC='/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc'

    CCDEPMODE=''

    CFLAGS=''

    CPP=''

    CPPFLAGS=''

    CYGPATH_W='echo'

    DEFS=''

    DEPDIR='.deps'

    DLLTOOL=''

    ECHO='/bin/echo'

    ECHO_C='ECHO_N=''

    ECHO_T=''

    EGREP=''

    EXEEXT=''

    GREP=''

    ICU_LIBS=''

    INSTALL_DATA='${INSTALL} -m 644'

    INSTALL_PROGRAM='${INSTALL}'

    INSTALL_SCRIPT='${INSTALL}'

    INSTALL_STRIP_PROGRAM='${SHELL} $(install_sh) -c -s'

    KRB4_LIBS=''

    KRB5_LIBS=''

    LDAP_LIBS=''

    LDFLAGS=''

    LIBOBJS=''

    LIBS=''

    LIBSLAPI=''

    LIBSLAPITOOLS=''

    LIBSRCS=''

    LIBTOOL=''

    LN_S=''

    LTHREAD_LIBS=''

    LTLIBOBJS=''

    LTSTATIC=''

    LUTIL_LIBS=''

    MAKEINFO='${SHELL} /Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22/build/missing --run makeinfo'

    MODULES_LIBS=''

    MOD_PERL_LDFLAGS=''

    MYSQL=''

    OBJDUMP=''

    OBJEXT=''

    OL_MKDEP=''

    OL_MKDEP_FLAGS=''

    OPENLDAP_LIBRELEASE='2.4'

    OPENLDAP_LIBVERSION='7:5:5'

    OPENLDAP_RELEASE_DATE='2010/04/24'

    PACKAGE='OpenLDAP'

    PACKAGE_BUGREPORT=''

    PACKAGE_NAME=''

    PACKAGE_STRING=''

    PACKAGE_TARNAME=''

    PACKAGE_VERSION=''

    PATH_SEPARATOR=':'

    PERLBIN=''

    PERL_CPPFLAGS=''

    PLAT=''

    RANLIB=''

    SASL_LIBS=''

    SET_MAKE=''

    SHELL='/bin/sh'

    SLAPD_DYNAMIC_BACKENDS=''

    SLAPD_DYNAMIC_OVERLAYS=''

    SLAPD_GMP_LIBS=''

    SLAPD_LIBS=''

    SLAPD_MODULES_CPPFLAGS=''

    SLAPD_MODULES_LDFLAGS=''

    SLAPD_NDB_INCS=''

    SLAPD_NDB_LIBS=''

    SLAPD_NO_STATIC=''

    SLAPD_PERL_LDFLAGS=''

    SLAPD_SLAPI_DEPEND=''

    SLAPD_SLP_LIBS=''

    SLAPD_SQL_INCLUDES=''

    SLAPD_SQL_LDFLAGS=''

    SLAPD_SQL_LIBS=''

    SLAPD_STATIC_BACKENDS='back-ldif'

    SLAPD_STATIC_OVERLAYS=''

    SLAPI_LIBS=''

    STRIP='strip'

    TLS_LIBS=''

    VERSION='2.4.22'

    WITH_ACI_ENABLED=''

    WITH_MODULES_ENABLED=''

    WITH_SASL=''

    WITH_TLS=''

    WRAP_LIBS=''

    ac_ct_CC=''

    am__fastdepCC_FALSE=''

    am__fastdepCC_TRUE=''

    am__include='include'

    am__leading_dot='.'

    am__quote=''

    am__tar='${AMTAR} chof - "$$tardir"'

    am__untar='${AMTAR} xf -'

    bindir='${exec_prefix}/bin'

    build='i686-apple-darwin12.3.0'

    build_alias=''

    build_cpu='i686'

    build_os='darwin12.3.0'

    build_vendor='apple'

    datadir='${datarootdir}'

    datarootdir='${prefix}/share'

    docdir='${datarootdir}/doc/${PACKAGE}'

    dvidir='${docdir}'

    exec_prefix='NONE'

    host='arm-apple-darwin'

    host_alias='arm-apple-darwin'

    host_cpu='arm'

    host_os='darwin'

    host_vendor='apple'

    htmldir='${docdir}'

    includedir='${prefix}/include'

    infodir='${datarootdir}/info'

    install_sh='/Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22/build/install-sh'

    ldap_subdir='/openldap'

    libdir='${exec_prefix}/lib'

    libexecdir='${exec_prefix}/libexec'

    localedir='${datarootdir}/locale'

    localstatedir='${prefix}/var'

    mandir='${datarootdir}/man'

    mkdir_p='$(install_sh) -d'

    oldincludedir='/usr/include'

    pdfdir='${docdir}'

    prefix='NONE'

    program_transform_name='s,x,x,'

    psdir='${docdir}'

    sbindir='${exec_prefix}/sbin'

    sharedstatedir='${prefix}/com'

    sysconfdir='${prefix}/etc'

    target='arm-apple-darwin'

    target_alias=''

    target_cpu='arm'

    target_os='darwin'

    target_vendor='apple'

    top_builddir='/Users/sam/Desktop/ProjetXcode/ldap/openldap-2.4.22'


    ##
    ##

    ## confdefs.h. ##

    ##
    ##


    #define PACKAGE_NAME ""

    #define PACKAGE_TARNAME ""

    #define PACKAGE_VERSION ""

    #define PACKAGE_STRING ""

    #define PACKAGE_BUGREPORT ""

    #define OPENLDAP_PACKAGE "OpenLDAP"

    #define OPENLDAP_VERSION "2.4.22"

    #define LDAP_VENDOR_VERSION 20422

    #define LDAP_VENDOR_VERSION_MAJOR 2

    #define LDAP_VENDOR_VERSION_MINOR 4

    #define LDAP_VENDOR_VERSION_PATCH 22

    #define HAVE_MKVERSION 1


    configure: exit 77

  • J'ai finalement suivi le tuto concernant iOSPorts (https://github.com/bindle/iOSPorts) et LDAP Kit (https://github.com/bindle/LdapKit), en recréant le projet "Zebra" .


     


    J'ai téléchargé et ajouté au projet les projets "openldap.xcodeproj" et "iOSPorts.xcodeproj" en allant sur Add Files to "Zebra"...


     


    J'ai mis à  jour le "Target Depedencies" en ajoutant :


    - ldap


    - lber


    - iOSPorts


     


    J'ai également mis à  jour le "Link Binary With Libraries" en ajoutant :


    - libldap.a


    - liblber.a


    - libiOSPorts.a


    - libssl.a


    - libsasl2.a


    - libcrypto.a


     


     


    Aperçu du projet avant compilation :


     


    640560AvantCompilation.png


     


     


    La compilation se passe sans erreur, mais avec quelques warning :


     


    507868ApresCompilation.png


     


     


    Maintenant que tout compile correctement, je ne voie pas comment utiliser les classes et méthodes pour faire la connexion avec le serveur LDAP, c'est-à -dire quel code écrire pour faire la liaison avec les infos concernant le bind DN/user (cn=...,ou=...,dc=...), le mot de passe de connexion, le numéro de port etc...


     


    Si tu as une idée, merci de m'éclairer.


     


  • Tu as lu le fichier d'exemple de LDAPKit https://github.com/bindle/LdapKit/blob/master/examples/PhoneDAP/PhoneDAP/PDLdapTest.m ? Tout est dedans.


     


    Si tu ne sais pas te servir d'une base LDAP je te conseil de commencer par te documenter sur le sujet avant tout. Une fois que tu sais ce que tu veux faire et que tu y arrive avec les ligne de commande ldapsearch et ldapmodify tu peux envisager le faire en code avec une lib ou une autre.


  • Je ne savais pas me servir d'une base LDAP mais j'ai regardé ça de plus près ; j'ai tapé quelques commandes sur le terminal de la machine virtuelle pour que ça affiche toute l'arborescence, et notamment la commande :



    ldapsearch -x -b "ou=xxx,dc=yyy,dc=zzz"

    En exécutant cette commande, ça m'affiche bien toute l'arborescence, j'aurais aimé pouvoir faire la même chose sur l'application iOS dans un premier temps, puis de pouvoir afficher les infos concernant une personne qui se connecte avec ses identifiants.


     


    J'ai regardé le projet "ldapsearch" et les fichiers "ldapTest.h" et "ldapTest.m", et parmi les fonctions présentes dans le .h celle qui m'interesse est "test_simple_ldap()".


     


    J'ai fait les remplacements nécessaires dans les #define du fichier "ldapTest.h" ainsi que les variables


    ldapURI et dn du fichier "ldapTest.m"..


     


    Apparement la connexion au serveur LDAP fonctionne, mais il y a l'erreur "Invalid credentials" à  l'appel de la fonction "ldap_sasl_bind_s()".


     


    421446ldapsearch.png


  • Tu as fait un -x dans ta commande de test... Si tu va lire la documentation pour comprendre ce que tu as copier coller tu verra que :



    -x Use simple authentication instead of SASL


     


    Donc forcément, si tu tente une connexion de type SASL avec SSL (ldap_sasl_bind_s) ça risque par de marcher de la même manière.

  • D'accord mais le -x était dans la commande tapée sur le terminal, tandis que l'erreur dans la fenêtre de log de Xcode est indépendante de la commande que j'ai tapée, je vais voir plus en détail le code alors.


  • Je reprend, le code que tu as tapé ne fait pas du tout la même chose que la commande du terminal, c'est normal que tu ai un résultat différent...


  • Merci beaucoup pour les indications, je peux enfin afficher dans la fenêtre de log des infos telles que le prénom, le nom et l'adresse mail d'un utilisateur (sans taper de mot de passe pour l'instant) à  partir du "filter" défini dans "ldapTest.h".


     


    Il fallait voir du côté des fonctions "ldap_first_attribute()" et "ldap_get_values_len()" pour récupérer les valeurs des attributs.


     


    Maintenant il me reste à  les afficher dans Interface Builder mais je ne voie pas encore comment, je continue de chercher.


  • Je peux désormais comparer le nom d'utilisateur saisi sur l'application avec le nom stocké dans la base LDAP et afficher des infos telles que le prénom, le nom, l'adresse mail sur l'application également, pour cela j'ai importé le fichier "ldapTest.h" dans "AppDelegate_Pad.m" et je peux accéder aux fonctions "test_all_ldap()" et en créer d'autres pour affiner la recherche.


     


    Le seul hic c'est pour comparer le mot de passe saisi sur l'appli et celui de la base qui est crypté ({SHA}....), je m'y attèle.


     


    Merci encore à  toi.


  • AliGatorAliGator Membre, Modérateur

    Bah c'est normal qu'il est en SHA1 (qui n'est pas un "cryptage", non seulement parce que le mot auquel tu pensais n'est pas "crypté" mais "chiffré", mais surtout parce que SHA1 est un hash et non un chiffrage).


     


    Mais quel est le problème ? Il suffit de comparer le SHA1(mdpSaisi) avec le SHA1 en base.


  • roukanoroukano Membre
    août 2013 modifié #17

    Merci pour les précisions, j'étais en train de chercher s'il existe une fonction qui permette de comparer le mdpSaisi (brut tapé au clavier) avec le SHA1 en base...


     


     


    J'essaie d'afficher le userPassword mais ce n'est apparemment pas un attribut reconnu :



    [...]
    struct berval ** vals;
    LDAPMessage *entry = ldap_first_entry(ld, res);

    while(entry){
    char *attribute = ldap_first_attribute(ld, entry, &ber);
    while(attribute){
    if ((vals = ldap_get_values_len(ld, entry, attribute))){
    for(i = 0; vals[i]; i++){

    // devrait afficher le mot de passe, mais rien ne s'affiche
    if(strcmp(attribute,"userPassword") == 0){
    NSLog(@Le mot de passe est : %s\n,vals[i]->bv_val);
    }
    }
    ldap_value_free_len(vals);
    };
    ldap_memfree(attribute);
    attribute = ldap_next_attribute(ld, entry, ber);
    };

    // skip to the next entry
    entry = ldap_next_entry(ld, entry);
    };
    [...]

    Sur LDAPManager cet attribut apparaà®t bien pourtant :


     


    519894mdp.png


  • C'est normal, tu n'as pas le droit de lire le mot de passe, même haché, d'un utilisateur, sinon c'est même plus la peine d'avoir un mot de passe.


     


    La seule et unique bonne méthode pour valider un utilisateur en LDAP c'est de faire une tentative de bind authentifié en son nom.


     


    Il ne faut pas essayer de comparer la valeur userPassword car certaines bases LDAP n'en auront tout simplement pas ! Le mot de passe sur des systèmes plus sécurisé que cela est stocké ailleurs.


     


    Ce qu'il faut faire c'est identifier ton utilisateur via une recherche en anonyme (ou avec une preauth de service), récupérer le dn de l'utilisateur et ensuite se servir du dn et du mot de passe pour faire une (re)authentification LDAP.


     


    Si la connexion passe, c'est que le mot de passe est bon, si la connexion échoue, c'est que le mot de passe n'est pas bon.


  • roukanoroukano Membre
    août 2013 modifié #19

    Ok merci, j'ai recherché dans cette voie là  et j'ai enfin pu faire l'authentification d'un utilisateur avec son mot de passe.


     


    C'est simplement une fonction en C telle que celle-ci, qui renvoie YES si la connexion a reussi, NO sinon.



    BOOL connexionLDAP(NSString *user, NSString *pass){ // le username et le password saisis dans l'interface de l'appli
        LDAP *ld;
        int rc;
        char bind_dn[100];
        int err;
        
        char *username = [user cStringUsingEncoding:NSASCIIStringEncoding]; // pour passer d'un NSString à  un char*
        char *password = [pass cStringUsingEncoding:NSASCIIStringEncoding]; // est-ce une bonne façon de faire ?
        
        /* Open LDAP Connection */
        if(ldap_initialize(&ld, "172.16.16.128:389")){ // adresse IP privée (relative au serveur Ubuntu de la machine virtuelle)
            perror("ldap_initialize");
            return NO;
        }
            
        sprintf(bind_dn,"cn=%s,ou=n1,ou=users,ou=applications,dc=societe,dc=com",username);
        printf("Connecting as %s...\n", bind_dn);
        
        
        int version = LDAP_VERSION3;
        err = ldap_set_option(ld,LDAP_OPT_PROTOCOL_VERSION,&version);
        if(err != LDAP_SUCCESS){
            NSLog(@ ldap_set_option(): %s\n, ldap_err2string(err));
            ldap_unbind_ext_s(ld, NULL, NULL);
            return NO;
        }
        
        /* User authentication (bind) */
        rc = ldap_simple_bind_s(ld,bind_dn,password);
        if(rc != LDAP_SUCCESS){
            fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc));
            return NO;
        }
        
        printf("Successful authentication\n");
        ldap_unbind(ld);
        return YES;
    }

    Ca marche très bien quand tous les username se trouvent dans la même branche de l'arbre, mais comment faire s'il existe d'autres username dans d'autres branches ?


     


    Par exemple avec cet arbre :


     


    ou=applications,dc=societe,dc=com


                                                   |_______cn=executive


                                                   |_______ou=team


                                                   |_______ou=users


                                                                      |_______ou=n1


                                                                      |                     |_______cn=responsable1


                                                                      |                     |_______cn=responsable2


                                                                      |                     |_______cn=agent1


                                                                      |_______ou=n2


                                                                                            |_______cn=gestionnaire1


                                                                                            |_______cn=gestionnaire2


     


    Tous les username (responsable1, responsable2, agent1, gestionnaire1 et gestionnaire2) se trouvent dans 2 branches différentes :


    - les uns dans : "ou=n1,ou=users,ou=applications,dc=societe,dc=com"


    - les autres dans : "ou=n2,ou=users,ou=applications,dc=societe,dc=com"


     


    On pourrait faire appel à  la fonction 2 fois en mettant en argument la branche voulue, mais y a t'il une autre façon un peu mieux ?




  • Ca marche très bien quand tous les username se trouvent dans la même branche de l'arbre, mais comment faire s'il existe d'autres username dans d'autres branches ?


     


    Par exemple avec cet arbre :


     


    ou=applications,dc=societe,dc=com


                                                   |_______cn=executive


                                                   |_______ou=team


                                                   |_______ou=users


                                                                      |_______ou=n1


                                                                      |                     |_______cn=responsable1


                                                                      |                     |_______cn=responsable2


                                                                      |                     |_______cn=agent1


                                                                      |_______ou=n2


                                                                                            |_______cn=gestionnaire1


                                                                                            |_______cn=gestionnaire2


     


    Tous les username (responsable1, responsable2, agent1, gestionnaire1 et gestionnaire2) se trouvent dans 2 branches différentes :


    - les uns dans : "ou=n1,ou=users,ou=applications,dc=societe,dc=com"


    - les autres dans : "ou=n2,ou=users,ou=applications,dc=societe,dc=com"


     


    On pourrait faire appel à  la fonction 2 fois en mettant en argument la branche voulue, mais y a t'il une autre façon un peu mieux ?


     



     


     


    Je t'ai déjà  donnée la réponse :


     




    Ce qu'il faut faire c'est identifier ton utilisateur via une recherche en anonyme (ou avec une preauth de service), récupérer le dn de l'utilisateur et ensuite se servir du dn et du mot de passe pour faire une (re)authentification LDAP.




     


     


    D'abord tu fais une recherche depuis ou=users,ou=applications,dc=societe,dc=com dans tout le subtree pour cn=toto (si cn est bien ta clef unique) et quand tu as l'identité de la personne, tu as son dn et à  partir de là  tu peut l'authentifier via un BIND LDAP.


     


    Quelque soit le protocole, il y a toujours identification avant authentification.

  • Ca marche merci, j'ai fait l'identification à  partir du noeud "users" puis l'authentification.


Connectez-vous ou Inscrivez-vous pour répondre.