Patch title: Release 92 bulk changes
Abstract:
File: /appli/file_browser.pli
Key:
    Removed line
    Added line
   
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/protocol/common/mime.pli"
module "/pliant/language/context.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/util/encoding/http.pli"
module "/pliant/util/encoding/date.pli"
module "/pliant/protocol/http/webdav.pli"
if os_api="linux"
  module "/pliant/language/stream/pipe.pli"



method page apply_uploaded_file src dest fileoptions0 -> sta
  arg_rw HtmlPage page ; arg Str src dest fileoptions0 ; arg
  var Str ext := dest (dest search "." dest:len) dest:len
  if ext=".pdb" and (data_file_switch src dest)=success
    return success
  if fullpliant and ext=".tgz" and file_os_name:dest=file_os
    file_delete "file:/boot/downgrade.tgz"  
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/protocol/common/mime.pli"
module "/pliant/language/context.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/util/encoding/http.pli"
module "/pliant/util/encoding/date.pli"
module "/pliant/protocol/http/webdav.pli"
if os_api="linux"
  module "/pliant/language/stream/pipe.pli"



method page apply_uploaded_file src dest fileoptions0 -> sta
  arg_rw HtmlPage page ; arg Str src dest fileoptions0 ; arg
  var Str ext := dest (dest search "." dest:len) dest:len
  if ext=".pdb" and (data_file_switch src dest)=success
    return success
  if fullpliant and ext=".tgz" and file_os_name:dest=file_os
    file_delete "file:/boot/downgrade.tgz"  
    execute "pliant module /pliant/fullpliant/recover.pli co
    execute "pliant module /pliant/install/minimal.pli module /pliant/fullpliant/recover.pli command 'downgrade "+string:upgrade_timeout+"'" detached
    var Float remain := tar_timeout
    while remain>0 and (file_query "file:/boot/downgrade.tgz
      sleep 1
    if remain>0
      var Array:FileInfo files := file_list "file:/pliant/bi
      for (var Int i) 0 files:size-1
        if files:i:extension=".dump"
          file_delete files:i:name
      file_move src dest
      file_extract dest "file:/"
      file_delete dest
      page shutdown 120 "restart"
  eif fullpliant and ext=".tgz" and file_os_name:dest=file_o
    var Array:FileInfo files := file_list "file:/pliant/bina
    for (var Int i) 0 files:size-1
      if files:i:extension=".dump"
        file_delete files:i:name
    file_move src dest
    file_extract dest "file:/"
    file_delete dest
    page shutdown 120 "restart"
  eif fullpliant and os_api="linux" and ext=".tgz" and (file
    var Array:FileInfo files := file_list "file:/pliant/bina
    for (var Int i) 0 files:size-1
      if files:i:extension=".dump"
        file_delete files:i:name
    file_move src dest
    page shutdown 120 ""
    file_move "security:/" "file:/pliant_security.backup/"
    file_extract dest "file:/"
    file_tree_delete "security:/"
    file_move "file:/pliant_security.backup/" "security:/"
    pliant_load_module "/pliant/appli/file_browser/lilo.pli"
    if file_os_name:dest=file_os_name:"file:/boot/kernel.tgz
      file_tree_delete "file:/sbin/"
      file_tree_delete "file:/etc/"
      file_tree_delete "file:/usr/"
      file_tree_delete "file:/var/"
      file_delete "file:/boot/modules.tgz"
      file_move dest "file:/boot/modules.tgz"
    else
      file_delete dest
    kernel_shutdown true
  var Str fileoptions := shunt fileoptions0<>"" fileoptions0
  status := file_move src dest
  if status=failure
    file_delete dest
    status := file_move src dest
  file_configure dest fileoptions



method page file_browser path options write direct_path
  arg_rw HtmlPage page ; arg Str path options ; arg CBool wr
  implicit page
    var Str answer := ""
    if virtual_command="GET" or virtual_command="POST"
      if path:len>0 and (path path:len-1)="/"
        browse_directory path options write direct_path
      else
        browse_file path options write
    eif virtual_command="HEAD"
      var FileInfo info := file_query path extended
      if info=success
        reset_http_answer
        if not info:is_directory
          http_request answer_size := info size
          http_request answer_datetime := info datetime
        http_request answer_is_dynamic := false
        http_request send_header
        http_request send_footer
      else
        answer := "404 Not found"
    eif virtual_command="PUT"
      if not write
        reset_http_answer
        http_request send_authentification_request
        return
      var DateTime dt := undefined
      var Str opt := ""
      var Pointer:Arrow c :> http_request:query_log first
      while c<>null
        var Pointer:Str s :> c map Str
        if (s parse acword:"pliant-options" ":" any:(var Str
          opt := http_decode value
        eif (s parse acword:"last-modified" ":" any:(var Str
          dt := rfc1123_date value
        c :> http_request:query_log next c
      var Str temp := file_temporary
      reset_http_answer
      (var Stream data) open temp out+safe
      var Int bytes := 0
      while not http_request:query_stream:atend and data=suc
        bytes += raw_copy http_request:query_stream data 1 2
      data close
      if dt=defined
        file_configure temp "datetime "+string:dt
      answer := shunt (apply_uploaded_file temp path opt)=su
      file_delete temp
    eif virtual_command="OPTIONS"
      answer := "200 OK"
      http_request:answer_extra append addressof:(new Str "A
      http_request:answer_extra append addressof:(new Str "D
    eif virtual_command="PROPFIND"
      var FileInfo info := file_query path extended
      var Array:FileInfo dir
      if http_request:webdav_depth<>0
        dir := file_list info:name extended+directories+rela
      webdav_propfind info dir
    eif virtual_command="PROPPATCH" or virtual_command="LOCK
      answer := "200 OK"
    eif virtual_command="MKCOL"
      if not write
        reset_http_answer
        http_request send_authentification_request
        return
      var Str slash := shunt path:len=0 or (path path:len-1)
    var Float remain := tar_timeout
    while remain>0 and (file_query "file:/boot/downgrade.tgz
      sleep 1
    if remain>0
      var Array:FileInfo files := file_list "file:/pliant/bi
      for (var Int i) 0 files:size-1
        if files:i:extension=".dump"
          file_delete files:i:name
      file_move src dest
      file_extract dest "file:/"
      file_delete dest
      page shutdown 120 "restart"
  eif fullpliant and ext=".tgz" and file_os_name:dest=file_o
    var Array:FileInfo files := file_list "file:/pliant/bina
    for (var Int i) 0 files:size-1
      if files:i:extension=".dump"
        file_delete files:i:name
    file_move src dest
    file_extract dest "file:/"
    file_delete dest
    page shutdown 120 "restart"
  eif fullpliant and os_api="linux" and ext=".tgz" and (file
    var Array:FileInfo files := file_list "file:/pliant/bina
    for (var Int i) 0 files:size-1
      if files:i:extension=".dump"
        file_delete files:i:name
    file_move src dest
    page shutdown 120 ""
    file_move "security:/" "file:/pliant_security.backup/"
    file_extract dest "file:/"
    file_tree_delete "security:/"
    file_move "file:/pliant_security.backup/" "security:/"
    pliant_load_module "/pliant/appli/file_browser/lilo.pli"
    if file_os_name:dest=file_os_name:"file:/boot/kernel.tgz
      file_tree_delete "file:/sbin/"
      file_tree_delete "file:/etc/"
      file_tree_delete "file:/usr/"
      file_tree_delete "file:/var/"
      file_delete "file:/boot/modules.tgz"
      file_move dest "file:/boot/modules.tgz"
    else
      file_delete dest
    kernel_shutdown true
  var Str fileoptions := shunt fileoptions0<>"" fileoptions0
  status := file_move src dest
  if status=failure
    file_delete dest
    status := file_move src dest
  file_configure dest fileoptions



method page file_browser path options write direct_path
  arg_rw HtmlPage page ; arg Str path options ; arg CBool wr
  implicit page
    var Str answer := ""
    if virtual_command="GET" or virtual_command="POST"
      if path:len>0 and (path path:len-1)="/"
        browse_directory path options write direct_path
      else
        browse_file path options write
    eif virtual_command="HEAD"
      var FileInfo info := file_query path extended
      if info=success
        reset_http_answer
        if not info:is_directory
          http_request answer_size := info size
          http_request answer_datetime := info datetime
        http_request answer_is_dynamic := false
        http_request send_header
        http_request send_footer
      else
        answer := "404 Not found"
    eif virtual_command="PUT"
      if not write
        reset_http_answer
        http_request send_authentification_request
        return
      var DateTime dt := undefined
      var Str opt := ""
      var Pointer:Arrow c :> http_request:query_log first
      while c<>null
        var Pointer:Str s :> c map Str
        if (s parse acword:"pliant-options" ":" any:(var Str
          opt := http_decode value
        eif (s parse acword:"last-modified" ":" any:(var Str
          dt := rfc1123_date value
        c :> http_request:query_log next c
      var Str temp := file_temporary
      reset_http_answer
      (var Stream data) open temp out+safe
      var Int bytes := 0
      while not http_request:query_stream:atend and data=suc
        bytes += raw_copy http_request:query_stream data 1 2
      data close
      if dt=defined
        file_configure temp "datetime "+string:dt
      answer := shunt (apply_uploaded_file temp path opt)=su
      file_delete temp
    eif virtual_command="OPTIONS"
      answer := "200 OK"
      http_request:answer_extra append addressof:(new Str "A
      http_request:answer_extra append addressof:(new Str "D
    eif virtual_command="PROPFIND"
      var FileInfo info := file_query path extended
      var Array:FileInfo dir
      if http_request:webdav_depth<>0
        dir := file_list info:name extended+directories+rela
      webdav_propfind info dir
    eif virtual_command="PROPPATCH" or virtual_command="LOCK
      answer := "200 OK"
    eif virtual_command="MKCOL"
      if not write
        reset_http_answer
        http_request send_authentification_request
        return
      var Str slash := shunt path:len=0 or (path path:len-1)
      answer := shunt (file_tree_create path+slash)=success 
      answer := shunt (file_tree_create path+slash)=success "201 Created" "500 Could not create directory"
    eif virtual_command="MOVE"
      answer := "403 Forbidden"
      var Str src := "http://"+http_request:site_name+http_r
      var Str dest := ""
      var Pointer:Arrow c :> http_request:query_log first
      while c<>null
        if ((c map Str) parse acword:"Destination" ":" any:(
    eif virtual_command="MOVE"
      answer := "403 Forbidden"
      var Str src := "http://"+http_request:site_name+http_r
      var Str dest := ""
      var Pointer:Arrow c :> http_request:query_log first
      while c<>null
        if ((c map Str) parse acword:"Destination" ":" any:(
          dest := http_decode value
          dest := value
        c :> http_request:query_log next c
        c :> http_request:query_log next c
      if (dest eparse "http://" any:(var Str dest_site) ":" (var Int dest_port) "/" any:(var Str dest_path)) and (dest_site search "/" -1)=(-1)
        dest := "http://"+dest_site+"/"+dest_path
      if (dest 0 (dest search_last "/" dest:len)+1)=(src 0 (
      if (dest 0 (dest search_last "/" dest:len)+1)=(src 0 (
        var Status status := file_move path (path 0 (path se
        var Status status := file_move path (path 0 (path search_last "/" path:len)+1)+http_decode:(dest (dest search_last "/" dest:len)+1 dest:len)
        if status=success
        if status=success
          answer := "200 OK"
          answer := "201 Created"
    eif virtual_command="DELETE"
      if not write
        reset_http_answer
        http_request send_authentification_request
        return
      answer := shunt file_delete:path=success or (file_tree
    else
      answer := "501 Not implemented"
    if answer<>""
      reset_http_answer
      http_request send_header "status "+string:answer+" siz
      http_request send_footer

export '. apply_uploaded_file' '. file_browser'
    eif virtual_command="DELETE"
      if not write
        reset_http_answer
        http_request send_authentification_request
        return
      answer := shunt file_delete:path=success or (file_tree
    else
      answer := "501 Not implemented"
    if answer<>""
      reset_http_answer
      http_request send_header "status "+string:answer+" siz
      http_request send_footer

export '. apply_uploaded_file' '. file_browser'