p4_web_api 2014.2.0.pre4 → 2014.2.0.pre5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7928b3bca740696b9fb622b838ad6dfa0eb06857
4
- data.tar.gz: abca39306fb28d24b7c986f19d11dcf041973904
3
+ metadata.gz: 7448a94ecf26d4514482e503978244ad96ae7b41
4
+ data.tar.gz: ccc6efa9cdbac3f0d7c3c1a0ddfd96ac8d83c4fc
5
5
  SHA512:
6
- metadata.gz: 4f8f49dec8c3fcb072354ae86c4ce6e3f5ea46ece96c4a5052e8a24a7cf43499332374149dd8792302c5152026d2d908f20bac6ce4e1306025342a78c3207c21
7
- data.tar.gz: b1f84f8cc8e6c1d192b769ca9066d415571349d3f182b49c492605e5c58b3b37511f9e5565dfb8ee584105014d3d1f0f30cdd73a65048b16e84ec4c46bdd6b36
6
+ metadata.gz: 30370200a5b0cd8bc25059088d453f61e75fe73f58e666fe9e51be0ead4538a14a0ce8e5a3c581ffc5576bcc5af620921775ad8046d03e7af757efd15877c320
7
+ data.tar.gz: e0f03da79600b959d7385a46086e94dab1b03a4b8e273476ad02bc5950306ea1a9f0ccc462955bb2615b5d9481520df028b2e80f2a83e9b85ede7a8248b8876d
@@ -12,14 +12,23 @@ module P4WebAPI
12
12
  class App < Sinatra::Base
13
13
  # Special depots only variant to match no path
14
14
  get '/v1/files' do
15
+ path = params['path']
16
+
15
17
  results = nil
16
18
 
17
- open_p4 do |p4|
18
- results = p4.run_depots
19
+ if path
20
+ open_p4 do |p4|
21
+ path = "//#{path}" unless path =~ %r{^//}
22
+ results = p4.run_files(path)
23
+ end
24
+ normalize_files(results) if settings.normalize_output
25
+ else
26
+ open_p4 do |p4|
27
+ results = p4.run_depots
28
+ end
29
+ normalize_depots(results) if settings.normalize_output
19
30
  end
20
31
 
21
- normalize_depots(results) if settings.normalize_output
22
-
23
32
  results.to_json
24
33
  end
25
34
 
@@ -34,6 +43,8 @@ module P4WebAPI
34
43
  get '/v1/files/*' do
35
44
  dirs = params[:splat].select { |x| !x.empty? }
36
45
 
46
+ P4Util.assert_no_special_paths(dirs)
47
+
37
48
  results = nil
38
49
 
39
50
  open_p4 do |p4|
@@ -101,9 +112,10 @@ module P4WebAPI
101
112
  description = params['Description'] || 'Uploaded files'
102
113
  is_dir = params.key?('Files')
103
114
 
115
+ P4Util.assert_no_special_paths(path_parts)
116
+
104
117
  files = nil
105
118
  if is_dir
106
- # TODO: 'clean' the directory path, avoiding refs like '...'
107
119
  dir_root = "//#{path_parts.join('/')}"
108
120
 
109
121
  files = params['Files'].map do |f|
@@ -113,7 +125,6 @@ module P4WebAPI
113
125
  }
114
126
  end
115
127
  else
116
- # TODO: 'sanitize' this file path
117
128
  files = [
118
129
  {
119
130
  'DepotFile' => "//#{path_parts.join('/')}",
@@ -142,7 +153,8 @@ module P4WebAPI
142
153
  description = params['Description'] || 'Deleting file'
143
154
  path_parts = params[:splat].select { |x| !x.empty? }
144
155
 
145
- # TODO: 'sanitize' this file path?
156
+ P4Util.assert_no_special_paths(path_parts)
157
+
146
158
  file_path = "//#{path_parts.join('/')}"
147
159
 
148
160
  open_p4_temp_client([file_path]) do |p4|
@@ -1,5 +1,7 @@
1
1
  require 'base64'
2
2
 
3
+ require_relative 'p4_util'
4
+
3
5
  module P4WebAPI
4
6
  # This class assists in creating changelists based on an array of file
5
7
  # changes, some of which may be file uploads.
@@ -86,7 +88,7 @@ module P4WebAPI
86
88
  end
87
89
 
88
90
  def exists?
89
- !file_result.nil?
91
+ !file_result.nil? && file_result['action'] != 'delete'
90
92
  end
91
93
 
92
94
  #
@@ -104,6 +106,7 @@ module P4WebAPI
104
106
  end
105
107
 
106
108
  def upload_file(p4, change_id, client_root)
109
+ P4Util.assert_no_special_paths(@depot_file.split('/'))
107
110
  if exists?
108
111
  P4Util.mark_change('edit', p4, change_id, client_root, depot_file)
109
112
  P4Util.save_content(client_root, depot_file, content)
@@ -59,6 +59,31 @@ module P4WebAPI
59
59
  fail P4WebAPI::P4Error.new(err.msgid, err.severity, err.to_s)
60
60
  end
61
61
 
62
+ # Assert that no relative directory or Perforce wildcard is in use for each
63
+ # string in the `paths` array.
64
+ def self.assert_no_special_paths(paths)
65
+ paths.each do |path|
66
+ if P4Util.wildcard?(path)
67
+ fail P4Error.default_error("The path '#{path}' contains a Perforce "\
68
+ 'wildcard, which is not allowed')
69
+ end
70
+ if P4Util.relative_dir?(path)
71
+ fail P4Error.default_error("The path '#{path}' is a relative " \
72
+ 'directory, which is not allowed')
73
+ end
74
+ end
75
+ end
76
+
77
+ # Returns true when `str` contains a Perforce wildcard
78
+ def self.wildcard?(str)
79
+ (str =~ /\.\.\./ || str =~ /\*/) != nil
80
+ end
81
+
82
+ # Returns true if str is '.' or '..'
83
+ def self.relative_dir?(str)
84
+ str == '.' || str == '..'
85
+ end
86
+
62
87
  # Returns true if the string looks like a Perforce authentication ticket.
63
88
  def self.p4_ticket?(str)
64
89
  /^[a-zA-Z0-9]{32,}$/.match(str) != nil
@@ -2,5 +2,5 @@
2
2
  # format, with a RubyGems-style suffix for 'prereleases'. Please use your branch
3
3
  # as the prerelease label.
4
4
  module P4WebAPI
5
- VERSION = '2014.2.0.pre4'
5
+ VERSION = '2014.2.0.pre5'
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p4_web_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2014.2.0.pre4
4
+ version: 2014.2.0.pre5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Perforce Software, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-18 00:00:00.000000000 Z
11
+ date: 2015-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler