5.3 Estensione dello schema mediante LDIF

Poiché LDIF può rappresentare operazioni di aggiornamento LDAP, è possibile utilizzare questo formato per modificare lo schema.

5.3.1 Aggiunta di una nuova classe di oggetti

Per aggiungere una classe, è sufficiente aggiungere un valore di attributo conforme alla specifica per NDSObjectClassDescription dell'attributo objectClasses di subschemaSubentry.

NDSObjectClassDescription = "(" whsp
   numericoid whsp
   [ "NAME" qdescrs ]
   [ "DESC" qdstring ]
   [ "OBSOLETE" whsp ]
   [ "SUP" oids ] 
   [ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]
   [ "MUST" oids ]    
   [ "MAY" oids ]     
   [ "X-NDS_NOT_CONTAINER" qdstrings ]
   [ "X-NDS_NONREMOVABLE" qdstrings ]
   [ "X-NDS_CONTAINMENT" qdstrings ] 
   [ "X-NDS_NAMING" qdstrings ]
   [ "X-NDS_NAME" qdstrings ] 
   whsp ")"

Mediante il file LDIF di esempio che segue viene aggiunta allo schema la classe di oggetti person:

 1 version: 1
 2 dn: cn=schema
 3 changetype: add
 4 objectClasses: ( 2.5.6.6 NAME ’person’ DESC ’Standard
 5   ObjectClass’ SUP ndsLoginProperties STRUCTURAL MUST
 6   (cn $ sn) MAY (description $ seeAlso $ telephoneNum
 7  ber $ fullName $ givenName $ initials $ uid $ userPa
 8  ssword) X-NDS_NAMING (’cn’ ’uid’) X-NDS_CONTAINMENT 
 9  (’organization’ ’organizationalUnit’ ’domain’) X-NDS
10  _NAME ’Person’ X-NDS_NOT_CONTAINER ’1’ X-NDS_NONREMO
11  VABLE ’1’)
12

Attributi obbligatori

Gli attributi obbligatori sono elencati nella sezione MUST della descrizione della classe di oggetti. Per la classe di oggetti person, gli attributi obbligatori sono cn e sn.

Attributi opzionali

Gli attributi facoltativi sono elencati nella sezione MAY della descrizione della classe di oggetti. Per la classe di oggetti person tali attributi sono description, seeAlso, telephoneNumber, fullName, givenName, initials, uid e userPassword.

NOTA:l'attributo userPassword non può essere utilizzato come attributo facoltativo (MAY). Se si tenta di utilizzarlo come attributo obbligatorio (MUST) nella nuova objectClass per estendere lo schema mediante il formato LDIF, l'operazione ha esito negativo.

Regole di contenimento

Le classi di oggetti che possono contenere quella che si sta definendo sono indicate nella sezione X-NDS_CONTAINMENT della descrizione della classe di oggetti. Le classi di oggetti che possono contenere la classe person sono organization, organizationalUnit e domain.

5.3.2 Aggiunta di un nuovo attributo

Per aggiungere un attributo, è sufficiente aggiungere un valore di attributo conforme alla specifica per NDSAttributeTypeDescription degli attributi di subschemaSubentry.

NDSAttributeTypeDescription = "(" whsp
  numericoid whsp  ; AttributeType identifier
  [ "NAME" qdescrs ]  ; name used in AttributeType
  [ "DESC" qdstring ]  ; description
  [ "OBSOLETE" whsp ]
  [ "SUP" woid ]  ; derived from this other AttributeType
  [ "EQUALITY" woid]  ; Matching Rule name
  [ "ORDERING" woid]  ; Matching Rule name
  [ "SUBSTR" woid ]  ; Matching Rule name
  [ "SYNTAX" whsp noidlen whsp ] ;  Syntax OID
  [ "SINGLE-VALUE" whsp ]  ; default multi-valued
  [ "COLLECTIVE" whsp ]  ; default not collective
  [ "NO-USER-MODIFICATION" whsp ] ;  default user modifiable
  [ "USAGE" whsp AttributeUsage ] ;  default userApplications
  [ "X-NDS_PUBLIC_READ" qdstrings ]
                             ; default not public read (’0’)
  [ "X-NDS_SERVER_READ" qdstrings ]
                              ; default not server read (’0’)
  [ "X-NDS_NEVER_SYNC" qdstrings ]
                               ; default not never sync (’0’) 
  [ "X-NDS_NOT_SCHED_SYNC_IMMEDIATE" qdstrings ]
                            ;  default sched sync immediate (’0’)
  [ "X-NDS_SCHED_SYNC_NEVER" qdstrings ]
                                  ;  default schedule sync (’0’)
  [ "X-NDS_LOWER_BOUND" qdstrings ]
                              ;  default no lower bound(’0’)
                                    ;(upper is specified in SYNTAX)
  [ "X-NDS_NAME_VALUE_ACCESS" qdstrings ]
                         ; default not name value access (’0’)
  [ "X-NDS_NAME" qdstrings ]  ; legacy NDS name 
  whsp ")"

Mediante il file LDIF di esempio che segue viene aggiunto allo schema il tipo di attributo title:

 1 version: 1
 2 dn: cn=schema
 3 changetype: add
 4 attributeTypes: ( 2.5.4.12 NAME ’title’ DESC ’Standa
 5  rd Attribute’ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
 6  64} X-NDS_NAME ’Title’ X-NDS_NOT_SCHED_SYNC_IMMEDIA
 7  TE ’1’ X-NDS_LOWER_BOUND ’1’)
 8

