gb_mapfish_appserver 0.8.7 → 0.9.0
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/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
|