spiderfw 0.6.25 → 0.6.26.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +15 -0
- data/VERSION +1 -1
- data/apps/core/auth/controllers/login_controller.rb +2 -0
- data/apps/core/auth/controllers/mixins/auth_helper.rb +1 -1
- data/apps/core/auth/public/css/login.css +49 -0
- data/apps/core/auth/views/login.layout.shtml +14 -0
- data/apps/core/auth/views/login.shtml +1 -0
- data/apps/core/components/public/js/jquery/plugins/jquery.ui.nestedSortable.js +356 -0
- data/apps/core/forms/public/date_time.js +1 -1
- data/apps/core/forms/public/select.js +1 -1
- data/apps/core/forms/tags/element_row.erb +2 -2
- data/apps/core/forms/widgets/form/form.rb +34 -22
- data/apps/messenger/_init.rb +1 -0
- data/apps/messenger/views/admin/index.shtml +1 -1
- data/apps/messenger/views/index.shtml +1 -1
- data/blueprints/.DS_Store +0 -0
- data/blueprints/home/.DS_Store +0 -0
- data/blueprints/install/.DS_Store +0 -0
- data/data/keys/spider.rsa +27 -0
- data/data/keys/spider.rsa.pub +1 -0
- data/lib/spiderfw/app.rb +64 -4
- data/lib/spiderfw/autoload.rb +0 -1
- data/lib/spiderfw/cmd/commands/app.rb +2 -1
- data/lib/spiderfw/controller/controller.rb +189 -90
- data/lib/spiderfw/controller/dispatcher.rb +13 -3
- data/lib/spiderfw/controller/http_controller.rb +18 -4
- data/lib/spiderfw/controller/mixins/http_mixin.rb +37 -10
- data/lib/spiderfw/controller/mixins/visual.rb +14 -5
- data/lib/spiderfw/http/http.rb +5 -0
- data/lib/spiderfw/model/base_model.rb +1 -11
- data/lib/spiderfw/model/condition.rb +7 -4
- data/lib/spiderfw/model/mappers/mapper.rb +2 -2
- data/lib/spiderfw/requires.rb +1 -0
- data/lib/spiderfw/setup/app_manager.rb +7 -2
- data/lib/spiderfw/setup/setup_task.rb +1 -1
- data/lib/spiderfw/setup/spider_setup_wizard.rb +1 -1
- data/lib/spiderfw/spider.rb +4 -1
- data/lib/spiderfw/templates/layout.rb +8 -3
- data/lib/spiderfw/templates/template.rb +2 -1
- data/lib/spiderfw/test/rack_tester.rb +10 -0
- data/lib/spiderfw/widget/widget_plugin.rb +8 -1
- metadata +254 -157
- data/lib/spiderfw/model/storage/db/connectors/mysql.rb +0 -16
- data/lib/spiderfw/model/storage/db/connectors/mysql2.rb +0 -9
@@ -43,10 +43,12 @@ module Spider
|
|
43
43
|
@request.params = Spider::HTTP.parse_query(@request.env['QUERY_STRING'])
|
44
44
|
@request.get = @request.params
|
45
45
|
end
|
46
|
-
if @request.env['REQUEST_METHOD']
|
46
|
+
if ['POST', 'PUT', 'DELETE'].include?(@request.env['REQUEST_METHOD']) && @request.env['HTTP_CONTENT_TYPE']
|
47
47
|
if @request.env['HTTP_CONTENT_TYPE'].include?('application/x-www-form-urlencoded')
|
48
|
-
|
49
|
-
@request.
|
48
|
+
data = Spider::HTTP.parse_query(@request.read_body)
|
49
|
+
req_meth = @request.env['REQUEST_METHOD'].downcase
|
50
|
+
@request.send(:"#{req_meth}=", data)
|
51
|
+
@request.params.merge!(@request.send(:"#{req_meth}"))
|
50
52
|
elsif @request.env['HTTP_CONTENT_TYPE'] =~ Spider::HTTP::MULTIPART_REGEXP
|
51
53
|
multipart_params, multipart_files = Spider::HTTP.parse_multipart(@request.body, $1, @request.env['CONTENT_LENGTH'].to_i)
|
52
54
|
@request.params.merge!(multipart_params)
|
@@ -176,7 +178,7 @@ module Spider
|
|
176
178
|
end
|
177
179
|
|
178
180
|
module HTTPRequest
|
179
|
-
attr_accessor :http_method, :http_host, :domain, :port, :post, :get
|
181
|
+
attr_accessor :http_method, :http_host, :domain, :port, :post, :get, :put, :delete
|
180
182
|
|
181
183
|
# Returns PATH_INFO reversing any proxy mappings if needed.
|
182
184
|
def path
|
@@ -228,6 +230,10 @@ module Spider
|
|
228
230
|
def get
|
229
231
|
@get ||= {}
|
230
232
|
end
|
233
|
+
|
234
|
+
def put
|
235
|
+
@put ||= {}
|
236
|
+
end
|
231
237
|
|
232
238
|
def post?
|
233
239
|
self.http_method == :POST
|
@@ -236,6 +242,14 @@ module Spider
|
|
236
242
|
def get?
|
237
243
|
self.http_method == :GET
|
238
244
|
end
|
245
|
+
|
246
|
+
def put?
|
247
|
+
self.http_method == :PUT
|
248
|
+
end
|
249
|
+
|
250
|
+
def delete?
|
251
|
+
self.http_method == :DELETE
|
252
|
+
end
|
239
253
|
|
240
254
|
end
|
241
255
|
|
@@ -12,6 +12,11 @@ module Spider; module ControllerMixins
|
|
12
12
|
klass.extend(ClassMethods)
|
13
13
|
end
|
14
14
|
|
15
|
+
# Sets the headers to redirect the browser to the given url, and calls
|
16
|
+
# {Controller#done} to terminate the execution of the Controller chain
|
17
|
+
# @param [String] url
|
18
|
+
# @param [Fixnum] code HTTP status to send
|
19
|
+
# @return void
|
15
20
|
def redirect(url, code=Spider::HTTP::SEE_OTHER)
|
16
21
|
debug "REDIRECTING TO #{url}"
|
17
22
|
@request.session.persist if @request.session # It might be too late afterwards
|
@@ -22,30 +27,35 @@ module Spider; module ControllerMixins
|
|
22
27
|
done
|
23
28
|
end
|
24
29
|
|
25
|
-
|
26
|
-
|
30
|
+
# Takes a url path that the framework would accept, and transforms it
|
31
|
+
# into the url path the webserver would send, given the settings in http.proxy_mapping
|
32
|
+
# @param [Strint] url_path
|
33
|
+
# @return [String] The transformed url path
|
34
|
+
def self.reverse_proxy_mapping(url_path)
|
35
|
+
return '' unless url_path
|
27
36
|
if (maps = Spider.conf.get('http.proxy_mapping'))
|
28
37
|
maps.each do |proxy, spider|
|
29
38
|
spider ||= ''
|
30
|
-
return proxy +
|
39
|
+
return proxy + url_path[spider.length..-1] if (spider == "" || url_path[0..spider.length-1] == spider)
|
31
40
|
end
|
32
41
|
end
|
33
|
-
return
|
42
|
+
return url_path
|
34
43
|
end
|
35
44
|
|
36
45
|
# Returns the http path used to call the current controller & action.
|
37
46
|
# Reverses any proxy mappings to the Controller#request_path.
|
47
|
+
# @return [String]
|
38
48
|
def request_path
|
39
49
|
HTTPMixin.reverse_proxy_mapping(super)
|
40
50
|
end
|
41
51
|
|
42
|
-
#
|
52
|
+
# @return [String] the request_path prefixed with http:// and the current host.
|
43
53
|
def request_url
|
44
54
|
return request_path unless @request.env['HTTP_HOST']
|
45
55
|
'http://'+@request.env['HTTP_HOST']+request_path
|
46
56
|
end
|
47
57
|
|
48
|
-
#
|
58
|
+
# @return [String] the request_url with query params, if any
|
49
59
|
def request_full_url
|
50
60
|
url = request_url
|
51
61
|
if (@request.env['QUERY_STRING'] && !@request.env['QUERY_STRING'].empty?)
|
@@ -54,11 +64,18 @@ module Spider; module ControllerMixins
|
|
54
64
|
return url
|
55
65
|
end
|
56
66
|
|
57
|
-
|
67
|
+
# Sets or returns the charset for the controller
|
68
|
+
# @param [String|nil] The charset
|
69
|
+
# @return [String] The charset in use
|
70
|
+
def self.output_charset(val=nil)
|
58
71
|
@output_charset = val if val
|
59
72
|
@output_charset || Spider.conf.get('http.charset')
|
60
73
|
end
|
61
74
|
|
75
|
+
# Sets a Content type
|
76
|
+
# @param [String|Symbol] Content type, or a symbol representing it
|
77
|
+
# (Can be :text, :json, :js, :javascript, :html, :xml)
|
78
|
+
# @return [String] The value of the "Content-Type" header
|
62
79
|
def content_type(ct)
|
63
80
|
if ct.is_a?(Symbol)
|
64
81
|
ct = {
|
@@ -73,6 +90,9 @@ module Spider; module ControllerMixins
|
|
73
90
|
@response.headers["Content-Type"] = "#{ct};charset=utf-8"
|
74
91
|
end
|
75
92
|
|
93
|
+
#
|
94
|
+
# @param [String] action
|
95
|
+
# @param [*Object] arguments
|
76
96
|
def before(action='', *arguments)
|
77
97
|
return super if self.is_a?(Spider::Widget)
|
78
98
|
# FIXME: the Spider::Widget check
|
@@ -89,14 +109,17 @@ module Spider; module ControllerMixins
|
|
89
109
|
super
|
90
110
|
end
|
91
111
|
|
112
|
+
# @return [String] the base URL to which the installation responds
|
92
113
|
def self.base_url
|
93
114
|
HTTPMixin.reverse_proxy_mapping("")
|
94
115
|
end
|
95
116
|
|
117
|
+
# @return [String] the base URL to which the installation responds
|
96
118
|
def base_url
|
97
119
|
HTTPMixin.base_url
|
98
120
|
end
|
99
121
|
|
122
|
+
|
100
123
|
def prepare_scene(scene)
|
101
124
|
scene = super
|
102
125
|
scene.base_url = base_url
|
@@ -212,13 +235,17 @@ module Spider; module ControllerMixins
|
|
212
235
|
end
|
213
236
|
|
214
237
|
|
215
|
-
def
|
216
|
-
return
|
238
|
+
def url(action=nil)
|
239
|
+
return super unless Spider.site
|
217
240
|
u = "http://#{Spider.site.domain}"
|
218
241
|
u += ":#{Spider.site.port}" unless Spider.site.port == 80
|
219
|
-
u += HTTPMixin.reverse_proxy_mapping(
|
242
|
+
u += HTTPMixin.reverse_proxy_mapping(super(action))
|
220
243
|
u
|
221
244
|
end
|
245
|
+
|
246
|
+
def http_url(action=nil)
|
247
|
+
url(action)
|
248
|
+
end
|
222
249
|
|
223
250
|
end
|
224
251
|
|
@@ -39,9 +39,9 @@ module Spider; module ControllerMixins
|
|
39
39
|
return super unless action_target?
|
40
40
|
format = nil
|
41
41
|
req_format = self.is_a?(Widget) && @is_target && @request.params['_wf'] ? @request.params['_wf'].to_sym : @request.format
|
42
|
-
if
|
42
|
+
if req_format && self.class.output_formats[@executed_method]
|
43
43
|
format = req_format if self.class.output_format?(@executed_method, req_format)
|
44
|
-
if
|
44
|
+
if format
|
45
45
|
format_params = self.class.output_format_params(@executed_method, format)
|
46
46
|
end
|
47
47
|
if @executed_method && !format || (format_params && format_params[:widgets] && !target_mode?)
|
@@ -50,6 +50,11 @@ module Spider; module ControllerMixins
|
|
50
50
|
end
|
51
51
|
format ||= self.class.output_format(@executed_method)
|
52
52
|
format_params ||= self.class.output_format_params(@executed_method, format)
|
53
|
+
|
54
|
+
unless !format_params || format_params[:http_method].blank?
|
55
|
+
format_params[:http_method] = [format_params[:http_method]] unless format_params[:http_method].is_a?(Enumerable)
|
56
|
+
raise Forbidden unless format_params[:http_method].include?(@request.http_method)
|
57
|
+
end
|
53
58
|
output_format_headers(format)
|
54
59
|
@executed_format = format
|
55
60
|
@executed_format_params = format_params
|
@@ -100,7 +105,7 @@ module Spider; module ControllerMixins
|
|
100
105
|
@is_target = false if target_mode? && !self.is_a?(Spider::Widget)
|
101
106
|
if (self.is_a?(Widget) && @is_target && @request.params['_wp'])
|
102
107
|
params = @request.params['_wp']
|
103
|
-
elsif
|
108
|
+
elsif @visual_params.is_a?(Hash) && @visual_params[:params]
|
104
109
|
p_first, p_rest = action.split('/')
|
105
110
|
params = format_params[:params].call(p_rest) if p_rest
|
106
111
|
end
|
@@ -192,7 +197,11 @@ module Spider; module ControllerMixins
|
|
192
197
|
template._widget_action = @request.params['_action']
|
193
198
|
else
|
194
199
|
template._action_to = options[:action_to]
|
195
|
-
|
200
|
+
template_action = @current_action.to_s.split('/')
|
201
|
+
if template_action.first == @executed_method.to_s
|
202
|
+
template_action = template_action[1..-1]
|
203
|
+
end
|
204
|
+
template._action = template_action.join('/')
|
196
205
|
end
|
197
206
|
return template
|
198
207
|
end
|
@@ -462,7 +471,7 @@ module Spider; module ControllerMixins
|
|
462
471
|
@output_formats[method] << format
|
463
472
|
@output_format_params[method] ||= {}
|
464
473
|
@output_format_params[method][format] = params
|
465
|
-
|
474
|
+
controller_action(method, params)
|
466
475
|
return format
|
467
476
|
end
|
468
477
|
return @default_output_format unless @output_formats[method] && @output_formats[method][0]
|
data/lib/spiderfw/http/http.rb
CHANGED
@@ -15,6 +15,11 @@ module Spider
|
|
15
15
|
FILENAME_REGEX = /Content-Disposition:.* filename="?([^\";]*)"?/ni.freeze
|
16
16
|
CRLF = "\r\n".freeze
|
17
17
|
EOL = CRLF
|
18
|
+
|
19
|
+
METHODS = [
|
20
|
+
:GET, :POST, :PUT, :DELETE, :HEAD, :TRACE, :CONNECT,
|
21
|
+
:PROPFIND, :PROPPATCH, :MKCOL, :COPY, :MOVE, :LOCK, :UNLOCK
|
22
|
+
]
|
18
23
|
|
19
24
|
module StatusCodes
|
20
25
|
|
@@ -52,6 +52,7 @@ module Spider; module Model
|
|
52
52
|
# p salmon_lovers[0].name
|
53
53
|
# => 'Cat'
|
54
54
|
class BaseModel
|
55
|
+
include App::AppClass
|
55
56
|
include Spider::Logger
|
56
57
|
include DataTypes
|
57
58
|
include Spider::QueryFuncs
|
@@ -138,17 +139,6 @@ module Spider; module Model
|
|
138
139
|
@subclasses || []
|
139
140
|
end
|
140
141
|
|
141
|
-
# Returns the parent Spider::App of the module
|
142
|
-
# @return [Spider::App]
|
143
|
-
def self.app
|
144
|
-
return @app if @app
|
145
|
-
app = self
|
146
|
-
while app && !app.include?(Spider::App)
|
147
|
-
app = app.parent_module
|
148
|
-
end
|
149
|
-
@app = app
|
150
|
-
end
|
151
|
-
|
152
142
|
|
153
143
|
#######################################
|
154
144
|
# Model definition methods #
|
@@ -110,6 +110,9 @@ module Spider; module Model
|
|
110
110
|
@comparisons = {}
|
111
111
|
@subconditions = []
|
112
112
|
params.reject!{ |p| p.nil? }
|
113
|
+
if params[0].is_a?(Proc)
|
114
|
+
params[0] = params[0].call
|
115
|
+
end
|
113
116
|
if (params.length == 1 && params[0].is_a?(Hash) && !params[0].is_a?(Condition))
|
114
117
|
params[0].each do |k, v|
|
115
118
|
set(k, '=', v)
|
@@ -193,14 +196,14 @@ module Spider; module Model
|
|
193
196
|
end
|
194
197
|
|
195
198
|
# Adds a subcondtion.
|
196
|
-
# @param [Condition] condition
|
199
|
+
# @param [Condition|Hash|Proc|String] condition
|
197
200
|
# @return [void]
|
198
201
|
def <<(condition)
|
199
|
-
if
|
202
|
+
if condition.class == self.class
|
200
203
|
@subconditions << condition
|
201
|
-
elsif
|
204
|
+
elsif condition.is_a?(Hash) || condition.is_a?(Proc)
|
202
205
|
@subconditions << self.class.new(condition)
|
203
|
-
elsif
|
206
|
+
elsif condition.class == String
|
204
207
|
key, val, comparison = parse_comparison(condition)
|
205
208
|
set(key, val, comparison)
|
206
209
|
end
|
@@ -1113,8 +1113,8 @@ module Spider; module Model
|
|
1113
1113
|
rescue TypeError => exc
|
1114
1114
|
raise TypeError, "Can't convert #{v} to #{element.type} for element #{k} (#{exc.message})"
|
1115
1115
|
end
|
1116
|
-
elsif element.type
|
1117
|
-
v =
|
1116
|
+
elsif [DateTime, Date].include?(element.type) && v && !v.is_a?(Date) && !v.is_a?(Time)
|
1117
|
+
v = element.type.parse(v)
|
1118
1118
|
changed_v = true
|
1119
1119
|
elsif element.model? && v.is_a?(Spider::Model::Condition)
|
1120
1120
|
unless v.primary_keys_only?(element.model)
|
data/lib/spiderfw/requires.rb
CHANGED
@@ -27,6 +27,7 @@ require 'spiderfw/utils/http_client'
|
|
27
27
|
require 'spiderfw/utils/gems'
|
28
28
|
require 'spiderfw/config/configuration'
|
29
29
|
require 'spiderfw/config/configurable'
|
30
|
+
require 'spiderfw/app'
|
30
31
|
require 'spiderfw/model/model'
|
31
32
|
require 'spiderfw/home'
|
32
33
|
require 'spiderfw/site'
|
@@ -90,8 +90,8 @@ module Spider
|
|
90
90
|
do_update(spec, options)
|
91
91
|
end
|
92
92
|
post_update(specs[:update], options)
|
93
|
-
rescue
|
94
|
-
rollback_update
|
93
|
+
rescue
|
94
|
+
rollback_update unless options[:no_rollback]
|
95
95
|
raise
|
96
96
|
end
|
97
97
|
unless options[:no_activate]
|
@@ -496,6 +496,11 @@ module Spider
|
|
496
496
|
|
497
497
|
private
|
498
498
|
|
499
|
+
def git_command(command)
|
500
|
+
#`GIT_SSH='ssh -i #{File.join(Spider.paths[:data], 'keys', 'spider.rsa')}' git #{command}`
|
501
|
+
`git #{command}`
|
502
|
+
end
|
503
|
+
|
499
504
|
def reset_git_env
|
500
505
|
ENV['GIT_WORK_TREE'] = nil
|
501
506
|
ENV["GIT_INDEX_FILE"] = nil
|
data/lib/spiderfw/spider.rb
CHANGED
@@ -154,7 +154,10 @@ module Spider
|
|
154
154
|
@runmode = nil
|
155
155
|
self.runmode = $SPIDER_RUNMODE if $SPIDER_RUNMODE
|
156
156
|
load_configuration File.join($SPIDER_PATH, 'config')
|
157
|
-
|
157
|
+
begin
|
158
|
+
user_rc = File.join(Etc.getpwuid.dir, '.spider.conf.yml')
|
159
|
+
rescue NoMethodError # No getpwuid under windows
|
160
|
+
end
|
158
161
|
if File.file?(user_rc)
|
159
162
|
load_configuration_file(user_rc)
|
160
163
|
end
|
@@ -270,9 +270,14 @@ module Spider
|
|
270
270
|
compiler.compile(ass[:path], dest)
|
271
271
|
rescue Exception
|
272
272
|
if ext == '.less'
|
273
|
-
|
274
|
-
|
275
|
-
|
273
|
+
msg = "Unable to compile LESS file #{ass[:path]}."
|
274
|
+
msg += "Please ensure you have a JS backend (see https://github.com/sstephenson/execjs)"
|
275
|
+
elsif ext == '.scss' || ext == '.sass'
|
276
|
+
msg = "Unable to compile SASS file #{ass[:path]}."
|
277
|
+
msg += "Please ensure that you have the 'sass' (and optionally 'compass') gems installed."
|
278
|
+
end
|
279
|
+
Spider.logger.error(msg)
|
280
|
+
unless File.exist?(dest)
|
276
281
|
raise
|
277
282
|
end
|
278
283
|
end
|
@@ -405,7 +405,8 @@ module Spider
|
|
405
405
|
ass[:app] = asset_owner.app if asset_owner.respond_to?(:app)
|
406
406
|
# FIXME! @definer_class is not correct for Spider::HomeController
|
407
407
|
raise "Asset type not given for #{src}" unless type
|
408
|
-
search_classes = [asset_owner
|
408
|
+
search_classes = [asset_owner]
|
409
|
+
search_classes << @definer_class if @definer_class
|
409
410
|
dfnr = @definer_class.superclass if @definer_class && @definer_class.respond_to?(:superclass)
|
410
411
|
while dfnr && dfnr < Spider::Widget
|
411
412
|
search_classes << dfnr
|
@@ -50,6 +50,13 @@ module Spider
|
|
50
50
|
end
|
51
51
|
@controller_actions
|
52
52
|
end
|
53
|
+
|
54
|
+
def controller_action(method, params)
|
55
|
+
@controller_actions ||= []
|
56
|
+
@controller_actions << method
|
57
|
+
@controller_action_params ||= {}
|
58
|
+
@controller_action_params[method] = params
|
59
|
+
end
|
53
60
|
|
54
61
|
def controller_action?(method)
|
55
62
|
@controller_actions && @controller_actions.include?(method)
|
@@ -59,4 +66,4 @@ module Spider
|
|
59
66
|
|
60
67
|
end
|
61
68
|
|
62
|
-
end
|
69
|
+
end
|