# auth_hatena.rb $Revision: 1 $
# Copyright (C) 2006 Michitaka Ohno <elpeo@mars.dti.ne.jp>
# You can redistribute it and/or modify it under GPL2.

require 'hiki/auth/hatena-auth'
require 'hiki/session'

@conf['hatena.api_key'] ||= ''
@conf['hatena.secret_key'] ||= ''

def auth?
	return true if @user && !@conf.password.empty?
	return true if @conf['hatena.api_key'].empty?
	session_id = @cgi.cookies['auth_hatena_session_id'][0]
	session_id && Session::new( @conf, session_id ).check
end

def auth_user
	session_id = @cgi.cookies['auth_hatena_session_id'][0]
	session = Session::new( @conf, session_id ) if session_id
	session && session.check && session.user
end

def auth_hatena
	ha = HatenaAuth.new( @conf['hatena.api_key'], @conf['hatena.secret_key'] )
	session_id = @cgi.cookies['auth_hatena_session_id'][0]
	session = Session::new(@conf, session_id) if session_id
	type = @cgi.params['type'][0]
	if type == 'logout' then
		session.delete if session
		redirect(@cgi, ha.get_logout_url )
	else
		cert = @cgi.params['cert'][0]
		user = ha.get_user( cert )
		if user then
			session = Session::new( @conf )
			session.user = user['name']
			session.save
    		self.cookies << CGI::Cookie.new( 'auth_hatena_session_id', session.session_id )
		else
			session.delete if session
		end
  		page =  @cgi.params['p'][0] || 'FrontPage'
		redirect(@cgi, "#{@conf.cgi_name}?#{CGI::escape( page )}", self.cookies )
	end
end


def login_url
	ha = HatenaAuth.new( @conf['hatena.api_key'], @conf['hatena.secret_key'] )
	ha.get_login_url
end

def logout_url
	"#{@conf.cgi_name}?c=plugin;plugin=auth_hatena;type=logout"
end

add_body_enter_proc do
	if !auth?
		<<-HTML
		<div class="hello">
		はてなアカウントで<a href="#{login_url}">ログイン</a>
		</div>
		HTML
	elsif user = auth_user
    	@user = user
		<<-HTML
		<div class="hello">
		こんにちは、#{@user.escapeHTML}さん（<a href="#{logout_url}">ログアウト</a>）
		</div>
		HTML
	end
end

add_conf_proc( 'auth_hatena', 'はてな認証' ) do
	if @mode == 'saveconf' then
		@conf['hatena.api_key'] = @cgi.params['hatena.api_key'][0]
		@conf['hatena.secret_key'] = @cgi.params['hatena.secret_key'][0]
	end
	<<-HTML
	<h3 class="subtitle">API キー</h3>
	<p>API キーを指定します。API キーは、<a href="http://auth.hatena.ne.jp/">はてな認証APIのページ</a>で取得できます。</p>
	<p><input name="hatena.api_key" size="50" value="#{CGI::escapeHTML(@conf['hatena.api_key'])}"></p>
	<h3 class="subtitle">秘密鍵</h3>
	<p>秘密鍵を指定します。秘密鍵は、<a href="http://auth.hatena.ne.jp/">はてな認証APIのページ</a>で取得できます。</p>
	<p><input name="hatena.secret_key" size="50" value="#{CGI::escapeHTML(@conf['hatena.secret_key'])}"></p>
	HTML
end
