passwordstate 0.0.1 → 0.0.2

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
  SHA256:
3
- metadata.gz: ab1c9b2c6cb3727612e991d77631ddf61d266c7a0b5ba26a5c835b5d349c51e6
4
- data.tar.gz: 18f155663d7592f40c0dd54b09b13d075c0e2d1265a1e993ad1c2cc7811e1e3d
3
+ metadata.gz: e3e65ba47af619efcf537b2636eb297ac1cbe7a1c423c323e44a0126f27a5e2e
4
+ data.tar.gz: 5829c7ee7bf3af1d9098246e16f53f06f29d2002683cf8aed15b87a900e50bec
5
5
  SHA512:
6
- metadata.gz: d3ad29d420d8bfb75bd7418747933716914b311fd87c8d50ee83451aed8de2a06d363ec2709823b3a3be11bfe68ea510359ab93638a483d45dcdd80fb1744b37
7
- data.tar.gz: 6ddc4c5bcd72c5a03da7f046eeca3fec8113ba23c88d71a5d45901923ff01b0294eddf9dfa02cd937bc70698869bbdd68beb69673732a177879087ea159a251d
6
+ metadata.gz: 96b62d8b3701e7779c035f7bdb05cf4b6ab5540fa74749742169bde51e093ccbe2d255c50309965c3f056bd5081fb24e438dd3f04e096a55cee12e3301b755a1
7
+ data.tar.gz: 5ed0bc2e7d0c7f922cb1ceee760d3a090381afda9a952d9fb98919eaedc1eee7cb1fecd5d18d3e65f28f6be5564a3eda13f35a8cd0e6a5f25ef8e10b26671b24
data/.gitlab-ci.yml CHANGED
@@ -14,6 +14,17 @@ rubocop:
14
14
  script:
15
15
  - bundle exec rubocop
16
16
 
17
+ pages:
18
+ stage: deploy
19
+ script:
20
+ - gem install yard
21
+ - yard doc -o public/
22
+ artifacts:
23
+ paths:
24
+ - public/
25
+ only:
26
+ - master
27
+
17
28
  # rspec:
18
29
  # script:
19
30
  # - rspec spec
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ ## v0.0.2 2018-08-14
2
+
3
+ - Add title and full_path fields to the appropriate resources - almost every resource should now have an obvious human-readable name
4
+ - Fix password searching in password lists
5
+ - Improved exception handling
6
+
7
+ ## v0.0.1 2018-07-31
8
+
9
+ - Initial release
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A ruby gem for communicating with a Passwordstate instance
4
4
 
5
+ The documentation for the development version can be found at http://iti.gitlab-pages.liu.se/ruby-passwordstate
6
+
5
7
  ## Installation
6
8
 
7
9
  Add this line to your application's Gemfile:
@@ -88,7 +88,8 @@ module Passwordstate
88
88
  if data
89
89
  return data if res_obj.is_a? Net::HTTPSuccess
90
90
  data = data&.first
91
- raise Passwordstate::HTTPError.new(res_obj.code, data&.fetch('errors', []) || [])
91
+
92
+ raise Passwordstate::HTTPError.new_by_code(res_obj.code, req_obj, res_obj, data&.fetch('errors', []) || [])
92
93
  else
93
94
  return res_obj.body if options.fetch(:allow_html, false)
94
95
  raise Passwordstate::PasswordstateError, 'Response was not parseable as JSON'
@@ -110,7 +111,7 @@ module Passwordstate
110
111
  @http.start
111
112
  end
112
113
 
113
- def print_http(http)
114
+ def print_http(http, truncate = true)
114
115
  return unless logger.debug?
115
116
 
116
117
  if http.is_a? Net::HTTPRequest
@@ -132,7 +133,9 @@ module Passwordstate
132
133
  else
133
134
  clean_body = http.body
134
135
  end
