Patch title: Release 90 bulk changes
Abstract:
File: /protocol/smtp/mail.pli
Key:
    Removed line
    Added line
submodule "/pliant/appli/database.pli"
module "/pliant/fullpliant/this_computer.pli"

public

type MailBox
  field Str name
  field Str abstract
  field Str computer
  field Str auto_answer
  field Str path
  field Bool archive <- true
  field Str smtp_ip
  field Char pop3_level <- "0" # 0 no, 1 tigger, 2 read, 3 read and remove
  field Str pop3_ip
  field Str pop3_password_md5
  field Str relay_computer
  field Bool relay_archive <- false
  field Bool list <- false
  field Set:Str subscriber
  field Bool check_ip <- true
  field Bool check_from <- true
  field Bool check_to <- true
  field Set:Void accept_from # receiving will be allowed, even with a missing 'to' if 'from' is one of these

type MailRedirect
  field Str pop3_server
  field Str user
  field Str smtp_server
  field Str mailbox
  field Str error

type MailDatabase
  field Set:MailBox box
  field Set:Void black_dns # black list domains
  field Set:Void black_ip # blacklisted SMTP servers IPs
  field Set:Void black_name # blacklisted SMTP servers names
  field Set:Void black_from # blacklisted boxes or domains
  field Set:Void magic_ip # always allowed SMTP servers IPs
  field Set:Void magic_name # always allowed SMTP servers names
  field Set:Void magic_from # allways allowed boxes or domains
  field Set:MailRedirect redirect

type MailBoxSecret
  field Str pop3_password_md5

type MailSecretDatabase
  field Set:MailBoxSecret box

(gvar Database:MailDatabase mail_database) load "security:/mail.pdb" log "security:/mail.log" mount "/pliant/mail"
gvar (Data Set:MailBox) mailbox :> mail_database:data:box
(gvar Database:MailSecretDatabase mail_secret_database) load "security:/mail_secret.pdb"

function migrate
  each b mailbox
    if b:pop3_password_md5<>""
      if not exists:(mail_secret_database:data:box keyof:b)
        mail_secret_database:data:box create keyof:b
      mail_secret_database:data:box:(keyof b) pop3_password_md5 := b pop3_password_md5
      b pop3_password_md5 := ""
migrate

method mb smart_path area -> p
  arg Data:MailBox mb ; arg Str area ; arg Str p
  if mb:path<>""
    p := mb:path+area+"/"
  else
    if not (keyof:mb parse any:(var Str id) "@" any:(var Str domain))
      id := keyof mb ; domain := "unknown"
    p := this_computer:env:"pliant":"mail":"path"
    if p=""
      p := "data:/pliant/mail/"
    p += domain+"/"+id+"/"+(shunt area<>"" area+"/" "")

method mb in_path -> p
  arg Data:MailBox mb ; arg Str p
  p := mb smart_path "in"

method mb unknown_path -> p
  arg Data:MailBox mb ; arg Str p
  p := mb smart_path "unknown"

method mb spam_path -> p
  arg Data:MailBox mb ; arg Str p
  p := mb smart_path "spam"

method mb out_path -> p
  arg Data:MailBox mb ; arg Str p
  p := mb smart_path "out"

method mb archive_path -> p
  arg Data:MailBox mb ; arg Str p
  p := mb smart_path "archive"

method mb area_path -> p
  arg Data:MailBox mb ; arg Str p
  p := mb smart_path "area"

method mb relay_path -> p
  arg Data:MailBox mb ; arg Str p
  p := mb smart_path "out"