21
21
from base64 import b64encode
24
25
from openchange import mailbox
26
from samba import param, Ldb, dsdb, substitute_var, read_and_sub_file
26
27
from samba.samdb import SamDB
27
from samba.auth import system_session
28
from samba.provision import setup_add_ldif, setup_modify_ldif
29
from openchange.urlutils import openchangedb_url, openchangedb_mapistore_url, openchangedb_mapistore_dir, openchangedb_suffix_for_mapistore_url
29
from ldb import (SCOPE_SUBTREE, SCOPE_BASE, FLAG_MOD_REPLACE, FLAG_MOD_ADD, FLAG_MOD_DELETE)
30
from samba.auth import system_session, admin_session
31
from samba.provision import (setup_add_ldif, setup_modify_ldif, setup_ldb,find_provision_key_parameters)
32
from samba.upgradehelpers import (get_paths, get_ldbs)
33
from openchange.urlutils import openchangedb_url
31
35
__docformat__ = 'restructuredText'
33
37
DEFAULTSITE = "Default-First-Site-Name"
34
38
FIRST_ORGANIZATION = "First Organization"
35
FIRST_ORGANIZATION_UNIT = "First Organization Unit"
39
FIRST_ORGANIZATION_UNIT = "First Administrative Group"
37
41
# This is a hack. Kind-of cute, but still a hack
214
216
session_info = system_session()
218
lp.set("dsdb:schema update allowed", "yes")
216
220
# Step 1. Extending the prefixmap attribute of the schema DN record
217
db = SamDB(url=lp.get("sam database"), session_info=session_info,
221
samdb = SamDB(url=lp.samdb_url(), session_info=session_info,
218
222
credentials=creds, lp=lp)
220
prefixmap = open(setup_path("AD/prefixMap.txt"), 'r').read()
222
db.transaction_start()
225
reporter.reportNextStep("Register Exchange OIDs")
226
setup_modify_ldif(db,
227
setup_path("AD/provision_schema_basedn_modify.ldif"), {
228
"SCHEMADN": names.schemadn,
229
"NETBIOSNAME": names.netbiosname,
230
"DEFAULTSITE": names.sitename,
231
"CONFIGDN": names.configdn,
232
"SERVERDN": names.serverdn,
233
"PREFIXMAP_B64": b64encode(prefixmap)
236
db.transaction_cancel()
239
db.transaction_commit()
224
schemadn = str(names.schemadn)
225
current = samdb.search(expression="objectClass=*", base=schemadn,
232
schema_ldif += samdb.write_ldif(ent, ldb.CHANGETYPE_NONE)
234
prefixmap_data = open(setup_path("AD/prefixMap.txt"), 'r').read()
235
prefixmap_data = b64encode(prefixmap_data)
237
# We don't actually add this ldif, just parse it
238
prefixmap_ldif = "dn: %s\nprefixMap:: %s\n\n" % (schemadn, prefixmap_data)
239
reporter.reportNextStep("Register Exchange OIDs")
240
dsdb._dsdb_set_schema_from_ldif(samdb, prefixmap_ldif, schema_ldif, schemadn)
241
242
provision_schema(setup_path, names, lp, creds, reporter, "AD/oc_provision_schema_attributes.ldif", "Add Exchange attributes to Samba schema")
242
243
provision_schema(setup_path, names, lp, creds, reporter, "AD/oc_provision_schema_auxiliary_class.ldif", "Add Exchange auxiliary classes to Samba schema")
251
252
provision_schema(setup_path, names, lp, creds, reporter, "AD/oc_provision_configuration.ldif", "Exchange Samba with Exchange configuration objects")
252
253
print "[SUCCESS] Done!"
254
def newmailbox(lp, username, firstorg, firstou, backend):
255
names = guess_names_from_smbconf(lp, firstorg, firstou)
257
db = mailbox.OpenChangeDB(openchangedb_url(lp))
259
# Step 1. Retrieve current FID index
260
GlobalCount = db.get_message_GlobalCount(names.netbiosname)
261
ReplicaID = db.get_message_ReplicaID(names.netbiosname)
263
print "[+] Mailbox for '%s'" % (username)
264
print "==================" + "=" * len(username)
265
print "* GlobalCount (0x%x) and ReplicaID (0x%x)" % (GlobalCount, ReplicaID)
267
# Step 2. Check if the user already exists
268
assert not db.user_exists(names.netbiosname, username)
270
# Step 3. Create a default mapistore content repository for this user
271
db.add_storage_dir(mapistoreURL=openchangedb_mapistore_dir(lp), username=username)
272
print "* Mapistore content repository created: %s" % os.path.join(openchangedb_mapistore_dir(lp), username)
274
# Step 4. Create the user object
275
retdn = db.add_mailbox_user(names.ocfirstorgdn, username=username)
276
print "* User object created: %s" % (retdn)
278
# Step 5. Create system mailbox folders for this user
279
print "* Adding System Folders"
282
"Deferred Actions": ({}, 2),
283
"Spooler Queue": ({}, 3),
284
"To-Do Search": ({}, 4),
288
"Sent Items": ({}, 8),
289
"Deleted Items": ({}, 9),
291
"Common Views": ({}, 10),
292
"Schedule": ({}, 11),
295
"Shortcuts": ({}, 14),
296
"Reminders": ({}, 15),
300
def add_folder(parent_fid, path, children, SystemIdx):
303
GlobalCount = db.get_message_GlobalCount(names.netbiosname)
304
ReplicaID = db.get_message_ReplicaID(names.netbiosname)
305
url = openchangedb_mapistore_url(lp, backend)
307
fid = db.add_mailbox_root_folder(names.ocfirstorgdn,
308
username=username, foldername=name,
309
parentfolder=parent_fid, GlobalCount=GlobalCount,
310
ReplicaID=ReplicaID, SystemIdx=SystemIdx,
312
mapistoreSuffix=openchangedb_suffix_for_mapistore_url(url))
315
db.set_message_GlobalCount(names.netbiosname, GlobalCount=GlobalCount)
319
print "\t* %-40s: %s" % (name, fid)
320
for name, grandchildren in children.iteritems():
321
add_folder(fid, path + (name,), grandchildren[0], grandchildren[1])
323
add_folder(0, ("Mailbox Root",), system_folders[0], system_folders[1])
325
# Step 6. Add special folders
326
print "* Adding Special Folders:"
328
(("Mailbox Root", "IPM Subtree"), "Calendar", "IPF.Appointment", "PidTagIpmAppointmentEntryId"),
329
(("Mailbox Root", "IPM Subtree"), "Contacts", "IPF.Contact", "PidTagIpmContactEntryId"),
330
(("Mailbox Root", "IPM Subtree"), "Journal", "IPF.Journal", "PidTagIpmJournalEntryId"),
331
(("Mailbox Root", "IPM Subtree"), "Notes", "IPF.StickyNote", "PidTagIpmNoteEntryId"),
332
(("Mailbox Root", "IPM Subtree"), "Tasks", "IPF.Task", "PidTagIpmTaskEntryId"),
333
(("Mailbox Root", "IPM Subtree"), "Drafts", "IPF.Note", "PidTagIpmDraftsEntryId")
336
fid_inbox = fids[("Mailbox Root", "IPM Subtree", "Inbox")]
337
fid_reminders = fids[("Mailbox Root", "Reminders")]
338
fid_mailbox = fids[("Mailbox Root",)]
339
for path, foldername, containerclass, pidtag in special_folders:
340
GlobalCount = db.get_message_GlobalCount(names.netbiosname)
341
ReplicaID = db.get_message_ReplicaID(names.netbiosname)
342
url = openchangedb_mapistore_url(lp, backend)
343
fid = db.add_mailbox_special_folder(username, fids[path], fid_inbox, foldername,
344
containerclass, GlobalCount, ReplicaID,
345
url, openchangedb_suffix_for_mapistore_url(url))
346
db.add_folder_property(fid_inbox, pidtag, fid)
347
db.add_folder_property(fid_mailbox, pidtag, fid)
349
db.set_message_GlobalCount(names.netbiosname, GlobalCount=GlobalCount)
350
print "\t* %-40s: %s (%s)" % (foldername, fid, containerclass)
352
# Step 7. Set default receive folders
353
print "* Adding default Receive Folders:"
355
(("Mailbox Root", "IPM Subtree", "Inbox"), "All"),
356
(("Mailbox Root", "IPM Subtree", "Inbox"), "IPM"),
357
(("Mailbox Root", "IPM Subtree", "Inbox"), "Report.IPM"),
358
(("Mailbox Root", "IPM Subtree", "Inbox"), "IPM.Note"),
359
(("Mailbox Root", "IPM Subtree",), "IPC")
362
for path, messageclass in receive_folders:
363
print "\t* %-40s Message Class added to %s" % (messageclass, fids[path])
364
db.set_receive_folder(username, names.ocfirstorgdn, fids[path],
367
# Step 8. Set additional properties on Inbox
368
print "* Adding additional default properties to Inbox"
369
db.add_folder_property(fid_inbox, "PidTagContentCount", "0")
370
db.add_folder_property(fid_inbox, "PidTagContentUnreadCount", "0")
371
db.add_folder_property(fid_inbox, "PidTagSubFolders", "FALSE")
373
print "* Adding additional default properties to Reminders"
374
db.add_folder_property(fid_reminders, "PidTagContainerClass", "Outlook.Reminder");
375
db.add_folder_property(fid_inbox, "PidTagRemindersOnlineEntryId", fid_reminders);
376
db.add_folder_property(fid_mailbox, "PidTagRemindersOnlineEntryId", fid_reminders);
378
GlobalCount = db.get_message_GlobalCount(names.netbiosname)
379
print "* GlobalCount (0x%x)" % GlobalCount
382
255
def newuser(lp, creds, username=None):
383
256
"""extend user record with OpenChange settings.
407
280
homeMDB: CN=Mailbox Store (%s),CN=First Storage Group,CN=InformationStore,CN=%s,CN=Servers,CN=First Administrative Group,CN=Administrative Groups,CN=%s,CN=Microsoft Exchange,CN=Services,CN=Configuration,%s
282
homeMTA: CN=Mailbox Store (%s),CN=First Storage Group,CN=InformationStore,CN=%s,CN=Servers,CN=First Administrative Group,CN=Administrative Groups,CN=%s,CN=Microsoft Exchange,CN=Services,CN=Configuration,%s
408
283
add: legacyExchangeDN
409
284
legacyExchangeDN: /o=%s/ou=First Administrative Group/cn=Recipients/cn=%s
410
285
add: proxyAddresses
286
proxyAddresses: =EX:/o=%s/ou=First Administrative Group/cn=Recipients/cn=%s
411
287
proxyAddresses: smtp:postmaster@%s
412
288
proxyAddresses: X400:c=US;a= ;p=First Organizati;o=Exchange;s=%s
413
289
proxyAddresses: SMTP:%s@%s
414
290
replace: msExchUserAccountControl
415
291
msExchUserAccountControl: 0
416
""" % (user_dn, username, username, names.netbiosname, names.netbiosname, names.firstorg, names.domaindn, names.firstorg, username, names.dnsdomain, username, username, names.dnsdomain)
292
""" % (user_dn, username, username, names.netbiosname, names.netbiosname, names.firstorg, names.domaindn, names.netbiosname, names.netbiosname, names.firstorg, names.domaindn, names.firstorg, username, names.firstorg, username, names.dnsdomain, username, username, names.dnsdomain)
417
293
db.modify_ldif(extended_user)
419
295
print "[+] User %s extended and enabled" % username