Patch title: Release 94 bulk changes
Abstract:
File: /pliant/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"



type LoginSlice
  field DateTime from to
  field Str ip comment


type LoginSlice
  field DateTime from to
  field Str ip comment


function user_update user first_name name email abstract pas
  arg Str user first_name name email abstract password_md5 p
function user_update user first_name name email abstract password_md5 public_key language options style_options server -> status
  arg Str user first_name name email abstract password_md5 public_key language options style_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
    u email := email
    u abstract := abstract
    user_secret_database:data:user:user password_md5 := pass
    u public_key := public_key
  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 public_key := public_key
    u language := language
    u options := options
    u options := options
    u style_options := style_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
      var Str l := s readline
      if (l parse "right" (var Str id) (var Str auth) (var S
        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 (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


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
  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
      var Str l := s readline
      if (l parse "right" (var Str id) (var Str auth) (var S
        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 (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


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:abs
      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:language u:options u:style_options c)=failure
        status := failure "Failed to forward changes to serv


export login_record
export user_update user_change_password user_delete
        status := failure "Failed to forward changes to serv


export login_record
export user_update user_change_password user_delete