mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-04-07 22:38:51 +00:00
Monotone-Parent: d102adf292e54c9c4f3572b83e38879d24b721d0
Monotone-Revision: 1d22ee7adc99b9420d9a7b859dfb1048c8c92eaa Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-18T15:26:03 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
@@ -41,6 +41,7 @@
|
||||
#import "MAPIStoreMapping.h"
|
||||
#import "MAPIStoreMessage.h"
|
||||
#import "MAPIStorePermissionsTable.h"
|
||||
#import "MAPIStoreSamDBUtils.h"
|
||||
#import "MAPIStoreTypes.h"
|
||||
#import "NSDate+MAPIStore.h"
|
||||
#import "NSString+MAPIStore.h"
|
||||
@@ -700,6 +701,23 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
return rc;
|
||||
}
|
||||
|
||||
- (SOGoFolder *) aclFolder
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void) _modifyPermissionEntryForUser: (NSString *) user
|
||||
withRoles: (NSArray *) roles
|
||||
isAddition: (BOOL) isAddition
|
||||
withACLFolder: (SOGoFolder *) aclFolder
|
||||
{
|
||||
if (isAddition)
|
||||
[aclFolder addUserInAcls: user];
|
||||
[aclFolder setRoles: roles forUser: user];
|
||||
}
|
||||
|
||||
- (void) postNotificationsForMoveCopyMessagesWithMIDs: (uint64_t *) srcMids
|
||||
andMessageURLs: (NSArray *) oldMessageURLs
|
||||
andCount: (uint32_t) midCount
|
||||
@@ -1247,6 +1265,196 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
return [MAPIStorePermissionsTable tableForContainer: self];
|
||||
}
|
||||
|
||||
- (NSArray *) permissionEntries
|
||||
{
|
||||
NSMutableArray *permissionEntries;
|
||||
MAPIStorePermissionEntry *entry;
|
||||
NSArray *aclUsers;
|
||||
uint64_t memberId, regularMemberId = 1;
|
||||
NSUInteger count, max;
|
||||
NSString *username, *defaultUserId;
|
||||
SOGoFolder *aclFolder;
|
||||
|
||||
aclFolder = [self aclFolder];
|
||||
|
||||
defaultUserId = [aclFolder defaultUserID];
|
||||
aclUsers = [aclFolder aclUsers];
|
||||
max = [aclUsers count];
|
||||
permissionEntries = [NSMutableArray arrayWithCapacity: max];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
username = [aclUsers objectAtIndex: count];
|
||||
if (![username hasPrefix: @"@"])
|
||||
{
|
||||
if ([username isEqualToString: defaultUserId])
|
||||
memberId = 0;
|
||||
else if ([username isEqualToString: @"anonymous"])
|
||||
memberId = ULLONG_MAX;
|
||||
else
|
||||
{
|
||||
memberId = regularMemberId;
|
||||
regularMemberId++;
|
||||
}
|
||||
entry = [MAPIStorePermissionEntry entryWithUserId: username
|
||||
andMemberId: memberId
|
||||
forFolder: self];
|
||||
[permissionEntries addObject: entry];
|
||||
}
|
||||
}
|
||||
|
||||
return permissionEntries;
|
||||
}
|
||||
|
||||
- (NSArray *) rolesForExchangeRights: (uint32_t) rights
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (uint32_t) exchangeRightsForRoles: (NSArray *) roles
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSString *) _usernameFromEntryId: (struct SBinary_short *) bin
|
||||
{
|
||||
struct Binary_r bin32;
|
||||
struct AddressBookEntryId *entryId;
|
||||
NSString *username;
|
||||
struct ldb_context *samCtx;
|
||||
|
||||
bin32.cb = bin->cb;
|
||||
bin32.lpb = bin->lpb;
|
||||
|
||||
entryId = get_AddressBookEntryId (NULL, &bin32);
|
||||
if (entryId)
|
||||
{
|
||||
samCtx = [[self context] connectionInfo]->sam_ctx;
|
||||
username = MAPIStoreSamDBUserAttribute (samCtx, @"legacyExchangeDN",
|
||||
[NSString stringWithUTF8String: entryId->X500DN],
|
||||
@"sAMAccountName");
|
||||
}
|
||||
else
|
||||
username = nil;
|
||||
talloc_free (entryId);
|
||||
|
||||
return username;
|
||||
}
|
||||
|
||||
- (NSString *) _usernameFromMemberId: (uint64_t) memberId
|
||||
inEntries: (NSArray *) entries
|
||||
{
|
||||
NSString *username = nil;
|
||||
NSUInteger count, max;
|
||||
MAPIStorePermissionEntry *entry;
|
||||
|
||||
max = [entries count];
|
||||
for (count = 0; !username && count < max; count++)
|
||||
{
|
||||
entry = [entries objectAtIndex: count];
|
||||
if ([entry memberId] == memberId)
|
||||
username = [entry userId];
|
||||
}
|
||||
|
||||
return username;
|
||||
}
|
||||
|
||||
- (void) _emptyACL
|
||||
{
|
||||
NSUInteger count, max;
|
||||
NSArray *users;
|
||||
SOGoFolder *aclFolder;
|
||||
|
||||
aclFolder = [self aclFolder];
|
||||
|
||||
users = [aclFolder aclUsers];
|
||||
max = [users count];
|
||||
for (count = 0; count < max; count++)
|
||||
[aclFolder removeUserFromAcls: [users objectAtIndex: count]];
|
||||
}
|
||||
|
||||
- (int) modifyPermissions: (struct PermissionData *) permissions
|
||||
withCount: (uint16_t) pcount
|
||||
andFlags: (int8_t) flags
|
||||
{
|
||||
NSUInteger count, propCount;
|
||||
struct PermissionData *currentPermission;
|
||||
struct mapi_SPropValue *mapiValue;
|
||||
NSString *permissionUser;
|
||||
NSArray *entries;
|
||||
NSArray *permissionRoles;
|
||||
BOOL reset, isAdd;
|
||||
SOGoFolder *aclFolder;
|
||||
|
||||
aclFolder = [self aclFolder];
|
||||
|
||||
reset = ((flags & ModifyPerms_ReplaceRows) != 0);
|
||||
if (reset)
|
||||
[self _emptyACL];
|
||||
|
||||
entries = [self permissionEntries];
|
||||
|
||||
for (count = 0; count < pcount; count++)
|
||||
{
|
||||
currentPermission = permissions + count;
|
||||
|
||||
permissionUser = nil;
|
||||
permissionRoles = nil;
|
||||
|
||||
isAdd = (currentPermission->PermissionDataFlags == ROW_ADD);
|
||||
for (propCount = 0;
|
||||
propCount < currentPermission->lpProps.cValues;
|
||||
propCount++)
|
||||
{
|
||||
mapiValue = currentPermission->lpProps.lpProps + propCount;
|
||||
switch (mapiValue->ulPropTag)
|
||||
{
|
||||
case PR_ENTRYID:
|
||||
permissionUser
|
||||
= [self _usernameFromEntryId: &mapiValue->value.bin];
|
||||
break;
|
||||
case PR_MEMBER_ID:
|
||||
permissionUser = [self _usernameFromMemberId: mapiValue->value.d
|
||||
inEntries: entries];
|
||||
break;
|
||||
case PR_MEMBER_RIGHTS:
|
||||
permissionRoles = [self
|
||||
rolesForExchangeRights: mapiValue->value.l];
|
||||
break;
|
||||
default:
|
||||
if (mapiValue->ulPropTag != PR_MEMBER_NAME)
|
||||
[self warnWithFormat: @"unhandled permission property: %.8x",
|
||||
mapiValue->ulPropTag];
|
||||
}
|
||||
}
|
||||
|
||||
if (reset)
|
||||
{
|
||||
if (isAdd)
|
||||
[self _modifyPermissionEntryForUser: permissionUser
|
||||
withRoles: permissionRoles
|
||||
isAddition: YES
|
||||
withACLFolder: aclFolder];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isAdd || currentPermission->PermissionDataFlags == ROW_MODIFY)
|
||||
[self _modifyPermissionEntryForUser: permissionUser
|
||||
withRoles: permissionRoles
|
||||
isAddition: isAdd
|
||||
withACLFolder: aclFolder];
|
||||
else if (currentPermission->PermissionDataFlags == ROW_REMOVE)
|
||||
[aclFolder removeUserFromAcls: permissionUser];
|
||||
else
|
||||
[self errorWithFormat: @"unhandled permission action flag: %d",
|
||||
currentPermission->PermissionDataFlags];
|
||||
}
|
||||
}
|
||||
|
||||
return MAPISTORE_SUCCESS;
|
||||
}
|
||||
|
||||
- (uint64_t) objectId
|
||||
{
|
||||
uint64_t objectId;
|
||||
|
||||
Reference in New Issue
Block a user