xowiki::validate_name

 xowiki::validate_name

Defined in

Partial Call Graph (max 5 caller/called nodes):
%3 ::xowiki::WikiForm ::xowiki::WikiForm xowiki::validate_name xowiki::validate_name ::xowiki::WikiForm->xowiki::validate_name Class Class Class->xowiki::validate_name export_vars export_vars (public) xowiki::validate_name->export_vars lang::system::get_locales lang::system::get_locales (public) xowiki::validate_name->lang::system::get_locales util_user_message util_user_message (public) xowiki::validate_name->util_user_message

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 1
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: