Index: openacs-4/packages/oacs-dav/oacs-dav.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/oacs-dav/oacs-dav.info,v diff -u -r1.2.2.10 -r1.2.2.11 --- openacs-4/packages/oacs-dav/oacs-dav.info 28 Oct 2004 17:40:44 -0000 1.2.2.10 +++ openacs-4/packages/oacs-dav/oacs-dav.info 30 Nov 2004 19:46:51 -0000 1.2.2.11 @@ -8,18 +8,19 @@ t webdav-support - + Dave Bauer Provides services to enable webDAV access to content repository items. 2004-09-27 OpenACS An interface to the tDAV webDAV package. oacs-dav provides services to offer webDAV access to content repository data. - + + Index: openacs-4/packages/oacs-dav/tcl/oacs-dav-install-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/oacs-dav/tcl/oacs-dav-install-procs.tcl,v diff -u -r1.1.1.1.2.1 -r1.1.1.1.2.2 --- openacs-4/packages/oacs-dav/tcl/oacs-dav-install-procs.tcl 31 Mar 2004 02:33:52 -0000 1.1.1.1.2.1 +++ openacs-4/packages/oacs-dav/tcl/oacs-dav-install-procs.tcl 30 Nov 2004 19:46:52 -0000 1.1.1.1.2.2 @@ -45,6 +45,7 @@ } { oacs_dav::install::create_dav_sc oacs_dav::install::create_dav_put_type_sc + oacs_dav::install::create_dav_mkcol_type_sc } ad_proc -private oacs_dav::install::create_dav_sc { @@ -145,12 +146,33 @@ } +ad_proc -private oacs_dav::install::create_dav_mkcol_type_sc { +} { + create dav_mkcol_type service contract +} { + set contract_name "dav_mkcol_type" + set spec { + description "returns content type to use for MKCOL operation" + operations { + get_type { + description "DAV MKCOL Content Type" + output { content_type:string } + } + } + } + + acs_sc::contract::new_from_spec \ + -spec [concat [list name $contract_name] $spec ] + +} + ad_proc -private oacs_dav::install::delete_service_contracts { } { remove service contracts on uninstall } { acs_sc::contract::delete -name dav acs_sc::contract::delete -name dav_put_type + acs_sc::contract::delete -name dav_mkcol_type } ad_proc -private oacs_dav::install::register_implementation { @@ -210,4 +232,20 @@ } { acs_sc::impl::delete -contract_name dav -impl_name content_folder acs_sc::impl::delete -contract_name dav -impl_name content_revision +} + +ad_proc -private oacs_dav::install::upgrade { + -from_version_name + -to_version_name +} { + Install new DAV service contracts +} { + apm_upgrade_logic \ + -from_version_name $from_version_name \ + -to_version_name $to_version_name \ + -spec { + 1.0b1 1.0b2 { + oacs_dav::install::create_dav_mkcol_type_sc + } + } } \ No newline at end of file Index: openacs-4/packages/oacs-dav/tcl/oacs-dav-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/oacs-dav/tcl/oacs-dav-procs.tcl,v diff -u -r1.4.2.21 -r1.4.2.22 --- openacs-4/packages/oacs-dav/tcl/oacs-dav-procs.tcl 16 Nov 2004 09:43:28 -0000 1.4.2.21 +++ openacs-4/packages/oacs-dav/tcl/oacs-dav-procs.tcl 30 Nov 2004 19:46:52 -0000 1.4.2.22 @@ -30,7 +30,7 @@ } { set encoded_string [ns_urlencode $string] set encoded_string [string map -nocase \ - {%2d - %5f _ %24 $ %2e . %21 ! %28 ( %29 ) %27 ' %2c ,} $encoded_string] + {+ %20 %2d - %5f _ %24 $ %2e . %21 ! %28 ( %29 ) %27 ' %2c ,} $encoded_string] return $encoded_string } @@ -164,7 +164,7 @@ -privilege "create"] ] } propfind { - if {[empty_string_p $user_id]} { + if {!$user_id} { ns_returnunauthorized } else { set authorized_p [permission::permission_p \ @@ -295,7 +295,6 @@ } { ad_conn -reset set uri [ns_urldecode [ns_conn url]] - ns_log debug "\nconn_setp uri \"$uri\" " set dav_url_regexp "^[oacs_dav::uri_prefix]" regsub $dav_url_regexp $uri {} uri @@ -315,7 +314,7 @@ set destination [ns_urldecode [ns_set iget [ns_conn headers] Destination]] - regsub {(http|https)://[^/]+/} $destination {/} dest + regsub {https?://[^/]+/} $destination {/} dest regsub $dav_url_regexp $dest {} dest @@ -396,7 +395,11 @@ # ask package what content type to use switch -- $method { mkcol { - set content_type "content_folder" + if {![acs_sc_binding_exists_p dav_mkcol_type $package_key]} { + set content_type "content_folder" + } else { + set content_type [acs_sc_call dav_mkcol_type get_type "" $package_key] + } } put { if {![acs_sc_binding_exists_p dav_put_type $package_key]} { @@ -573,8 +576,8 @@ } # according to the spec copy with overwrite means # delete then copy - set blocked_p [oacs_dav::children_have_permission_p -item_id $copy_folder_id -user_id $user_id -privilege "delete"] - if {$blocked_p} { + set children_permission_p [oacs_dav::children_have_permission_p -item_id $copy_folder_id -user_id $user_id -privilege "delete"] + if {!$children_permission_p} { return [list 409] } if {![string equal "unlocked" [tdav::check_lock $target_uri]]} { @@ -586,6 +589,7 @@ } else { set response [list 201] } + set err_p 0 db_transaction { db_exec_plsql copy_folder "" # we need to do this because in oracle content_folder__copy @@ -594,6 +598,10 @@ # update all child items revisions to live revision db_dml update_child_revisions "" } on_error { + set err_p 1 + } + + if { $err_p } { return [list 500] } @@ -645,8 +653,8 @@ return [list 423] } # TODO check if we have permission over everything inside - set blocked_p [oacs_dav::children_have_permission_p -item_id $move_folder_id -user_id $user_id -privilege "delete"] - if {$blocked_p} { + set children_permission_p [oacs_dav::children_have_permission_p -item_id $move_folder_id -user_id $user_id -privilege "delete"] + if {!$children_permission_p} { return [list 409] } db_exec_plsql delete_for_move "" @@ -662,8 +670,8 @@ return [list 403] } + set err_p 0 db_transaction { - if {![string equal $cur_parent_folder_id $new_parent_folder_id]} { ns_log debug "\n@@DAV@@ move folder $move_folder_id" db_exec_plsql move_folder "" @@ -677,8 +685,13 @@ } } on_error { + set err_p 1 + } + + if { $err_p } { return [list 500] } + tdav::copy_props $uri $target_uri tdav::delete_props $uri tdav::remove_lock $uri @@ -697,8 +710,8 @@ if {![string equal "unlocked" [tdav::check_lock $uri]]} { return [list 423] } - set blocked_p [oacs_dav::children_have_permission_p -item_id $item_id -user_id $user_id -privilege "delete"] - if {$blocked_p} { + set children_permission_p [oacs_dav::children_have_permission_p -item_id $item_id -user_id $user_id -privilege "delete"] + if {!$children_permission_p} { return [list 403] } if {[catch {db_exec_plsql delete_folder ""} errmsg]} { @@ -1080,12 +1093,18 @@ set response [list 201] } + set err_p 0 db_transaction { set item_id [db_exec_plsql copy_item ""] db_dml set_live_revision "" } on_error { + set err_p 1 + } + + if { $err_p } { return [list 500] } + tdav::copy_props $uri $target_uri return $response } @@ -1137,6 +1156,7 @@ set response [list 201] } + set err_p 0 db_transaction { if {![string equal $cur_parent_folder_id $new_parent_folder_id]} { db_exec_plsql move_item "" @@ -1148,8 +1168,13 @@ db_dml update_title "" } } on_error { + set err_p 1 + } + + if { $err_p } { return [list 500] } + tdav::copy_props $uri $target_uri tdav::delete_props $uri tdav::remove_lock $uri