xowiki::validate_name (private)
xowiki::validate_name [ data ]
Defined in packages/xowiki/tcl/xowiki-form-procs.tcl
Validate and normalize the name in the caller's name variable. Apply language and file naming rules and resolve eligible autoname collisions.
- Parameters:
- data (optional)
- Page object, or empty to use the active WikiForm data.
- Returns:
- 1 if the resulting name is valid, or 0 otherwise.
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
Source code: # # This proc is not only a validator of the "name" attribute, but # modifies "name" according to the value of the language settings, # in case it is applied on non-file pages. In cases of data of the # autonamed forms (i.e. for pages of type ::xowiki::PageInstance), # it avoids name clashes as well. # upvar name name if {$data eq ""} { unset data set form ::xowiki::f1 ;# form has to be named this way for the time being # $form log "--F validate_name data=[$form exists data]" $form instvar data } #$data log "validate_name: '$name'" $data instvar package_id set cc [::$package_id context] set old_name [$cc form_parameter __object_name:signed,convert ""] #$data msg "validate: old='$old_name', current='$name'" if {[$data istype ::xowiki::File] && [$data exists upload_file] && [$data exists mime_type]} { #$data log "validate_name: MIME [$data set mime_type]" set name [$data build_name $name [$data set upload_file]] # # Check, if the user is allowed to create a file with the specified # name. Files ending in .css or .js might require special permissions. # Caveat: the error message is always the same. # set package_id [$cc package_id] set computed_link [export_vars -base [::$package_id package_url] {{edit-new 1} name {object_type ::xowiki::File}}] set granted [::$package_id check_permissions -link $computed_link $package_id edit-new] #$data log "validate_name: computed_link=$computed_link,granted=$granted" if {!$granted} { util_user_message -message "User not authorized to create a file named $name" return 0 } } else { if {![$data istype ::xowiki::File] && [regexp {^[a-zA-Z][a-zA-Z]:$} $name]} { # # The name looks like a language prefix followed by an empty # name. Empty names are not allowed. # return 0 } $data name $name # # Try first to get the language from the form parameter # "nls_language". If this fails, get it from "nls_language". If # this fails as well, fall back to "en_US". Actually, one should # consider parameterizing/refactoring validate_name which # predates form-fields and follows ad_form conventions and uses # upvar, etc. # set nls_language [$data form_parameter nls_language:token [$data form_parameter _nls_language:token]] if {$nls_language eq ""} { set nls_language en_US } elseif {$nls_language ni [lang::system::get_locales]} { # # The locale does not belong to the enabled locales. This can # be still wanted by the application, but we should provide a # hint in the log file about this unusual situation. # if {$nls_language ni [lang::system::get_locales -all]} { set message "'$nls_language' not defined in the system, call back to 'en_US'" set severity warning set nls_language en_US } else { set severity notice set message "'$nls_language' not enabled in the system" } ns_log $severity "suspect content of form variable nls_language: $message" } set name [$data build_name -nls_language $nls_language] } if {$name ne ""} { set prefixed_page_p [expr {![$data is_folder_page] && ![$data is_link_page]}] set name [::$package_id normalize_name -with_prefix $prefixed_page_p $name] } #$data log "validate_name: old='$old_name', new='$name'" if {$name eq $old_name && $name ne ""} { # do not change names, which are already validated; # otherwise, autonamed entries might get an unwanted en:prefix return 1 } # check, if we try to create a new item with an existing name #$data log "validate_name: new=[$data form_parameter __new_p 0], eq=[expr {$old_name ne $name}]" if {[$data form_parameter __new_p:boolean 0] || $old_name ne $name } { if {[::xo::db::CrClass lookup -name $name -parent_id [$data parent_id]] == 0} { # the provided name is really new return 1 } #$data log "validate_name: entry '$name' exists here already" if {[$data istype ::xowiki::PageInstance]} { # # The entry might be autonamed. In case of imports from other # xowiki instances, we might have name clashes. Therefore, we # compute a fresh name here. # set anon_instances [$data get_from_template anon_instances f] if {$anon_instances} { set basename [::xowiki::autoname basename [[$data page_template] name]] $data log "validate_name: have anon_instances basename '$basename' name '$name'" if {[string match $basename* $name]} { set name [::xowiki::autoname new -name $basename -parent_id [$data parent_id]] $data name $name $data log "validate_name: changed data name to '$name'" return 1 } } } return 0 } return 1XQL Not present: Generic, PostgreSQL, Oracle