mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
Fixed LDAP access on CE
This commit is contained in:
parent
7f6fba3437
commit
4a230275f8
4 changed files with 250 additions and 35 deletions
169
dirmngr/w32-ldap-help.h
Normal file
169
dirmngr/w32-ldap-help.h
Normal file
|
@ -0,0 +1,169 @@
|
|||
/* w32-ldap-help.h - Map utf8 based API into a wchar_t API.
|
||||
o* Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef W32_LDAP_HELP_H
|
||||
#define W32_LDAP_HELP_H
|
||||
|
||||
#ifndef HAVE_W32CE_SYSTEM
|
||||
# error This is only required for W32CE.
|
||||
#endif
|
||||
|
||||
|
||||
static inline LDAP *
|
||||
_dirmngr_ldap_init (const char *host, unsigned short port)
|
||||
{
|
||||
LDAP *ld;
|
||||
wchar_t *whost = NULL;
|
||||
|
||||
if (host)
|
||||
{
|
||||
whost = utf8_to_wchar (host);
|
||||
if (!whost)
|
||||
return NULL;
|
||||
}
|
||||
ld = ldap_init (whost, port);
|
||||
xfree (whost);
|
||||
return ld;
|
||||
}
|
||||
|
||||
|
||||
static inline ULONG
|
||||
_dirmngr_ldap_simple_bind_s (LDAP *ld, const char *user, const char *pass)
|
||||
{
|
||||
ULONG ret;
|
||||
wchar_t *wuser, *wpass;
|
||||
|
||||
wuser = user? utf8_to_wchar (user) : NULL;
|
||||
wpass = pass? utf8_to_wchar (pass) : NULL;
|
||||
/* We can't easily map errnos to ldap_errno, thus we pass a NULL to
|
||||
the function in the hope that the server will throw an error. */
|
||||
ret = ldap_simple_bind_s (ld, wuser, wpass);
|
||||
xfree (wpass);
|
||||
xfree (wuser);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static inline ULONG
|
||||
_dirmngr_ldap_search_st (LDAP *ld, const char *base, ULONG scope,
|
||||
const char *filter, char **attrs,
|
||||
ULONG attrsonly, struct timeval *timeout,
|
||||
LDAPMessage **res)
|
||||
{
|
||||
ULONG ret = LDAP_NO_MEMORY;
|
||||
wchar_t *wbase = NULL;
|
||||
wchar_t *wfilter = NULL;
|
||||
wchar_t **wattrs = NULL;
|
||||
int i;
|
||||
|
||||
if (base)
|
||||
{
|
||||
wbase = utf8_to_wchar (base);
|
||||
if (!wbase)
|
||||
goto leave;
|
||||
}
|
||||
if (filter)
|
||||
{
|
||||
wfilter = utf8_to_wchar (filter);
|
||||
if (!wfilter)
|
||||
goto leave;
|
||||
}
|
||||
if (attrs)
|
||||
{
|
||||
for (i=0; attrs[i]; i++)
|
||||
;
|
||||
wattrs = xtrycalloc (i+1, sizeof *wattrs);
|
||||
if (!wattrs)
|
||||
goto leave;
|
||||
for (i=0; attrs[i]; i++)
|
||||
{
|
||||
wattrs[i] = utf8_to_wchar (attrs[i]);
|
||||
if (!wattrs[i])
|
||||
goto leave;
|
||||
}
|
||||
}
|
||||
|
||||
ret = ldap_search_st (ld, wbase, scope, wfilter, wattrs, attrsonly,
|
||||
(struct l_timeval *)timeout, res);
|
||||
|
||||
leave:
|
||||
if (wattrs)
|
||||
{
|
||||
for (i=0; wattrs[i]; i++)
|
||||
xfree (wattrs[i]);
|
||||
xfree (wattrs);
|
||||
}
|
||||
xfree (wfilter);
|
||||
xfree (wbase);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static inline char *
|
||||
_dirmngr_ldap_first_attribute (LDAP *ld, LDAPMessage *msg, BerElement **elem)
|
||||
{
|
||||
wchar_t *wattr;
|
||||
char *attr;
|
||||
|
||||
wattr = ldap_first_attribute (ld, msg, elem);
|
||||
if (!wattr)
|
||||
return NULL;
|
||||
attr = wchar_to_utf8 (wattr);
|
||||
ldap_memfree (wattr);
|
||||
return attr;
|
||||
}
|
||||
|
||||
|
||||
static inline char *
|
||||
_dirmngr_ldap_next_attribute (LDAP *ld, LDAPMessage *msg, BerElement *elem)
|
||||
{
|
||||
wchar_t *wattr;
|
||||
char *attr;
|
||||
|
||||
wattr = ldap_next_attribute (ld, msg, elem);
|
||||
if (!wattr)
|
||||
return NULL;
|
||||
attr = wchar_to_utf8 (wattr);
|
||||
ldap_memfree (wattr);
|
||||
return attr;
|
||||
}
|
||||
|
||||
static inline BerValue **
|
||||
_dirmngr_ldap_get_values_len (LDAP *ld, LDAPMessage *msg, const char *attr)
|
||||
{
|
||||
BerValue **ret;
|
||||
wchar_t *wattr;
|
||||
|
||||
if (attr)
|
||||
{
|
||||
wattr = utf8_to_wchar (attr);
|
||||
if (!wattr)
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
wattr = NULL;
|
||||
|
||||
ret = ldap_get_values_len (ld, msg, wattr);
|
||||
xfree (wattr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#endif /*W32_LDAP_HELP_H*/
|
Loading…
Add table
Add a link
Reference in a new issue