1
1
/* schema_init.c - init builtin schema */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/schema_init.c,v 1.386.2.17 2007/12/03 15:04:31 hyc Exp $ */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/schema_init.c,v 1.386.2.20 2008/04/14 20:01:31 quanah Exp $ */
3
3
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5
* Copyright 1998-2007 The OpenLDAP Foundation.
5
* Copyright 1998-2008 The OpenLDAP Foundation.
6
6
* All rights reserved.
8
8
* Redistribution and use in source and binary forms, with or without
3561
3561
return hexValidate( NULL, &bv );
3564
/* Normalize a CSN in OpenLDAP 2.1 format */
3571
struct berval *normalized,
3574
struct berval gt, cnt, sid, mod;
3576
char buf[ STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ#SSSSSS#SID#ssssss" ) + 1 ];
3580
assert( SLAP_MR_IS_VALUE_OF_SYNTAX( usage ) != 0 );
3581
assert( !BER_BVISEMPTY( val ) );
3585
ptr = ber_bvchr( >, '#' );
3586
if ( ptr == NULL || ptr - gt.bv_val == gt.bv_len ) {
3587
return LDAP_INVALID_SYNTAX;
3590
gt.bv_len = ptr - gt.bv_val;
3591
if ( gt.bv_len != STRLENOF( "YYYYmmddHH:MM:SSZ" ) ) {
3592
return LDAP_INVALID_SYNTAX;
3595
if ( gt.bv_val[ 10 ] != ':' || gt.bv_val[ 13 ] != ':' ) {
3596
return LDAP_INVALID_SYNTAX;
3599
cnt.bv_val = ptr + 1;
3600
cnt.bv_len = val->bv_len - ( cnt.bv_val - val->bv_val );
3602
ptr = ber_bvchr( &cnt, '#' );
3603
if ( ptr == NULL || ptr - val->bv_val == val->bv_len ) {
3604
return LDAP_INVALID_SYNTAX;
3607
cnt.bv_len = ptr - cnt.bv_val;
3608
if ( cnt.bv_len != STRLENOF( "0x0000" ) ) {
3609
return LDAP_INVALID_SYNTAX;
3612
if ( strncmp( cnt.bv_val, "0x", STRLENOF( "0x" ) ) != 0 ) {
3613
return LDAP_INVALID_SYNTAX;
3616
cnt.bv_val += STRLENOF( "0x" );
3617
cnt.bv_len -= STRLENOF( "0x" );
3619
sid.bv_val = ptr + 1;
3620
sid.bv_len = val->bv_len - ( sid.bv_val - val->bv_val );
3622
ptr = ber_bvchr( &sid, '#' );
3623
if ( ptr == NULL || ptr - val->bv_val == val->bv_len ) {
3624
return LDAP_INVALID_SYNTAX;
3627
sid.bv_len = ptr - sid.bv_val;
3628
if ( sid.bv_len != STRLENOF( "0" ) ) {
3629
return LDAP_INVALID_SYNTAX;
3632
mod.bv_val = ptr + 1;
3633
mod.bv_len = val->bv_len - ( mod.bv_val - val->bv_val );
3634
if ( mod.bv_len != STRLENOF( "0000" ) ) {
3635
return LDAP_INVALID_SYNTAX;
3638
bv.bv_len = STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ#SSSSSS#SID#ssssss" );
3642
ptr = lutil_strncopy( ptr, gt.bv_val, STRLENOF( "YYYYmmddHH" ) );
3643
ptr = lutil_strncopy( ptr, >.bv_val[ STRLENOF( "YYYYmmddHH:" ) ],
3645
ptr = lutil_strncopy( ptr, >.bv_val[ STRLENOF( "YYYYmmddHH:MM:" ) ],
3647
ptr = lutil_strcopy( ptr, ".000000Z#00" );
3648
ptr = lutil_strncopy( ptr, cnt.bv_val, cnt.bv_len );
3652
*ptr++ = sid.bv_val[ 0 ];
3656
for ( i = 0; i < mod.bv_len; i++ ) {
3657
*ptr++ = TOLOWER( mod.bv_val[ i ] );
3661
assert( ptr - bv.bv_val == bv.bv_len );
3663
if ( csnValidate( syntax, &bv ) != LDAP_SUCCESS ) {
3664
return LDAP_INVALID_SYNTAX;
3667
ber_dupbv_x( normalized, &bv, ctx );
3669
return LDAP_SUCCESS;
3564
3672
/* Normalize a CSN in OpenLDAP 2.3 format */
3566
3674
csnNormalize23(
3610
3724
sid.bv_len = ptr - sid.bv_val;
3611
assert( sid.bv_len == STRLENOF( "00" ) );
3725
if ( sid.bv_len != STRLENOF( "00" ) ) {
3726
return LDAP_INVALID_SYNTAX;
3613
3729
mod.bv_val = ptr + 1;
3614
3730
mod.bv_len = val->bv_len - ( mod.bv_val - val->bv_val );
3615
assert( mod.bv_len == STRLENOF( "000000" ) );
3617
normalized->bv_len = STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ#SSSSSS#SID#ssssss" );
3618
normalized->bv_val = ber_memalloc_x( normalized->bv_len + 1, ctx );
3620
ptr = normalized->bv_val;
3731
if ( mod.bv_len != STRLENOF( "000000" ) ) {
3732
return LDAP_INVALID_SYNTAX;
3735
bv.bv_len = STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ#SSSSSS#SID#ssssss" );
3621
3739
ptr = lutil_strncopy( ptr, gt.bv_val, gt.bv_len - 1 );
3622
3740
ptr = lutil_strcopy( ptr, ".000000Z#" );
3623
3741
ptr = lutil_strncopy( ptr, cnt.bv_val, cnt.bv_len );
3666
3789
return csnNormalize23( usage, syntax, mr, val, normalized, ctx );
3669
assert( val->bv_len == STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ#SSSSSS#SID#ssssss" ) );
3792
if ( val->bv_len == STRLENOF( "YYYYmmddHH:MM:SSZ#0xSSSS#I#ssss" ) ) {
3795
return csnNormalize21( usage, syntax, mr, val, normalized, ctx );
3798
if ( val->bv_len != STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ#SSSSSS#SID#ssssss" ) ) {
3799
return LDAP_INVALID_SYNTAX;
3671
3802
ptr = ber_bvchr( val, '#' );
3672
3803
if ( ptr == NULL || ptr - val->bv_val == val->bv_len ) {
3673
3804
return LDAP_INVALID_SYNTAX;
3676
assert( ptr - val->bv_val == STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ" ) );
3807
if ( ptr - val->bv_val != STRLENOF( "YYYYmmddHHMMSS.uuuuuuZ" ) ) {
3808
return LDAP_INVALID_SYNTAX;
3678
3811
cnt.bv_val = ptr + 1;
3679
3812
cnt.bv_len = val->bv_len - ( cnt.bv_val - val->bv_val );
3696
3831
sid.bv_len = ptr - sid.bv_val;
3697
assert( sid.bv_len == STRLENOF( "000" ) );
3832
if ( sid.bv_len != STRLENOF( "000" ) ) {
3833
return LDAP_INVALID_SYNTAX;
3699
3836
mod.bv_val = ptr + 1;
3700
3837
mod.bv_len = val->bv_len - ( mod.bv_val - val->bv_val );
3702
assert( mod.bv_len == STRLENOF( "000000" ) );
3839
if ( mod.bv_len != STRLENOF( "000000" ) ) {
3840
return LDAP_INVALID_SYNTAX;
3704
3843
ber_dupbv_x( normalized, val, ctx );