basic support for LDAPControls

This commit is contained in:
eknauel 2004-05-21 08:31:21 +00:00
parent 610b9c5c00
commit 4ab9274132
2 changed files with 105 additions and 2 deletions

View File

@ -9,6 +9,8 @@ FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapmessage, scsh_ldapmessage_record_type,
FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapmod, scsh_ldapmod_record_type,
LDAPMod*);
/* LDAPAPIInfo */
FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapiinfo, scsh_ldapapiinfo_record_type,
LDAPAPIInfo*);
@ -36,6 +38,58 @@ FFIT_STRUCT_GET(scsh_ldapapiinfo_get_extensions,
scsh_ldapapiinfo_record_type, LDAPAPIInfo*,
ldapai_extensions, ffit_enter_string_array);
/* LDAPControl */
FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapcontrol, scsh_ldapcontrol_record_type,
LDAPControl*);
FFIT_STRUCT_GET_STRING(scsh_ldapcontrol_get_objectid,
scsh_ldapcontrol_record_type, LDAPControl*,
ldctl_oid);
FFIT_STRUCT_SET_STRING(scsh_ldapcontrol_set_objectid,
scsh_ldapcontrol_record_type, LDAPControl*,
ldctl_oid);
s48_value scsh_ldapcontrol_get_value(s48_value control)
{
LDAPControl* ctrl;
s48_value bytes;
S48_DECLARE_GC_PROTECT(2);
S48_GC_PROTECT_2(control, bytes);
ctrl = scsh_extract_ldapcontrol(control);
bytes = scsh_enter_BerValue_as_bytevector(&(ctrl->ldctl_value));
S48_GC_UNPROTECT();
return bytes;
}
s48_value scsh_ldapcontrol_set_value(s48_value control, s48_value value)
{
BerValue* bv;
LDAPControl* ctrl;
S48_DECLARE_GC_PROTECT(2);
S48_GC_PROTECT_2(control, value);
ctrl = scsh_extract_ldapcontrol(control);
bv = scsh_extract_bytevector_as_BerValue(value);
(ctrl->ldctl_value).bv_len = bv->bv_len;
(ctrl->ldctl_value).bv_val = bv->bv_val;
free(bv);
S48_GC_UNPROTECT();
return S48_UNSPECIFIC;
}
FFIT_STRUCT_GET_CHAR(scsh_ldapcontrol_get_iscritical,
scsh_ldapcontrol_record_type, LDAPControl*,
ldctl_iscritical);
FFIT_STRUCT_SET_CHAR(scsh_ldapcontrol_set_iscritical,
scsh_ldapcontrol_record_type, LDAPControl*,
ldctl_iscritical);
/* BerElement */
FFIT_MAKE_ENTER_RECORD(scsh_enter_berelement, scsh_berelement_record_type,
BerElement *);
@ -74,6 +128,16 @@ s48_value scsh_ldap_sasl_bind_s(s48_value ldap, s48_value dn,
s48_value client_controls,
s48_value server_cred_p)
{
LDAP *l;
BerValue *bv;
int ret;
S48_DECLARE_GC_PROTECT(8);
bv = scsh_extract_bytevector_as_BerValue(cred);
l = scsh_extract_ldap(ldap);
/* need to implement bindings for berval stuff first */
return S48_FALSE;
}
@ -619,13 +683,13 @@ LDAPMod** scsh_extract_ldapmod_list(s48_value list)
S48_DECLARE_GC_PROTECT(2);
S48_GC_PROTECT_2(list, e);
l = length_scheme_list(list);
l = s48_length(list);
if ((a = (LDAPMod **) calloc(l + 1, sizeof(LDAPMod *))) == NULL)
s48_raise_out_of_memory_error();
a[l] = NULL;
for (e = list, i = 0; e != NULL; e = S48_CDR(e), i++)
for (e = list, i = 0; e != S48_NULL; e = S48_CDR(e), i++)
a[i] = scsh_create_ldapmod(S48_CAR(e));
S48_GC_UNPROTECT();
@ -642,6 +706,37 @@ void scsh_free_ldapmod_array(LDAPMod **a)
free(a);
}
s48_value scsh_enter_BerValue_as_bytevector(BerValue* bv)
{
int i;
s48_value res = S48_FALSE;
S48_DECLARE_GC_PROTECT(1);
S48_GC_PROTECT_1(res);
res = s48_make_byte_vector(bv->bv_len, 0);
for (i = 0; i < bv->bv_len; i++)
S48_BYTE_VECTOR_SET(res, i, bv->bv_val[i]);
S48_GC_UNPROTECT();
return res;
}
BerValue* scsh_extract_bytevector_as_BerValue(s48_value bytevector)
{
BerValue* bv;
S48_DECLARE_GC_PROTECT(1);
S48_GC_PROTECT_1(bytevector);
if ((bv = (BerValue*) malloc(sizeof(BerValue))) == NULL)
s48_raise_out_of_memory_error();
bv->bv_val = s48_extract_byte_vector(bytevector);
bv->bv_len = S48_BYTE_VECTOR_LENGTH(bytevector);
S48_GC_UNPROTECT();
return bv;
}
void raise_ldap_memory_alloc_error(void)
{
s48_raise_scheme_exception(condition_ldap_memory_alloc_error, 0);

View File

@ -25,6 +25,7 @@ static s48_value scsh_ldapmessage_record_type = S48_FALSE;
static s48_value scsh_ldapmod_record_type = S48_FALSE;
static s48_value scsh_ldapapiinfo_record_type = S48_FALSE;
static s48_value scsh_berelement_record_type = S48_FALSE;
static s48_value scsh_ldapcontrol_record_type = S48_FALSE;
FFIT_MAKE_ENTER_RECORD_PROTOTYPE(scsh_enter_ldap, LDAP*);
#define scsh_extract_ldap(x) \
@ -55,6 +56,11 @@ FFIT_MAKE_ENTER_RECORD_PROTOTYPE(scsh_enter_berelement, BerElement*);
((BerElement *) \
s48_extract_integer(S48_RECORD_REF(x, 0)))
FFIT_MAKE_ENTER_RECORD_PROTOTYPE(scsh_enter_ldapcontrol_record_type, LDAPControl*);
#define scsh_extract_ldapcontrol(x) \
((LDAPControl *) \
s48_extract_integer(S48_RECORD_REF(x, 0)))
/* conditions */
static s48_value condition_ldap_memory_alloc_error = S48_FALSE;
static s48_value condition_ldap_feature_not_supported = S48_FALSE;
@ -115,4 +121,6 @@ s48_value scsh_ldap_get_set_option(s48_value, s48_value, s48_value, s48_value);
LDAPMod* scsh_create_ldapmod(s48_value ldapmod);
LDAPMod** scsh_extract_ldapmod_list(s48_value);
void scsh_free_ldapmod_array(LDAPMod **);
s48_value scsh_enter_BerValue_as_bytevector(BerValue* bv);
BerValue* scsh_extract_bytevector_as_BerValue(s48_value bytevector);
void scsh_init_ldap_bindings(void);