135
- logger.debug "#{dir} #{clean_body.length < 200 ? clean_body : clean_body.slice(0..200) + "... [truncated, #{clean_body.length} Bytes]"}" if clean_body
136
+
137
+ clean_body = clean_body.slice(0..2000) + "... [truncated, #{clean_body.length} Bytes total]" if truncate && clean_body.length > 2000
138
+ logger.debug "#{dir} #{clean_body}" if clean_body
136
139
  end
137
140
  end
138
141
  end
@@ -2,10 +2,12 @@ module Passwordstate
2
2
  class PasswordstateError < RuntimeError; end
3
3
 
4
4
  class HTTPError < PasswordstateError
5
- attr_reader :code, :errors
5
+ attr_reader :code, :request, :response, :errors
6
6
 
7
- def initialize(code, errors = [])
7
+ def initialize(code, request, response, errors = [])
8
8
  @code = code.to_i
9
+ @request = request
10
+ @response = response
9
11
  @errors = errors
10
12
 
11
13
  super <<-ERRMSG
@@ -13,5 +15,38 @@ Passwordstate responded with an error to the request;
13
15
  #{errors.map { |err| err['message'] || err['phrase'] }.join(', ')}
14
16
  ERRMSG
15
17
  end
18
+
19
+ def self.new_by_code(code, req, res, errors = [])
20
+ code_i = code.to_i
21
+
22
+ errtype = nil
23
+ errtype ||= NotFoundError if code_i == 404
24
+ errtype ||= ClientError if code_i >= 400 && code_i < 500
25
+ errtype ||= ServerError if code_i >= 500 && code_i < 600
26
+
27
+ errtype ||= HTTPError
28
+ errtype.new(code_i, req, res, errors)
29
+ end
30
+ end
31
+
32
+ # 4xx
33
+ class ClientError < HTTPError
34
+ def initialize(code, req, res, errors = [])
35
+ super
36
+ end
37
+ end
38
+
39
+ # 404
40
+ class NotFoundError < ClientError
41
+ def initialize(code, req, res, errors = [])
42
+ super
43
+ end
44
+ end
45
+
46
+ # 5xx
47
+ class ServerError < HTTPError
48
+ def initialize(code, req, res, errors = [])
49
+ super
50
+ end
16
51
  end
17
52
  end
@@ -47,8 +47,10 @@ module Passwordstate
47
47
  end
48
48
 
49
49
  def load(entries)
50
- clear && entries.each { |obj| self << obj }
51
- true
50
+ clear && entries.tap do |loaded|
51
+ loaded.sort! { |obj| obj.send(obj.class.index_field) } if options.fetch(:sort, true)
52
+ end.each { |obj| self << obj }
53
+ self
52
54
  end
53
55
 
54
56
  def operation_supported?(operation)
@@ -8,6 +8,8 @@ module Passwordstate
8
8
  read_fields :document_id, { name: 'DocumentID' },
9
9
  :document_name
10
10
 
11
+ alias title document_name
12
+
11
13
  def self.search(client, store, options = {})
12
14
  client.request :get, "#{api_path}/#{store}/", query: options
13
15
  end
@@ -13,6 +13,8 @@ module Passwordstate
13
13
  :site_id, { name: 'SiteID' },
14
14
  :site_location
15
15
 
16
+ alias title folder_name
17
+
16
18
  def password_lists
17
19
  Passwordstate::ResourceList.new client, Passwordstate::Resources::PasswordList,
18
20
  search_query: { tree_path: tree_path },
@@ -20,6 +22,11 @@ module Passwordstate
20
22
  all_query: { tree_path: tree_path },
21
23
  object_data: { nest_undef_folder_id: folder_id }
22
24
  end
25
+
26
+ def full_path(unix = false)
27
+ return tree_path.tr('\\', '/') if unix
28
+ tree_path
29
+ end
23
30
  end
24
31
  end
25
32
  end
@@ -10,16 +10,16 @@ module Passwordstate
10
10
  :host_name,
11
11
  :user_name,
12
12
  :description,
13
- :generic_field_1,
14
- :generic_field_2,
15
- :generic_field_3,
16
- :generic_field_4,
17
- :generic_field_5,
18
- :generic_field_6,
19
- :generic_field_7,
20
- :generic_field_8,
21
- :generic_field_9,
22
- :generic_field_10,
13
+ :generic_field_1, { name: 'GenericField1' },
14
+ :generic_field_2, { name: 'GenericField2' },
15
+ :generic_field_3, { name: 'GenericField3' },
16
+ :generic_field_4, { name: 'GenericField4' },
17
+ :generic_field_5, { name: 'GenericField5' },
18
+ :generic_field_6, { name: 'GenericField6' },
19
+ :generic_field_7, { name: 'GenericField7' },
20
+ :generic_field_8, { name: 'GenericField8' },
21
+ :generic_field_9, { name: 'GenericField9' },
22
+ :generic_field_10, { name: 'GenericField10' },
23
23
  :account_type_id, { name: 'AccountTypeID' },
24
24
  :account_type,
25
25
  :notes,
@@ -75,7 +75,7 @@ module Passwordstate
75
75
  end
76
76
 
77
77
  def self.search(client, query = {})
78
- super client, query.merge(_api_path: 'searchpassword')
78
+ super client, { _api_path: 'searchpasswords' }.merge(query)
79
79
  end
80
80
 
81
81
  def self.generate(client, options = {})
@@ -38,6 +38,12 @@ module Passwordstate
38
38
  :generator_name,
39
39
  :policy_name
40
40
 
41
+ alias title password_list
42
+
43
+ def self.search(client, query = {})
44
+ super client, query.merge(_api_path: 'searchpasswordlists')
45
+ end
46
+
41
47
  def passwords
42
48
  Passwordstate::ResourceList.new client, Passwordstate::Resources::Password,
43
49
  all_path: "passwords/#{password_list_id}",
@@ -46,8 +52,10 @@ module Passwordstate
46
52
  object_data: { password_list_id: password_list_id }
47
53
  end
48
54
 
49
- def self.search(client, query = {})
50
- super client, query.merge(_api_path: 'searchpasswordlists')
55
+ def full_path(unix = false)
56
+ [tree_path, password_list].compact.join('\\').tap do |full|
57
+ full.tr!('\\', '/') if unix
58
+ end
51
59
  end
52
60
  end
53
61
  end
@@ -1,3 +1,3 @@
1
1
  module Passwordstate
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.0.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passwordstate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Olofsson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-31 00:00:00.000000000 Z
11
+ date: 2018-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logging
@@ -104,6 +104,7 @@ files:
104
104
  - ".gitignore"
105
105
  - ".gitlab-ci.yml"
106
106
  - ".rubocop.yml"
107
+ - CHANGELOG.md
107
108
  - Gemfile
108
109
  - LICENSE.txt
109
110
  - README.md