From: wolfgang Date: Thu, 24 Apr 2008 01:25:04 +0000 (+0000) Subject: git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1402 d1b88da0-ebda-0310... X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65d124dbb143783d904d167308d6da2120b0f812;p=scalable-opengroupware.org git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1402 d1b88da0-ebda-0310-925b-ed51d893ca5b --- diff --git a/ChangeLog b/ChangeLog index 327220f8..5d53d29d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +2008-04-23 Wolfgang Sourdeau + + * SoObjects/SOGo/SOGoObject.m ([SOGoObject +initialize]): the + module is now a framework and we now load the new DAVReportMap + description file. + ([-davOwner]): the principal URL is now based on the DAV + application URL. + ([SOGoObject + -lookupName:lookupNameinContext:localContextacquire:acquire]): we + now lookup report methods from here (code from SOGoFolder). The + method has changed to refer to the new DAVReportMAP description + file in order to resolve the lookups on self. + ([SOGoObject -davSupportedReportSet]): implemented the new + "supported-report-set" dav method, based on the new mechanism + described above. + + * SoObjects/SOGo/SOGoFolder.m: REPORT lookups are now done + directly from SOGoObject. + + * SoObjects/SOGo/SOGoUser.m ([SOGoUser + -initWithLogin:newLoginroles:newRoles]): we make sure realUID is + not an empty string. + + * SoObjects/SOGo/SOGoUserFolder.m ([SOGoUserFolder + -davResourceType]): we declare self as a "principal". + + * SoObjects/SOGo/SOGoContentObject.m ([SOGoContentObject + -davContentLength]): the content length should is now based on the + UTF-8 encoding. + 2008-04-22 Wolfgang Sourdeau * UI/Scheduler/UIxCalendarSelector.m ([UIxCalendarSelector diff --git a/Main/GNUmakefile.preamble b/Main/GNUmakefile.preamble index 991110f9..89fd3d01 100644 --- a/Main/GNUmakefile.preamble +++ b/Main/GNUmakefile.preamble @@ -11,7 +11,7 @@ ADDITIONAL_INCLUDE_DIRS += \ -I.. -DSOGO_BUILD_DATE="@\"$(BUILD_DATE)\"" ADDITIONAL_LIB_DIRS += \ - -L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \ + -L../SoObjects/SOGo/SOGo.framework \ -L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \ -L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ diff --git a/OGoContentStore/GNUmakefile b/OGoContentStore/GNUmakefile index 1ef0149f..b697967e 100644 --- a/OGoContentStore/GNUmakefile +++ b/OGoContentStore/GNUmakefile @@ -12,7 +12,6 @@ TYPEMODELS_DIR = $(SOGO_TYPEMODELS) libOGoContentStore_HEADER_FILES_DIR = . libOGoContentStore_HEADER_FILES_INSTALL_DIR = /OGoContentStore libOGoContentStore_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) -libOGoContentStore_INSTALL_DIR=$(SOGO_SYSLIBDIR) ADDITIONAL_INCLUDE_DIRS += -I../SOPE ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj diff --git a/SOPE/GDLContentStore/GNUmakefile b/SOPE/GDLContentStore/GNUmakefile index eca654b2..ca90d783 100644 --- a/SOPE/GDLContentStore/GNUmakefile +++ b/SOPE/GDLContentStore/GNUmakefile @@ -14,7 +14,6 @@ endif libGDLContentStore_PCH_FILE = common.h libGDLContentStore_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) -libGDLContentStore_INSTALL_DIR=$(SOGO_SYSLIBDIR) libGDLContentStore_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) TOOL_NAME = gcs_ls gcs_mkdir gcs_cat gcs_recreatequick gcs_gensql diff --git a/SOPE/NGCards/GNUmakefile b/SOPE/NGCards/GNUmakefile index 252fbbdc..563c2134 100644 --- a/SOPE/NGCards/GNUmakefile +++ b/SOPE/NGCards/GNUmakefile @@ -15,7 +15,6 @@ endif libNGCards_HEADER_FILES_DIR = . libNGCards_HEADER_FILES_INSTALL_DIR = /NGCards libNGCards_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) -libNGCards_INSTALL_DIR=$(SOGO_SYSLIBDIR) libNGCards_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) libNGCards_HEADER_FILES = \ diff --git a/SoObjects/SOGo/DAVReportMap.plist b/SoObjects/SOGo/DAVReportMap.plist new file mode 100644 index 00000000..5481dcd0 --- /dev/null +++ b/SoObjects/SOGo/DAVReportMap.plist @@ -0,0 +1,17 @@ +{ /* -*-java-*- */ + /* CalDAV */ + "{urn:ietf:params:xml:ns:caldav}calendar-query" = davCalendarQuery; + "{urn:ietf:params:xml:ns:caldav}calendar-multiget" = davCalendarMultiget; + + /* CardDAV */ + "{urn:ietf:params:xml:ns:carddav}addressbook-query" = davAddressbookQuery; + "{urn:ietf:params:xml:ns:carddav}addressbook-multiget" + = davAddressbookMultiget; + "{urn:ietf:params:xml:ns:carddav}supported-collation-set" + = davSupportedCollectionSet; + + /* Inverse DAV */ + "{urn:inverse:params:xml:ns:inverse-dav}collection-query" + = davCollectionQuery; + "{urn:inverse:params:xml:ns:inverse-dav}acl-query" = davAclQuery; +} diff --git a/SoObjects/SOGo/GNUmakefile b/SoObjects/SOGo/GNUmakefile index 4a00f5d5..29432aa3 100644 --- a/SoObjects/SOGo/GNUmakefile +++ b/SoObjects/SOGo/GNUmakefile @@ -5,7 +5,9 @@ include $(GNUSTEP_MAKEFILES)/common.make -include ../../Version -include ./Version -LIBRARY_NAME = libSOGo +FRAMEWORK_NAME = SOGo + +SOGo_INSTALL_DIR = $(SOGO_LIBDIR) TOOL_NAME = \ # agenor_email2uid \ @@ -13,13 +15,9 @@ TOOL_NAME = \ # agenor_emails4uid \ # agenor_defaults -libSOGo_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) -libSOGo_INSTALL_DIR=$(SOGO_SYSLIBDIR) - -libSOGo_HEADER_FILES_DIR = . -libSOGo_HEADER_FILES_INSTALL_DIR = /SOGo +SOGo_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) -libSOGo_HEADER_FILES = \ +SOGo_HEADER_FILES = \ SOGoCache.h \ SOGoObject.h \ SOGoContentObject.h \ @@ -56,7 +54,7 @@ libSOGo_HEADER_FILES = \ \ WORequest+SOGo.h -libSOGo_OBJC_FILES = \ +SOGo_OBJC_FILES = \ SOGoCache.m \ SOGoObject.m \ SOGoContentObject.m \ @@ -94,6 +92,9 @@ libSOGo_OBJC_FILES = \ \ WORequest+SOGo.m +SOGo_RESOURCE_FILES = \ + DAVReportMap.plist + # tools agenor_email2uid_OBJC_FILES += agenor_email2uid.m @@ -106,10 +107,9 @@ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -include GNUmakefile.preamble -include ../common.make ifneq ($(FHS_INSTALL_ROOT),) GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include endif -include $(GNUSTEP_MAKEFILES)/library.make +include $(GNUSTEP_MAKEFILES)/framework.make include $(GNUSTEP_MAKEFILES)/tool.make -include GNUmakefile.postamble diff --git a/SoObjects/SOGo/GNUmakefile.preamble b/SoObjects/SOGo/GNUmakefile.preamble index f49ab0b7..c2edd529 100644 --- a/SoObjects/SOGo/GNUmakefile.preamble +++ b/SoObjects/SOGo/GNUmakefile.preamble @@ -1,10 +1,8 @@ # compilation settings -libSOGo_INCLUDE_DIRS += -I.. -I../../.. +SOGo_INCLUDE_DIRS += -I.. -I../.. -DSOGO_MAJOR_VERSION="\"$(MAJOR_VERSION)\"" -DSOGO_MINOR_VERSION="\"$(MINOR_VERSION)\"" -SYSTEM_LIB_DIR += -L/usr/local/lib - -libSOGo_LIBRARIES_DEPEND_UPON += \ +SOGo_LIBRARIES_DEPEND_UPON += \ -lOGoContentStore \ -lGDLAccess \ -lNGObjWeb \ diff --git a/SoObjects/SOGo/SOGoContentObject.m b/SoObjects/SOGo/SOGoContentObject.m index a4bfbc37..af4e3b53 100644 --- a/SoObjects/SOGo/SOGoContentObject.m +++ b/SoObjects/SOGo/SOGoContentObject.m @@ -344,7 +344,7 @@ content = [record objectForKey: @"c_content"]; return [NSString stringWithFormat: @"%u", - [content lengthOfBytesUsingEncoding: NSISOLatin1StringEncoding]]; + [content lengthOfBytesUsingEncoding: NSUTF8StringEncoding]]; } - (NSException *) davMoveToTargetObject: (id) _target diff --git a/SoObjects/SOGo/SOGoFolder.m b/SoObjects/SOGo/SOGoFolder.m index b01bfe5a..1d821ae3 100644 --- a/SoObjects/SOGo/SOGoFolder.m +++ b/SoObjects/SOGo/SOGoFolder.m @@ -24,8 +24,6 @@ #import #import -#import - #import #import "NSString+Utilities.h" @@ -66,41 +64,6 @@ return nil; } -- (id) lookupName: (NSString *) lookupName - inContext: (id) localContext - acquire: (BOOL) acquire -{ - id obj; - NSArray *davNamespaces; - NSDictionary *davInvocation; - NSString *objcMethod; - - obj = [super lookupName: lookupName inContext: localContext - acquire: acquire]; - if (!obj) - { - davNamespaces = [self davNamespaces]; - if ([davNamespaces count] > 0) - { - davInvocation = [lookupName asDavInvocation]; - if (davInvocation - && [davNamespaces - containsObject: [davInvocation objectForKey: @"ns"]]) - { - objcMethod = [[davInvocation objectForKey: @"method"] - davMethodToObjC]; - obj = [[SoSelectorInvocation alloc] - initWithSelectorNamed: - [NSString stringWithFormat: @"%@:", objcMethod] - addContextParameter: YES]; - [obj autorelease]; - } - } - } - - return obj; -} - #warning we should remove this method - (NSArray *) toOneRelationshipKeys { diff --git a/SoObjects/SOGo/SOGoObject.m b/SoObjects/SOGo/SOGoObject.m index 678f6a3c..eada235b 100644 --- a/SoObjects/SOGo/SOGoObject.m +++ b/SoObjects/SOGo/SOGoObject.m @@ -28,6 +28,8 @@ #import #import +#import +#import #import #import #import @@ -36,6 +38,8 @@ #import #import #import +#import +#import #import #import #import @@ -56,6 +60,7 @@ #import "NSArray+Utilities.h" #import "NSCalendarDate+SOGo.h" #import "NSDictionary+Utilities.h" +#import "NSObject+Utilities.h" #import "NSString+Utilities.h" #import "SOGoCache.h" #import "SOGoDAVAuthenticator.h" @@ -69,6 +74,8 @@ static BOOL kontactGroupDAV = YES; static BOOL sendACLAdvisories = NO; +static NSDictionary *reportMap = nil; + @interface SOGoObject(Content) - (NSString *) contentAsString; @end @@ -164,6 +171,31 @@ static BOOL sendACLAdvisories = NO; @implementation SOGoObject ++ (void) _loadReportMap +{ + NSFileManager *fm; + NSEnumerator *paths; + NSString *currentPath, *filename; + + [self logWithFormat: @"Loading DAV REPORT map:"]; + + fm = [NSFileManager defaultManager]; + paths = [NSStandardLibraryPaths() objectEnumerator]; + while (!reportMap && (currentPath = [paths nextObject])) + { + filename = [NSString stringWithFormat: @"%@/SOGo-%s.%s/SOGo.framework" + @"/Resources/DAVReportMap.plist", + currentPath, + SOGO_MAJOR_VERSION, SOGO_MINOR_VERSION]; + [self logWithFormat: @" %@", filename]; + if ([fm fileExistsAtPath: filename]) + { + reportMap = [[NSDictionary alloc] initWithContentsOfFile: filename]; + [self logWithFormat: @"found!"]; + } + } +} + + (void) initialize { NSUserDefaults *ud; @@ -172,6 +204,8 @@ static BOOL sendACLAdvisories = NO; kontactGroupDAV = ![ud boolForKey:@"SOGoDisableKontact34GroupDAVHack"]; sendACLAdvisories = [ud boolForKey: @"SOGoACLsSendEMailNotifications"]; + if (!reportMap) + [self _loadReportMap]; // SoClass security declarations // require View permission to access the root (bound to authenticated ...) @@ -276,8 +310,8 @@ static BOOL sendACLAdvisories = NO; /* DAV ACL properties */ - (NSString *) davOwner { - return [NSString stringWithFormat: @"%@users/%@", - [self rootURLInContext: context], + return [NSString stringWithFormat: @"%@%@", + [WOApplication davURL], [self ownerInContext: nil]]; } @@ -555,12 +589,32 @@ static BOOL sendACLAdvisories = NO; return ma; } +- (NSString *) _reportSelector: (NSString *) reportName +{ + NSString *methodName, *objcMethod, *resultName; + SEL reportSel; + + resultName = nil; + + methodName = [reportMap objectForKey: reportName]; + if (methodName) + { + objcMethod = [NSString stringWithFormat: @"%@:", methodName]; + reportSel = NSSelectorFromString (objcMethod); + if ([self respondsToSelector: reportSel]) + resultName = objcMethod; + } + + return resultName; +} + - (id) lookupName: (NSString *) lookupName inContext: (id) localContext acquire: (BOOL) acquire { id obj; SOGoCache *cache; + NSString *objcMethod; cache = [SOGoCache sharedCache]; obj = [cache objectNamed: lookupName inContainer: self]; @@ -568,10 +622,21 @@ static BOOL sendACLAdvisories = NO; { obj = [[self soClass] lookupKey: lookupName inContext: localContext]; if (obj) + [obj bindToObject: self inContext: localContext]; + else { - [obj bindToObject: self inContext: localContext]; - [cache registerObject: obj withName: lookupName inContainer: self]; + objcMethod = [self _reportSelector: lookupName]; + if (objcMethod) + { + obj = [[SoSelectorInvocation alloc] + initWithSelectorNamed: objcMethod + addContextParameter: YES]; + [obj autorelease]; + } } + + if (obj) + [cache registerObject: obj withName: lookupName inContainer: self]; } return obj; @@ -625,13 +690,14 @@ static BOOL sendACLAdvisories = NO; - (id) DELETEAction: (id) _ctx { - NSException *error; + id result; - if ((error = [self delete]) != nil) - return error; - + result = [self delete]; /* Note: returning 'nil' breaks in SoObjectRequestHandler */ - return [NSNumber numberWithBool:YES]; /* delete worked out ... */ + if (!result) + result = [NSNumber numberWithBool: YES]; /* delete worked out ... */ + + return result; } - (BOOL) isFolderish @@ -1329,8 +1395,10 @@ static BOOL sendACLAdvisories = NO; if ([content length]) { [r setStatus: 207]; - [r setHeader: @"text/xml; charset=\"utf-8\"" forKey: @"content-type"]; - [r appendContentString: @"\r\n"]; + [r setHeader: @"application/xml; charset=\"utf-8\"" + forKey: @"content-type"]; + [r appendContentString: + @"\r\n"]; [r appendContentString: content]; } else @@ -1375,4 +1443,25 @@ static BOOL sendACLAdvisories = NO; return exception; } +- (NSArray *) davSupportedReportSet +{ + NSEnumerator *reportKeys; + NSMutableArray *reportSet; + NSString *currentKey, *currentValue; + + reportSet = [NSMutableArray array]; + + reportKeys = [[reportMap allKeys] objectEnumerator]; + while ((currentKey = [reportKeys nextObject])) + if ([self _reportSelector: currentKey]) + { + currentValue = [[currentKey asDavInvocation] + keysWithFormat: @"<%{method} xmlns=\"%{ns}\"/>"]; + [reportSet addObject: [SoWebDAVValue valueForObject: currentValue + attributes: nil]]; + } + + return [SOGoDAVSet davSetWithArray: reportSet ofValuesTaggedAs: @"report"]; +} + @end /* SOGoObject */ diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index db9b6dcb..1932e9f0 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -194,7 +194,7 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; objectForKey: @"c_uid"]; } - if (realUID) + if ([realUID length]) self = [super initWithLogin: realUID roles: newRoles]; else { diff --git a/SoObjects/SOGo/SOGoUserFolder.m b/SoObjects/SOGo/SOGoUserFolder.m index a3a6dc7d..a7e6ba51 100644 --- a/SoObjects/SOGo/SOGoUserFolder.m +++ b/SoObjects/SOGo/SOGoUserFolder.m @@ -221,6 +221,16 @@ return results; } +- (NSArray *) davResourceType +{ + NSMutableArray *rType; + + rType = [NSMutableArray arrayWithArray: [super davResourceType]]; + [rType addObject: @"principal"]; + + return rType; +} + - (NSString *) _baseDAVURLWithSuffix: (NSString *) suffix { NSURL *prefixURL; diff --git a/UI/SOGoUI/GNUmakefile b/UI/SOGoUI/GNUmakefile index aca9621e..7b76d73e 100644 --- a/UI/SOGoUI/GNUmakefile +++ b/UI/SOGoUI/GNUmakefile @@ -11,7 +11,6 @@ LIBRARY_NAME = libSOGoUI libSOGoUI_HEADER_FILES_DIR = . libSOGoUI_HEADER_FILES_INSTALL_DIR = /SOGoUI libSOGoUI_INTERFACE_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION) -libSOGoUI_INSTALL_DIR=$(SOGO_SYSLIBDIR) libSOGoUI_HEADER_FILES += \ \