@@ -45,12 +45,18 @@ def initialize(root, http_client = PuppetForgeServer::Http::HttpClient.new)
45
45
46
46
get '/modules' do
47
47
query = params [ :query ]
48
+ halt ( 400 , haml ( :security , :locals => { :query => query } ) ) \
49
+ unless safe_input? query
50
+
48
51
modules = get ( "#{ request . base_url } /v3/modules?query=#{ query } " ) [ 'results' ]
49
52
haml :modules , :locals => { :query => query , :modules => modules }
50
53
end
51
54
52
55
get '/module' do
53
56
module_v3_name = params [ :name ] . gsub ( /\/ / , '-' )
57
+ halt ( 400 , haml ( :security , :locals => { :query => module_v3_name } ) ) \
58
+ unless safe_input? module_v3_name
59
+
54
60
releases = get ( "#{ request . base_url } /v3/modules/#{ module_v3_name } " ) [ 'releases' ]
55
61
if params . has_key? 'version'
56
62
module_uri = releases . find { |r | r [ 'version' ] == params [ 'version' ] } [ 'uri' ]
@@ -63,7 +69,10 @@ def initialize(root, http_client = PuppetForgeServer::Http::HttpClient.new)
63
69
rescue
64
70
readme_markdown = ''
65
71
end
66
- haml :module , :locals => { :module_metadata => module_metadata , :base_url => request . base_url , :readme_markdown => readme_markdown , :releases => releases }
72
+ haml :module , :locals => { :module_metadata => module_metadata ,
73
+ :base_url => request . base_url ,
74
+ :readme_markdown => readme_markdown ,
75
+ :releases => releases }
67
76
end
68
77
69
78
get '/upload' do
@@ -84,5 +93,10 @@ def get(relative_url)
84
93
{ 'results' => [ ] }
85
94
end
86
95
end
96
+
97
+ def safe_input? ( query )
98
+ unsafe_query = CGI ::unescape ( query )
99
+ %w[ < javascript: ] . none? { |q | unsafe_query . include? ( q ) }
100
+ end
87
101
end
88
102
end
0 commit comments