tdiary 4.1.1 → 4.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/ChangeLog +42 -0
- data/Gemfile +2 -11
- data/Gemfile.lock +64 -61
- data/README.md +4 -2
- data/doc/HOWTO-authenticate-in-rack.md +96 -8
- data/doc/HOWTO-testing-tDiary.md +1 -1
- data/doc/INSTALL-paas.md +19 -54
- data/doc/README.en.md +1 -1
- data/doc/README.md +1 -1
- data/js/comment_ajax.js +1 -1
- data/lib/tdiary/application/configuration.rb +5 -9
- data/lib/tdiary/application.rb +59 -36
- data/lib/tdiary/cli.rb +9 -3
- data/lib/tdiary/core_ext.rb +1 -1
- data/lib/tdiary/diary_container.rb +55 -0
- data/lib/tdiary/environment.rb +3 -0
- data/lib/tdiary/plugin/00default.rb +4 -3
- data/lib/tdiary/plugin/05referer.rb +9 -7
- data/lib/tdiary/plugin.rb +13 -2
- data/lib/tdiary/rack/auth/basic.rb +1 -1
- data/lib/tdiary/rack/auth/omniauth/authorization.rb +64 -0
- data/lib/tdiary/rack/auth/omniauth.rb +78 -46
- data/lib/tdiary/rack/auth.rb +20 -0
- data/lib/tdiary/rack/session.rb +35 -0
- data/lib/tdiary/rack.rb +2 -5
- data/lib/tdiary/style.rb +2 -1
- data/lib/tdiary/tasks/assets.rake +1 -1
- data/lib/tdiary/tasks/release.rake +18 -7
- data/lib/tdiary/version.rb +1 -1
- data/lib/tdiary.rb +1 -0
- data/misc/paas/heroku/Gemfile.local +8 -0
- data/misc/paas/heroku/app.json +19 -0
- data/misc/paas/heroku/config.ru +6 -0
- data/misc/paas/heroku/tasks/mongodb.rake +12 -0
- data/misc/paas/heroku/tdiary.conf +14 -14
- data/misc/plugin/amazon.rb +9 -1
- data/misc/plugin/category.rb +1 -19
- data/misc/plugin/category_autocomplete.rb +2 -2
- data/misc/plugin/comment_ajax.rb +2 -0
- data/misc/plugin/comment_emoji_autocomplete.rb +2 -2
- data/misc/plugin/comment_mail-smtp.rb +23 -8
- data/misc/plugin/makerss.rb +5 -1
- data/misc/plugin/recent_comment3.rb +1 -5
- data/misc/plugin/recent_list.rb +1 -5
- data/misc/plugin/theme_online.rb +8 -2
- data/spec/acceptance/save_conf_plugin_spec.rb +2 -2
- data/spec/core/application_spec.rb +65 -0
- data/spec/core/diary_container_spec.rb +71 -0
- data/spec/core/plugin_spec.rb +13 -0
- data/spec/fixtures/tdiary.conf.gem +2 -2
- data/spec/fixtures/tdiary.conf.rack +2 -2
- data/spec/fixtures/tdiary.conf.secure +2 -2
- data/spec/fixtures/tdiary.conf.webrick +2 -2
- data/spec/spec_helper.rb +5 -4
- metadata +15 -6
- data/lib/tdiary/application/extensions/omniauth.rb +0 -22
- data/misc/paas/heroku/Gemfile +0 -20
- data/misc/paas/heroku/Gemfile.lock +0 -74
data/lib/tdiary/application.rb
CHANGED
@@ -7,7 +7,7 @@ require 'tdiary/rack'
|
|
7
7
|
# FIXME too dirty hack :-<
|
8
8
|
class CGI
|
9
9
|
def env_table_rack
|
10
|
-
$RACK_ENV
|
10
|
+
$RACK_ENV || ENV
|
11
11
|
end
|
12
12
|
|
13
13
|
alias :env_table_orig :env_table
|
@@ -27,53 +27,76 @@ module TDiary
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def initialize( base_dir = '/' )
|
30
|
-
@app = ::Rack::Builder.app
|
30
|
+
@app = ::Rack::Builder.app do
|
31
31
|
map base_dir do
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
map Application.config.path[:index] do
|
33
|
+
use TDiary::Rack::HtmlAnchor
|
34
|
+
use TDiary::Rack::Static, "public"
|
35
|
+
use TDiary::Rack::ValidRequestPath
|
36
|
+
run TDiary::Dispatcher.index
|
35
37
|
end
|
38
|
+
|
39
|
+
map Application.config.path[:update] do
|
40
|
+
use TDiary::Rack::Auth
|
41
|
+
run TDiary::Dispatcher.update
|
42
|
+
end
|
43
|
+
|
44
|
+
map Application.config.path[:assets] do
|
45
|
+
environment = Sprockets::Environment.new
|
46
|
+
TDiary::Application.config.assets_paths.each {|assets_path|
|
47
|
+
environment.append_path assets_path
|
48
|
+
}
|
49
|
+
|
50
|
+
if Application.config.assets_precompile
|
51
|
+
require 'tdiary/rack/assets/precompile'
|
52
|
+
use TDiary::Rack::Assets::Precompile, environment
|
53
|
+
end
|
54
|
+
|
55
|
+
run environment
|
56
|
+
end
|
36
57
|
end
|
37
|
-
|
58
|
+
end
|
59
|
+
run_plugin_startup_procs
|
38
60
|
end
|
39
61
|
|
40
62
|
def call( env )
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
map Application.config.path[:index] do
|
48
|
-
use TDiary::Rack::HtmlAnchor
|
49
|
-
use TDiary::Rack::Static, "public"
|
50
|
-
use TDiary::Rack::ValidRequestPath
|
51
|
-
run TDiary::Dispatcher.index
|
63
|
+
begin
|
64
|
+
@app.call( env )
|
65
|
+
rescue Exception => e
|
66
|
+
body = ["#{e.class}: #{e}\n"]
|
67
|
+
body << e.backtrace.join("\n")
|
68
|
+
[500, {'Content-Type' => 'text/plain'}, body]
|
52
69
|
end
|
70
|
+
end
|
53
71
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
72
|
+
private
|
73
|
+
def run_plugin_startup_procs
|
74
|
+
# avoid offline mode at CGI.new
|
75
|
+
ARGV.replace([""])
|
76
|
+
cgi = RackCGI.new
|
58
77
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
}.flatten.uniq.each {|assets_path|
|
64
|
-
environment.append_path assets_path
|
65
|
-
}
|
78
|
+
request = TDiary::Request.new(ENV, cgi)
|
79
|
+
conf = TDiary::Configuration.new(cgi, request)
|
80
|
+
tdiary = TDiary::TDiaryBase.new(cgi, '', conf)
|
81
|
+
io = conf.io_class.new(tdiary)
|
66
82
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
83
|
+
plugin = TDiary::Plugin.new(
|
84
|
+
'conf' => conf,
|
85
|
+
'mode' => 'startup',
|
86
|
+
'diaries' => tdiary.diaries,
|
87
|
+
'cgi' => cgi,
|
88
|
+
'years' => nil,
|
89
|
+
'cache_path' => io.cache_path,
|
90
|
+
'date' => Time.now,
|
91
|
+
'comment' => nil,
|
92
|
+
'last_modified' => Time.now, # FIXME
|
93
|
+
'logger' => TDiary.logger,
|
94
|
+
# 'debug' => true
|
95
|
+
)
|
71
96
|
|
72
|
-
|
73
|
-
|
97
|
+
# run startup plugin
|
98
|
+
plugin.__send__(:startup_proc, self)
|
74
99
|
end
|
75
|
-
|
76
|
-
config.authenticate TDiary::Rack::Auth::Basic, '.htpasswd'
|
77
100
|
end
|
78
101
|
end
|
79
102
|
|
data/lib/tdiary/cli.rb
CHANGED
@@ -58,7 +58,7 @@ module TDiary
|
|
58
58
|
|
59
59
|
desc "assets_copy", "copy assets files"
|
60
60
|
def assets_copy
|
61
|
-
require 'tdiary
|
61
|
+
require 'tdiary'
|
62
62
|
assets_path = File.join(TDiary.server_root, 'public/assets')
|
63
63
|
TDiary::Application.config.assets_paths.each do |path|
|
64
64
|
Dir.glob(File.join(path, '*')).each do |entity|
|
@@ -96,7 +96,10 @@ module TDiary
|
|
96
96
|
"bind to the IP"
|
97
97
|
method_option "port", aliases: "p", type: :numeric, default: 19292, banner:
|
98
98
|
"use PORT"
|
99
|
+
method_option "log", aliases: "l", type: :string, banner:
|
100
|
+
"File to redirect output"
|
99
101
|
def server
|
102
|
+
require 'tdiary'
|
100
103
|
require 'tdiary/environment'
|
101
104
|
|
102
105
|
if options[:cgi]
|
@@ -105,12 +108,13 @@ module TDiary
|
|
105
108
|
:bind => options[:bind],
|
106
109
|
:port => options[:port],
|
107
110
|
:logger => $stderr,
|
108
|
-
:access_log => $stderr
|
111
|
+
:access_log => options[:log] ? File.open(options[:log], 'a') : $stderr
|
109
112
|
}
|
110
113
|
TDiary::Server.run( opts )
|
111
114
|
elsif
|
112
115
|
# --rack option
|
113
116
|
# Rack::Server reads ARGV as :config, so delete it
|
117
|
+
require 'webrick'
|
114
118
|
ARGV.shift
|
115
119
|
opts = {
|
116
120
|
:environment => ENV['RACK_ENV'] || "development",
|
@@ -118,9 +122,11 @@ module TDiary
|
|
118
122
|
:Host => options[:bind],
|
119
123
|
:Port => options[:port],
|
120
124
|
:pid => File.expand_path("tdiary.pid"),
|
121
|
-
:AccessLog => $stderr,
|
122
125
|
:config => File.expand_path("config.ru")
|
123
126
|
}
|
127
|
+
if options[:log]
|
128
|
+
opts[:AccessLog] = [[File.open(options[:log], 'a'), WEBrick::AccessLog::CLF]]
|
129
|
+
end
|
124
130
|
::Rack::Server.start( opts )
|
125
131
|
end
|
126
132
|
end
|
data/lib/tdiary/core_ext.rb
CHANGED
@@ -37,7 +37,7 @@ class String
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def emojify
|
40
|
-
self.gsub(/:([a-zA-Z0-9_+-]+):/) do |match|
|
40
|
+
self.to_str.gsub(/:([a-zA-Z0-9_+-]+):/) do |match|
|
41
41
|
emoji_alias = $1.downcase
|
42
42
|
emoji_url = %Q[<img src='http://www.emoji-cheat-sheet.com/graphics/emojis/%s.png' width='20' height='20' title='%s' alt='%s' class='emoji' />]
|
43
43
|
if emoji_alias == 'plus1' or emoji_alias == '+1'
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module TDiary
|
2
|
+
class DiaryContainer
|
3
|
+
# YYYYMMDD
|
4
|
+
def self.find_by_day(conf, date)
|
5
|
+
# date: YYYYMMDD
|
6
|
+
m = date.match(/^(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})$/)
|
7
|
+
raise ArgumentError.new("date must be YYYYMMDD format") unless m
|
8
|
+
new(conf, m[:year], m[:month], m[:day])
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.find_by_month(conf, date)
|
12
|
+
# date: YYYYMM
|
13
|
+
m = date.match(/^(?<year>\d{4})(?<month>\d{2})$/)
|
14
|
+
raise ArgumentError.new("date must be YYYYMM format") unless m
|
15
|
+
new(conf, m[:year], m[:month])
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(conf, year, month, day = nil)
|
19
|
+
cgi = FakeCGI.new
|
20
|
+
if year && month && day
|
21
|
+
cgi.params['date'] = ["#{year}#{month}#{day}"]
|
22
|
+
@controller = TDiaryDayWithoutFilter::new(cgi, '', conf)
|
23
|
+
elsif year && month
|
24
|
+
cgi.params['date'] = ["#{year}#{month}"]
|
25
|
+
@controller = TDiaryMonthWithoutFilter::new(cgi, '', conf)
|
26
|
+
else
|
27
|
+
raise StandardError.new
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def conf
|
32
|
+
@controller.conf
|
33
|
+
end
|
34
|
+
|
35
|
+
def diaries
|
36
|
+
# Hash of 'YYYYMMDD' => TDiary::Style::WikiDiary
|
37
|
+
@controller.diaries
|
38
|
+
end
|
39
|
+
|
40
|
+
class FakeCGI < CGI
|
41
|
+
def refeter; nil end
|
42
|
+
def user_agent; nil; end
|
43
|
+
def mobile_agent?; nil; end
|
44
|
+
def request_method; 'GET'; end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Local Variables:
|
50
|
+
# mode: ruby
|
51
|
+
# indent-tabs-mode: t
|
52
|
+
# tab-width: 3
|
53
|
+
# ruby-indent-level: 3
|
54
|
+
# End:
|
55
|
+
# vim: ts=3
|
data/lib/tdiary/environment.rb
CHANGED
@@ -9,6 +9,9 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __FILE__)
|
|
9
9
|
|
10
10
|
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
11
11
|
|
12
|
+
# FIXME: workaround fix for tainted path from Gemfile.local
|
13
|
+
$LOAD_PATH.each{|lp| $LOAD_PATH << $LOAD_PATH.shift.dup.untaint}
|
14
|
+
|
12
15
|
if defined?(Bundler)
|
13
16
|
env = [:default]
|
14
17
|
env << :development if ENV['RACK_ENV'].nil? || ENV['RACK_ENV'].empty?
|
@@ -342,12 +342,13 @@ def default_ogp
|
|
342
342
|
uri = @conf.index.dup
|
343
343
|
uri[0, 0] = base_url if %r|^https?://|i !~ @conf.index
|
344
344
|
uri.gsub!( %r|/\./|, '/' )
|
345
|
+
image = File.join(uri, "#{theme_url}/ogimage.png")
|
345
346
|
if @mode == 'day' then
|
346
347
|
uri += anchor( @date.strftime( '%Y%m%d' ) )
|
347
348
|
end
|
348
349
|
%Q[<meta content="#{title_tag.gsub(/<[^>]*>/, "")}" property="og:title">
|
349
350
|
<meta content="#{(@mode == 'day') ? 'article' : 'website'}" property="og:type">
|
350
|
-
<meta content="#{h
|
351
|
+
<meta content="#{h image}" property="og:image">
|
351
352
|
<meta content="#{h uri}" property="og:url">]
|
352
353
|
end
|
353
354
|
end
|
@@ -383,7 +384,7 @@ def script_tag
|
|
383
384
|
require 'uri'
|
384
385
|
query = script_tag_query_string
|
385
386
|
html = @javascripts.sort.map {|script|
|
386
|
-
if URI(script).scheme
|
387
|
+
if URI(script).scheme or script =~ %r|\A//|
|
387
388
|
%Q|<script src="#{script}" type="text/javascript"></script>|
|
388
389
|
else
|
389
390
|
%Q|<script src="#{js_url}/#{script}#{query}" type="text/javascript"></script>|
|
@@ -1001,7 +1002,7 @@ end
|
|
1001
1002
|
# old ruby alert
|
1002
1003
|
#
|
1003
1004
|
def old_ruby_alert
|
1004
|
-
if RUBY_VERSION < '
|
1005
|
+
if RUBY_VERSION < '2.0.0' and !@conf['old_ruby_alert.hide']
|
1005
1006
|
%Q|<div class="alert-warn">
|
1006
1007
|
<a href="#" class="action-button" id="alert-old-ruby">×</a>
|
1007
1008
|
#{old_ruby_alert_message}
|
@@ -117,13 +117,15 @@ def referer_update( diary )
|
|
117
117
|
end
|
118
118
|
|
119
119
|
when 'day'
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
120
|
+
if diary
|
121
|
+
referer_load_current( diary )
|
122
|
+
referer_save_current( diary, @cgi.referer )
|
123
|
+
if latest_day?( diary ) then
|
124
|
+
referer_load_volatile( @referer_volatile )
|
125
|
+
elsif @cgi.referer
|
126
|
+
referer_load_volatile( @referer_volatile )
|
127
|
+
referer_save_volatile( @referer_volatile, @cgi.referer )
|
128
|
+
end
|
127
129
|
end
|
128
130
|
|
129
131
|
when "edit"
|
data/lib/tdiary/plugin.rb
CHANGED
@@ -31,6 +31,7 @@ module TDiary
|
|
31
31
|
@conf_procs = {}
|
32
32
|
@conf_genre_label = {}
|
33
33
|
@content_procs = {}
|
34
|
+
@startup_procs = []
|
34
35
|
@cookies = []
|
35
36
|
@javascripts = []
|
36
37
|
@javascript_setting = []
|
@@ -337,6 +338,16 @@ module TDiary
|
|
337
338
|
@content_procs[key].call( date )
|
338
339
|
end
|
339
340
|
|
341
|
+
def add_startup_proc( block = Proc::new )
|
342
|
+
@startup_procs << block
|
343
|
+
end
|
344
|
+
|
345
|
+
def startup_proc( app )
|
346
|
+
@startup_procs.each do |proc|
|
347
|
+
proc.call( app )
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
340
351
|
def remove_tag( str )
|
341
352
|
str.gsub( /<[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$)/, '' )
|
342
353
|
end
|
@@ -344,8 +355,8 @@ module TDiary
|
|
344
355
|
def apply_plugin( str, remove_tag = false )
|
345
356
|
return '' unless str
|
346
357
|
r = str.dup
|
347
|
-
if @conf.options['apply_plugin'] and
|
348
|
-
r =
|
358
|
+
if @conf.options['apply_plugin'] and r.index( '<%' ) then
|
359
|
+
r = r.untaint if $SAFE < 3
|
349
360
|
Safe::safe( @conf.secure ? 4 : 1 ) do
|
350
361
|
begin
|
351
362
|
r = ERB::new( r ).result( binding )
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'omniauth'
|
2
|
+
|
3
|
+
module TDiary
|
4
|
+
module Rack
|
5
|
+
class Auth
|
6
|
+
class OmniAuth
|
7
|
+
class Authorization
|
8
|
+
def initialize(app, provider, &block)
|
9
|
+
@app = app
|
10
|
+
@provider = provider
|
11
|
+
@authz = block
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
if not authenticate?(env)
|
16
|
+
# phase 1: request phase
|
17
|
+
login(env)
|
18
|
+
elsif env['REQUEST_PATH'].match(%r|auth/#{@provider}/callback|)
|
19
|
+
# phase 2: callback phase
|
20
|
+
callback(env)
|
21
|
+
else
|
22
|
+
# phase 3: authorization phase
|
23
|
+
auth = env['rack.session']['auth']
|
24
|
+
env['REMOTE_USER'] = "#{auth.uid}@#{auth.provider}"
|
25
|
+
return forbidden unless @authz.call(auth)
|
26
|
+
@app.call(env)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def login(env)
|
31
|
+
STDERR.puts "use #{@provider} authentication strategy"
|
32
|
+
req = ::Rack::Request.new(env)
|
33
|
+
env['rack.session']['tdiary.auth.redirect'] = "#{req.base_url}#{req.fullpath}"
|
34
|
+
redirect = File.join("#{req.base_url}#{req.path}", "#{::OmniAuth.config.path_prefix}/#{@provider}")
|
35
|
+
[302, {'Content-Type' => 'text/plain', 'Location' => redirect}, []]
|
36
|
+
end
|
37
|
+
|
38
|
+
def logout(env)
|
39
|
+
env['rack.session']['user_id'] = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def forbidden
|
43
|
+
[403, {'Content-Type' => 'text/plain'}, ['forbidden']]
|
44
|
+
end
|
45
|
+
|
46
|
+
def callback(env)
|
47
|
+
# reset sesstion to prevend session fixation attack
|
48
|
+
# see: http://www.ipa.go.jp/security/vuln/documents/website_security.pdf (section 1.4)
|
49
|
+
env['rack.session.options'][:renew] = true
|
50
|
+
auth = env['omniauth.auth']
|
51
|
+
env['rack.session']['auth'] = auth
|
52
|
+
env['REMOTE_USER'] = "#{auth.uid}@#{auth.provider}"
|
53
|
+
redirect = env['rack.session']['tdiary.auth.redirect'] || '/'
|
54
|
+
[302, {'Content-Type' => 'text/plain', 'Location' => redirect}, []]
|
55
|
+
end
|
56
|
+
|
57
|
+
def authenticate?(env)
|
58
|
+
env['omniauth.auth'] || env['rack.session']['auth']
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,51 +1,83 @@
|
|
1
1
|
require 'omniauth'
|
2
|
+
require 'tdiary/rack/auth/omniauth/authorization'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
4
|
+
class TDiary::Rack::Auth::OmniAuth
|
5
|
+
class NoStrategyFoundError < StandardError; end
|
6
|
+
@provider_procs = {}
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_reader :provider_procs
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.add_provider(name, &block)
|
13
|
+
@provider_procs[name] = block
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(app)
|
17
|
+
provider = enabled_providers.first
|
18
|
+
unless provider
|
19
|
+
raise NoStrategyFoundError.new("Not found any strategies. Write the omniauth strategy in your Gemfile.local.")
|
20
|
+
end
|
21
|
+
|
22
|
+
@builder = ::Rack::Builder.new(app) {
|
23
|
+
use TDiary::Rack::Session
|
24
|
+
}
|
25
|
+
@builder.instance_eval(&self.class.provider_procs[provider])
|
26
|
+
end
|
27
|
+
|
28
|
+
def call(env)
|
29
|
+
@builder.call(env)
|
30
|
+
end
|
31
|
+
|
32
|
+
add_provider(:Twitter) do
|
33
|
+
# https://apps.twitter.com/
|
34
|
+
# https://github.com/arunagw/omniauth-twitter
|
35
|
+
use ::OmniAuth::Builder do
|
36
|
+
provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
|
37
|
+
end
|
38
|
+
use TDiary::Rack::Auth::OmniAuth::Authorization, :twitter do |auth|
|
39
|
+
ENV['TWITTER_NAME'].split(/,/).include?(auth.info.nickname)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
add_provider(:Facebook) do
|
44
|
+
# https://developers.facebook.com/apps/
|
45
|
+
# https://github.com/mkdynamic/omniauth-facebook
|
46
|
+
use ::OmniAuth::Builder do
|
47
|
+
provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
|
48
|
+
end
|
49
|
+
use TDiary::Rack::Auth::OmniAuth::Authorization, :facebook do |auth|
|
50
|
+
ENV['FACEBOOK_EMAIL'].split(/,/).include?(auth.info.email)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
add_provider(:GitHub) do
|
55
|
+
# https://github.com/settings/applications
|
56
|
+
# https://github.com/intridea/omniauth-github
|
57
|
+
use ::OmniAuth::Builder do
|
58
|
+
provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET']
|
59
|
+
end
|
60
|
+
use TDiary::Rack::Auth::OmniAuth::Authorization, :github do |auth|
|
61
|
+
ENV['GITHUB_NAME'].split(/,/).include?(auth.info.nickname)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
add_provider(:GoogleOauth2) do
|
66
|
+
# https://code.google.com/apis/console/
|
67
|
+
# https://github.com/zquestz/omniauth-google-oauth2
|
68
|
+
use ::OmniAuth::Builder do
|
69
|
+
provider :google_oauth2, ENV["GOOGLE_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"]
|
70
|
+
end
|
71
|
+
use TDiary::Rack::Auth::OmniAuth::Authorization, :google_oauth2 do |auth|
|
72
|
+
ENV['GOOGLE_EMAIL'].split(/,/).include?(auth.info.email)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def enabled_providers
|
79
|
+
::OmniAuth::Strategies.constants.select do |name|
|
80
|
+
self.class.provider_procs.has_key?(name)
|
49
81
|
end
|
50
82
|
end
|
51
83
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module TDiary
|
2
|
+
module Rack
|
3
|
+
class Auth
|
4
|
+
autoload :Basic, 'tdiary/rack/auth/basic'
|
5
|
+
autoload :OmniAuth, 'tdiary/rack/auth/omniauth'
|
6
|
+
|
7
|
+
def initialize(app)
|
8
|
+
if defined? ::OmniAuth
|
9
|
+
@app = TDiary::Rack::Auth::OmniAuth.new(app)
|
10
|
+
else
|
11
|
+
@app = TDiary::Rack::Auth::Basic.new(app, '.htpasswd')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
@app.call(env)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
begin
|
2
|
+
require 'rack/session/dalli'
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
|
6
|
+
module TDiary
|
7
|
+
module Rack
|
8
|
+
class Session
|
9
|
+
def initialize(app)
|
10
|
+
@app = session_middleware(app)
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def session_middleware(app)
|
20
|
+
if ::Rack::Session.const_defined? :Dalli
|
21
|
+
::Rack::Session::Dalli.new(
|
22
|
+
app,
|
23
|
+
cache: Dalli::Client.new,
|
24
|
+
expire_after: 2592000
|
25
|
+
)
|
26
|
+
else
|
27
|
+
::Rack::Session::Pool.new(
|
28
|
+
app,
|
29
|
+
expire_after: 2592000
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/tdiary/rack.rb
CHANGED
@@ -4,16 +4,13 @@ module TDiary
|
|
4
4
|
module Rack
|
5
5
|
autoload :HtmlAnchor, 'tdiary/rack/html_anchor'
|
6
6
|
autoload :ValidRequestPath, 'tdiary/rack/valid_request_path'
|
7
|
+
autoload :Session, 'tdiary/rack/session'
|
7
8
|
autoload :Static, 'tdiary/rack/static'
|
9
|
+
autoload :Auth, 'tdiary/rack/auth'
|
8
10
|
|
9
11
|
module Assets
|
10
12
|
autoload :Precompile, 'tdiary/rack/assets/precompile'
|
11
13
|
end
|
12
|
-
|
13
|
-
module Auth
|
14
|
-
autoload :Basic, 'tdiary/rack/auth/basic'
|
15
|
-
autoload :OmniAuth, 'tdiary/rack/auth/omniauth'
|
16
|
-
end
|
17
14
|
end
|
18
15
|
end
|
19
16
|
|
data/lib/tdiary/style.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'tdiary/comment_manager'
|
4
4
|
require 'tdiary/referer_manager'
|
5
|
+
require 'erb'
|
5
6
|
|
6
7
|
module TDiary
|
7
8
|
module Style
|
@@ -46,7 +47,7 @@ module TDiary
|
|
46
47
|
end
|
47
48
|
|
48
49
|
module BaseDiary
|
49
|
-
include ERB::Util
|
50
|
+
include ::ERB::Util
|
50
51
|
include CommentManager
|
51
52
|
include RefererManager
|
52
53
|
|
@@ -13,7 +13,7 @@ namespace :assets do
|
|
13
13
|
desc "copy assets files"
|
14
14
|
task :copy do
|
15
15
|
require 'fileutils'
|
16
|
-
assets_path = File.dirname(__FILE__) + '
|
16
|
+
assets_path = File.dirname(__FILE__) + '/../../../public/assets'
|
17
17
|
|
18
18
|
FileUtils.mkdir_p assets_path
|
19
19
|
FileList['{js,theme}/*'].each do |file|
|