# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License. 

# created mozillaAbPersonObsolete schema
# from mozillaOrgPerson schema v.0.6
# for OpenLDAP Directory servers
#
# Changes from v.0.6
# 
# - Add additional attritute names to match those currently exported 
#   from mozilla, except for 'mozilla_AimScreenName' which is invalid.
#   I have found that mozilla does not find them otherwise.
# - Set both versions of 'nsAIMid' to use the mozilla OID space.
# - Make 'inetOrgPerson' the SUP for 'mozillaAbPersonObsolete'.

# req. core
# req. cosine
# req. inetorgperson

# attribute defs

attributetype ( 1.3.6.1.4.1.13769.2.1.1 
	NAME ( 'xmozillanickname' 'mozillaNickname' ) 
	SUP name )

attributetype ( 1.3.6.1.4.1.13769.2.1.2 
	NAME ( 'xmozillausehtmlmail' 'mozillaUseHtmlMail' ) 
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 
	SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.13769.2.1.3
	NAME 'mozillaSecondEmail' 
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.13769.2.1.4
	NAME 'mozillaHomeLocalityName' 
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )

attributetype ( 1.3.6.1.4.1.13769.2.1.5 
	NAME 'mozillaPostalAddress2'
	EQUALITY caseIgnoreListMatch
	SUBSTR caseIgnoreListSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )

attributetype ( 1.3.6.1.4.1.13769.2.1.6 
	NAME 'mozillaHomePostalAddress2'
	EQUALITY caseIgnoreListMatch
	SUBSTR caseIgnoreListSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )

attributetype ( 1.3.6.1.4.1.13769.2.1.7 
	NAME ( 'mozillaHomeState' ) SUP name )

attributetype ( 1.3.6.1.4.1.13769.2.1.8 
	NAME 'mozillaHomePostalCode'
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} )

attributetype ( 1.3.6.1.4.1.13769.2.1.9 
	NAME ( 'mozillaHomeCountryName' ) 
	SUP name SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.13769.2.1.10
	NAME ( 'mozillaHomeFriendlyCountryName' )
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

attributetype ( 1.3.6.1.4.1.13769.2.1.11
	NAME ( 'homeurl' 'mozillaHomeUrl' )
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.13769.2.1.12
	NAME ( 'workurl' 'mozillaWorkUrl' )
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

# un-comment for all LDAP server NOT supporting SYNTAX 2.16.840.1.113730.3.7.1
attributetype ( 1.3.6.1.4.1.13769.2.1.13
	NAME ( 'nsAIMid' )
	DESC 'AOL Instant Messenger (AIM) Identity'
	EQUALITY telephoneNumberMatch
	SUBSTR telephoneNumberSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )

# un-comment for ... LDAP server supporting SYNTAX 2.16.840.1.113730.3.7.1
#attributetype ( 1.3.6.1.4.1.13769.2.1.13
#	NAME ( 'nsAIMid' )
#	DESC 'AOL Instant Messenger (AIM) Identity'
#	SYNTAX 2.16.840.1.113730.3.7.1 )

attributetype ( 1.3.6.1.4.1.13769.2.1.96
	NAME ( 'custom1' 'mozillaCustom1' )
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
	SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.13769.2.1.97
	NAME ( 'custom2' 'mozillaCustom2' )
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
	SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.13769.2.1.98
	NAME ( 'custom3' 'mozillaCustom3' )
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
	SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.13769.2.1.99
	NAME ( 'custom4' 'mozillaCustom4' )
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
	SINGLE-VALUE )
 

# objectClass defs 

objectclass ( 1.3.6.1.4.1.13769.2.2.1
	NAME 'mozillaAbPersonObsolete'
	SUP inetOrgPerson
	STRUCTURAL
	MAY (
	mozillaNickname $
	mozillaUseHtmlMail $
	mozillaSecondEmail $
	mozillaPostalAddress2 $
	mozillaHomePostalAddress2 $
	mozillaHomeLocalityName $
	mozillaHomeState $
	mozillaHomePostalCode $
	mozillaHomeCountryName $
	mozillaHomeFriendlyCountryName $
	mozillaHomeUrl $
	mozillaWorkUrl $
	mozillaCustom1 $
	mozillaCustom2 $
	mozillaCustom3 $
	mozillaCustom4 $
	nsAIMid $
	c $
	co ) )

