Patch title: Release 92 bulk changes
Abstract:
File: /fullpliant/login.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/fullpliant/user.pli"

module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/fullpliant/user.pli"

module "/pliant/language/context.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/util/remote/client.pli"
module "/pliant/admin/md5.pli"



module "/pliant/fullpliant/this_computer.pli"
module "/pliant/util/remote/client.pli"
module "/pliant/admin/md5.pli"



function user_update user first_name name abstract password_
  arg Str user first_name name abstract password_md5 server 
function user_update user first_name name email abstract password_md5 public_key options server -> status
  arg Str user first_name name email abstract password_md5 public_key options server ; arg Status status
  remote server
    control c is_password_server:c
    control c not is_administrator:user
    share status
    user_database:data:user create user
    user_database2:data:user create user
    user_secret_database:data:user create user
    var Data:User u :> user_database:data:user user
    u first_name := first_name
    u name := name
  remote server
    control c is_password_server:c
    control c not is_administrator:user
    share status
    user_database:data:user create user
    user_database2:data:user create user
    user_secret_database:data:user create user
    var Data:User u :> user_database:data:user user
    u first_name := first_name
    u name := name
    u email := email
    u abstract := abstract
    user_secret_database:data:user:user password_md5 := pass
    u abstract := abstract
    user_secret_database:data:user:user password_md5 := pass
    u public_key := public_key
    u options := options
  local_streaming s
    each r user_database:data:user:user:right
      s writeline "right "+(string keyof:r)+" "+(string r:au
    each t user_database:data:user:user:template
      s writeline "template "+(string keyof:t)+" "+string:t
  remote_streaming s
    var Data:User u :> user_database:data:user user
    var (Dictionary Str Void) lines templates
    while not s:atend
  local_streaming s
    each r user_database:data:user:user:right
      s writeline "right "+(string keyof:r)+" "+(string r:au
    each t user_database:data:user:user:template
      s writeline "template "+(string keyof:t)+" "+string:t
  remote_streaming s
    var Data:User u :> user_database:data:user user
    var (Dictionary Str Void) lines templates
    while not s:atend
      if (s:readline parse "right" (var Str id) (var Str aut
      var Str l := s readline
      if (l parse "right" (var Str id) (var Str auth) (var Str ip) (var Str server) (var Str right))
        if right<>"administrator"
          u:right create id
          var Data:UserRight r :> u:right id
          r auth := auth+"3" 0 ; r ip := ip ; r server := se
        lines insert id void
        if right<>"administrator"
          u:right create id
          var Data:UserRight r :> u:right id
          r auth := auth+"3" 0 ; r ip := ip ; r server := se
        lines insert id void
      eif (s:readline parse "template" (var Str id) (var Str
      eif (l parse "template" (var Str id) (var Str template))
        if not is_administrator:template
          u:template create id
          u:template id := template
        templates insert id void
    each r u:right
      if not exists:(lines first keyof:r)
        u:right delete keyof:r
    each t u:template
      if not exists:(templates first keyof:t)
        u:template delete keyof:t
  success
    status := success
  failure
    status := failure


        if not is_administrator:template
          u:template create id
          u:template id := template
        templates insert id void
    each r u:right
      if not exists:(lines first keyof:r)
        u:right delete keyof:r
    each t u:template
      if not exists:(templates first keyof:t)
        u:template delete keyof:t
  success
    status := success
  failure
    status := failure


function user_update user -> status
  arg Str user ; arg ExtendedStatus status
  status := success
  each c this_computer:env:"pliant":"password"
    if (keyof:c parse "client" any) and c<>computer_fullname
      var Data:User u :> user_database:data:user user
      if (user_update user u:first_name u:name u:email u:abstract user_secret_database:data:user:user:password_md5 u:public_key u:options c)=failure
        status := failure "Failed to forward changes to server "+c


export login_record
export user_update user_change_password user_delete
export login_record
export user_update user_change_password user_delete