# $Id: ext_member.rb,v 1.12 2004/04/22 14:47:49 eto Exp $
# Copyright (C) 2003-2004 Kouichirou Eto, All rights reserved.
# This is free software with ABSOLUTELY NO WARRANTY.
# You can redistribute it and/or modify it under the terms of the GNU GPL2.

require 'qwik/ext_wikidb'
require 'qwik/ext_form'

module Qwik
  class Site
    def member()
      @member = SiteMember.new(@config, self) if @member.nil?
      @member
    end
  end

  class SiteMember
    def initialize(config, site)
      @config = config
      @site = site
      @quickml_member = ',members'
      @key = @config.sitemember
    end

    def exist?(user)
      return true if exist_qwik_members?(user)
      return true if exist_quickml_members?(user)
      false
    end

    def exist_qwik_members?(user)
      page = @site[@key]
      return false if page.nil?
      page.wikidb.exist?(user)
    end

    def exist_quickml_members?(user) # QuickML compatible
      file = @site.dir.path+@quickml_member
      return false unless file.exist?
      file.open('rb'){|f|
	while line = f.gets
	  next if line =~ /^#/
	  next if line =~ /^;/
	  u, p = line.chomp.split
	  return true if u && u == user
	end
      }
      false
    end

    def add(user)
      invite(user, nil)
    end

    def invite(user, invite)
      page = @site[@key]
      page = @site.create(@key) if page.nil?
      page.wikidb.add(user, invite)
    end

    def remove(user)
      page = @site[@key]
      page.wikidb.remove(user) if page
    end

    def nulist()
      page = @site[@key]
      if page
	page.wikidb.exist?(user)
      end
    end
  end

  class PasswordGenerator
    def initialize(config)
      @config = config
      @pass = ""
      file = @config.pass_file.path
      if file.exist?
	@pass = file.open('rb'){|f| f.gets }.chomp
      end
    end

    def generate(user, generation=0)
      (user.to_s+':'+@pass+':'+generation.to_s).md5hex.upcase[0, 8]
    end
  end

  class PasswordMailGenerator
    def initialize(config, site)
      @config, @site = config, site
    end

    def generate(user, generation=0)
      user = user.to_s
      domainurl = @site.domainurl()
      siteurl = @site.url()
      gen = PasswordGenerator.new(@config)
      password = gen.generate(user, generation)

      mail = Mail.new
      mail.from = @site.ml
      mail.to = user
      mail.subject = domainurl+" におけるパスワード"
      mail.content = <<EOM
#{domainurl} におけるユーザー名とパスワードは、下記の通りです。

ユーザー名:	#{user}
パスワード:	#{password}

#{siteurl} に再度アクセスしてみてください。
EOM
      return mail
    end
  end

  class Plugin
    def member_add
      tomail = @req.query['tomail']
#      qp tomail
      return member_add_go if tomail
      member_add_form
    end

    def member_add_form(dest="")
#新規メンバーを追加します。
      form(dest){
"|あなたのメール|{{member_user(mail)}}|
|追加メール|{{input(tomail,,must)}}|
|追加したい人のメールアドレスを入力してください。|
||{{submit( 追加 )}}|"}
    end

    def member_add_go
      tomail = @req.query['tomail']
      goback = "\n:メール:#{tomail}\nブラウザの「戻るボタン」で入力画面に戻り、もう一度入力を確認してください。\n"

      if !tomail || !MailAddress.new(tomail).valid?
	return "** メンバーは追加されませんでした。#{goback}".w.res
      end

      if @site.member.exist?(tomail)
	return "** メンバーはすでに追加されているようです。#{goback}".w.res
      end

      result = @site.member.invite(tomail, @req.user)

      if !@site.member.exist?(tomail)
	return "** メンバー追加エラー\nシステム管理者にご連絡下さい。".w.res
      end

      return "** メンバーは追加されました。\n:メール:#{tomail}\n".w.res
    end

    def member_user(arg=nil)
      @req.user
    end
  end
end
