Index: openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl,v
diff -u -r1.368.2.152 -r1.368.2.153
--- openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl	30 Jan 2024 16:35:10 -0000	1.368.2.152
+++ openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl	30 Jan 2024 17:18:46 -0000	1.368.2.153
@@ -38,7 +38,7 @@
 
     set instantiate_p [:form_parameter instantiate_p:boolean false]
 
-    set item_ids [:get_ids_for_bulk_actions [:form_parameter objects]]
+    set item_ids [:get_ids_for_bulk_actions [:form_parameter objects:int32,0..n]]
     foreach item_id $item_ids {
       :log "bulk-delete: DELETE item_id $item_id"
       if {$instantiate_p} {
@@ -69,7 +69,7 @@
       :msg "nothing to copy"
     }
 
-    ::xowiki::clipboard add [:get_ids_for_bulk_actions [:form_parameter objects]]
+    ::xowiki::clipboard add [:get_ids_for_bulk_actions [:form_parameter objects:int32,0..n]]
     #
     # When called via AJAX, we have reason to make a redirect.
     #
@@ -258,17 +258,23 @@
     #
     # Collect some default values from query parameters.
     #
-    set default_variables [list]
-    foreach param [list \
-                       name \
-                       title \
-                       page_order:graph \
-                       last_page_id:int32 \
-                       "nls_language:oneof,arg=[join [lang::system::get_locales] |]" \
-                      ] {
-      regexp {^([^:]+):?} $param . key
+    set default_variables {}
+    #
+    # The value for "name" is validated later, and requires the type
+    # of the object. Different names are allowed for files, folders
+    # and other wiki pages.
+    #
+    foreach name_and_spec [list \
+                               name \
+                               title \
+                               page_order:graph \
+                               last_page_id:int32 \
+                               nls_language:oneof,arg=[join [lang::system::get_locales] |] \
+                              ] {
+      set p [string first : $name_and_spec]
+      set key [expr {$p > -1 ? [string range $name_and_spec 0 $p-1] : $name_and_spec}]
       if {[:exists_query_parameter $key]} {
-        lappend default_variables $key [:query_parameter $param]
+        lappend default_variables $key [:query_parameter $name_and_spec]
       }
     }
 
@@ -280,7 +286,7 @@
     # We should probably allow as well controlling auto-naming and
     # and prohibit empty postings.
 
-    set text_to_html [:form_parameter "__text_to_html" ""]
+    set text_to_html [:form_parameter __text_to_html:0..n ""]
     foreach key {_text _name} {
       if {[:exists_form_parameter $key]} {
         set __value [:form_parameter $key]
@@ -313,7 +319,7 @@
       if {![info exists :parent_id]} {
         set :parent_id [::${:package_id} folder_id]
       }
-      set fp_parent_id [:form_parameter parent_id [:query_parameter parent_id:int32 ${:parent_id}]]
+      set fp_parent_id [:form_parameter parent_id:int32 [:query_parameter parent_id:int32 ${:parent_id}]]
     } else {
       set fp_parent_id $parent_id
     }
@@ -327,7 +333,7 @@
 
     # In case the Form is inherited and package_id was not specified, we
     # use the actual package_id.
-    set fp_package_id [:form_parameter package_id [:query_parameter package_id:int32 ${:package_id}]]
+    set fp_package_id [:form_parameter package_id:int32 [:query_parameter package_id:int32 ${:package_id}]]
 
     #
     # Handling publish_status. When the publish_status is provided via
@@ -346,7 +352,7 @@
       } else {
         set publish_status "ready"
       }
-      :log "FINAL publish_status $publish_status"
+      #:log "FINAL publish_status $publish_status"
     }
 
     #
@@ -407,10 +413,17 @@
 
     $f notification_notify
 
-    foreach var {return_url:localurl template_file title detail_link:localurl text} {
-      regexp {^([^:]+):?} $var . key
+    foreach name_and_spec {
+      return_url:localurl
+      template_file
+      title
+      detail_link:localurl
+      text
+    } {
+      set p [string first : $name_and_spec]
+      set key [expr {$p > -1 ? [string range $name_and_spec 0 $p-1] : $name_and_spec}]
       if {[:exists_query_parameter $key]} {
-        set $key [:query_parameter $var]
+        set $key [:query_parameter $name_and_spec]
         :log "set instance var from query param '$key' -> '[set $key]'"
       }
     }
@@ -424,7 +437,7 @@
       #
       set template_file [$fp_package_id normalizepath $template_file]
     }
-    set form_redirect [:form_parameter "__form_redirect" ""]
+    set form_redirect [:form_parameter __form_redirect:0..n ""]
     if {$form_redirect eq ""} {
       set form_redirect [$f pretty_link -query [export_vars {
         {m $view_method} return_url template_file title detail_link text
@@ -856,17 +869,18 @@
 
   Page instproc edit_set_default_values {} {
     # set some default values if they are provided
-    foreach param [list \
-                       name \
-                       title \
-                       page_order:graph \
-                       last_page_id:int32 \
-                       "nls_language:oneof,arg=[join [lang::system::get_locales] |]" \
+    foreach name_and_spec [list \
+                               name \
+                               title \
+                               page_order:graph \
+                               last_page_id:int32 \
+                               nls_language:oneof,arg=[join [lang::system::get_locales] |] \
                       ] {
-      regexp {^([^:]+):?} $param . key
+      set p [string first : $name_and_spec]
+      set key [expr {$p > -1 ? [string range $name_and_spec 0 $p-1] : $name_and_spec}]
       if {[::${:package_id} exists_query_parameter $key]} {
         #:log "setting [self] set $key [::${:package_id} query_parameter $key]"
-        set :$key [::${:package_id} query_parameter $param]
+        set :$key [::${:package_id} query_parameter $name_and_spec]
       }
     }
   }
@@ -1128,7 +1142,7 @@
       # Disable some form-fields since these are disabled in the form
       # as well.
       #
-      foreach name [:form_parameter __disabled_fields] {
+      foreach name [:form_parameter __disabled_fields:0..n] {
         set f [:lookup_form_field -name $name $form_fields]
         $f set_disabled true
       }
@@ -1521,8 +1535,9 @@
     set disposition [:query_parameter disposition:wordchar File]
 
     #
-    # Filename is sanitized. If it turns out to be made only of
-    # invalid characters, we complain.
+    # Filename is sanitized. If the filename contains only invalid
+    # characters, "ad_sanitize_filename" might return empty, and we
+    # complain.
     #
     set fileName [ad_sanitize_filename \
                       [ns_queryget name [ns_queryget upload]]]
@@ -1886,7 +1901,7 @@
         -item_id ${:item_id} \
         -revision_id ${:revision_id} \
         -package_id ${:package_id} \
-        [:form_parameter new_tags]
+        [:form_parameter new_tags:0..n]
 
     ::${:package_id} returnredirect \
         [:query_parameter return_url:localurl [ad_return_url]]
@@ -2117,9 +2132,7 @@
       set template ""
       set page [self]
 
-      foreach css [::$context_package_id get_parameter \
-                       -check_query_parameter false \
-                       extra_css ""] {
+      foreach css [::$context_package_id get_parameter extra_css:localurl ""] {
         ::xo::Page requireCSS -order 10 $css
       }
 
@@ -2706,13 +2719,6 @@
     array set containers [list]
     set cc [::${:package_id} context]
 
-    #
-    # Fetching the form data may also affect this object's
-    # variables. Backup the old page object to revert these changes in
-    # case of validation error.
-    #
-    :copy old_page
-
     if {![info exists field_names]} {
       #
       # Field names might come directly from the POST request payload
@@ -2960,17 +2966,6 @@
       foreach f $form_fields {
         $f reset_on_validation_error
       }
-      #
-      # Revert changes performed by this method on the page object, as
-      # these may come from data failing to validate.
-      #
-      foreach var [old_page info vars] {
-        if {[old_page array exists $var]} {
-          array set :$var [old_page array get $var]
-        } else {
-          set :$var [old_page set $var]
-        }
-      }
     }
 
     #:log "=== get_form_data has validation_errors $validation_errors, instance_attributes: ${:instance_attributes}"