mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
allow parsing/unparsing of keepalive stuff in bindconf (first part of ITS#6389)
This commit is contained in:
parent
1970251bb7
commit
14c3f7de57
@ -1210,6 +1210,89 @@ static slap_verbmasks versionkey[] = {
|
||||
{ BER_BVNULL, 0 }
|
||||
};
|
||||
|
||||
static int
|
||||
slap_keepalive_parse(
|
||||
struct berval *val,
|
||||
void *bc,
|
||||
slap_cf_aux_table *tab0,
|
||||
const char *tabmsg,
|
||||
int unparse )
|
||||
{
|
||||
if ( unparse ) {
|
||||
slap_keepalive *sk = (slap_keepalive *)bc;
|
||||
int rc = snprintf( val->bv_val, val->bv_len, "%d:%d:%d",
|
||||
sk->sk_idle, sk->sk_probes, sk->sk_interval );
|
||||
if ( rc < 0 ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( (unsigned)rc >= val->bv_len ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
val->bv_len = rc;
|
||||
|
||||
} else {
|
||||
char *s = val->bv_val;
|
||||
char *next;
|
||||
slap_keepalive *sk = (slap_keepalive *)bc;
|
||||
slap_keepalive sk2;
|
||||
|
||||
if ( s[0] == ':' ) {
|
||||
sk2.sk_idle = 0;
|
||||
s++;
|
||||
|
||||
} else {
|
||||
sk2.sk_idle = strtol( s, &next, 10 );
|
||||
if ( next == s || next[0] != ':' ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( sk2.sk_idle < 0 ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
s = ++next;
|
||||
}
|
||||
|
||||
if ( s[0] == ':' ) {
|
||||
sk2.sk_probes = 0;
|
||||
s++;
|
||||
|
||||
} else {
|
||||
sk2.sk_probes = strtol( s, &next, 10 );
|
||||
if ( next == s || next[0] != ':' ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( sk2.sk_probes < 0 ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
s = ++next;
|
||||
}
|
||||
|
||||
if ( s == '\0' ) {
|
||||
sk2.sk_interval = 0;
|
||||
s++;
|
||||
|
||||
} else {
|
||||
sk2.sk_interval = strtol( s, &next, 10 );
|
||||
if ( next == s || next[0] != '\0' ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( sk2.sk_interval < 0 ) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
*sk = sk2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static slap_cf_aux_table bindkey[] = {
|
||||
{ BER_BVC("uri="), offsetof(slap_bindconf, sb_uri), 'b', 1, NULL },
|
||||
{ BER_BVC("version="), offsetof(slap_bindconf, sb_version), 'i', 0, versionkey },
|
||||
@ -1223,12 +1306,13 @@ static slap_cf_aux_table bindkey[] = {
|
||||
{ BER_BVC("realm="), offsetof(slap_bindconf, sb_realm), 'b', 0, NULL },
|
||||
{ BER_BVC("authcID="), offsetof(slap_bindconf, sb_authcId), 'b', 1, NULL },
|
||||
{ BER_BVC("authzID="), offsetof(slap_bindconf, sb_authzId), 'b', 1, (slap_verbmasks *)authzNormalize },
|
||||
{ BER_BVC("keepalive="), offsetof(slap_bindconf, sb_keepalive), 'x', 0, (slap_verbmasks *)slap_keepalive_parse },
|
||||
#ifdef HAVE_TLS
|
||||
{ BER_BVC("starttls="), offsetof(slap_bindconf, sb_tls), 'i', 0, tlskey },
|
||||
|
||||
/* NOTE: replace "13" with the actual index
|
||||
/* NOTE: replace "14" with the actual index
|
||||
* of the first TLS-related line */
|
||||
#define aux_TLS (bindkey+13) /* beginning of TLS keywords */
|
||||
#define aux_TLS (bindkey+14) /* beginning of TLS keywords */
|
||||
|
||||
{ BER_BVC("tls_cert="), offsetof(slap_bindconf, sb_tls_cert), 's', 1, NULL },
|
||||
{ BER_BVC("tls_key="), offsetof(slap_bindconf, sb_tls_key), 's', 1, NULL },
|
||||
@ -1330,6 +1414,20 @@ slap_cf_aux_table_parse( const char *word, void *dst, slap_cf_aux_table *tab0, L
|
||||
|
||||
rc = lutil_atoulx( ulptr, val, 0 );
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
if ( tab->aux != NULL ) {
|
||||
struct berval value;
|
||||
slap_cf_aux_table_parse_x *func = (slap_cf_aux_table_parse_x *)tab->aux;
|
||||
|
||||
ber_str2bv( val, 0, 1, &value );
|
||||
|
||||
rc = func( &value, (void *)((char *)dst + tab->off), tab, tabmsg, 0 );
|
||||
|
||||
} else {
|
||||
rc = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ( rc ) {
|
||||
@ -1420,6 +1518,26 @@ slap_cf_aux_table_unparse( void *src, struct berval *bv, slap_cf_aux_table *tab0
|
||||
ptr += snprintf( ptr, sizeof( buf ) - ( ptr - buf ), "%lu", *ulptr );
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
*ptr++ = ' ';
|
||||
ptr = lutil_strcopy( ptr, tab->key.bv_val );
|
||||
if ( tab->quote ) *ptr++ = '"';
|
||||
if ( tab->aux != NULL ) {
|
||||
struct berval value;
|
||||
slap_cf_aux_table_parse_x *func = (slap_cf_aux_table_parse_x *)tab->aux;
|
||||
int rc;
|
||||
|
||||
value.bv_val = ptr;
|
||||
value.bv_len = buf + sizeof( buf ) - ptr;
|
||||
|
||||
rc = func( &value, (void *)((char *)src + tab->off), tab, "(unparse)", 1 );
|
||||
if ( rc == 0 ) {
|
||||
ptr += value.bv_len;
|
||||
}
|
||||
}
|
||||
if ( tab->quote ) *ptr++ = '"';
|
||||
break;
|
||||
|
||||
default:
|
||||
assert( 0 );
|
||||
}
|
||||
|
@ -1587,6 +1587,12 @@ LDAP_SLAPD_V (int) slapMode;
|
||||
#define SB_TLS_ON 1
|
||||
#define SB_TLS_CRITICAL 2
|
||||
|
||||
typedef struct slap_keepalive {
|
||||
int sk_idle;
|
||||
int sk_probes;
|
||||
int sk_interval;
|
||||
} slap_keepalive;
|
||||
|
||||
typedef struct slap_bindconf {
|
||||
struct berval sb_uri;
|
||||
int sb_version;
|
||||
@ -1601,6 +1607,7 @@ typedef struct slap_bindconf {
|
||||
struct berval sb_realm;
|
||||
struct berval sb_authcId;
|
||||
struct berval sb_authzId;
|
||||
slap_keepalive sb_keepalive;
|
||||
#ifdef HAVE_TLS
|
||||
void *sb_tls_ctx;
|
||||
char *sb_tls_cert;
|
||||
@ -1630,6 +1637,14 @@ typedef struct slap_cf_aux_table {
|
||||
void *aux;
|
||||
} slap_cf_aux_table;
|
||||
|
||||
typedef int
|
||||
slap_cf_aux_table_parse_x LDAP_P((
|
||||
struct berval *val,
|
||||
void *bc,
|
||||
slap_cf_aux_table *tab0,
|
||||
const char *tabmsg,
|
||||
int unparse ));
|
||||
|
||||
#define SLAP_LIMIT_TIME 1
|
||||
#define SLAP_LIMIT_SIZE 2
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user