fix(dav): return 405 when collection already exists

See https://datatracker.ietf.org/doc/html/rfc4918#section-9.3.1
This commit is contained in:
Francis Lachapelle
2022-08-09 11:57:47 -04:00
parent efe78c5179
commit 95eecc402a
8 changed files with 42 additions and 21 deletions

View File

@@ -3076,15 +3076,15 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
}
/* folder management */
- (BOOL) create
- (NSException *) create
{
BOOL rc;
SOGoUserSettings *userSettings;
NSMutableDictionary *calendarSettings;
NSException *error;
SOGoUser *ownerUser;
rc = [super create];
if (rc)
error = [super create];
if (!error)
{
ownerUser = [SOGoUser userWithLogin: [self ownerInContext: context]];
userSettings = [ownerUser userSettings];
@@ -3097,7 +3097,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
[userSettings synchronize];
}
return rc;
return error;
}
- (void) removeFolderSettings: (NSMutableDictionary *) moduleSettings

View File

@@ -398,20 +398,18 @@ static SoSecurityManager *sm = nil;
if ([subfolderNames containsObject: newName])
{
content = [NSString stringWithFormat: @"A collection named '%@' already exists.", newName];
error = [NSException exceptionWithDAVStatus: 403
error = [NSException exceptionWithDAVStatus: 405
reason: content];
}
else
{
properties = [[createContext request]
davPatchedPropertiesWithTopTag: @"mkcalendar"];
properties = [[createContext request] davPatchedPropertiesWithTopTag: @"mkcalendar"];
setProperties = [properties objectForKey: @"set"];
newDisplayName = [self _fetchPropertyWithName: @"{DAV:}displayname"
inArray: setProperties];
if (![newDisplayName length])
newDisplayName = newName;
error
= [self newFolderWithName: newDisplayName andNameInContainer: newName];
error = [self newFolderWithName: newDisplayName andNameInContainer: newName];
if (!error)
{
newFolder = [self lookupName: newName

View File

@@ -1,6 +1,6 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2006-2015 Inverse inc.
Copyright (C) 2006-2022 Inverse inc.
This file is part of SOGo.
@@ -96,7 +96,7 @@
- (BOOL) folderIsMandatory;
- (BOOL) create;
- (NSException *) create;
- (NSException *) delete;
- (void) renameTo: (NSString *) newName;

View File

@@ -556,7 +556,7 @@ static NSArray *childRecordFields = nil;
&& [userLogin isEqualToString: [self ownerInContext: context]]
&& [user canAuthenticate]
&& [self folderIsMandatory]
&& [self create])
&& ![self create])
ocsFolder = [self ocsFolderForPath: [self ocsPath]];
[ocsFolder retain];
}
@@ -569,7 +569,7 @@ static NSArray *childRecordFields = nil;
return folder;
}
- (BOOL) create
- (NSException *) create
{
NSException *result;
result = [[self folderManager] createFolderOfType: [self folderType]
@@ -580,7 +580,7 @@ static NSArray *childRecordFields = nil;
&& [[context request] handledByDefaultHandler])
[self sendFolderAdvisoryTemplate: @"Addition"];
return (result == nil);
return result;
}
- (NSException *) delete

View File

@@ -413,7 +413,7 @@
davPrivileges = [NSMutableArray array];
privileges = [[webdavAclManager davPermissionsForRoles: roles
onObject: self] objectEnumerator];
onObject: self] objectEnumerator];
while ((privilege = [privileges nextObject]))
[davPrivileges addObject: davElementWithContent (@"privilege", XMLNS_WEBDAV,
privilege)];

View File

@@ -178,7 +178,7 @@ static SoSecurityManager *sm = nil;
[folder setDisplayName: [self defaultFolderName]];
[folder setOCSPath: [NSString stringWithFormat: @"%@/%@", OCSPath, folderName]];
if ([folder create])
if (![folder create])
[subFolders setObject: folder forKey: folderName];
}
else if (folderType == SOGoCollectedFolder)
@@ -190,7 +190,7 @@ static SoSecurityManager *sm = nil;
[folder setDisplayName: [self collectedFolderName]];
[folder setOCSPath: [NSString stringWithFormat: @"%@/%@", OCSPath, folderName]];
if ([folder create])
if (![folder create])
[subFolders setObject: folder forKey: folderName];
[ud setSelectedAddressBook:folderName];
@@ -406,14 +406,23 @@ static SoSecurityManager *sm = nil;
[newFolder setDisplayName: name];
[newFolder setOCSPath: [NSString stringWithFormat: @"%@/%@",
OCSPath, newNameInContainer]];
if ([newFolder create])
error = [newFolder create];
if (!error)
{
[subFolders setObject: newFolder forKey: newNameInContainer];
error = nil;
}
else if ([[error name] isEqual: @"GCSExitingFolder"])
{
error = [self exceptionWithHTTPStatus: 405
reason: [error reason]];
}
else
error = [self exceptionWithHTTPStatus: 400
reason: @"The new folder could not be created"];
{
[self errorWithFormat: @"An error occured when creating a folder: %@ - %@", [error name], [error reason]];
error = [self exceptionWithHTTPStatus: 400
reason: @"The new folder could not be created"];
}
}
return error;

View File

@@ -15,6 +15,13 @@ describe('read and set calendar properties', function() {
await webdav.deleteObject(resource)
})
it("calendar already exists", async function() {
const response = await webdav.makeCalendar(resource)
expect(response[0].status)
.withContext(`HTTP status code of MKCALENDAR`)
.toEqual(405)
})
// CalDAVPropertiesTest
it("propfind", async function() {

View File

@@ -97,6 +97,13 @@ describe('CardDAV extensions', function() {
await webdav_su.deleteObject(resource)
})
it("addressbook already exists", async function() {
const response = await webdav.makeCollection(resource)
expect(response[0].status)
.withContext(`HTTP status code of MKCOL`)
.toEqual(405)
})
// CARDDAV:addressbook-query Report
// https://datatracker.ietf.org/doc/html/rfc6352#section-8.6
it("supports for addressbook-query on GCS folder", async function() {