danwrong-evil 0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +1 -0
- data/LICENSE +22 -0
- data/Manifest +33 -7
- data/README.textile +20 -0
- data/Rakefile +21 -2
- data/assets/config.ru +10 -2
- data/assets/evil-lib.js +222 -0
- data/assets/evil.css +204 -10
- data/assets/evil.js +20 -0
- data/assets/logo.png +0 -0
- data/evil.gemspec +32 -19
- data/lib/evil/application.rb +85 -17
- data/lib/evil/extensions.rb +71 -0
- data/lib/evil/helpers.rb +62 -0
- data/lib/evil/models/config_pair.rb +7 -0
- data/lib/evil/models/template.rb +10 -9
- data/lib/evil/models.rb +0 -12
- data/lib/evil/open_id.rb +101 -0
- data/lib/evil/plugin/base.rb +56 -0
- data/lib/evil/plugin/configuration.rb +77 -0
- data/lib/evil/plugin/environment.rb +15 -0
- data/lib/evil/plugin/filesystem.rb +18 -0
- data/lib/evil/plugin/tag.rb +81 -0
- data/lib/evil/plugin.rb +21 -0
- data/lib/evil/setup/generator.rb +13 -1
- data/lib/evil/setup/migration.rb +4 -11
- data/lib/evil.rb +34 -1
- data/test/app/evil_test.rb +64 -0
- data/test/dev_env.rb +10 -0
- data/test/test_helper.rb +12 -0
- data/test/units/plugin/base_test.rb +47 -0
- data/test/units/plugin/tag_test.rb +108 -0
- data/views/_banner.haml +8 -0
- data/views/_errors.haml +9 -0
- data/views/index.haml +41 -0
- data/views/layout.haml +13 -0
- data/views/login.haml +5 -0
- data/views/plugins/_fields.haml +7 -0
- data/views/plugins/edit.haml +2 -0
- data/views/plugins/fields/_password.haml +3 -0
- data/views/plugins/fields/_text.haml +3 -0
- data/views/plugins/new.haml +6 -0
- data/views/templates/_fields.haml +23 -0
- data/views/templates/edit.haml +3 -0
- data/views/templates/new.haml +3 -0
- metadata +115 -13
- data/lib/evil/models/plugin.rb +0 -13
- data/test/harness/config.ru +0 -9
- data/test/harness/evil.db +0 -0
- data/test/harness/public/javascripts/evil.js +0 -0
- data/test/harness/public/stylesheets/evil.css +0 -24
- data/test/harness/tmp/restart.txt +0 -0
data/evil.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{evil}
|
5
|
-
s.version = "0.1"
|
5
|
+
s.version = "0.1.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Dan Webb"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-04-17}
|
10
10
|
s.default_executable = %q{evil}
|
11
11
|
s.description = %q{A simple framework for creating sites from 3rd party data and services}
|
12
12
|
s.email = %q{dan@danwebb.net}
|
13
13
|
s.executables = ["evil"]
|
14
|
-
s.extra_rdoc_files = ["bin/evil", "CHANGELOG", "lib/evil/application.rb", "lib/evil/
|
15
|
-
s.files = ["assets/config.ru", "assets/evil.css", "assets/evil.js", "bin/evil", "CHANGELOG", "lib/evil/application.rb", "lib/evil/
|
14
|
+
s.extra_rdoc_files = ["bin/evil", "CHANGELOG", "lib/evil/application.rb", "lib/evil/extensions.rb", "lib/evil/helpers.rb", "lib/evil/models/config_pair.rb", "lib/evil/models/template.rb", "lib/evil/models/whitelist.rb", "lib/evil/models.rb", "lib/evil/open_id.rb", "lib/evil/plugin/base.rb", "lib/evil/plugin/configuration.rb", "lib/evil/plugin/environment.rb", "lib/evil/plugin/filesystem.rb", "lib/evil/plugin/tag.rb", "lib/evil/plugin.rb", "lib/evil/setup/db_tool.rb", "lib/evil/setup/generator.rb", "lib/evil/setup/migration.rb", "lib/evil.rb", "LICENSE", "README.textile"]
|
15
|
+
s.files = ["assets/config.ru", "assets/evil-lib.js", "assets/evil.css", "assets/evil.js", "assets/logo.png", "bin/evil", "CHANGELOG", "evil.gemspec", "lib/evil/application.rb", "lib/evil/extensions.rb", "lib/evil/helpers.rb", "lib/evil/models/config_pair.rb", "lib/evil/models/template.rb", "lib/evil/models/whitelist.rb", "lib/evil/models.rb", "lib/evil/open_id.rb", "lib/evil/plugin/base.rb", "lib/evil/plugin/configuration.rb", "lib/evil/plugin/environment.rb", "lib/evil/plugin/filesystem.rb", "lib/evil/plugin/tag.rb", "lib/evil/plugin.rb", "lib/evil/setup/db_tool.rb", "lib/evil/setup/generator.rb", "lib/evil/setup/migration.rb", "lib/evil.rb", "LICENSE", "Manifest", "Rakefile", "README.textile", "test/app/evil_test.rb", "test/dev_env.rb", "test/test_helper.rb", "test/units/plugin/base_test.rb", "test/units/plugin/tag_test.rb", "views/_banner.haml", "views/_errors.haml", "views/index.haml", "views/layout.haml", "views/login.haml", "views/plugins/_fields.haml", "views/plugins/edit.haml", "views/plugins/fields/_password.haml", "views/plugins/fields/_text.haml", "views/plugins/new.haml", "views/templates/_fields.haml", "views/templates/edit.haml", "views/templates/new.haml"]
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.homepage = %q{http://www.evilmashups.com}
|
18
18
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Evil", "--main", "README.textile"]
|
@@ -20,29 +20,42 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.rubyforge_project = %q{evil}
|
21
21
|
s.rubygems_version = %q{1.3.1}
|
22
22
|
s.summary = %q{A simple framework for creating sites from 3rd party data and services}
|
23
|
+
s.test_files = ["test/app/evil_test.rb", "test/test_helper.rb", "test/units/plugin/base_test.rb", "test/units/plugin/tag_test.rb"]
|
23
24
|
|
24
25
|
if s.respond_to? :specification_version then
|
25
26
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
26
27
|
s.specification_version = 2
|
27
28
|
|
28
29
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
29
|
-
s.add_runtime_dependency(%q<sinatra>, [">= 0"])
|
30
|
-
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
31
|
-
s.add_runtime_dependency(%q<sqlite3-ruby>, [">= 0"])
|
32
|
-
s.add_runtime_dependency(%q<clip>, [">= 0"])
|
33
|
-
s.add_runtime_dependency(%q<haml>, [">= 0"])
|
30
|
+
s.add_runtime_dependency(%q<sinatra>, [">= 0", "= 0.9.1.1"])
|
31
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 0", "= 2.3.2"])
|
32
|
+
s.add_runtime_dependency(%q<sqlite3-ruby>, [">= 0", "= 1.2.1"])
|
33
|
+
s.add_runtime_dependency(%q<clip>, [">= 0", "= 1.0.0"])
|
34
|
+
s.add_runtime_dependency(%q<haml>, [">= 0", "= 2.0.9"])
|
35
|
+
s.add_runtime_dependency(%q<liquid>, [">= 0", "= 2.0.0"])
|
36
|
+
s.add_runtime_dependency(%q<danwrong-liquid-inheritance>, [">= 0", "= 0.1.1"])
|
37
|
+
s.add_runtime_dependency(%q<rack-cache>, [">= 0", "= 0.4"])
|
38
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
34
39
|
else
|
35
|
-
s.add_dependency(%q<sinatra>, [">= 0"])
|
36
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
37
|
-
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
38
|
-
s.add_dependency(%q<clip>, [">= 0"])
|
39
|
-
s.add_dependency(%q<haml>, [">= 0"])
|
40
|
+
s.add_dependency(%q<sinatra>, [">= 0", "= 0.9.1.1"])
|
41
|
+
s.add_dependency(%q<activerecord>, [">= 0", "= 2.3.2"])
|
42
|
+
s.add_dependency(%q<sqlite3-ruby>, [">= 0", "= 1.2.1"])
|
43
|
+
s.add_dependency(%q<clip>, [">= 0", "= 1.0.0"])
|
44
|
+
s.add_dependency(%q<haml>, [">= 0", "= 2.0.9"])
|
45
|
+
s.add_dependency(%q<liquid>, [">= 0", "= 2.0.0"])
|
46
|
+
s.add_dependency(%q<danwrong-liquid-inheritance>, [">= 0", "= 0.1.1"])
|
47
|
+
s.add_dependency(%q<rack-cache>, [">= 0", "= 0.4"])
|
48
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
40
49
|
end
|
41
50
|
else
|
42
|
-
s.add_dependency(%q<sinatra>, [">= 0"])
|
43
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
44
|
-
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
45
|
-
s.add_dependency(%q<clip>, [">= 0"])
|
46
|
-
s.add_dependency(%q<haml>, [">= 0"])
|
51
|
+
s.add_dependency(%q<sinatra>, [">= 0", "= 0.9.1.1"])
|
52
|
+
s.add_dependency(%q<activerecord>, [">= 0", "= 2.3.2"])
|
53
|
+
s.add_dependency(%q<sqlite3-ruby>, [">= 0", "= 1.2.1"])
|
54
|
+
s.add_dependency(%q<clip>, [">= 0", "= 1.0.0"])
|
55
|
+
s.add_dependency(%q<haml>, [">= 0", "= 2.0.9"])
|
56
|
+
s.add_dependency(%q<liquid>, [">= 0", "= 2.0.0"])
|
57
|
+
s.add_dependency(%q<danwrong-liquid-inheritance>, [">= 0", "= 0.1.1"])
|
58
|
+
s.add_dependency(%q<rack-cache>, [">= 0", "= 0.4"])
|
59
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
47
60
|
end
|
48
61
|
end
|
data/lib/evil/application.rb
CHANGED
@@ -1,21 +1,89 @@
|
|
1
|
-
require 'sinatra'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
require 'sinatra/base'
|
2
|
+
|
3
|
+
module Evil
|
4
|
+
class Application < Sinatra::Base
|
5
|
+
configure do
|
6
|
+
register(Evil::Extensions)
|
7
|
+
helpers(Evil::Helpers, Evil::OpenID::Helpers)
|
8
|
+
|
9
|
+
initialize_evil
|
10
|
+
end
|
11
|
+
|
12
|
+
require_whitelisted_openid(/^\/admin/)
|
13
|
+
load_template_routes
|
14
|
+
|
15
|
+
get '/admin/openid/login' do
|
16
|
+
attempt_openid_authentication do |identity_url|
|
17
|
+
session[:identity_url] = identity_url
|
18
|
+
redirect session[:destination_url]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
post '/admin/openid/logout' do
|
23
|
+
session[:identity_url] = nil
|
24
|
+
redirect '/admin'
|
25
|
+
end
|
26
|
+
|
27
|
+
get '/admin' do
|
28
|
+
@templates = Evil::Models::Template.in_order
|
29
|
+
@plugins = Evil::Models::ConfigPair.plugins
|
30
|
+
|
31
|
+
haml :index
|
32
|
+
end
|
33
|
+
|
34
|
+
get '/admin/templates/new' do
|
35
|
+
@template = Evil::Models::Template.new
|
14
36
|
|
15
|
-
|
37
|
+
haml :"templates/new"
|
38
|
+
end
|
16
39
|
|
17
|
-
|
18
|
-
|
19
|
-
|
40
|
+
post '/admin/templates' do
|
41
|
+
@template = Evil::Models::Template.new params[:template]
|
42
|
+
|
43
|
+
if @template.save
|
44
|
+
self.class.reload!
|
45
|
+
redirect '/admin'
|
46
|
+
else
|
47
|
+
haml :"templates/new"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
get '/admin/templates/:id' do
|
52
|
+
@template = Evil::Models::Template.find(params[:id]) rescue not_found
|
53
|
+
|
54
|
+
haml :"templates/edit"
|
55
|
+
end
|
56
|
+
|
57
|
+
post '/admin/templates/:id' do
|
58
|
+
@template = Evil::Models::Template.find(params[:id]) rescue not_found
|
59
|
+
|
60
|
+
@template.attributes = params[:template]
|
61
|
+
|
62
|
+
if @template.save
|
63
|
+
self.class.reload!
|
64
|
+
redirect '/admin'
|
65
|
+
else
|
66
|
+
haml :"templates/edit"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
get '/admin/plugins/new' do
|
71
|
+
haml :"plugins/new"
|
72
|
+
end
|
73
|
+
|
74
|
+
get '/admin/plugins/:id' do
|
75
|
+
@plugin = Evil::Plugin.find_plugin(params[:id]) rescue not_found
|
76
|
+
|
77
|
+
haml :"plugins/edit"
|
78
|
+
end
|
79
|
+
|
80
|
+
post '/admin/plugins/:id' do
|
81
|
+
@plugin = Evil::Plugin.find_plugin(params[:id]) rescue not_found
|
82
|
+
|
83
|
+
@plugin.config.set(params[:config])
|
84
|
+
|
85
|
+
redirect '/admin'
|
86
|
+
end
|
87
|
+
end
|
20
88
|
end
|
21
89
|
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'evil/models'
|
2
|
+
|
3
|
+
module Evil
|
4
|
+
module Extensions
|
5
|
+
|
6
|
+
def initialize_evil
|
7
|
+
set :public => File.join(Evil.app_root, 'public'),
|
8
|
+
:views => File.join(Evil.gem_root, 'views'),
|
9
|
+
:haml => { :format => :html5 },
|
10
|
+
:logging => true,
|
11
|
+
:static => true,
|
12
|
+
:dump_errors => true
|
13
|
+
|
14
|
+
Liquid::Template.file_system = Evil::Plugin::Filesystem.new
|
15
|
+
|
16
|
+
connect_to_database
|
17
|
+
load_all_plugins
|
18
|
+
end
|
19
|
+
|
20
|
+
def reload!
|
21
|
+
@reloading = true
|
22
|
+
reset!
|
23
|
+
Kernel.load 'evil/application.rb'
|
24
|
+
@reloading = false
|
25
|
+
end
|
26
|
+
|
27
|
+
def connect_to_database
|
28
|
+
if Evil.heroku?
|
29
|
+
dbconfig = YAML.load(File.read(File.join(Evil.app_root, 'config/database.yml')))
|
30
|
+
ActiveRecord::Base.establish_connection dbconfig['production']
|
31
|
+
else
|
32
|
+
ActiveRecord::Base.establish_connection :adapter => 'sqlite3',
|
33
|
+
:database => File.join(Evil.app_root, 'evil.db')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def load_template_routes
|
38
|
+
Evil::Models::Template.in_order.each do |template|
|
39
|
+
get(template.route, &proc_for(template)) unless template.route.nil? || template.route.empty?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_all_plugins
|
44
|
+
Dir[File.join(Evil.gem_root, 'lib', 'plugin/builtin', '*.rb')].each do |plugin|
|
45
|
+
Evil::Plugin.from_file(plugin)
|
46
|
+
end
|
47
|
+
|
48
|
+
Dir[File.join(Evil.app_root, 'plugins', '*.evil')].each do |plugin|
|
49
|
+
Evil::Plugin.from_file(plugin)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def require_whitelisted_openid(pattern)
|
54
|
+
before do
|
55
|
+
if request.path_info =~ pattern && !params[:openid_url]
|
56
|
+
unless whitelisted_openid?
|
57
|
+
session[:destination_url] = request.url
|
58
|
+
not_authorized
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
protected
|
65
|
+
|
66
|
+
def proc_for(template)
|
67
|
+
lambda { serve template }
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
data/lib/evil/helpers.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Evil
|
2
|
+
module Helpers
|
3
|
+
include Evil::Models
|
4
|
+
|
5
|
+
def serve(template)
|
6
|
+
initialize_plugins
|
7
|
+
|
8
|
+
liquid_template = Liquid::Template.parse(template.reload.source)
|
9
|
+
|
10
|
+
content_type(template.content_type || 'text/html', :charset => template.encoding || 'utf-8')
|
11
|
+
|
12
|
+
if template.ttl
|
13
|
+
headers 'Cache-Control' => "public, max-age=#{template.ttl}"
|
14
|
+
end
|
15
|
+
|
16
|
+
liquid_template.render 'params' => params
|
17
|
+
end
|
18
|
+
|
19
|
+
def partial(template, options={})
|
20
|
+
haml(partial_name(template), options.merge( :layout => false ))
|
21
|
+
end
|
22
|
+
|
23
|
+
def render_config_field(field)
|
24
|
+
partial("plugins/fields/#{field.type}", :locals => { :field => field })
|
25
|
+
end
|
26
|
+
|
27
|
+
def not_authorized(message=nil)
|
28
|
+
status 401
|
29
|
+
halt haml(:login)
|
30
|
+
end
|
31
|
+
|
32
|
+
def whitelisted_openid?
|
33
|
+
session[:identity_url] && Whitelist.authorize(session[:identity_url])
|
34
|
+
end
|
35
|
+
|
36
|
+
def attempt_openid_authentication
|
37
|
+
openid_authenticate do |result, identity_url|
|
38
|
+
if result == :successful
|
39
|
+
yield identity_url
|
40
|
+
else
|
41
|
+
not_authorized
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def urlencode(str)
|
47
|
+
URI.escape(str)
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
|
52
|
+
def initialize_plugins
|
53
|
+
Plugin::Environment.plugins.each { |p| p.init }
|
54
|
+
end
|
55
|
+
|
56
|
+
def partial_name(template_path)
|
57
|
+
parts = template_path.to_s.split('/')
|
58
|
+
parts[-1] = "_#{parts.last}"
|
59
|
+
parts.join('/').to_sym
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/evil/models/template.rb
CHANGED
@@ -5,21 +5,22 @@ module Evil
|
|
5
5
|
class Template < ActiveRecord::Base
|
6
6
|
set_table_name :evil_templates
|
7
7
|
|
8
|
-
validates_presence_of :
|
9
|
-
validates_uniqueness_of :route
|
10
|
-
validates_format_of :route, :with => /^((\/)|(((\/|\.):?[a-z0-9\_]+)+))
|
11
|
-
|
12
|
-
|
13
|
-
after_destroy :reload_template_routes
|
8
|
+
validates_presence_of :title, :source
|
9
|
+
validates_uniqueness_of :route, :if => lambda { |template| !(template.route.empty? || template.route.nil?) }
|
10
|
+
validates_format_of :route, :with => /^((\/)|(((\/|\.):?[a-z0-9\_]+)+))$/,
|
11
|
+
:allow_blank => true, :allow_nil => true
|
12
|
+
validate :liquid_syntax
|
14
13
|
|
15
14
|
has_many :cached_pages
|
16
15
|
|
17
16
|
named_scope :in_order, :order => 'position ASC'
|
18
17
|
|
19
|
-
|
18
|
+
private
|
20
19
|
|
21
|
-
def
|
22
|
-
|
20
|
+
def liquid_syntax
|
21
|
+
Liquid::Template.parse(source)
|
22
|
+
rescue Liquid::SyntaxError => error
|
23
|
+
errors.add(:source, "has syntax error: #{error.message}")
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
data/lib/evil/models.rb
CHANGED
@@ -1,17 +1,5 @@
|
|
1
1
|
require 'activerecord'
|
2
2
|
require 'evil/models/config_pair'
|
3
|
-
require 'evil/models/plugin'
|
4
3
|
require 'evil/models/template'
|
5
4
|
require 'evil/models/whitelist'
|
6
5
|
|
7
|
-
module Evil
|
8
|
-
module Models
|
9
|
-
|
10
|
-
def connect_to_database
|
11
|
-
ActiveRecord::Base.establish_connection :adapter => 'sqlite3',
|
12
|
-
:database => File.join(Evil.app_root, 'evil.db')
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
data/lib/evil/open_id.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'openid'
|
2
|
+
require 'openid/extensions/sreg'
|
3
|
+
require 'openid/store/memory'
|
4
|
+
|
5
|
+
module Evil
|
6
|
+
module OpenID
|
7
|
+
module Helpers
|
8
|
+
|
9
|
+
def openid_request?(open_id_param=params[:openid_url])
|
10
|
+
!!((open_id_param && !open_id_param.strip.empty?) || params[:openid_complete])
|
11
|
+
end
|
12
|
+
|
13
|
+
def openid_authenticate(options={}, &block)
|
14
|
+
open_id_param = options.delete(:open_id_param) || params[:openid_url]
|
15
|
+
|
16
|
+
unless params[:openid_complete]
|
17
|
+
begin_openid_authentication(open_id_param, options, &block)
|
18
|
+
else
|
19
|
+
complete_openid_authentication(&block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def openid_consumer
|
26
|
+
@@openid_consumer ||= ::OpenID::Consumer.new session, ::OpenID::Store::Memory.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def begin_openid_authentication(openid_url, options={})
|
30
|
+
fields = options[:sreg] || {}
|
31
|
+
immediate = (options[:immediate] === true)
|
32
|
+
|
33
|
+
request = openid_consumer.begin(openid_url)
|
34
|
+
|
35
|
+
add_sreg_fields(request, fields)
|
36
|
+
|
37
|
+
redirect openid_provider_url(request, immediate)
|
38
|
+
|
39
|
+
rescue ::OpenID::OpenIDError, Timeout::Error
|
40
|
+
yield :missing
|
41
|
+
end
|
42
|
+
|
43
|
+
def complete_openid_authentication
|
44
|
+
query_string_params = request.GET
|
45
|
+
|
46
|
+
begin
|
47
|
+
response = openid_consumer.complete(query_string_params, openid_return_to)
|
48
|
+
identity_url = response.endpoint.claimed_id
|
49
|
+
|
50
|
+
case response.status
|
51
|
+
when ::OpenID::Consumer::SUCCESS
|
52
|
+
yield :successful, identity_url, ::OpenID::SReg::Response.from_success_response(response)
|
53
|
+
when ::OpenID::Consumer::CANCEL
|
54
|
+
yield :cancelled, identity_url, nil
|
55
|
+
when ::OpenID::Consumer::FAILURE
|
56
|
+
yield :failed, identity_url, nil
|
57
|
+
when ::OpenID::Consumer::SETUP_NEEDED
|
58
|
+
# get around ruby openid 2.x bug
|
59
|
+
yield :setup_needed, identity_url, response.instance_variable_get(:@setup_url)
|
60
|
+
end
|
61
|
+
rescue Timeout::Error
|
62
|
+
yield :failed
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def add_sreg_fields(request, fields)
|
67
|
+
if fields.is_a?(Array)
|
68
|
+
required, optional = fields, []
|
69
|
+
else
|
70
|
+
required = fields[:required] || []
|
71
|
+
optional = fields[:optional] || []
|
72
|
+
end
|
73
|
+
|
74
|
+
sreg = ::OpenID::SReg::Request.new
|
75
|
+
|
76
|
+
sreg.request_fields(required.collect { |f| f.to_s }, true) unless required.empty?
|
77
|
+
sreg.request_fields(optional.collect { |f| f.to_s }, false) unless optional.empty?
|
78
|
+
|
79
|
+
request.add_extension(sreg)
|
80
|
+
end
|
81
|
+
|
82
|
+
def openid_provider_url(request, immediate)
|
83
|
+
request.return_to_args['openid_complete'] = '1'
|
84
|
+
request.redirect_url(openid_trust_root, openid_return_to, immediate)
|
85
|
+
end
|
86
|
+
|
87
|
+
def openid_trust_root
|
88
|
+
@openid_trust_root ||= [
|
89
|
+
request.scheme, '://',
|
90
|
+
request.host,
|
91
|
+
(":#{request.port}" if request.port), "/"
|
92
|
+
].compact.join
|
93
|
+
end
|
94
|
+
|
95
|
+
def openid_return_to
|
96
|
+
@openid_return_to ||= request.url
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Evil
|
2
|
+
module Plugin
|
3
|
+
class Base
|
4
|
+
attr_reader :name, :configurator
|
5
|
+
|
6
|
+
def initialize(name, &block)
|
7
|
+
@name = name
|
8
|
+
@configurator = Configuration::Configurator.new
|
9
|
+
block.call(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
def init
|
13
|
+
@setup_proc.call if @setup_proc
|
14
|
+
end
|
15
|
+
|
16
|
+
def description(desc=nil)
|
17
|
+
@description = desc if desc
|
18
|
+
@description
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup(&block)
|
22
|
+
@setup_proc = block
|
23
|
+
end
|
24
|
+
|
25
|
+
def tag(name, &block)
|
26
|
+
tag = Tag.from(&block)
|
27
|
+
Liquid::Template.register_tag(name, tag)
|
28
|
+
end
|
29
|
+
|
30
|
+
def filter(fname, &block)
|
31
|
+
mod = Module.new do
|
32
|
+
define_method(fname, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
mod.module_eval "def self.name; \"_filter_#{fname}\"; end"
|
36
|
+
|
37
|
+
Liquid::Template.register_filter(mod)
|
38
|
+
end
|
39
|
+
|
40
|
+
def http
|
41
|
+
@http ||= Module.new do
|
42
|
+
include HTTParty
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def configure
|
47
|
+
yield @configurator
|
48
|
+
end
|
49
|
+
|
50
|
+
def config
|
51
|
+
@config ||= Configuration::Config.new(self)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Evil
|
2
|
+
module Plugin
|
3
|
+
module Configuration
|
4
|
+
|
5
|
+
class ConfigField
|
6
|
+
|
7
|
+
attr_accessor :name, :type, :options
|
8
|
+
|
9
|
+
def initialize(type, name, options={})
|
10
|
+
@type, @name, @options = type, name, options
|
11
|
+
end
|
12
|
+
|
13
|
+
def label
|
14
|
+
options[:label] || name.to_s.capitalize
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
class Configurator
|
20
|
+
|
21
|
+
attr_reader :fields
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@fields = []
|
25
|
+
end
|
26
|
+
|
27
|
+
def text(field, options={})
|
28
|
+
@fields << ConfigField.new(:text, field, options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def password(field, options={})
|
32
|
+
@fields << ConfigField.new(:password, field, options)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
class Config
|
38
|
+
include Evil::Models
|
39
|
+
|
40
|
+
def initialize(plugin)
|
41
|
+
@plugin = plugin
|
42
|
+
|
43
|
+
load_config!
|
44
|
+
end
|
45
|
+
|
46
|
+
def [](val)
|
47
|
+
@values[val.to_sym]
|
48
|
+
end
|
49
|
+
|
50
|
+
def set(values)
|
51
|
+
values.each do |k, v|
|
52
|
+
c = ConfigPair.find_or_create_by_plugin_and_key(@plugin.name, k)
|
53
|
+
c.update_attribute :value, v
|
54
|
+
end if values
|
55
|
+
|
56
|
+
load_config!
|
57
|
+
end
|
58
|
+
|
59
|
+
protected
|
60
|
+
|
61
|
+
def load_config!
|
62
|
+
pairs = Evil::Models::ConfigPair.find_all_by_plugin(@plugin.name)
|
63
|
+
|
64
|
+
if pairs
|
65
|
+
@values = pairs.inject(Hash.new('')) do |m, pair|
|
66
|
+
m[pair.key.to_sym] = pair.value; m
|
67
|
+
end
|
68
|
+
else
|
69
|
+
@values = Hash.new('')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Evil
|
2
|
+
module Plugin
|
3
|
+
|
4
|
+
class Filesystem
|
5
|
+
|
6
|
+
def read_template_file(title)
|
7
|
+
if template = Evil::Models::Template.find_by_title(title)
|
8
|
+
template.source
|
9
|
+
else
|
10
|
+
raise FileSystemError, "No such template '#{title}'"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|