Patch title: Release 94 bulk changes
Abstract:
File: /pliant/util/crypto/proxy.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "channel.pli"
module "/pliant/fullpliant/user.pli"
module "/pliant/protocol/http/site.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/admin/md5.pli"
module "/pliant/util/crypto/cipher.pli"
module "/pliant/language/type/text/str8.pli"

module "/pliant/protocol/dns/client.pli" # force using Pliant names database

constant debug false
constant trace true
constant secured_proxy_tcp_port 9999

if debug
  gvar Int counter := 0
  gvar FastSem sem


function proxy src dest public stop
  arg Str src dest ; arg CBool public ; arg_rw CBool stop
  stop := false
  while not stop
    part session
      var Link:Stream s :> new Stream
      s open src in+out+noautopost+safe
      if not public and (s query "remote_ip_address")<>"127.0.0.1"
        console "Somebody at "+(s query "remote_ip_address")+" is trying to use your proxy !!!" eol
        leave session
      thread
        var Link:Stream d :> new Stream
        d open dest in+out+noautopost+safe
        if trace
          if d=success
            console "."
          else
            console "connection failed" eol
            var FileInfo info := file_query dest extended
            var Str key := info:options option "client_key" Str
            if key<>""
              console "client key is " key eol
            var Str key := info:options option "server_key" Str
            if key<>""
              console "server key is " key eol
        if debug
          sem request ; counter += 2 ; console counter eol ; sem release
        thread 
          while { d read_available (var Address adr2) (var Int size2) ; size2<>0 }
            if debug
              console " <-" size2
            s raw_write adr2 size2
            s flush anytime
            if debug
              console ";"
          s safe_configure "shutdown"
          if debug
            sem request ; counter -= 1 ; console counter " " d:name eol ; sem release
        while { s read_available (var Address adr1) (var Int size1) ; size1<>0 }
          if debug
            console " ->" size1
          d raw_write adr1 size1
          d flush anytime
          if debug
            console ";"
        d safe_configure "shutdown"
        if debug
          sem request ; counter -= 1 ; console counter " " s:name eol ; sem release


gvar Str proxy_current_site
gvar CBool stop
gvar Sem sem

function proxy user password site -> status
  arg Str user password site ; arg ExtendedStatus status
  stop := true
  (var Stream s) open "tcp://127.0.0.1/client/"+string:secured_proxy_tcp_port in+out+safe
  s close
  if not (site parse any:(var Str host) ":" (var Int port))
    host := site
    var Data:NameHost h :> name_database:data:host site
    if exists:h
      port := h http_port
    else
      var Data:Site si :> site_database:data:site site
      if exists:si and si:port=defined
        port := si port
      eif exists:si and si:computer<>"" and exists:(name_database:data:host si:computer)
        port := (name_database:data:host si:computer) http_port
      else
        port := 80
  proxy_current_site := ""
  if site=""
    return success
  sem request
  var CBool ok :=  user_secret_database:data:user:user:key_md5="" or user_secret_database:data:user:user:key_md5=string_md5_hexa_signature:(uncipher user_secret_database:data:user:user:private_key password)
  var CBool ok := user_secret_database:data:user:user:key_md5="" or user_secret_database:data:user:user:key_md5=string_md5_hexa_signature:(uncipher (straight_to_Str user_secret_database:data:user:user:private_key) password)
  if not ok
    sleep 2
    sem release
    return (failure "Password for '"+user+"' is wrong.")
  sem release
  proxy_current_site := host
  thread
    proxy "tcp:/server/"+string:secured_proxy_tcp_port "zchannel://"+host+"/client/"+(string port+500)+"/"+host+"/"+user+"/"+password false stop
  status := success

export proxy proxy_current_site secured_proxy_tcp_port