]> err.no Git - sope/commitdiff
improved WebDAV locking
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 May 2006 22:49:17 +0000 (22:49 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 May 2006 22:49:17 +0000 (22:49 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1262 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m
sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.h
sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m

index 131e0d7295c7855ab42f492f853c89875283c303..2a19499b1e602f618ee46fbf6cc54e3886582934 100644 (file)
@@ -1,5 +1,9 @@
 2006-05-05  Helge Hess  <helge.hess@opengroupware.org>
 
+       * WebDAV/SoWebDAVRenderer.m: deliver more lockinfo fields when a lock
+         is acquired. This solves an issue with files being openened in Word
+         2003 in readonly mode. (v4.5.232)
+
        * v4.5.231
        
        * WebDAV/SoWebDAVRenderer.m: major change: WebDAV properties which got
index 704a3bc2fc9888d19cc97bab3593e834f481a055..c1996c3130754abb3ced297cb4ad3653719fda8a 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=231
+SUBMINOR_VERSION:=232
 
 # v4.5.214 requires libNGExtensions v4.5.179
 # v4.5.122 requires libNGExtensions v4.5.153
index ffb310182530784d1581dcea5772ce6e8f0fbb36..22d47d72acbe2c49efa5e52133cc1db8dbc3c214 100644 (file)
@@ -1,5 +1,6 @@
 /*
-  Copyright (C) 2002-2005 SKYRIX Software AG
+  Copyright (C) 2002-2006 SKYRIX Software AG
+  Copyright (C) 2006      Helge Hess
 
   This file is part of SOPE.
 
@@ -762,17 +763,29 @@ static NSTimeZone                *gmt      = nil;
     [self warnWithFormat:@"'depth' locking not supported yet (depth=%@)!", 
             lockDepth];
   }
-  if (ifValue) {
+  if (ifValue != nil) {
     [self warnWithFormat:@"'if' locking not supported yet, if: '%@'", ifValue];
   }
   
-  // need to parse lockinfo
+  /*
+    TODO: parse lockinfo:
+      <?xml version="1.0" encoding="UTF-8" ?>
+      <lockinfo xmlns="DAV:">
+        <locktype><write/></locktype>
+        <lockscope><exclusive/></lockscope>
+        <owner>helge</owner>
+      </lockinfo>
+    
+    Currently we assume exclusive/write ... (also see SoWebDAVRenderer)
+  */
+  
+  /* Sample timeout: Second-180 */
   
   token = [lockManager lockURI:[rq uri]
                       timeout:[rq headerForKey:@"timeout"]
-                      scope:@"exclusive"
-                      type:@"write"
-                      owner:nil];
+                      scope:@"exclusive" // TODO
+                      type:@"write"      // TODO
+                      owner:nil];        // TODO
   if (token == nil) {
     /* already locked */
     return [self httpException:423 /* locked */
index 26be4d45c0771847b53ce0b8bc661958335fa825..9fd4f24b091c8ec45ab9661afbffd29d18cf6215 100644 (file)
@@ -1,5 +1,6 @@
 /*
-  Copyright (C) 2000-2005 SKYRIX Software AG
+  Copyright (C) 2000-2006 SKYRIX Software AG
+  Copyright (C) 2006      Helge Hess
 
   This file is part of SOPE.
 
index 9c5c5c135c620bba8ce4277de202630567247fb7..b7a1ad23342415225ac3aaa1c73b9843ce6d86f5 100644 (file)
@@ -909,8 +909,10 @@ static BOOL         formatOutput = NO;
 }
 
 - (BOOL)renderLockToken:(id)_object inContext:(WOContext *)_ctx {
-  /* TODO: this is a fake ! */
+  // TODO: this is fake for most parts! The object needs to be some real
+  //       object describing the lock, not just the token
   WOResponse *r;
+  id tmp;
   
   if (_object == nil) return NO;
   
@@ -926,18 +928,45 @@ static BOOL         formatOutput = NO;
   [r appendContentString:@"<D:activelock>"];
   if (formatOutput) [r appendContentCharacter:'\n'];
   
+  // TODO: we assume a write token and exclusive access, also check the
+  //       SoObjectWebDAVDispatcher
+
+  [r appendContentString:@"<D:locktype><D:write/></D:locktype>"];
+  if (formatOutput) [r appendContentCharacter:'\n'];
+
+  [r appendContentString:@"<D:lockscope><D:exclusive/></D:lockscope>"];
+  if (formatOutput) [r appendContentCharacter:'\n'];
+  
+  /* write the depth */
+  // TODO: we just give back the depth of the request ...
+  
+  if ([(tmp = [[_ctx request] headerForKey:@"depth"]) isNotEmpty]) {
+    [r appendContentString:@"<D:depth>"];
+    [r appendContentString:[tmp stringValue]];
+    [r appendContentString:@"</D:depth>"];
+    if (formatOutput) [r appendContentCharacter:'\n'];
+  }
+  
+  // TODO: owner,     eg <D:owner><D:href>...</D:href></D:owner>
+  
+  /* write the timeout */
+  // TODO: we just give back the timeout of the request ...
+  
+  if ([(tmp = [[_ctx request] headerForKey:@"timeout"]) isNotEmpty]) {
+    /* eg <D:timeout>Second-604800</D:timeout> */
+    [r appendContentString:@"<D:timeout>"];
+    [r appendContentString:[tmp stringValue]];
+    [r appendContentString:@"</D:timeout>"];
+    if (formatOutput) [r appendContentCharacter:'\n'];
+  }
+  
   /* this is the href of the lock, not of the locked resource */
+
   [r appendContentString:@"<D:locktoken><D:href>"];
   [r appendContentString:[_object stringValue]];
   [r appendContentString:@"</D:href></D:locktoken>"];
   if (formatOutput) [r appendContentCharacter:'\n'];
   
-  // TODO: locktype,  eg <D:locktype><D:write/></D:locktype>
-  // TODO: lockscope, eg <D:lockscope><D:exclusive/></D:lockscope>
-  // TODO: depth,     eg <D:depth>Infinitiy</D:depth>
-  // TODO: owner,     eg <D:owner><D:href>...</D:href></D:owner>
-  // TODO: timeout,   eg <D:timeout>Second-604800</D:timeout>
-  
   [r appendContentString:@"</D:activelock>"];
   [r appendContentString:@"</D:lockdiscovery>"];
   [r appendContentString:@"</D:prop>"];