From 392970b125000b5b467afd43406b05d90ec1d06e Mon Sep 17 00:00:00 2001
From: Guilhem Moulin <guilhem.moulin@fripost.org>
Date: Mon, 20 Aug 2012 18:37:32 +0200
Subject: Duplicating an attribute to add a presence index.

---
 ldap/fripost.ldif     | 27 ++++++++++++++++++---------
 ldap/index.ldif       | 15 +++++----------
 ldap/populate.ldif    |  1 +
 ldap/syncrepl.ldif    |  2 +-
 ldap/test-user-acl.sh | 14 +++++++-------
 5 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/ldap/fripost.ldif b/ldap/fripost.ldif
index e0052a3..81602d5 100644
--- a/ldap/fripost.ldif
+++ b/ldap/fripost.ldif
@@ -76,33 +76,42 @@ olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.6 NAME 'fripostMaildrop'
     SUBSTR caseIgnoreIA5SubstringsMatch
     SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
 #
-olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.7 NAME 'fripostIsStatusActive'
+# We are creating a new attribute, optional in virtual domains and
+# mailboxes, because the presence index should *not* apply to the
+# mandatory attribute above.
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.7 NAME 'fripostOptionalMaildrop'
+    DESC 'An optional email address for catch-all aliases on domains and mailboxes'
+    EQUALITY caseIgnoreIA5Match
+    SUBSTR caseIgnoreIA5SubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
+#
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.8 NAME 'fripostIsStatusActive'
     DESC 'Is the entry active?'
     EQUALITY booleanMatch
     SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
 #
-olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.8 NAME 'fripostMailboxQuota'
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.9 NAME 'fripostMailboxQuota'
     DESC 'The quota on a mailbox e.g., "50MB"'
     EQUALITY caseExactMatch
     SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE )
 #
-olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.9 NAME 'fripostCanCreateAlias'
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.10 NAME 'fripostCanCreateAlias'
     DESC 'A user/domain that can create aliases for the parent domain'
     SUP distinguishedName )
 #
-olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.10 NAME 'fripostCanCreateML'
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.11 NAME 'fripostCanCreateML'
     DESC 'A user/domain that can create mailing lists for the parent domain'
     SUP distinguishedName )
 #
-olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.11 NAME 'fripostOwner'
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.12 NAME 'fripostOwner'
     DESC 'A user that owns the parent domain'
     SUP distinguishedName )
 #
-olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.12 NAME 'fripostPostmaster'
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.13 NAME 'fripostPostmaster'
     DESC 'A user that is a postmaster of the parent domain'
     SUP distinguishedName )
 #
-olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.13 NAME 'fripostMLManager'
+olcAttributeTypes: ( 1.3.6.1.4.1.40011.1.2.1.14 NAME 'fripostMLManager'
     DESC 'A mailing list manager'
     EQUALITY caseIgnoreMatch
     SUBSTR caseIgnoreSubstringsMatch
@@ -117,14 +126,14 @@ olcObjectclasses: ( 1.3.6.1.4.1.40011.1.2.1 NAME 'FripostVirtualDomain'
     MUST ( fvd $ fripostIsStatusActive )
     MAY ( fripostCanCreateAlias $ fripostCanCreateML $
           fripostOwner $ fripostPostmaster $
-          fripostMaildrop $ description ) )
+          fripostOptionalMaildrop $ description ) )
 #
 # | TODO: add limits here
 olcObjectclasses: ( 1.3.6.1.4.1.40011.1.2.2 NAME 'FripostVirtualMailbox'
     SUP top STRUCTURAL
     DESC 'Virtual mailbox'
     MUST ( fvu $ userPassword $ fripostIsStatusActive )
-    MAY ( fripostMailboxQuota $ fripostMaildrop $ cn $ description) )
+    MAY ( fripostMailboxQuota $ fripostOptionalMaildrop $ cn $ description) )
 #
 olcObjectclasses: ( 1.3.6.1.4.1.40011.1.2.3 NAME 'FripostVirtualAlias'
     SUP top STRUCTURAL
diff --git a/ldap/index.ldif b/ldap/index.ldif
index d5f31a5..6d7089a 100644
--- a/ldap/index.ldif
+++ b/ldap/index.ldif
@@ -26,19 +26,14 @@ changetype: modify
 replace: olcDbIndex
 olcDbIndex: objectClass eq
 -
+# Let us make Postfix's job easier.
 add: olcDbIndex
-olcDbIndex: fripostIsStatusActive eq
+olcDbIndex: fripostIsStatusActive,fvd,fvu,fva,fvml,fripostMLCommand,fripostMLManager eq
 -
+# Let us make Postfix's job easier.
 add: olcDbIndex
-olcDbIndex: fvd,fvu,fva,fvml,fripostMLCommand,fripostMLManager eq
+olcDbIndex: fripostOptionalMaildrop pres
 -
-add: olcDbIndex
-olcDbIndex: fripostMaildrop pres
-# ^ TODO: a presence index on fripostMaildrop is not optimal, as the
-# attribute is not very rare...
-# Having a different attribute for the virtualMailbox object class would
-# be better.
--
-# synprov specific indexing (provider side)
+# SyncProv/SyncRepl specific indexing
 add: olcDbIndex
 olcDbIndex: entryCSN,entryUUID eq
diff --git a/ldap/populate.ldif b/ldap/populate.ldif
index 04d5177..57681b5 100644
--- a/ldap/populate.ldif
+++ b/ldap/populate.ldif
@@ -35,6 +35,7 @@ dn: fvu=user1,fvd=fripost.org,ou=virtual,o=mailHosting,dc=fripost,dc=dev
 objectClass: fripostVirtualMailbox
 userPassword: user1
 fripostIsStatusActive: TRUE
+fripostOptionalMaildrop: user1@external.org
 
 dn: fvu=user2,fvd=fripost.org,ou=virtual,o=mailHosting,dc=fripost,dc=dev
 objectClass: fripostVirtualMailbox
diff --git a/ldap/syncrepl.ldif b/ldap/syncrepl.ldif
index 6b9c378..9dbd30a 100644
--- a/ldap/syncrepl.ldif
+++ b/ldap/syncrepl.ldif
@@ -27,7 +27,7 @@ type=refreshAndPersist
 retry="5 5 300 +"
 searchbase="ou=virtual,o=mailHosting,dc=fripost,dc=org"
 filter="(&(|(objectClass=FripostVirtualDomain)(objectClass=FripostVirtualMailbox)(objectClass=FripostVirtualAlias)(objectClass=FripostVirtualML))(fripostIsStatusActive=TRUE))"
-attrs="fripostIsStatusActive,fripostMaildrop,fvd,fvu,fva,fvml,fripostMLCommand,fripostMLManager"
+attrs="fripostIsStatusActive,fripostMaildrop,fripostOptionalMaildrop,fvd,fvu,fva,fvml,fripostMLCommand,fripostMLManager"
 scope=sub
 schemachecking=off
 
diff --git a/ldap/test-user-acl.sh b/ldap/test-user-acl.sh
index 4b233ef..26298f9 100755
--- a/ldap/test-user-acl.sh
+++ b/ldap/test-user-acl.sh
@@ -186,7 +186,7 @@ echo "Authenticated users, access to domain entries"
 #       =s for all
 #       +d if children
 #       +rc if canCreate{Alias,ML}, owner or postmaster
-# * fripostMaildrop
+# * fripostOptionalMaildrop
 #       =wrscd if owner or postmaster
 # * description
 #       =rscd if children, canCreate{Alias,ML}, owner or postmaster
@@ -304,7 +304,7 @@ msg "Have =wrscd to the domain attributes (other than \"canCreate\"), and >=w to
 ATTRSO="entry/delete
         fvd/write
         fripostIsStatusActive/write
-        fripostMaildrop/delete fripostMaildrop/add fripostMaildrop/read fripostMaildrop/search fripostMaildrop/compare fripostMaildrop/disclose
+        fripostOptionalMaildrop/delete fripostOptionalMaildrop/add fripostOptionalMaildrop/read fripostOptionalMaildrop/search fripostOptionalMaildrop/compare fripostOptionalMaildrop/disclose
         description/add description/delete"
 for U in ${USERS}; do
     for D in ${DOMAINS}; do
@@ -397,7 +397,7 @@ done | isOK '\(=0\|DENIED\)$' entry # "entry" here is useless, but it's just to
 
 
 # not (3 or 4)
-msg "Have =0 access to \"fripostMaildrop\" (unless Owner or Postmaster)"
+msg "Have =0 access to \"fripostOptionalMaildrop\" (unless Owner or Postmaster)"
 for U in ${USERS}; do
     for D in ${DOMAINS}; do
         search -s base -b "${D},${SUFFIX}" "(|(fripostOwner=${U},${SUFFIX})
@@ -439,7 +439,7 @@ echo "Authenticated users, access to user entries"
 #       =wrscd if account owner or domain postmaster
 # * fripostMailboxQuota:
 #       =rscd if account owner or domain postmaster
-# * fripostMaildrop:
+# * fripostOptionalMaildrop:
 #       =wrscd if account owner or domain postmaster
 # * cn:
 #       =wrscd if account owner or domain postmaster
@@ -463,7 +463,7 @@ usersU userPassword | isOK '=w$'
 [ $? -eq 0 ] || exit $?
 
 msg "Have =wrscxd access to the other attributes of their own entry"
-usersU fvu fripostIsStatusActive fripostMaildrop cn description | isOK 'write(=wrscxd)$' fvu
+usersU fvu fripostIsStatusActive fripostOptionalMaildrop cn description | isOK 'write(=wrscxd)$' fvu
 [ $? -eq 0 ] || exit $?
 
 msg "Have >=rsd access to the \"entry\" attribute of their own entry"
@@ -485,7 +485,7 @@ for U1 in ${USERS}; do
                                  fvu userPassword \
                                  fripostIsStatusActive \
                                  fripostMailboxQuota \
-                                 fripostMaildrop \
+                                 fripostOptionalMaildrop \
                                  cn description
     done
 done | isOK '=0$' entry
@@ -512,7 +512,7 @@ usersP userPassword | isOK '=w$'
 [ $? -eq 0 ] || exit $?
 
 msg "Have =wrscxd access to the other attributes of their users' entry (if Postmaster)"
-usersP fvu fripostIsStatusActive fripostMaildrop cn description | isOK 'write(=wrscxd)$' fvu
+usersP fvu fripostIsStatusActive fripostOptionalMaildrop cn description | isOK 'write(=wrscxd)$' fvu
 [ $? -eq 0 ] || exit $?
 
 # "+a" is needed to create new accounts. "+z" would be required to
-- 
cgit v1.2.3