Attributi a valore singolo e a valore multiplo

Un attributo viene impostato per default su un valore multiplo, a meno che non venga specificato esplicitamente come valore singolo. Mediante il file LDIF di esempio che segue viene creato un titolo con valore singolo aggiungendo la parola chiave SINGLE-VALUE dopo la sezione SYNTAX:

 1 version: 1
 2 dn: cn=schema
 3 changetype: add
 4 attributeTypes: ( 2.5.4.12 NAME ’title’ DESC ’Standa
 5  rd Attribute’ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
 6  64} SINGLE-VALUE X-NDS_NAME ’Title’ X-NDS_NOT_SCHED
 7  _SYNC_IMMEDIATE ’1’ X-NDS_LOWER_BOUND ’1’)
 8

Aggiunta di un attributo facoltativo a una classe di oggetti esistente

Sebbene l'aggiunta di nuovi elementi nello schema sia una prassi accettabile, la modifica o l'estensione di uno schema esistente è in genere un'operazione rischiosa. Poiché ciascun elemento dello schema viene identificato in modo univoco da un OID, quando si estende un elemento dello schema standard, viene in effetti creata una seconda definizione per l'elemento, nonostante si utilizzi ancora l'OID originale. Questa condizione può creare problemi d'incompatibilità.

Esistono casi in cui è opportuno modificare gli elementi dello schema. Ad esempio, potrebbe essere necessario estendere o modificare i nuovi elementi di uno schema come quando vengono ottimizzati in fase di sviluppo. Anziché aggiungere nuovi attributi direttamente a una classe, è consigliabile utilizzare le classi ausiliarie solo per:

  • Aggiungere nuovi attributi a una classe di oggetti esistente.

  • Dividere in sottoclassi una classe di oggetti esistente.

5.3.3 Aggiunta o rimozione di classi ausiliarie

Il file LDIF di esempio riportato di seguito consente di creare due nuovi attributi e una classe ausiliaria con i nuovi attributi, nonché di aggiungere una voce inetOrgPerson con la classe auxiliary come classe di oggetti della voce e con i valori degli attributi per la classe auxiliary.

version: 1
# Add an attribute to track a bear’s hair. The attribute is 
# multi-valued, uses a case ignore string syntax, 
# and has public read rights 
# Values may include: long hair, short, curly, straight, 
# none, black, and brown 
# X-NDS_PUBLIC_READ ’1’ The 1 allows public read, 
# 0 denies public read 
dn: cn=schema 
changetype: modify 
add: attributeTypes
attributeTypes: ( 2.16.840.1.113719.1.186.4.10 NAME
’bearHair’ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
X-NDS_PUBLIC_READ ’1’ )

# add an attribute to store a bear’s picture 
dn: cn=schema 
changetype: modify 
add: attributeTypes 
attributeTypes: ( 2.16.840.1.113719.1.186.4.11 NAME
’bearPicture’ SYNTAX 1.3.6.1.4.1.1466.115.121.1.5
SINGLE-VALUE )

# create an Auxiliary class for the bearfeatures 
dn: cn=schema 
changetype: modify 
add: objectclasses 
objectclasses: (2.16.840.1.113719.1.186.6.101 NAME
’bearFeatures’ MAY (bearHair $ bearPicture) AUXILIARY)

# now create a user named bobby
dn: cn=bobby,o=bearcave 
changetype: add 
cn: bobby 
sn: bear 
givenName: bobby 
bearHair: Short 
bearHair: Brown 
bearHair: Curly 
bearPicture:< file:///c:/tmp/alien.jpg 
objectClass: top 
objectClass: person 
objectClass: inetOrgPerson 
objectClass: bearFeatures 

# now create a person named john that will later be changed
# into a bear when bearFeatures is added to its objectClass
# list
dn: cn=john,o=bearcave
changetype: add
cn: John
sn: bear
givenName: john
objectClass: top
objectClass: person
objectClass: inetOrgPerson

# now morph john into a bear by adding bearFeatures
dn: cn=john,o=bearcave
changetype: modify
add: objectClass
objectClass: bearFeatures
-
add: bearHair
bearHair: long
bearHair: black
#bearPicture:< file:///c:/tmp/john.jpg>
-

# to morph john back to a person, simply delete the
# objectClass bearFeatures
dn: cn=john,o=bearcave
changetype: modify
delete: objectClass
objectClass: bearFeatures

Quando si rimuovono classi ausiliarie, non è necessario eliminare tutti i valori associati alla classe auxiliary se si rimuove la classe auxiliary stessa dall'elenco di classi di oggetti. In eDirectory questa operazione viene eseguita automaticamente.

Se la classe auxiliary contiene attributi MUST, affinché la modifica venga eseguita è necessario specificarli tutti nella medesima operazione di modifica che aggiunge la classe auxiliary all'elenco delle classi di oggetti.

Problemi noti relativi all'analisi sintattica XML

L'elaborazione XML dei record LDIF (formato LDIF o record generati dal server LDAP) ha esito negativo nel caso in cui i singoli record non soddisfino tutte le regole XML specificate nel file XML.