gb_mapfish_appserver 0.8.7 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/application_controller.rb +26 -0
- data/app/controllers/apps_controller.rb +7 -0
- data/app/controllers/print_controller.rb +40 -0
- data/app/controllers/token_authentications_controller.rb +20 -0
- data/app/controllers/users_controller.rb +50 -0
- data/app/controllers/wfs_controller.rb +38 -9
- data/app/controllers/wms_controller.rb +44 -11
- data/app/models/ability.rb +42 -18
- data/app/models/access_filter.rb +36 -0
- data/app/models/layer.rb +0 -4
- data/app/models/permission.rb +11 -6
- data/app/models/topic.rb +7 -4
- data/app/views/groups_users/_form.html.erb +12 -0
- data/app/views/groups_users/index.html.erb +36 -5
- data/app/views/groups_users/new.html.erb +42 -3
- data/app/views/layouts/application.html.erb +34 -15
- data/app/views/registrations/edit.html.erb +21 -0
- data/app/views/registrations/new.html.erb +1 -1
- data/app/views/users/edit.html.erb +63 -0
- data/config/routes.rb +8 -1
- data/gb_mapfish_appserver.gemspec +6 -6
- data/lib/gb_mapfish_appserver/version.rb +1 -1
- data/lib/generators/mapfish/install/install_generator.rb +1 -1
- data/test/dummy/config/environments/development.rb +1 -1
- metadata +43 -40
@@ -6,6 +6,11 @@ class ApplicationController < ActionController::Base
|
|
6
6
|
before_filter :set_zone
|
7
7
|
before_filter :set_locale
|
8
8
|
|
9
|
+
# This is our new function that comes before Devise's one
|
10
|
+
before_filter :authenticate_user_from_token!
|
11
|
+
# This is Devise's authentication
|
12
|
+
# before_filter :authenticate_user!
|
13
|
+
|
9
14
|
protected
|
10
15
|
|
11
16
|
#Zone 'intranet' or 'internet' depending on host name
|
@@ -70,4 +75,25 @@ class ApplicationController < ActionController::Base
|
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
78
|
+
# With a token setup, all you need to do is override
|
79
|
+
# your application controller to also consider token
|
80
|
+
# lookups:
|
81
|
+
|
82
|
+
|
83
|
+
# For this example, we are simply using token authentication
|
84
|
+
# via parameters. However, anyone could use Rails's token
|
85
|
+
# authentication features to get the token from a header.
|
86
|
+
def authenticate_user_from_token!
|
87
|
+
user_token = params[:USER_TOKEN].presence
|
88
|
+
user = user_token && User.find_by_authentication_token(user_token.to_s)
|
89
|
+
|
90
|
+
if user
|
91
|
+
# Notice we are passing store false, so the user is not
|
92
|
+
# actually stored in the session and a token is needed
|
93
|
+
# for every request. If you want the token to work as a
|
94
|
+
# sign in token, you can simply remove store: false.
|
95
|
+
sign_in user, :store => false
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
73
99
|
end
|
@@ -4,6 +4,10 @@ class AppsController < ApplicationController
|
|
4
4
|
@current_roles = current_roles.roles.collect(&:name)
|
5
5
|
|
6
6
|
@topic_name = params['topic'] || DEFAULT_TOPIC[@zone].name
|
7
|
+
|
8
|
+
@back_topic_name = params['back'].nil? ? nil : params['back']
|
9
|
+
@over_topic_name = params['over'].blank? ? '[]' : params['over'].split(',').to_json
|
10
|
+
|
7
11
|
@main_default_topic = DEFAULT_TOPIC[@zone].name
|
8
12
|
@offlayers = params['offlayers'].blank? ? [] : params['offlayers'].split(',')
|
9
13
|
|
@@ -11,6 +15,9 @@ class AppsController < ApplicationController
|
|
11
15
|
@x = params['x'].nil? ? DEFAULT_X : params['x'].to_f
|
12
16
|
@y = params['y'].nil? ? DEFAULT_Y : params['y'].to_f
|
13
17
|
|
18
|
+
@zoom = params['zoom'].nil? ? DEFAULT_ZOOM : params['zoom'].to_i # for mobile
|
19
|
+
@gbapp = params['gbapp'].nil? ? 'default' : params['gbapp'] # for mobile
|
20
|
+
|
14
21
|
@seltopic = params['seltopic']
|
15
22
|
@sellayer = params['sellayer']
|
16
23
|
@selproperty = params['selproperty']
|
@@ -78,6 +78,11 @@ class PrintController < ApplicationController
|
|
78
78
|
layer["customParams"].delete("DPI")
|
79
79
|
layer["customParams"]["map_resolution"] = request.parameters["dpi"]
|
80
80
|
end
|
81
|
+
|
82
|
+
topic = Topic.find_by_name(topic_name)
|
83
|
+
add_sld_body(topic, layer)
|
84
|
+
add_filter(topic, layer)
|
85
|
+
|
81
86
|
# For permission check in WMS controller: pass session as WMS request parameter
|
82
87
|
#layer["customParams"]["session"] =
|
83
88
|
else
|
@@ -199,6 +204,41 @@ class PrintController < ApplicationController
|
|
199
204
|
end
|
200
205
|
end
|
201
206
|
|
207
|
+
def add_sld_body(topic, layer)
|
208
|
+
# add SLD for selection
|
209
|
+
unless layer["customParams"]["SELECTION[LAYER]"].blank?
|
210
|
+
sld_body = Wms.sld_selection(topic,
|
211
|
+
layer["customParams"]["SELECTION[LAYER]"],
|
212
|
+
layer["customParams"]["SELECTION[PROPERTY]"],
|
213
|
+
layer["customParams"]["SELECTION[VALUES]"].split(',')
|
214
|
+
)
|
215
|
+
|
216
|
+
unless sld_body.nil?
|
217
|
+
# add serverside SLD for selection
|
218
|
+
layer["customParams"]["SLD_BODY"] = sld_body
|
219
|
+
else
|
220
|
+
logger.info "Selection layer '#{layer["customParams"]["SELECTION[LAYER]"]}' not found in topic '#{topic.name}'"
|
221
|
+
end
|
222
|
+
|
223
|
+
# remove non-WMS params
|
224
|
+
layer["customParams"].delete("SELECTION[LAYER]")
|
225
|
+
layer["customParams"].delete("SELECTION[PROPERTY]")
|
226
|
+
layer["customParams"].delete("SELECTION[VALUES]")
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def add_filter(topic, layer)
|
231
|
+
filters = Wms.access_filters(current_ability, current_user, topic, layer["layers"])
|
232
|
+
if filters.any?
|
233
|
+
filters.each do |key, value|
|
234
|
+
# remove existing filter
|
235
|
+
layer["customParams"].delete(key)
|
236
|
+
# add serverside filter
|
237
|
+
layer["customParams"][key] = value
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
202
242
|
protected
|
203
243
|
|
204
244
|
def rewrite_wms_uri(url, use_cgi)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# token_authentications_controller.rb
|
2
|
+
|
3
|
+
class TokenAuthenticationsController < ApplicationController
|
4
|
+
|
5
|
+
def create
|
6
|
+
#@user = User.criteria.id(params[:user_id]).first
|
7
|
+
@user = User.find(params[:user_id])
|
8
|
+
@user.reset_authentication_token!
|
9
|
+
redirect_to edit_user_registration_path(@user)
|
10
|
+
end
|
11
|
+
|
12
|
+
def destroy
|
13
|
+
#@user = User.criteria.id(params[:id]).first
|
14
|
+
@user = User.find(params[:id])
|
15
|
+
@user.authentication_token = nil
|
16
|
+
@user.save
|
17
|
+
redirect_to edit_user_registration_path(@user)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class UsersController < ApplicationController
|
2
|
+
|
3
|
+
before_filter :authenticate_user!
|
4
|
+
before_filter :accessible_user, :except => [:find]
|
5
|
+
|
6
|
+
def edit
|
7
|
+
end
|
8
|
+
|
9
|
+
def update
|
10
|
+
unless params[:user][:app_infos].blank?
|
11
|
+
@user.merge_app_infos(params[:user][:app_infos])
|
12
|
+
params[:user].delete(:app_infos)
|
13
|
+
end
|
14
|
+
if @user.update_attributes(params[:user])
|
15
|
+
redirect_to groups_users_url, :notice => 'Benutzer wurde erfolgreich gespeichert.'
|
16
|
+
else
|
17
|
+
render :action => "edit"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# find users by email for autocomplete
|
22
|
+
def find
|
23
|
+
users = User.where("email ILIKE ?", "#{params[:term]}%").order(:email).pluck(:email)
|
24
|
+
|
25
|
+
render :json => users
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# FIXME: use ability -> User.accessible_by(current_ability)
|
31
|
+
def accessible_user
|
32
|
+
@user = User.find(params[:id])
|
33
|
+
|
34
|
+
user_accessible = (@user.id == current_user.id) # can edit self
|
35
|
+
unless user_accessible
|
36
|
+
# check if user is in accessible group
|
37
|
+
groups = Group.accessible_by(current_ability)
|
38
|
+
@user.groups_users.each do |groups_user|
|
39
|
+
if groups.include?(groups_user.group)
|
40
|
+
user_accessible = true
|
41
|
+
break
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
unless user_accessible
|
46
|
+
raise CanCan::AccessDenied.new("Permission error")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -4,7 +4,7 @@ require 'uri'
|
|
4
4
|
class WfsController < ApplicationController
|
5
5
|
|
6
6
|
def show
|
7
|
-
logger.info "---->
|
7
|
+
logger.info "----> WFS call with user '#{current_user.try(:login)}'"
|
8
8
|
|
9
9
|
#Send redirect for public services
|
10
10
|
#if public?(params[:service], host_zone(request.host))
|
@@ -14,16 +14,17 @@ class WfsController < ApplicationController
|
|
14
14
|
# return
|
15
15
|
#end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
wfs_accessible
|
20
|
-
|
21
|
-
|
22
|
-
log_user_permissions(:show, topic) if topic
|
23
|
-
log_user_permissions(:show, Wfs.new(params[:service]))
|
17
|
+
topic_name = params[:service]
|
18
|
+
wfs_accessible = can?(:show, Wfs.new(topic_name))
|
19
|
+
unless wfs_accessible
|
20
|
+
logger.info "----> WFS '#{topic_name}' not accessible with roles #{current_roles.roles.collect(&:name).join('+')}!"
|
21
|
+
log_user_permissions(:show, Wfs.new(topic_name))
|
24
22
|
request_http_basic_authentication('Secure WFS Login')
|
25
23
|
return
|
26
24
|
end
|
25
|
+
|
26
|
+
add_filter(topic_name)
|
27
|
+
|
27
28
|
call_wfs(request)
|
28
29
|
end
|
29
30
|
|
@@ -76,7 +77,11 @@ class WfsController < ApplicationController
|
|
76
77
|
render :nothing => true
|
77
78
|
return
|
78
79
|
end
|
79
|
-
|
80
|
+
if (params[:format] == 'json')
|
81
|
+
send_data Hash.from_xml(response.body).to_json, :status => response.code, :type => {'Content-Type' => 'application/json'}, :disposition => 'inline'
|
82
|
+
else
|
83
|
+
send_data response.body, :status => response.code, :type => response.content_type, :disposition => 'inline'
|
84
|
+
end
|
80
85
|
end
|
81
86
|
|
82
87
|
#Public accessible WFS
|
@@ -90,5 +95,29 @@ class WfsController < ApplicationController
|
|
90
95
|
end
|
91
96
|
end
|
92
97
|
|
98
|
+
def add_filter(topic_name)
|
99
|
+
if !topic_name.blank? && params[:REQUEST] == "GetFeature" && !params[:TYPENAME].blank?
|
100
|
+
# get access filters for requested layers
|
101
|
+
access_filters = {}
|
102
|
+
params[:TYPENAME].split(',').each do |layer|
|
103
|
+
access_filter = current_ability.access_filter("WFS", topic_name, layer)
|
104
|
+
unless access_filter.nil?
|
105
|
+
access_filter.each do |key, value|
|
106
|
+
access_filter[key] = AccessFilter.user_value(current_user, value)
|
107
|
+
end
|
108
|
+
access_filters.merge!(access_filter)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
if access_filters.any?
|
113
|
+
# remove existing filters
|
114
|
+
access_filters.each do |key, value|
|
115
|
+
request.env["QUERY_STRING"].gsub!(/(^|&)#{key}=.+?(?=(&|$))/, '')
|
116
|
+
end
|
117
|
+
# add serverside filters
|
118
|
+
request.env["QUERY_STRING"] += "&#{access_filters.to_query}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
93
122
|
|
94
123
|
end
|
@@ -6,29 +6,32 @@ class WmsController < ApplicationController
|
|
6
6
|
def show
|
7
7
|
logger.debug "----> WMS call with user '#{current_user.try(:login)}'"
|
8
8
|
|
9
|
-
|
9
|
+
topic_name = params[:service]
|
10
|
+
topic = Topic.where(:name => topic_name).first
|
10
11
|
add_sld_body(topic)
|
12
|
+
add_filter(topic_name)
|
11
13
|
|
12
14
|
#Send redirect for public services
|
13
|
-
if request.get? && public?(
|
15
|
+
if request.get? && public?(topic_name, host_zone(request.host))
|
14
16
|
url, path = mapserv_request_url(request)
|
15
|
-
#expires_in 2.minutes, :public => true #FIXME: cache_path "wms-public-#{
|
17
|
+
#expires_in 2.minutes, :public => true #FIXME: cache_path "wms-public-#{topic_name}-#{host_zone(request.host)}"
|
16
18
|
redirect_to "#{url.scheme}://#{url.host}#{path}"
|
17
19
|
return
|
18
20
|
end
|
19
21
|
|
20
22
|
topic_accessible = topic && can?(:show, topic)
|
21
|
-
wms_accessible = can?(:show, Wms.new(
|
23
|
+
wms_accessible = can?(:show, Wms.new(topic_name))
|
24
|
+
|
22
25
|
if topic_accessible && !wms_accessible
|
23
26
|
topic_accessible = session_ok?
|
24
27
|
if !topic_accessible
|
25
|
-
logger.info "----> WMS '#{
|
28
|
+
logger.info "----> WMS '#{topic_name}' not accessible without valid session!"
|
26
29
|
end
|
27
30
|
end
|
28
31
|
if !topic_accessible && !wms_accessible && !print_request? # allow all topics for print servlet
|
29
|
-
logger.info "----> Topic/WMS '#{
|
32
|
+
logger.info "----> Topic/WMS '#{topic_name}' not accessible with roles #{current_roles.roles.collect(&:name).join('+')}!"
|
30
33
|
log_user_permissions(:show, topic) if topic
|
31
|
-
log_user_permissions(:show, Wms.new(
|
34
|
+
log_user_permissions(:show, Wms.new(topic_name))
|
32
35
|
request_http_basic_authentication('Secure WMS Login')
|
33
36
|
return
|
34
37
|
end
|
@@ -114,11 +117,11 @@ class WmsController < ApplicationController
|
|
114
117
|
logger.info "Selection layer '#{params[:SELECTION][:LAYER]}' not found in topic '#{topic.name}'"
|
115
118
|
return
|
116
119
|
end
|
117
|
-
|
118
|
-
request.env["QUERY_STRING"] += "&SLD_BODY=" + URI.escape(
|
119
|
-
sld_selection(layer, params[:SELECTION][:PROPERTY], params[:SELECTION][:VALUES].split(',')))
|
120
|
+
sld_body = sld_selection(layer, params[:SELECTION][:PROPERTY], params[:SELECTION][:VALUES].split(','))
|
120
121
|
# Remove non-WMS params
|
121
|
-
request.env["QUERY_STRING"].gsub!(
|
122
|
+
request.env["QUERY_STRING"].gsub!(/(^|&)SELECTION.+?(?=(&|$))/, '')
|
123
|
+
# add serverside SLD for selection
|
124
|
+
request.env["QUERY_STRING"] += "&SLD_BODY=" + URI.escape(sld_body)
|
122
125
|
params.delete[:SELECTION]
|
123
126
|
end
|
124
127
|
end
|
@@ -155,6 +158,36 @@ class WmsController < ApplicationController
|
|
155
158
|
sld
|
156
159
|
end
|
157
160
|
|
161
|
+
def add_filter(topic_name)
|
162
|
+
unless params[:LAYERS].blank?
|
163
|
+
filters = access_filters(topic_name, params[:LAYERS].split(','))
|
164
|
+
if filters.any?
|
165
|
+
# remove existing filters
|
166
|
+
filters.each do |key, value|
|
167
|
+
request.env["QUERY_STRING"].gsub!(/(^|&)#{key}=.+?(?=(&|$))/, '')
|
168
|
+
end
|
169
|
+
# add serverside filters
|
170
|
+
request.env["QUERY_STRING"] += "&#{filters.to_query}"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def access_filters(topic_name, layers)
|
176
|
+
access_filters = {}
|
177
|
+
unless topic_name.blank?
|
178
|
+
layers.each do |layer|
|
179
|
+
access_filter = current_ability.access_filter("WMS", topic_name, layer)
|
180
|
+
unless access_filter.nil?
|
181
|
+
access_filter.each do |key, value|
|
182
|
+
access_filter[key] = AccessFilter.user_value(current_user, value)
|
183
|
+
end
|
184
|
+
access_filters.merge!(access_filter)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
access_filters
|
189
|
+
end
|
190
|
+
|
158
191
|
#Public accessible WMS
|
159
192
|
#REMARK: permission change needs restart!
|
160
193
|
def public?(name, zone)
|
data/app/models/ability.rb
CHANGED
@@ -120,10 +120,12 @@ class Ability
|
|
120
120
|
def layer_topics_lookup
|
121
121
|
#Build a lookup hash for all layer -> topic relations
|
122
122
|
@layer_topics ||= begin
|
123
|
-
layer_topics = resources.all.inject({}) {|hsh,l| hsh[l.id] = []; hsh }
|
124
|
-
|
125
|
-
|
126
|
-
all_topics
|
123
|
+
layer_topics = resources.all.inject({}) {|hsh,l| hsh[l.id] = []; hsh }
|
124
|
+
|
125
|
+
# NOTE: query without includes(:layers) is about 5 times faster
|
126
|
+
all_topics = Topic.select("id,name")
|
127
|
+
all_topics.each {|t| t.layers.select("layers.id,layers.name").each {|l| layer_topics[l.id] << t.name} }
|
128
|
+
|
127
129
|
layer_topics
|
128
130
|
end
|
129
131
|
end
|
@@ -267,6 +269,8 @@ class Ability
|
|
267
269
|
alias_action :index, :show, :legend, :query, :to => :edit #Edit implies index and show permissions
|
268
270
|
alias_action :legend, :query, :to => :show #Show implies legend and query permissions
|
269
271
|
|
272
|
+
@access_filters = {}
|
273
|
+
|
270
274
|
@ability_roles = ability_roles
|
271
275
|
if @ability_roles.has_role?(:admin)
|
272
276
|
can :manage, :all
|
@@ -296,16 +300,23 @@ class Ability
|
|
296
300
|
|
297
301
|
#Attribute permissions
|
298
302
|
ToolResourceType.new.add_ability(self, roles)
|
299
|
-
end
|
300
303
|
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
304
|
+
#Access filters:
|
305
|
+
# {
|
306
|
+
# resource_type => {
|
307
|
+
# topic => {
|
308
|
+
# layer => condition
|
309
|
+
# }
|
310
|
+
# }
|
311
|
+
# }
|
312
|
+
AccessFilter.for_roles(roles).each do |access_filter|
|
313
|
+
@access_filters[access_filter.resource_type] ||= {}
|
314
|
+
|
315
|
+
topic, layer = access_filter.resource.split('/')
|
316
|
+
@access_filters[access_filter.resource_type][topic] ||= {}
|
317
|
+
@access_filters[access_filter.resource_type][topic][layer] = access_filter.parse_condition
|
318
|
+
end
|
319
|
+
end
|
309
320
|
end
|
310
321
|
|
311
322
|
def roles
|
@@ -317,9 +328,22 @@ class Ability
|
|
317
328
|
resource_type.roles_permissions(roles, action, resource)
|
318
329
|
end
|
319
330
|
|
320
|
-
#
|
321
|
-
#
|
322
|
-
|
323
|
-
|
324
|
-
|
331
|
+
# specific topic/layer takes precedence over "*" wildcard
|
332
|
+
# priorities: topic/layer > topic/* > */layer > */*
|
333
|
+
def access_filter(resource_type, topic, layer)
|
334
|
+
filter = nil
|
335
|
+
unless @access_filters[resource_type].nil?
|
336
|
+
unless @access_filters[resource_type][topic].nil?
|
337
|
+
# topic/layer or topic/*
|
338
|
+
filter = @access_filters[resource_type][topic][layer] || @access_filters[resource_type][topic]["*"]
|
339
|
+
end
|
340
|
+
|
341
|
+
if filter.nil? && !@access_filters[resource_type]["*"].nil?
|
342
|
+
# */layer or */*
|
343
|
+
filter = @access_filters[resource_type]["*"][layer] || @access_filters[resource_type]["*"]["*"]
|
344
|
+
end
|
345
|
+
end
|
346
|
+
filter
|
347
|
+
end
|
348
|
+
|
325
349
|
end
|
data/app/models/access_filter.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# NOTE: mark user values with "$user.<attribute>$", e.g. "$user.bfsnr$"
|
2
|
+
|
1
3
|
class AccessFilter < ActiveRecord::Base
|
2
4
|
belongs_to :role
|
3
5
|
|
@@ -5,4 +7,38 @@ class AccessFilter < ActiveRecord::Base
|
|
5
7
|
|
6
8
|
scope :for_roles, lambda { |roles| where(:role_id => roles.collect(&:id)) }
|
7
9
|
|
10
|
+
def parse_condition
|
11
|
+
if ["WMS", "WFS"].include?(resource_type)
|
12
|
+
wms_condition = condition
|
13
|
+
begin
|
14
|
+
# try to parse as JSON
|
15
|
+
wms_condition = JSON.parse(wms_condition)
|
16
|
+
rescue => err
|
17
|
+
Rails.logger.info "Could not parse #{resource_type} condition for #{role.name} #{resource} as JSON: #{err}"
|
18
|
+
end
|
19
|
+
wms_condition
|
20
|
+
else
|
21
|
+
condition
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.user_value(user, value)
|
26
|
+
# replace "$user.<attribute>$" placeholders with user.app_infos[<attribute>] values
|
27
|
+
user_attributes = value.to_s.scan(/\$user\.(\w+)\$/).flatten
|
28
|
+
unless user_attributes.empty?
|
29
|
+
if user.nil?
|
30
|
+
# empty values if no user
|
31
|
+
value.sub(/\$user\.(\w+)\$/, '')
|
32
|
+
else
|
33
|
+
user_attributes.each do |key|
|
34
|
+
# replace placeholder with value from user.app_infos
|
35
|
+
value.sub!(/\$user\.#{key}\$/, user.app_infos[key] || '')
|
36
|
+
end
|
37
|
+
value
|
38
|
+
end
|
39
|
+
else
|
40
|
+
value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
8
44
|
end
|
data/app/models/layer.rb
CHANGED
@@ -103,10 +103,6 @@ EOS
|
|
103
103
|
#logger.info "************************* Attribute for name '#{name}': #{@attrs[name].inspect}"
|
104
104
|
end
|
105
105
|
|
106
|
-
#def filtered(ability)
|
107
|
-
# feature_class.where(ability.resource_access_filter(self))
|
108
|
-
#end
|
109
|
-
|
110
106
|
def query_fields(ability)
|
111
107
|
return '' if feature_class.nil?
|
112
108
|
([pkey]+ident_fields_for(ability)+[feature_class.extent_field, feature_class.area_field]).join(',')
|
data/app/models/permission.rb
CHANGED
@@ -47,7 +47,7 @@ class Permission < ActiveRecord::Base
|
|
47
47
|
def role_can?(role_id, action, resource)
|
48
48
|
ActiveRecord::Base.silence do
|
49
49
|
can = if has_resource_list?
|
50
|
-
permitted_resources(role_id, action).include?(resource)
|
50
|
+
permitted_resources(role_id, action, resources).include?(resource)
|
51
51
|
else
|
52
52
|
permitted?(resource, permissions(role_id, action))
|
53
53
|
end
|
@@ -67,6 +67,7 @@ class Permission < ActiveRecord::Base
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def roles_can?(roles, action, resource)
|
70
|
+
# find first permitted role if any
|
70
71
|
roles.find { |role| role_can?(role.id, action, resource) }
|
71
72
|
end
|
72
73
|
|
@@ -74,6 +75,7 @@ class Permission < ActiveRecord::Base
|
|
74
75
|
ActiveRecord::Base.silence do
|
75
76
|
actions.each do |action|
|
76
77
|
if has_resource_list?
|
78
|
+
# use Rails cache
|
77
79
|
ids = Rails.cache.fetch("permitted_resource_ids-#{action}-#{@resource_type_name}-roles-#{roles.collect(&:id).join(',')}") do
|
78
80
|
permitted_resource_ids(roles, action)
|
79
81
|
end
|
@@ -90,10 +92,12 @@ class Permission < ActiveRecord::Base
|
|
90
92
|
|
91
93
|
protected
|
92
94
|
|
95
|
+
# higher sequence takes precedence
|
93
96
|
def permitted?(resource, permissions)
|
94
97
|
allow = false
|
95
98
|
permissions.each do |permission|
|
96
99
|
if permission.deny
|
100
|
+
# NOTE: permissions with higher sequence will override this, so deny permissions should have highest sequence
|
97
101
|
allow = false if compare(resource, permission.resource)
|
98
102
|
else
|
99
103
|
allow ||= compare(resource, permission.resource)
|
@@ -102,10 +106,10 @@ class Permission < ActiveRecord::Base
|
|
102
106
|
allow
|
103
107
|
end
|
104
108
|
|
105
|
-
#All resource
|
106
|
-
def permitted_resources(role_id, action)
|
109
|
+
#All resource permissions for a given role_id + action
|
110
|
+
def permitted_resources(role_id, action, resources_list)
|
107
111
|
permissions = permissions(role_id, action)
|
108
|
-
|
112
|
+
resources_list.select do |r|
|
109
113
|
permitted?(r, permissions)
|
110
114
|
end
|
111
115
|
end
|
@@ -114,11 +118,12 @@ class Permission < ActiveRecord::Base
|
|
114
118
|
def permitted_resource_ids(roles, action)
|
115
119
|
ids = []
|
116
120
|
return ids if !has_resource_list?
|
117
|
-
|
121
|
+
resources_list = resources.all # load resources here to optimize loop below
|
122
|
+
roles.each { |role| ids += permitted_resources(role.id, action, resources_list).collect(&:id) }
|
118
123
|
ids.sort.uniq
|
119
124
|
end
|
120
125
|
|
121
|
-
#All permissions for a given role_id + action
|
126
|
+
#All permissions for a given role_id + action, ordered by sequence
|
122
127
|
def permissions(role_id, action)
|
123
128
|
Permission.where(:role_id => role_id,
|
124
129
|
:resource_type => @resource_type_name, :action => action).order(
|
data/app/models/topic.rb
CHANGED
@@ -42,8 +42,9 @@ class Topic < ActiveRecord::Base
|
|
42
42
|
app.gbapplications_categories.includes(:category).each do |gbapplications_category|
|
43
43
|
category = gbapplications_category.category
|
44
44
|
unless category.nil?
|
45
|
-
category_topics = category.topics.accessible_by(current_ability)
|
46
|
-
|
45
|
+
category_topics = category.topics.accessible_by(current_ability)
|
46
|
+
category_topics = category_topics.includes(:organisation).includes(:bg_topic).includes(:overlay_topics) # optimize query performance
|
47
|
+
category_topics.select('topics.*,categories_topics.sort AS categories_topics_sort')
|
47
48
|
topics += category_topics.collect do |topic|
|
48
49
|
subtopics = category_topics.select{|t| t.parent_id == topic.id}.collect do |subtopic|
|
49
50
|
{
|
@@ -188,8 +189,10 @@ class Topic < ActiveRecord::Base
|
|
188
189
|
end
|
189
190
|
|
190
191
|
def query_layers(ability, active_layers) #TODO: 0.5s
|
191
|
-
|
192
|
-
|
192
|
+
ActiveRecord::Base.silence do
|
193
|
+
layers.accessible_by(ability).where('topics_layers.queryable').order('topics_layers.leg_sort DESC').find_all do |layer|
|
194
|
+
active_layers.include?(layer.name)
|
195
|
+
end
|
193
196
|
end
|
194
197
|
end
|
195
198
|
|
@@ -17,12 +17,24 @@
|
|
17
17
|
<%= @groups_user.group.name %>
|
18
18
|
</div>
|
19
19
|
</div>
|
20
|
+
<div class="row">
|
21
|
+
<%= f.label 'Login name' %>
|
22
|
+
<div class="input uneditable-input">
|
23
|
+
<%= @groups_user.user.login %>
|
24
|
+
</div>
|
25
|
+
</div>
|
20
26
|
<div class="row">
|
21
27
|
<%= f.label 'User' %>
|
22
28
|
<div class="input uneditable-input">
|
23
29
|
<%= @groups_user.user.name %>
|
24
30
|
</div>
|
25
31
|
</div>
|
32
|
+
<div class="row">
|
33
|
+
<%= f.label 'Email' %>
|
34
|
+
<div class="input uneditable-input">
|
35
|
+
<a href="mailto:<%= @groups_user.user.email %>?Subject=Bestätigung&Body=<%= render @mail_body %>"><%= @groups_user.user.email %></a>
|
36
|
+
</div>
|
37
|
+
</div>
|
26
38
|
<div class="row">
|
27
39
|
<%= f.label :granted %>
|
28
40
|
<div class="input">
|
@@ -1,24 +1,34 @@
|
|
1
|
+
<% if @groups.any? || @groups_users.any? %>
|
1
2
|
<h1>Usergruppen Verwaltung</h1>
|
3
|
+
<% end %>
|
2
4
|
|
5
|
+
<% if @groups.any? %>
|
3
6
|
<table>
|
4
7
|
<tr>
|
5
8
|
<th>Group</th>
|
6
9
|
<th>Signup-Link</th>
|
10
|
+
<th></th>
|
7
11
|
</tr>
|
8
12
|
|
9
13
|
<% @groups.each do |group| %>
|
10
14
|
<tr>
|
11
15
|
<td><%= group.name %></td>
|
12
16
|
<td><%= link_to new_user_registration_url(:group => group.name), new_user_registration_path(:group => group.name) %></td>
|
17
|
+
<td><%= link_to 'User hinzufügen', new_groups_user_path({:group => group}) %></td>
|
13
18
|
</tr>
|
14
19
|
<% end %>
|
15
20
|
</table>
|
21
|
+
<% end %>
|
16
22
|
|
23
|
+
<% if @groups_users.any? %>
|
17
24
|
<table>
|
18
25
|
<tr>
|
19
26
|
<th>Group</th>
|
27
|
+
<th>Login</th>
|
20
28
|
<th>User</th>
|
29
|
+
<th>EMail</th>
|
21
30
|
<th>Granted</th>
|
31
|
+
<th>Info</th>
|
22
32
|
<th></th>
|
23
33
|
<th></th>
|
24
34
|
</tr>
|
@@ -26,14 +36,35 @@
|
|
26
36
|
<% @groups_users.each do |groups_user| %>
|
27
37
|
<tr>
|
28
38
|
<td><%= groups_user.group.name %></td>
|
39
|
+
<td><%= link_to groups_user.user.login, edit_user_path(groups_user.user) %></td>
|
29
40
|
<td><%= groups_user.user.name %></td>
|
30
|
-
<td><%= groups_user.
|
31
|
-
<td><%= link_to
|
32
|
-
<td
|
41
|
+
<td><%= groups_user.user.email %></td>
|
42
|
+
<td><%= link_to groups_user.granted.to_s, edit_groups_user_path(groups_user) %></td>
|
43
|
+
<td>
|
44
|
+
<% unless groups_user.user.app_infos.nil? %>
|
45
|
+
<% groups_user.user.app_infos.each do |key, value| %>
|
46
|
+
<i><%= key %></i>: <%= value %><br/>
|
47
|
+
<% end %>
|
48
|
+
<% end %>
|
49
|
+
</td>
|
50
|
+
<td><%= link_to 'Bearbeiten', edit_user_path(groups_user.user) %></td>
|
51
|
+
<td><%= link_to 'Entfernen', groups_user, :confirm => 'Benutzer aus Gruppe entfernen?', :method => :delete %></td>
|
33
52
|
</tr>
|
34
53
|
<% end %>
|
35
54
|
</table>
|
55
|
+
<% end %>
|
36
56
|
|
37
|
-
<
|
57
|
+
<h1>Eigene Gruppen</h1>
|
38
58
|
|
39
|
-
|
59
|
+
<table>
|
60
|
+
<tr>
|
61
|
+
<th>Gruppe</th>
|
62
|
+
<th>Freigeschaltet</th>
|
63
|
+
</tr>
|
64
|
+
<% current_user.groups_users.each do |groups_user| %>
|
65
|
+
<tr>
|
66
|
+
<td><%= groups_user.group.name %></td>
|
67
|
+
<td><%= groups_user.granted ? "ja" : "nein" %></td>
|
68
|
+
</tr>
|
69
|
+
<% end %>
|
70
|
+
</table>
|
@@ -1,5 +1,44 @@
|
|
1
|
-
|
1
|
+
<% content_for :head do %>
|
2
|
+
<script type="text/javascript">
|
3
|
+
$(function() {
|
4
|
+
$('#user_email').autocomplete({
|
5
|
+
source: '/users/find.json',
|
6
|
+
minLength: 3
|
7
|
+
});
|
8
|
+
});
|
9
|
+
</script>
|
10
|
+
<% end %>
|
2
11
|
|
3
|
-
|
12
|
+
<h1>Benutzer zu Gruppe hinzufügen</h1>
|
4
13
|
|
5
|
-
<%=
|
14
|
+
<%= form_for(@groups_user) do |f| %>
|
15
|
+
<% if @groups_user.errors.any? %>
|
16
|
+
<div id="error_explanation">
|
17
|
+
<h2><%= pluralize(@groups_user.errors.count, "error") %> prohibited this groups_user from being saved:</h2>
|
18
|
+
|
19
|
+
<ul>
|
20
|
+
<% @groups_user.errors.full_messages.each do |msg| %>
|
21
|
+
<li><%= msg %></li>
|
22
|
+
<% end %>
|
23
|
+
</ul>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<%= f.hidden_field :group_id, :value => @group.id %>
|
28
|
+
<div class="row">
|
29
|
+
<%= f.label 'Gruppe' %>
|
30
|
+
<div class="input uneditable-input">
|
31
|
+
<%= @groups_user.group.name %>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
<div class="row">
|
35
|
+
<%= f.label :user_email, 'Benutzer E-Mail' %>
|
36
|
+
<%= text_field_tag :user_email %>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div class="actions">
|
40
|
+
<%= f.submit "Benutzer hinzufügen" %>
|
41
|
+
</div>
|
42
|
+
<% end %>
|
43
|
+
|
44
|
+
<%= link_to 'Zurück', groups_users_path %>
|
@@ -2,15 +2,30 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>GIS-Browser Admin</title>
|
5
|
-
|
5
|
+
<%= stylesheet_link_tag :application, :media => "all" %>
|
6
6
|
<% if HOST_ZONE[request.host] == 'intranet' %>
|
7
7
|
<%= stylesheet_link_tag 'http://www.intranet.ktzh.ch/css/global.css' %>
|
8
8
|
<%= stylesheet_link_tag 'http://www.intranet.ktzh.ch/css/intranet.css' %>
|
9
9
|
<% else %>
|
10
10
|
<%= stylesheet_link_tag 'http://www.zh.ch/css/global.css' %>
|
11
11
|
<% end %>
|
12
|
+
<style type="text/css">
|
13
|
+
div.alert-message {
|
14
|
+
background-color: #F2FBF2;
|
15
|
+
border: 2px solid #23C123;
|
16
|
+
color: #23C123;
|
17
|
+
margin-bottom: 30px;
|
18
|
+
padding: 5px 51px 5px 10px;
|
19
|
+
}
|
20
|
+
div.alert-message.error {
|
21
|
+
background-color: #FBF2F2;
|
22
|
+
border: 2px solid #C12323;
|
23
|
+
color: #C12323;
|
24
|
+
}
|
25
|
+
</style>
|
12
26
|
<%= javascript_include_tag :application %>
|
13
27
|
<%= csrf_meta_tags %>
|
28
|
+
<%= yield :head %>
|
14
29
|
</head>
|
15
30
|
|
16
31
|
<body>
|
@@ -26,34 +41,38 @@
|
|
26
41
|
<div id="nav-meta" role="navigation">
|
27
42
|
<ul>
|
28
43
|
<% if user_signed_in? %>
|
29
|
-
|
44
|
+
<li><%= link_to current_user.login, edit_user_path(current_user) %></li>
|
30
45
|
<li><%= link_to('Usergruppen', groups_users_path) %></li>
|
31
46
|
<% else %>
|
32
47
|
<li><%= link_to "Anmelden", new_user_session_path %></li>
|
33
48
|
<% end%>
|
34
49
|
<li><%= link_to "Karte", root_path %></li>
|
50
|
+
<% if user_signed_in? %>
|
51
|
+
<li><%= link_to "Abmelden", destroy_user_session_path %></li>
|
52
|
+
<% end %>
|
35
53
|
</ul>
|
36
54
|
</div>
|
37
55
|
|
38
56
|
<div id="main-area">
|
57
|
+
<div id="content-column">
|
58
|
+
|
39
59
|
|
40
60
|
<% if flash.present? %>
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
<br/>
|
50
|
-
</div>
|
61
|
+
<% flash.each do |key, value| %>
|
62
|
+
<div class='<%= key == :alert ? 'error-required-box' : "alert-message #{key}" %>'>
|
63
|
+
<p>
|
64
|
+
<%= value %>
|
65
|
+
</p>
|
66
|
+
<br/>
|
67
|
+
</div>
|
68
|
+
<% end %>
|
51
69
|
<% end %>
|
52
70
|
|
53
71
|
<%= yield %>
|
54
72
|
|
55
73
|
<hr />
|
56
74
|
</div>
|
75
|
+
</div>
|
57
76
|
|
58
77
|
<div id="footer" role="complementary">
|
59
78
|
|
@@ -61,13 +80,13 @@
|
|
61
80
|
|
62
81
|
<ul>
|
63
82
|
<li class="copyright">
|
64
|
-
©
|
83
|
+
© 2013 Kanton Zürich
|
65
84
|
</li>
|
66
85
|
<li >
|
67
|
-
<a href="http://www.zh.ch/internet/de/service/nav/footer/nutzungsregelungen.html">Nutzungsregelungen</a>
|
86
|
+
<a href="http://www.zh.ch/internet/de/service/nav/footer/nutzungsregelungen.html" target="_blank">Nutzungsregelungen</a>
|
68
87
|
</li>
|
69
88
|
<li >
|
70
|
-
<a href="http://www.zh.ch/internet/de/service/nav/footer/impressum.html">Impressum</a>
|
89
|
+
<a href="http://www.zh.ch/internet/de/service/nav/footer/impressum.html" target="_blank">Impressum</a>
|
71
90
|
</li>
|
72
91
|
</ul>
|
73
92
|
<div class="clear"></div>
|
@@ -31,4 +31,25 @@
|
|
31
31
|
<div class="row">
|
32
32
|
<%= f.submit "Update" %>
|
33
33
|
</div>
|
34
|
+
|
35
|
+
<div class="row">
|
36
|
+
<%= f.label :token_authentication_key %>
|
37
|
+
<p><%= resource.authentication_token.blank? ? "Token Empty" : resource.authentication_token %></p>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<div class="row">
|
41
|
+
<%= link_to "Generate Token", token_authentications_path(:user_id => resource.id), :method => :post, :confirm => "Are you sure?" %>
|
42
|
+
<%= link_to "Delete Token", token_authentication_path(resource), :method => :delete, :confirm => "Are you sure?" %>
|
43
|
+
</div>
|
44
|
+
|
45
|
+
<div class="row">
|
46
|
+
<% if resource.authentication_token %>
|
47
|
+
<p>You can use this url to login<br />
|
48
|
+
<%= link_to "http://maps.zh.ch#{root_path(:user_token => resource.authentication_token)}", root_path(:user_token => resource.authentication_token) %></p>
|
49
|
+
<% end %>
|
50
|
+
</div>
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
34
55
|
<% end %>
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<h2>Benutzer bearbeiten</h2>
|
2
|
+
|
3
|
+
<%= form_for @user do |f| %>
|
4
|
+
<% if @user.errors.any? %>
|
5
|
+
<div id="error_explanation">
|
6
|
+
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this groups_user from being saved:</h2>
|
7
|
+
|
8
|
+
<ul>
|
9
|
+
<% @user.errors.full_messages.each do |msg| %>
|
10
|
+
<li><%= msg %></li>
|
11
|
+
<% end %>
|
12
|
+
</ul>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<div class="row">
|
17
|
+
<%= f.label 'Login' %>
|
18
|
+
<div class="input uneditable-input">
|
19
|
+
<%= @user.login %>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div class="row">
|
24
|
+
<%= f.label 'Name' %>
|
25
|
+
<div class="input uneditable-input">
|
26
|
+
<%= @user.name %>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div class="row">
|
31
|
+
<%= f.label 'E-Mail' %>
|
32
|
+
<div class="input uneditable-input">
|
33
|
+
<%= @user.email %>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<% if current_user.id == @user.id %>
|
38
|
+
<%= link_to "Bearbeiten", edit_user_registration_path(current_user) %>
|
39
|
+
<% end %>
|
40
|
+
|
41
|
+
<% @user.groups_users.each do |groups_user| %>
|
42
|
+
<% next if groups_user.group.nil? %>
|
43
|
+
<% if File.exist?(File.join(Rails.root, 'app', 'views', 'registrations', groups_user.group.name)) && (@user.id == current_user.id || current_user.group_admin?(groups_user.group)) %>
|
44
|
+
<fieldset>
|
45
|
+
<legend><%= groups_user.group.name %> (<%= groups_user.granted ? "freigeschaltet" : "nicht freigeschaltet" %>)</legend>
|
46
|
+
<%= render :partial => "registrations/#{groups_user.group.name}/app_infos", :locals => {:f => f} %>
|
47
|
+
<%# show user filter fields to group admins only %>
|
48
|
+
<% if current_user.group_admin?(groups_user.group) && File.exist?(File.join(Rails.root, 'app', 'views', 'registrations', groups_user.group.name, '_filters.html.erb')) %>
|
49
|
+
<div class="row">
|
50
|
+
<b><%= f.label "Filter" %></b>
|
51
|
+
</div>
|
52
|
+
<%= render :partial => "registrations/#{groups_user.group.name}/filters", :locals => {:f => f} %>
|
53
|
+
<% end %>
|
54
|
+
</fieldset>
|
55
|
+
<% end %>
|
56
|
+
<% end %>
|
57
|
+
|
58
|
+
<div class="actions">
|
59
|
+
<%= f.submit "Benutzer speichern" %>
|
60
|
+
</div>
|
61
|
+
<% end %>
|
62
|
+
|
63
|
+
<%= link_to 'Zurück', groups_users_path %>
|
data/config/routes.rb
CHANGED
@@ -11,10 +11,17 @@ Rails.application.routes.draw do
|
|
11
11
|
match '/session/welcome' => "registrations#index", :as => :user_welcome
|
12
12
|
match '/session/login' => "registrations#login", :as => :user_login
|
13
13
|
match '/session/logout' => "registrations#logout", :as => :user_logout
|
14
|
+
match '/session/confirm' => "registrations#confirm", :as => :user_confirm
|
14
15
|
end
|
15
16
|
|
17
|
+
resources :token_authentications, :only => [:create, :destroy]
|
16
18
|
|
17
|
-
resources :groups_users
|
19
|
+
resources :groups_users do
|
20
|
+
get :register, :on => :collection
|
21
|
+
end
|
22
|
+
resources :users do
|
23
|
+
get :find, :on => :collection
|
24
|
+
end
|
18
25
|
|
19
26
|
resources :topics_layers
|
20
27
|
|
@@ -19,20 +19,20 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.add_dependency "json"
|
20
20
|
s.add_dependency "acts_as_tree", "0.2.0"
|
21
21
|
|
22
|
-
s.add_dependency "devise", "2.0
|
23
|
-
s.add_dependency "cancan", "1.6.
|
22
|
+
s.add_dependency "devise", "~> 2.2.0"
|
23
|
+
s.add_dependency "cancan", "~> 1.6.8"
|
24
24
|
|
25
|
-
s.add_dependency "rails_admin", "0.0
|
25
|
+
s.add_dependency "rails_admin", "~> 0.4.0"
|
26
26
|
s.add_dependency "fastercsv"# required for rails_admin and Ruby <= 1.8
|
27
27
|
s.add_dependency "sass", "~> 3.2.12" # rails_admin 0.0.5 does not work with sass >=3.3
|
28
28
|
|
29
29
|
s.add_dependency "GeoRuby", ">= 0.1.4" #used for reading envelope, e.g. in GeoModel#bbox
|
30
30
|
|
31
|
-
s.add_dependency "rgeo", "0.3.20"
|
32
|
-
s.add_dependency "rgeo-geojson", "0.2.
|
31
|
+
s.add_dependency "rgeo", "~> 0.3.20"
|
32
|
+
s.add_dependency "rgeo-geojson", "~> 0.2.3"
|
33
33
|
|
34
34
|
s.add_dependency "hpricot" # Cascaded WMS FeatureInfo parsing
|
35
35
|
|
36
|
-
s.add_dependency "pg", "0.14.0"
|
36
|
+
s.add_dependency "pg", "~> 0.14.0"
|
37
37
|
s.add_dependency "activerecord-postgis-adapter", "0.4.1"
|
38
38
|
end
|
@@ -75,7 +75,7 @@ module Mapfish
|
|
75
75
|
#Parts for building a Mapserver URL
|
76
76
|
# Example: http://localhost/cgi-bin/mapserv.fcgi?map=#{Rails.root}/mapconfig/#{options["default-site-name"]}/naturalearth.map)
|
77
77
|
MAPSERV_SERVER = 'http://localhost' #nil for current application server
|
78
|
-
MAPSERV_URL = '/cgi-bin/mapserv
|
78
|
+
MAPSERV_URL = '/cgi-bin/mapserv'
|
79
79
|
MAPSERV_CGI_URL = '/cgi-bin/mapserv'
|
80
80
|
MAPPATH = '#{Rails.root}/mapconfig'
|
81
81
|
|
@@ -39,7 +39,7 @@ end
|
|
39
39
|
#Parts for building a Mapserver URL
|
40
40
|
# Example: http://localhost/cgi-bin/mapserv.fcgi?map=/home/pi/code/rails/dummy/mapconfig/maps.example.com/naturalearth.map)
|
41
41
|
MAPSERV_SERVER = 'http://localhost' #nil for current application server
|
42
|
-
MAPSERV_URL = '/cgi-bin/mapserv
|
42
|
+
MAPSERV_URL = '/cgi-bin/mapserv'
|
43
43
|
MAPSERV_CGI_URL = '/cgi-bin/mapserv'
|
44
44
|
MAPPATH = '/home/pi/code/rails/gb_mapfish_appserver/test/dummy/mapconfig'
|
45
45
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gb_mapfish_appserver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-05-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &23267300 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.2.13
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *23267300
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: json
|
27
|
-
requirement: &
|
27
|
+
requirement: &23281540 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *23281540
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: acts_as_tree
|
38
|
-
requirement: &
|
38
|
+
requirement: &23280980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - =
|
@@ -43,43 +43,43 @@ dependencies:
|
|
43
43
|
version: 0.2.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *23280980
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: devise
|
49
|
-
requirement: &
|
49
|
+
requirement: &23280440 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 2.0
|
54
|
+
version: 2.2.0
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *23280440
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: cancan
|
60
|
-
requirement: &
|
60
|
+
requirement: &23279720 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
|
-
- -
|
63
|
+
- - ~>
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version: 1.6.
|
65
|
+
version: 1.6.8
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *23279720
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rails_admin
|
71
|
-
requirement: &
|
71
|
+
requirement: &23279060 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ~>
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: 0.0
|
76
|
+
version: 0.4.0
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *23279060
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: fastercsv
|
82
|
-
requirement: &
|
82
|
+
requirement: &23278480 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *23278480
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: sass
|
93
|
-
requirement: &
|
93
|
+
requirement: &23277660 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 3.2.12
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *23277660
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: GeoRuby
|
104
|
-
requirement: &
|
104
|
+
requirement: &23276940 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,32 +109,32 @@ dependencies:
|
|
109
109
|
version: 0.1.4
|
110
110
|
type: :runtime
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *23276940
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: rgeo
|
115
|
-
requirement: &
|
115
|
+
requirement: &23276220 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
|
-
- -
|
118
|
+
- - ~>
|
119
119
|
- !ruby/object:Gem::Version
|
120
120
|
version: 0.3.20
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *23276220
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: rgeo-geojson
|
126
|
-
requirement: &
|
126
|
+
requirement: &23275540 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - ~>
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.2.
|
131
|
+
version: 0.2.3
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *23275540
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: hpricot
|
137
|
-
requirement: &
|
137
|
+
requirement: &23274960 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ! '>='
|
@@ -142,21 +142,21 @@ dependencies:
|
|
142
142
|
version: '0'
|
143
143
|
type: :runtime
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *23274960
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: pg
|
148
|
-
requirement: &
|
148
|
+
requirement: &23290800 !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
151
|
-
- -
|
151
|
+
- - ~>
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: 0.14.0
|
154
154
|
type: :runtime
|
155
155
|
prerelease: false
|
156
|
-
version_requirements: *
|
156
|
+
version_requirements: *23290800
|
157
157
|
- !ruby/object:Gem::Dependency
|
158
158
|
name: activerecord-postgis-adapter
|
159
|
-
requirement: &
|
159
|
+
requirement: &23290300 !ruby/object:Gem::Requirement
|
160
160
|
none: false
|
161
161
|
requirements:
|
162
162
|
- - =
|
@@ -164,7 +164,7 @@ dependencies:
|
|
164
164
|
version: 0.4.1
|
165
165
|
type: :runtime
|
166
166
|
prerelease: false
|
167
|
-
version_requirements: *
|
167
|
+
version_requirements: *23290300
|
168
168
|
description: Mapfish Appserver is a framework for web mapping applications using OGC
|
169
169
|
standards and the Mapfish protocol.
|
170
170
|
email:
|
@@ -191,8 +191,10 @@ files:
|
|
191
191
|
- app/controllers/print_controller.rb
|
192
192
|
- app/controllers/registrations_controller.rb
|
193
193
|
- app/controllers/search_controller.rb
|
194
|
+
- app/controllers/token_authentications_controller.rb
|
194
195
|
- app/controllers/topics_controller.rb
|
195
196
|
- app/controllers/upload_controller.rb
|
197
|
+
- app/controllers/users_controller.rb
|
196
198
|
- app/controllers/wfs_controller.rb
|
197
199
|
- app/controllers/wms_controller.rb
|
198
200
|
- app/helpers/application_helper.rb
|
@@ -261,6 +263,7 @@ files:
|
|
261
263
|
- app/views/topics/_print_disclaimer.txt
|
262
264
|
- app/views/topics/legend.html.erb
|
263
265
|
- app/views/topics/query.html.erb
|
266
|
+
- app/views/users/edit.html.erb
|
264
267
|
- config/initializers/devise.rb
|
265
268
|
- config/initializers/geodb.rb
|
266
269
|
- config/initializers/mime_types.rb
|