Pistos-ramaze 2008.09 → 2008.12
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/benchmark/run.rb +1 -1
- data/examples/app/blog/spec/blog.rb +2 -2
- data/examples/app/rapaste/spec/rapaste.rb +1 -1
- data/examples/app/rapaste/start.rb +2 -2
- data/examples/app/rapaste/view/view.xhtml +3 -0
- data/examples/app/todolist/spec/todolist.rb +1 -1
- data/examples/app/whywiki/spec/whywiki.rb +1 -1
- data/examples/app/wikore/spec/wikore.rb +1 -1
- data/examples/app/wikore/src/model.rb +1 -1
- data/examples/app/wiktacular/spec/wiktacular.rb +1 -1
- data/examples/app/wiktacular/src/model.rb +1 -1
- data/examples/basic/partial.rb +28 -0
- data/examples/helpers/httpdigest.rb +68 -10
- data/examples/misc/ramaise.rb +2 -2
- data/examples/templates/template_amrita2.rb +1 -1
- data/examples/templates/template_erubis.rb +1 -1
- data/examples/templates/template_ezamar.rb +1 -1
- data/examples/templates/template_haml.rb +2 -2
- data/examples/templates/template_liquid.rb +1 -1
- data/examples/templates/template_markaby.rb +2 -2
- data/examples/templates/template_nagoro.rb +1 -1
- data/examples/templates/template_redcloth.rb +1 -1
- data/examples/templates/template_remarkably.rb +2 -2
- data/examples/templates/template_tenjin.rb +1 -1
- data/examples/templates/template_xslt.rb +1 -1
- data/lib/proto/controller/init.rb +2 -1
- data/lib/proto/model/init.rb +3 -3
- data/lib/proto/public/dispatch.fcgi +2 -2
- data/lib/proto/spec/main.rb +3 -3
- data/lib/proto/start.rb +4 -0
- data/lib/ramaze/action/render.rb +6 -5
- data/lib/ramaze/action.rb +7 -1
- data/lib/ramaze/cache/file.rb +71 -0
- data/lib/ramaze/cache.rb +1 -0
- data/lib/ramaze/contrib/email.rb +2 -0
- data/lib/ramaze/contrib/facebook.rb +2 -2
- data/lib/ramaze/contrib/file_cache.rb +2 -64
- data/lib/ramaze/contrib/sequel/image.rb +1 -1
- data/lib/ramaze/contrib.rb +1 -1
- data/lib/ramaze/controller/resolve.rb +8 -3
- data/lib/ramaze/controller.rb +9 -1
- data/lib/ramaze/current/request.rb +85 -68
- data/lib/ramaze/current/session/hash.rb +7 -11
- data/lib/ramaze/current/session.rb +3 -5
- data/lib/ramaze/dispatcher/action.rb +2 -0
- data/lib/ramaze/dispatcher/file.rb +6 -1
- data/lib/ramaze/helper/aspect.rb +2 -2
- data/lib/ramaze/helper/form.rb +5 -2
- data/lib/ramaze/helper/formatting.rb +4 -0
- data/lib/ramaze/helper/gravatar.rb +18 -1
- data/lib/ramaze/helper/httpdigest.rb +57 -28
- data/lib/ramaze/helper/maruku.rb +2 -0
- data/lib/ramaze/helper/paginate.rb +2 -3
- data/lib/ramaze/helper/partial.rb +1 -1
- data/lib/ramaze/helper/redirect.rb +22 -4
- data/lib/ramaze/helper/user.rb +4 -4
- data/lib/ramaze/helper.rb +12 -4
- data/lib/ramaze/log/rotatinginformer.rb +168 -0
- data/lib/ramaze/option/holder.rb +3 -3
- data/lib/ramaze/option.rb +1 -1
- data/lib/ramaze/reloader/watch_inotify.rb +85 -0
- data/lib/ramaze/reloader/watch_stat.rb +58 -0
- data/lib/ramaze/reloader.rb +25 -41
- data/lib/ramaze/snippets/divide.rb +2 -0
- data/lib/ramaze/snippets/numeric/time.rb +1 -1
- data/lib/ramaze/snippets/object/__dir__.rb +3 -3
- data/lib/ramaze/snippets/object/acquire.rb +3 -6
- data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
- data/lib/ramaze/snippets/ramaze/deprecated.rb +2 -1
- data/lib/ramaze/spec/helper/mock_http.rb +6 -5
- data/lib/ramaze/template/ezamar/render_partial.rb +8 -0
- data/lib/ramaze/tool/mime.rb +1 -1
- data/lib/ramaze/tool/project_creator.rb +2 -1
- data/lib/ramaze/version.rb +1 -1
- data/lib/ramaze.rb +6 -0
- data/rake_tasks/coverage.rake +4 -5
- data/rake_tasks/spec.rake +6 -6
- data/ramaze.gemspec +769 -756
- data/spec/contrib/profiling.rb +2 -2
- data/spec/ramaze/action/file_cache.rb +1 -1
- data/spec/ramaze/action/layout.rb +1 -1
- data/spec/ramaze/controller/actionless_templates.rb +1 -1
- data/spec/ramaze/controller/resolve.rb +1 -1
- data/spec/ramaze/controller/template_resolving.rb +1 -1
- data/spec/ramaze/dispatcher/directory.rb +3 -3
- data/spec/ramaze/helper/aspect.rb +1 -1
- data/spec/ramaze/helper/partial.rb +1 -1
- data/spec/ramaze/localize.rb +1 -1
- data/spec/ramaze/rewrite.rb +1 -1
- data/spec/ramaze/template/amrita2.rb +1 -1
- data/spec/ramaze/template/erubis.rb +1 -1
- data/spec/ramaze/template/ezamar.rb +1 -1
- data/spec/ramaze/template/haml.rb +2 -2
- data/spec/ramaze/template/nagoro.rb +1 -1
- data/spec/ramaze/template/redcloth.rb +1 -1
- data/spec/ramaze/template/sass.rb +1 -1
- data/spec/ramaze/template/tenjin.rb +1 -1
- data/spec/ramaze/template.rb +3 -3
- data/spec/snippets/object/__dir__.rb +6 -0
- data/spec/snippets/{object → ramaze}/acquire.rb +24 -18
- metadata +15 -12
- data/lib/ramaze/contrib/auto_params/get_args.rb +0 -58
- data/lib/ramaze/contrib/auto_params.rb +0 -135
- data/spec/contrib/auto_params.rb +0 -121
- data/spec/snippets/divide.rb +0 -19
|
@@ -1,65 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
# drop-in replacement for Ramaze's built-in MemoryCache built on the
|
|
3
|
-
# filesystem. # to use with sessions do
|
|
4
|
-
#
|
|
5
|
-
# Ramaze::Global::cache_alternative[:sessions] = Ramaze::FileCache
|
|
6
|
-
#
|
|
7
|
-
# to use with everything do
|
|
8
|
-
#
|
|
9
|
-
# Ramaze::Global::cache = Ramaze::FileCache
|
|
10
|
-
#
|
|
1
|
+
Ramaze::Log.warn("ramaze/contrib/file_cache is now ramaze/cache/file")
|
|
11
2
|
|
|
12
|
-
|
|
13
|
-
require "fileutils"
|
|
14
|
-
require "socket"
|
|
15
|
-
|
|
16
|
-
Host = Socket.gethostname
|
|
17
|
-
Pid = Process.pid
|
|
18
|
-
Fu = FileUtils
|
|
19
|
-
Root = File.join Ramaze::APPDIR, "cache"
|
|
20
|
-
|
|
21
|
-
Fu.mkdir_p(Root) rescue nil
|
|
22
|
-
|
|
23
|
-
def self.[] key
|
|
24
|
-
path = File.join Root, key, "data"
|
|
25
|
-
Marshal.load(IO.read(path))
|
|
26
|
-
rescue
|
|
27
|
-
nil
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def self.[]= key, value
|
|
31
|
-
tmp = File.join Root, key, "data.#{ Host }.#{ Pid }"
|
|
32
|
-
dirname = File.join Root, key
|
|
33
|
-
path = File.join Root, key, "data"
|
|
34
|
-
data = Marshal.dump value
|
|
35
|
-
Fu.rm_rf dirname rescue nil
|
|
36
|
-
Fu.mkdir_p dirname rescue nil
|
|
37
|
-
open(tmp, 'w'){|fd| fd.write data}
|
|
38
|
-
Fu.mv tmp, path
|
|
39
|
-
rescue
|
|
40
|
-
nil
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def self.values_at *keys
|
|
44
|
-
keys.map{|key| self[key]}
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def self.delete *keys
|
|
48
|
-
keys.map do |key|
|
|
49
|
-
dirname = File.join Root, key
|
|
50
|
-
Fu.rm_rf dirname rescue next
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def self.clear
|
|
55
|
-
Dir["#{ Root }/*"].each{|entry| Fu.rm_rf entry}
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def self.new
|
|
59
|
-
self
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def self.to_sym
|
|
63
|
-
name.split(%r/::/).last.to_sym
|
|
64
|
-
end
|
|
65
|
-
end
|
|
3
|
+
require 'ramaze/cache/file'
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
# # Creates a square thumbnail of the image cropping the longest edge
|
|
32
32
|
# # to match the shortest edge, resizes to +size+.
|
|
33
33
|
#
|
|
34
|
-
# :
|
|
34
|
+
# :algorithm => :thumbnail,
|
|
35
35
|
#
|
|
36
36
|
#
|
|
37
37
|
# # Key specifies the filename and accessors, value are arguments to the
|
data/lib/ramaze/contrib.rb
CHANGED
|
@@ -49,7 +49,7 @@ module Ramaze
|
|
|
49
49
|
const.startup if const.respond_to?(:startup)
|
|
50
50
|
Log.dev "Loaded contrib: #{const}"
|
|
51
51
|
rescue NameError
|
|
52
|
-
files = Dir["{contrib,#{BASEDIR
|
|
52
|
+
files = Dir["{contrib,#{BASEDIR}/ramaze/contrib}/#{name}.{so,bundle,rb}"]
|
|
53
53
|
raise LoadError, "#{mod_name} not found" unless files.any?
|
|
54
54
|
require(files.first) ? retry : raise
|
|
55
55
|
end
|
|
@@ -136,10 +136,15 @@ module Ramaze
|
|
|
136
136
|
|
|
137
137
|
def resolve_template(path)
|
|
138
138
|
path = path.to_s
|
|
139
|
-
path_converted = path.split('__').inject{|s,v| s
|
|
139
|
+
path_converted = path.split('__').inject{|s,v| File.join(s, v) }
|
|
140
140
|
possible_paths = [path, path_converted].compact
|
|
141
141
|
|
|
142
|
-
paths = template_paths.map{|pa|
|
|
142
|
+
paths = template_paths.map{|pa|
|
|
143
|
+
possible_paths.map{|a|
|
|
144
|
+
File.join(pa, a)
|
|
145
|
+
}
|
|
146
|
+
}.flatten.uniq
|
|
147
|
+
|
|
143
148
|
glob = "{#{paths.join(',')}}.{#{extension_order.join(',')}}"
|
|
144
149
|
|
|
145
150
|
Dir[glob].first
|
|
@@ -153,7 +158,7 @@ module Ramaze
|
|
|
153
158
|
if paths = view_root
|
|
154
159
|
paths
|
|
155
160
|
else
|
|
156
|
-
view_root(Global.view_root
|
|
161
|
+
view_root(File.join(Global.view_root, Global.mapping.invert[self]))
|
|
157
162
|
end
|
|
158
163
|
end
|
|
159
164
|
|
data/lib/ramaze/controller.rb
CHANGED
|
@@ -67,13 +67,17 @@ module Ramaze
|
|
|
67
67
|
|
|
68
68
|
# if trait[:automap] is set and controller is not in Global.mapping yet
|
|
69
69
|
# this will build a new default mapping-point, MainController is put
|
|
70
|
-
# at '/' by default.
|
|
70
|
+
# at '/' by default. For other Class names, String#snake_case is called,
|
|
71
|
+
# e.g. FooBarController is mapped at '/foo_bar'.
|
|
71
72
|
|
|
72
73
|
def mapping
|
|
73
74
|
global_mapping = Global.mapping.invert[self]
|
|
75
|
+
|
|
74
76
|
return global_mapping if global_mapping
|
|
77
|
+
|
|
75
78
|
if ancestral_trait[:automap] && self.to_s !~ /#<Class:/
|
|
76
79
|
name = self.to_s.gsub('Controller', '').gsub('::', '/').clone
|
|
80
|
+
return if name.empty?
|
|
77
81
|
name == 'Main' ? '/' : "/#{name.snake_case}"
|
|
78
82
|
end
|
|
79
83
|
end
|
|
@@ -262,6 +266,10 @@ module Ramaze
|
|
|
262
266
|
action.render
|
|
263
267
|
end
|
|
264
268
|
|
|
269
|
+
# By default, returns all ancestors of current Controller that have
|
|
270
|
+
# Ramaze::Controller as their ancestor. Optional argument parent
|
|
271
|
+
# can be used return ancestors that have parent as an ancestor.
|
|
272
|
+
|
|
265
273
|
def relevant_ancestors(parent = Ramaze::Controller)
|
|
266
274
|
ancestors.select do |anc|
|
|
267
275
|
anc.ancestors.include?(parent)
|
|
@@ -28,10 +28,14 @@ module Ramaze
|
|
|
28
28
|
super
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
+
# the full request URI provided by Rack::Request e.g. http://localhost:7000/controller/action?foo=bar.xhtml
|
|
32
|
+
|
|
31
33
|
def request_uri
|
|
32
34
|
env['REQUEST_URI'] || path_info
|
|
33
35
|
end
|
|
34
36
|
|
|
37
|
+
# the IP address(s) making the request provided by Rack::Request. You shouldn't trust it
|
|
38
|
+
|
|
35
39
|
def ip
|
|
36
40
|
if addr = env['HTTP_X_FORWARDED_FOR']
|
|
37
41
|
addr.split(',').last.strip
|
|
@@ -47,9 +51,8 @@ module Ramaze
|
|
|
47
51
|
ipv6 = %w[ fc00::/7 fe80::/10 fec0::/10 ::1 ]
|
|
48
52
|
LOCAL = (ipv4 + ipv6).map{|a| IPAddr.new(a)} unless defined?(LOCAL)
|
|
49
53
|
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
# ++
|
|
54
|
+
# returns true if the IP address making the request is from local network.
|
|
55
|
+
# Optional argument address can be used to check any IP address.
|
|
53
56
|
|
|
54
57
|
def local_net?(address = ip)
|
|
55
58
|
addr = IPAddr.new(address)
|
|
@@ -63,6 +66,15 @@ module Ramaze
|
|
|
63
66
|
[key, *rest].map{|k| params[k.to_s] }
|
|
64
67
|
end
|
|
65
68
|
|
|
69
|
+
# Sets any arguments passed as @instance_variables for the current action.
|
|
70
|
+
#
|
|
71
|
+
# Usage:
|
|
72
|
+
# request.params # => {'name' => 'manveru', 'q' => 'google', 'lang' => 'de'}
|
|
73
|
+
# to_ivs(:name, :q)
|
|
74
|
+
# @q # => 'google'
|
|
75
|
+
# @name # => 'manveru'
|
|
76
|
+
# @lang # => nil
|
|
77
|
+
|
|
66
78
|
def to_ivs(*args)
|
|
67
79
|
instance = Action.current.instance
|
|
68
80
|
args.each do |arg|
|
|
@@ -71,81 +83,77 @@ module Ramaze
|
|
|
71
83
|
end
|
|
72
84
|
end
|
|
73
85
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
@rack_params = {}
|
|
116
|
-
Log.error(ex)
|
|
117
|
-
end
|
|
86
|
+
# Wrapping Request#params to support a one-level hash notation.
|
|
87
|
+
# It doesn't support anything really fancy, so be conservative in its use.
|
|
88
|
+
#
|
|
89
|
+
# See if following provides something useful for us:
|
|
90
|
+
# http://redhanded.hobix.com/2006/01/25.html
|
|
91
|
+
#
|
|
92
|
+
# Example Usage:
|
|
93
|
+
#
|
|
94
|
+
# # Template:
|
|
95
|
+
#
|
|
96
|
+
# <form action="/paste">
|
|
97
|
+
# <input type="text" name="paste[name]" />
|
|
98
|
+
# <input type="text" name="paste[syntax]" />
|
|
99
|
+
# <input type="submit" />
|
|
100
|
+
# </form>
|
|
101
|
+
#
|
|
102
|
+
# # In your Controller:
|
|
103
|
+
#
|
|
104
|
+
# def paste
|
|
105
|
+
# name, syntax = request['paste'].values_at('name', 'syntax')
|
|
106
|
+
# paste = Paste.create_with(:name => name, :syntax => syntax)
|
|
107
|
+
# redirect '/'
|
|
108
|
+
# end
|
|
109
|
+
#
|
|
110
|
+
# # Or, easier:
|
|
111
|
+
#
|
|
112
|
+
# def paste
|
|
113
|
+
# paste = Paste.create_with(request['paste'])
|
|
114
|
+
# redirect '/'
|
|
115
|
+
# end
|
|
116
|
+
|
|
117
|
+
def params
|
|
118
|
+
return {} if put?
|
|
119
|
+
return @ramaze_params if @ramaze_params
|
|
120
|
+
|
|
121
|
+
begin
|
|
122
|
+
@rack_params ||= super
|
|
123
|
+
rescue EOFError => ex
|
|
124
|
+
@rack_params = {}
|
|
125
|
+
Log.error(ex)
|
|
126
|
+
end
|
|
118
127
|
|
|
119
|
-
|
|
128
|
+
@ramaze_params = {}
|
|
120
129
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
130
|
+
@rack_params.each do |key, value|
|
|
131
|
+
if key =~ /^(.*?)(\[.*\])/
|
|
132
|
+
prim, nested = $~.captures
|
|
133
|
+
ref = @ramaze_params
|
|
125
134
|
|
|
126
|
-
|
|
127
|
-
|
|
135
|
+
keys = nested.scan(/\[([^\]]+)\]/).flatten
|
|
136
|
+
keys.unshift prim
|
|
128
137
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
138
|
+
keys.each_with_index do |k, i|
|
|
139
|
+
if i + 1 >= keys.size
|
|
140
|
+
ref[k] = value
|
|
141
|
+
else
|
|
142
|
+
# in case the value is a string we cannot let it be ref next
|
|
143
|
+
# time, so throw it away
|
|
144
|
+
if ref[k].is_a?(String)
|
|
145
|
+
ref = ref[k] = {}
|
|
132
146
|
else
|
|
133
|
-
|
|
134
|
-
# time, so throw it away
|
|
135
|
-
if ref[k].is_a?(String)
|
|
136
|
-
ref = ref[k] = {}
|
|
137
|
-
else
|
|
138
|
-
ref = ref[k] ||= {}
|
|
139
|
-
end
|
|
147
|
+
ref = ref[k] ||= {}
|
|
140
148
|
end
|
|
141
149
|
end
|
|
142
|
-
else
|
|
143
|
-
@ramaze_params[key] = value
|
|
144
150
|
end
|
|
151
|
+
else
|
|
152
|
+
@ramaze_params[key] = value
|
|
145
153
|
end
|
|
146
|
-
|
|
147
|
-
@ramaze_params
|
|
148
154
|
end
|
|
155
|
+
|
|
156
|
+
@ramaze_params
|
|
149
157
|
end
|
|
150
158
|
|
|
151
159
|
# Interesting HTTP variables from env
|
|
@@ -156,12 +164,18 @@ module Ramaze
|
|
|
156
164
|
}
|
|
157
165
|
end
|
|
158
166
|
|
|
167
|
+
# Returns a string presentation of the request, useful for debugging
|
|
168
|
+
# parameters of the action.
|
|
169
|
+
|
|
159
170
|
def to_s
|
|
160
171
|
p, c, e = params.inspect, cookies.inspect, http_vars.inspect
|
|
161
172
|
%{#<Ramaze::Request params=#{p} cookies=#{c} env=#{e}>}
|
|
162
173
|
end
|
|
163
174
|
alias inspect to_s
|
|
164
175
|
|
|
176
|
+
# Pretty prints current action with parameters, cookies and
|
|
177
|
+
# enviroment variables.
|
|
178
|
+
|
|
165
179
|
def pretty_print pp
|
|
166
180
|
p, c, e = params, cookies, http_vars
|
|
167
181
|
pp.object_group(self){
|
|
@@ -198,6 +212,9 @@ module Ramaze
|
|
|
198
212
|
URI("#{scheme}://#{host}#{path}")
|
|
199
213
|
end
|
|
200
214
|
|
|
215
|
+
# Returns and array of locales from env['HTTP_ACCEPT_LANGUAGE].
|
|
216
|
+
# e.g. ["fi", "en", "ja", "fr", "de", "es", "it", "nl", "sv"]
|
|
217
|
+
|
|
201
218
|
def locales
|
|
202
219
|
env['HTTP_ACCEPT_LANGUAGE'].to_s.split(/(?:,|;q=[\d.,]+)/)
|
|
203
220
|
end
|
|
@@ -9,8 +9,8 @@ module Ramaze
|
|
|
9
9
|
|
|
10
10
|
# Sets @hash to an empty Hash
|
|
11
11
|
|
|
12
|
-
def initialize
|
|
13
|
-
@session =
|
|
12
|
+
def initialize(session)
|
|
13
|
+
@session = session
|
|
14
14
|
@hash = {}
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -18,11 +18,8 @@ module Ramaze
|
|
|
18
18
|
# Session.current.sessions if anything changes.
|
|
19
19
|
|
|
20
20
|
def method_missing(*args, &block)
|
|
21
|
-
old = @hash.dup
|
|
22
21
|
result = @hash.send(*args, &block)
|
|
23
|
-
|
|
24
|
-
Cache.sessions[@session.session_id] = self
|
|
25
|
-
end
|
|
22
|
+
Cache.sessions[@session.session_id] = self
|
|
26
23
|
result
|
|
27
24
|
end
|
|
28
25
|
|
|
@@ -48,11 +45,10 @@ module Ramaze
|
|
|
48
45
|
|
|
49
46
|
# Unmarshal cookie data to a hash and verify its integrity.
|
|
50
47
|
def unmarshal(cookie)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
end
|
|
48
|
+
return unless cookie
|
|
49
|
+
data, digest = cookie.split('--')
|
|
50
|
+
return nil unless digest == generate_digest(data)
|
|
51
|
+
Marshal.load(data.unpack('m').first)
|
|
56
52
|
end
|
|
57
53
|
|
|
58
54
|
# Generate the inline SHA512 message digest. Larger (128 bytes) than SHA256
|
|
@@ -96,7 +96,7 @@ module Ramaze
|
|
|
96
96
|
def initialize(sess_or_request = Current.request)
|
|
97
97
|
return unless Global.sessions
|
|
98
98
|
|
|
99
|
-
if sess_or_request.
|
|
99
|
+
if sess_or_request.respond_to?(:cookies)
|
|
100
100
|
request = sess_or_request
|
|
101
101
|
@session_id = request.cookies[SESSION_KEY] || Session.random_key
|
|
102
102
|
else
|
|
@@ -125,10 +125,8 @@ module Ramaze
|
|
|
125
125
|
# existing already, the session itself is an instance of SessionHash
|
|
126
126
|
|
|
127
127
|
def current
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
end
|
|
131
|
-
@current
|
|
128
|
+
return @current if @current
|
|
129
|
+
@current = ( sessions[session_id] ||= Session::Hash.new(self) )
|
|
132
130
|
end
|
|
133
131
|
|
|
134
132
|
# shortcut to Cache.sessions
|
|
@@ -64,7 +64,8 @@ module Ramaze
|
|
|
64
64
|
joined = ::File.join(Global.public_root, path)
|
|
65
65
|
|
|
66
66
|
if ::File.directory?(joined)
|
|
67
|
-
|
|
67
|
+
glob = ::File.join(joined, "{#{INDICES.join(',')}}")
|
|
68
|
+
Dir[glob].first || joined
|
|
68
69
|
else
|
|
69
70
|
joined
|
|
70
71
|
end
|
|
@@ -78,6 +79,10 @@ module Ramaze
|
|
|
78
79
|
|
|
79
80
|
private
|
|
80
81
|
|
|
82
|
+
# Shortcut for Ramaze::Dispatcher::File#expand_path(path).
|
|
83
|
+
# Returns the absolute path of passed argument e.g.
|
|
84
|
+
# "/Users/rikur/ramaze_tests/public/foo.txt"
|
|
85
|
+
|
|
81
86
|
def expand(path)
|
|
82
87
|
::File.expand_path(path)
|
|
83
88
|
end
|
data/lib/ramaze/helper/aspect.rb
CHANGED
|
@@ -76,7 +76,7 @@ module Ramaze
|
|
|
76
76
|
class Action
|
|
77
77
|
|
|
78
78
|
# overwrites the default Action hook and runs the neccesary blocks in its
|
|
79
|
-
# scope
|
|
79
|
+
# scope before actions are run, starting from Ramaze::Controller down the
|
|
80
80
|
# ancestor chain.
|
|
81
81
|
def before_process
|
|
82
82
|
common_aspect(:before)
|
|
@@ -84,7 +84,7 @@ module Ramaze
|
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
# overwrites the default Action hook and runs the neccesary blocks in its
|
|
87
|
-
# scope
|
|
87
|
+
# scope after actions are run, starting from Ramaze::Controller down the
|
|
88
88
|
# ancestor chain.
|
|
89
89
|
def after_process
|
|
90
90
|
common_aspect(:after)
|
data/lib/ramaze/helper/form.rb
CHANGED
|
@@ -219,16 +219,19 @@ module Ramaze
|
|
|
219
219
|
|
|
220
220
|
# Form for instances of the model class
|
|
221
221
|
class InstanceForm < Form
|
|
222
|
-
# <input type='text' name='name' value='value' />
|
|
222
|
+
# returns <input type='text' name='name' value='value' />
|
|
223
223
|
def field_input(name, value)
|
|
224
224
|
"<input type='text' name='#{name}' value='#{value}'/>"
|
|
225
225
|
end
|
|
226
226
|
|
|
227
|
+
# returns <textarea name='name'>#{value}</textarea>
|
|
228
|
+
|
|
227
229
|
def field_textarea(name, value)
|
|
228
230
|
"<textarea name='#{name}'>#{value}</textarea>"
|
|
229
231
|
end
|
|
230
232
|
|
|
231
|
-
# <input type="text" name="name" value="value" />
|
|
233
|
+
# returns <input type="text" name="name" value="value" />
|
|
234
|
+
|
|
232
235
|
def field_integer(name, value)
|
|
233
236
|
field_input(name, value)
|
|
234
237
|
end
|
|
@@ -111,6 +111,10 @@ module Ramaze
|
|
|
111
111
|
end
|
|
112
112
|
alias autolink auto_link
|
|
113
113
|
|
|
114
|
+
# takes a string and optional argument for outputting compliance HTML
|
|
115
|
+
# instead of XHTML.
|
|
116
|
+
# e.g nl2br "a\nb\n\c" #=> 'a<br />b<br />c'
|
|
117
|
+
|
|
114
118
|
def nl2br(string, xhtml = true)
|
|
115
119
|
br = xhtml ? '<br />' : '<br>'
|
|
116
120
|
string.gsub(/\n/, br)
|
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
module Ramaze
|
|
2
2
|
module Helper
|
|
3
3
|
module Gravatar
|
|
4
|
+
|
|
5
|
+
# fetches a gravatar from http//www.gravatar.com based on 'email'
|
|
6
|
+
# and 'size'. Falls back to 'fallback_path' if no gravatar is found.
|
|
7
|
+
# default 'fallback_path' is "/images/gravatar_default.jpg".
|
|
8
|
+
# example:
|
|
9
|
+
#
|
|
10
|
+
# class GravatarController < Ramaze::Controller
|
|
11
|
+
# helper :gravatar
|
|
12
|
+
#
|
|
13
|
+
# def index
|
|
14
|
+
# @gravatar_thumbnail_src = gravatar(session[:email] || 'riku@helloit.fi')
|
|
15
|
+
# end
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
# /view/gravatar/index.html:
|
|
19
|
+
# <img src="#{@gravatar_thumbnail_src}" />
|
|
20
|
+
|
|
4
21
|
def gravatar(email, size = 32, fallback_path = "/images/gravatar_default.jpg")
|
|
5
22
|
emailhash = Digest::MD5.hexdigest(email)
|
|
6
23
|
|
|
7
24
|
fallback = Request.current.domain
|
|
8
25
|
fallback.path = fallback_path
|
|
9
|
-
default =
|
|
26
|
+
default = Rack::Utils.escape(fallback.to_s)
|
|
10
27
|
|
|
11
28
|
return "http://www.gravatar.com/avatar.php?gravatar_id=#{emailhash}&default=#{default}&size=#{size}"
|
|
12
29
|
end
|
|
@@ -5,50 +5,79 @@ module Ramaze
|
|
|
5
5
|
module Helper
|
|
6
6
|
module HttpDigest
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
UUID_GENERATOR = UUID.new
|
|
9
|
+
|
|
10
|
+
SESSION_NONCE = 'httpdigest_authentication_nonce'
|
|
11
|
+
SESSION_OPAQUE = 'httpdigest_authentication_opaque'
|
|
9
12
|
|
|
10
13
|
def httpdigest_logout
|
|
11
|
-
session.delete(
|
|
14
|
+
session.delete( SESSION_NONCE )
|
|
15
|
+
session.delete( SESSION_OPAQUE )
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def httpdigest_headers uid, realm
|
|
19
|
+
session[ SESSION_NONCE ] = UUID_GENERATOR.generate
|
|
20
|
+
session[ SESSION_OPAQUE ][ realm ][ uid ] = UUID_GENERATOR.generate
|
|
21
|
+
response['WWW-Authenticate'] =
|
|
22
|
+
%|Digest realm="#{realm}",| +
|
|
23
|
+
%|qop="auth,auth-int",| +
|
|
24
|
+
%|nonce="#{session[SESSION_NONCE]}",| +
|
|
25
|
+
%|opaque="#{session[SESSION_OPAQUE][realm][uid]}"|
|
|
12
26
|
end
|
|
13
27
|
|
|
14
28
|
def httpdigest(uid, realm)
|
|
15
|
-
|
|
29
|
+
session[ SESSION_OPAQUE ] ||= {}
|
|
30
|
+
session[ SESSION_OPAQUE ][ realm ] ||= {}
|
|
16
31
|
|
|
17
|
-
|
|
32
|
+
if request.env['HTTP_AUTHORIZATION']
|
|
18
33
|
|
|
19
|
-
|
|
34
|
+
authorized = false
|
|
20
35
|
|
|
21
|
-
|
|
36
|
+
if session[ SESSION_NONCE ] and session[ SESSION_OPAQUE ][ realm ][ uid ]
|
|
22
37
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
digest_response, username, nonce, nc, cnonce, qop =
|
|
27
|
-
authorization.values_at(*%w[response username nonce nc cnonce qop])
|
|
38
|
+
auth_split = request.env['HTTP_AUTHORIZATION'].split
|
|
39
|
+
authentication_type = auth_split[0]
|
|
40
|
+
authorization = Rack::Auth::Digest::Params.parse( auth_split[1..-1].join(' ') )
|
|
28
41
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
ha1 = yield(username)
|
|
32
|
-
ha2 = MD5.hexdigest("#{request.request_method}:#{request.fullpath}")
|
|
33
|
-
md5 = MD5.hexdigest([ha1, nonce, nc, cnonce, qop, ha2].join(':'))
|
|
42
|
+
digest_response, username, nonce, nc, cnonce, qop, opaque =
|
|
43
|
+
authorization.values_at(*%w[response username nonce nc cnonce qop opaque])
|
|
34
44
|
|
|
35
|
-
|
|
45
|
+
if authentication_type == 'Digest'
|
|
46
|
+
if nonce == session[SESSION_NONCE] and opaque == session[SESSION_OPAQUE][realm][uid]
|
|
47
|
+
h1 = nil
|
|
48
|
+
if respond_to?( :httpdigest_lookup_password )
|
|
49
|
+
ha1 = httpdigest_lookup_password( username )
|
|
50
|
+
else
|
|
51
|
+
if respond_to?( :httpdigest_lookup_plaintext_password )
|
|
52
|
+
ha1 = MD5.hexdigest( "#{username}:#{realm}:#{httpdigest_lookup_plaintext_password( username )}" )
|
|
53
|
+
else
|
|
54
|
+
if block_given?
|
|
55
|
+
ha1 = yield( username )
|
|
56
|
+
else
|
|
57
|
+
raise "No password lookup handler found"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
ha2 = MD5.hexdigest([request.request_method,request.fullpath].join(':'))
|
|
62
|
+
md5 = MD5.hexdigest([ha1, nonce, nc, cnonce, qop, ha2].join(':'))
|
|
63
|
+
|
|
64
|
+
authorized = digest_response == md5
|
|
65
|
+
end
|
|
36
66
|
end
|
|
67
|
+
|
|
37
68
|
end
|
|
38
|
-
end
|
|
39
69
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
response['WWW-Authenticate'] =
|
|
43
|
-
%|Digest realm="#{realm}",| +
|
|
44
|
-
%|qop="auth,auth-int",| +
|
|
45
|
-
%|nonce="#{session[@session_nonce]}",| +
|
|
46
|
-
%|opaque="#{session[session_opaque]}"|
|
|
47
|
-
if respond_to?( :httpdigest_failure )
|
|
48
|
-
httpdigest_failure
|
|
49
|
-
else
|
|
70
|
+
unless authorized
|
|
71
|
+
httpdigest_headers( uid, realm )
|
|
50
72
|
respond('Unauthorized', 401)
|
|
51
73
|
end
|
|
74
|
+
|
|
75
|
+
else
|
|
76
|
+
|
|
77
|
+
httpdigest_headers( uid, realm )
|
|
78
|
+
httpdigest_failure if respond_to?( :httpdigest_failure )
|
|
79
|
+
respond('Unauthorized', 401)
|
|
80
|
+
|
|
52
81
|
end
|
|
53
82
|
|
|
54
83
|
authorization["username"]
|
data/lib/ramaze/helper/maruku.rb
CHANGED
|
@@ -165,9 +165,8 @@ module Ramaze
|
|
|
165
165
|
text = h(text.to_s)
|
|
166
166
|
|
|
167
167
|
params = Ramaze::Request.current.params.merge(@var.to_s => n)
|
|
168
|
-
name = Ramaze::
|
|
169
|
-
|
|
170
|
-
hash[:href] = Rs(name, params)
|
|
168
|
+
name = Ramaze::Request.current.request_path
|
|
169
|
+
hash[:href] = R(name, params)
|
|
171
170
|
|
|
172
171
|
g.a(hash){ text }
|
|
173
172
|
end
|