gpg_status_parser 0.2.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.tar.gz.asc ADDED
@@ -0,0 +1,11 @@
1
+ -----BEGIN PGP SIGNATURE-----
2
+ Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
3
+
4
+ iQEcBAABCgAGBQJRICf6AAoJEP5F5V2hilTWNMkIALMlt98b/n67s6jlOA4P00ws
5
+ pyEII0ZznGMN8zIfFn+QpcLJ4N475Nd+ZdNza0M+ObbUXEGDASbsoEkFtjU3ycmz
6
+ 1LyfujQcE41gJ2Od7x+LsqAMYP6IIiSEJlC7G4yUre2J7vYKw1manA2KarOR8J9U
7
+ BqE24DwLvRjYi4i3KXj4uS3AAymDvDrlKP6V1J59T3ZvfGwVMvWh0kdOJ320ZqNU
8
+ telIvyYn1zkGAZg3TC4Quoj619leFgdYAfLygGWmQePVAAxs+5dkl99+i3sF6nbl
9
+ bvKN4z5PK7gtLS4alIOpaF5IHY/NQUv4Fg+FP8gpyR47CoSbQeP7xSYrPROfPd4=
10
+ =jz+e
11
+ -----END PGP SIGNATURE-----
data/LICENSE ADDED
@@ -0,0 +1,31 @@
1
+ Copyright (c) 2013 Grant T. Olson
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above
12
+ copyright notice, this list of conditions and the following
13
+ disclaimer in the documentation and/or other materials provided
14
+ with the distribution.
15
+
16
+ * Neither the name of the Grant T. Olson nor the names of
17
+ additional contributors may be used to endorse or promote
18
+ products derived from this software without specific prior
19
+ written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
@@ -0,0 +1,20 @@
1
+ require 'gpg_status_parser/status_message'
2
+
3
+ module GPGStatusParser
4
+
5
+ # Parse a single line
6
+ def self.parse_line(line)
7
+ GPGStatusParser::StatusMessage.new(line.strip)
8
+ end
9
+
10
+ # Takes a file or string and optional block and either yields or
11
+ # returns a list of status messages
12
+ def self.parse(file_or_string, &block)
13
+ if block
14
+ file_or_string.each_line { |line| yield parse_line(line)}
15
+ else
16
+ file_or_string.each_line.map{ |line| parse_line(line)}
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,152 @@
1
+ module GPGStatusParser::Arguments
2
+
3
+ # Regexps to extract arguments should have two matchers, the actual
4
+ # argument value and the rest minus whitespace
5
+ NO_WHITESPACE = /([^\s]+)(.*)?/
6
+ USERNAME = /(.+)()$/
7
+ HEX = /([A-Z0-9]+)(.*)?/
8
+ NUMBER = /(\d+)(.*)?/
9
+ DATE = /(\d\d\d\d-\d\d-\d\d)(.*)?/
10
+
11
+ ARGUMENTS = {
12
+ :long_keyid_or_fpr => NO_WHITESPACE,
13
+ :username => USERNAME,
14
+ :keyid => NO_WHITESPACE,
15
+ :pkalgo => NO_WHITESPACE,
16
+ :hashalgo => NO_WHITESPACE,
17
+ :sig_class => NO_WHITESPACE,
18
+ :time => NO_WHITESPACE,
19
+ :rc => NO_WHITESPACE,
20
+ :args => NO_WHITESPACE,
21
+ :radix64_string => NO_WHITESPACE,
22
+ :sig_creation_date => DATE,
23
+ :sig_version => NUMBER,
24
+ :sig_timestamp => NUMBER,
25
+ :long_keyid => NO_WHITESPACE,
26
+ :keytype => NO_WHITESPACE,
27
+ :keylength => NO_WHITESPACE,
28
+ :mdc_method => NO_WHITESPACE,
29
+ :sym_algo => NO_WHITESPACE,
30
+ :algo => NO_WHITESPACE,
31
+ :hexdigits => NO_WHITESPACE,
32
+ :what => NO_WHITESPACE,
33
+ :filename => NO_WHITESPACE,
34
+ :long_keyid => NO_WHITESPACE,
35
+ :type => NO_WHITESPACE,
36
+ :pk_algo => NO_WHITESPACE,
37
+ :hash_algo => NUMBER,
38
+ :class => NO_WHITESPACE,
39
+ :timestamp => NO_WHITESPACE,
40
+ :keyfpr => NO_WHITESPACE,
41
+ :name => NO_WHITESPACE,
42
+ :string => NO_WHITESPACE,
43
+ :format => NO_WHITESPACE,
44
+ :length => NO_WHITESPACE,
45
+ :arguments => NO_WHITESPACE,
46
+ :flags => NO_WHITESPACE,
47
+ :len => NO_WHITESPACE,
48
+ :pubkey_algo => NUMBER,
49
+ :data => NO_WHITESPACE,
50
+ :reserved => NUMBER,
51
+ :expire_timestamp => NUMBER,
52
+ :long_keyid => HEX,
53
+ :fingerprint => HEX,
54
+ :primary_key_fpr => HEX,
55
+ :fingerprint_in_hex => HEX,
56
+ :handle => NO_WHITESPACE,
57
+ :error_token => NO_WHITESPACE,
58
+ :zero => /(0)(.*)/,
59
+ :validation_model => NO_WHITESPACE,
60
+ :mailbox => NO_WHITESPACE,
61
+ :long_main_keyid => NO_WHITESPACE,
62
+ :cipher_algo => NO_WHITESPACE,
63
+ :s2k_mode => NO_WHITESPACE,
64
+ :s2k_hash => NO_WHITESPACE,
65
+ :card_type => NO_WHITESPACE,
66
+ :chvno => NO_WHITESPACE,
67
+ :serialno => NO_WHITESPACE,
68
+ :user_ID => NO_WHITESPACE,
69
+ :reason => NO_WHITESPACE,
70
+ :code => NO_WHITESPACE,
71
+ :maxno => NO_WHITESPACE,
72
+ :error_location => NO_WHITESPACE,
73
+ :error_code => NO_WHITESPACE,
74
+ :more => NO_WHITESPACE,
75
+ :location => NO_WHITESPACE,
76
+ :reason_code => NO_WHITESPACE,
77
+ :char => NO_WHITESPACE,
78
+ :cur => NO_WHITESPACE,
79
+ :total => NO_WHITESPACE,
80
+ :fname => NO_WHITESPACE,
81
+ :pid => NO_WHITESPACE}
82
+
83
+ def self.extract_expected_argument argument_string
84
+ argument_string = argument_string.strip
85
+
86
+ return [nil, nil] if argument_string.empty?
87
+
88
+ optional = false
89
+ if argument_string[0] == "["
90
+ optional = true
91
+ argument_string = /[ ]*\[(.*)[ ]*\][ ]*$/.match(argument_string)[1]
92
+ end
93
+
94
+
95
+ matches = /<([^>]+)>(.*)/.match(argument_string)
96
+
97
+ # make ruby-friendly symbols
98
+ arg = matches[1].gsub(/[ -]/,"_")
99
+ arg = arg.intern
100
+
101
+ rest = matches[2]
102
+
103
+ result = [arg, rest]
104
+ result << :optional if optional
105
+
106
+ result
107
+ end
108
+
109
+ def self.extract_expected_arguments argument_string
110
+ args = []
111
+ first, rest = extract_expected_argument(argument_string)
112
+
113
+ while (first || rest)
114
+ args << first
115
+ first, rest = extract_expected_argument(rest)
116
+ end
117
+
118
+ args
119
+ end
120
+
121
+ def self.extract_argument_values expected_args, argument_value_string
122
+ return {} if expected_args.empty?
123
+
124
+ results = []
125
+ first, rest = expected_args[0], expected_args[1..-1]
126
+
127
+ while first
128
+ extract_re = ARGUMENTS[first]
129
+ match = extract_re.match(argument_value_string)
130
+
131
+ if match.nil?
132
+ results << ""
133
+ argument_value_string = ""
134
+ first = nil
135
+ rest = nil
136
+ else
137
+ results << match[1]
138
+ argument_value_string = match[2]
139
+ first, rest = rest[0], rest[1..-1]
140
+ end
141
+
142
+ end
143
+
144
+ # raise "Acutal args didnt match expected" if expected_args.length != results.length
145
+ raise "Acutal args didnt match expected" if argument_value_string && argument_value_string.length > 0
146
+
147
+ # Delete unspecified optional args
148
+ args = Hash[expected_args.zip(results)]
149
+ args.delete_if {|key,val| val.nil? || val.empty?}
150
+ args
151
+ end
152
+ end
@@ -0,0 +1,81 @@
1
+ module GPGStatusParser
2
+ STATUS_CODES = {
3
+ :NEWSIG => "",
4
+ :GOODSIG => "<long_keyid_or_fpr> <username>",
5
+ :EXPSIG => "<long_keyid_or_fpr> <username>",
6
+ :EXPKEYSIG => "<long_keyid_or_fpr> <username>",
7
+ :REVKEYSIG => "<long_keyid_or_fpr> <username>",
8
+ :BADSIG => "<long_keyid_or_fpr> <username>",
9
+ :ERRSIG => "<keyid> <pkalgo> <hashalgo> <sig_class> <time> <rc>",
10
+ :VALIDSIG => "<fingerprint_in_hex> <sig_creation_date> <sig-timestamp> <expire-timestamp> <sig-version> <reserved> <pubkey-algo> <hash-algo> <sig-class> [ <primary-key-fpr> ]",
11
+ :SIG_ID => "<radix64_string> <sig_creation_date> <sig-timestamp>",
12
+ :ENC_TO => "<long_keyid> <keytype> <keylength>",
13
+ :BEGIN_DECRYPTION => "",
14
+ :END_DECRYPTION => "",
15
+ :DECRYPTION_INFO => "<mdc_method> <sym_algo>",
16
+ :DECRYPTION_FAILED => "",
17
+ :DECRYPTION_OKAY => "",
18
+ :SESSION_KEY => "<algo>:<hexdigits>",
19
+ :BEGIN_ENCRYPTION => "<mdc_method> <sym_algo>",
20
+ :END_ENCRYPTION => "",
21
+ :FILE_START => "<what> <filename>",
22
+ :FILE_DONE => "",
23
+ :BEGIN_SIGNING => "",
24
+ :ALREADY_SIGNED => "<long-keyid>",
25
+ :SIG_CREATED => "<type> <pk_algo> <hash_algo> <class> <timestamp> <keyfpr>",
26
+ :NOTATION_NAME => "<name>",
27
+ :NOTATION_DATA => "<string>",
28
+ :POLICY_URL => "<string>",
29
+ :PLAINTEXT => "<format> <timestamp> <filename>",
30
+ :PLAINTEXT_LENGTH => "<length>",
31
+ :ATTRIBUTE => "<arguments>",
32
+ :SIG_SUBPACKET => "<type> <flags> <len> <data>",
33
+ :INV_RECP => "",
34
+ :INV_SGNR => "",
35
+ :NO_RECP => "<reserved>",
36
+ :NO_SGNR => "<reserved>",
37
+ :KEYEXPIRED => "<expire-timestamp>",
38
+ :KEYREVOKED => "",
39
+ :NO_PUBKEY => "<long keyid>",
40
+ :NO_SECKEY => "<long keyid>",
41
+ :KEY_CREATED => "<type> <fingerprint> [<handle>]",
42
+ :KEY_NOT_CREATED => "[<handle>]",
43
+ :TRUST_UNDEFINED => "<error_token>",
44
+ :TRUST_NEVER => "<error_token>",
45
+ :TRUST_MARGINAL => "[<zero> [<validation_model>]]",
46
+ :TRUST_FULLY => "[<zero> [<validation_model>]]",
47
+ :TRUST_ULTIMATE => "[<zero> [<validation_model>]]",
48
+ :PKA_TRUST_GOOD => "<mailbox>",
49
+ :PKA_TRUST_BAD => "<mailbox>",
50
+ :GET_BOOL => "",
51
+ :GET_LINE => "",
52
+ :GET_HIDDEN => "",
53
+ :GOT_IT => "",
54
+ :USERID_HINT => "<long main keyid> <string>",
55
+ :NEED_PASSPHRASE => "<long keyid> <long main keyid> <keytype> <keylength>",
56
+ :NEED_PASSPHRASE_SYM => "<cipher_algo> <s2k_mode> <s2k_hash>",
57
+ :NEED_PASSPHRASE_PIN => "<card_type> <chvno> [<serialno>]",
58
+ :MISSING_PASSPHRASE => "",
59
+ :BAD_PASSPHRASE => "<long keyid>",
60
+ :GOOD_PASSPHRASE => "",
61
+ :IMPORT_CHECK => "<long keyid> <fingerprint> <user ID>",
62
+ :IMPORTED => "<long keyid> <username>",
63
+ :IMPORT_OK => "<reason> [<fingerprint>]",
64
+ :IMPORT_PROBLEM => "<reason> [<fingerprint>]",
65
+ :IMPORT_RES => "<args>",
66
+ :CARDCTRL => "<what> [<serialno>]",
67
+ :SC_OP_FAILURE => "[<code>]",
68
+ :SC_OP_SUCCESS => "",
69
+ :NODATA => "<what>",
70
+ :UNEXPECTED => "<what>",
71
+ :TRUNCATED => "<maxno>",
72
+ :ERROR => "<error location> <error code> [<more>]",
73
+ :SUCCESS => "[<location>]",
74
+ :BADARMOR => "",
75
+ :DELETE_PROBLEM => "<reason_code>",
76
+ :PROGRESS => "<what> <char> <cur> <total>",
77
+ :BACKUP_KEY_CREATED => "<fingerprint> <fname>",
78
+ :MOUNTPOINT => "<name>",
79
+ :PINENTRY_LAUNCHED => "<pid>"
80
+ }
81
+ end
@@ -0,0 +1,29 @@
1
+ require 'gpg_status_parser/status_codes'
2
+ require 'gpg_status_parser/arguments'
3
+
4
+ module GPGStatusParser
5
+
6
+ class NotGPGStatus < StandardError
7
+ end
8
+
9
+ class InvalidStatus < StandardError
10
+ end
11
+
12
+ class StatusMessage
13
+ COMMAND_REGEXP = /^\[GNUPG:\] ([^ ]+)(?: (.*))?$/
14
+
15
+ attr_reader :status, :args
16
+
17
+ def initialize status_string
18
+ match = COMMAND_REGEXP.match(status_string)
19
+ raise NotGPGStatus if match.nil?
20
+
21
+ @status = match[1].intern
22
+ raise InvalidStatus if !STATUS_CODES.keys.include?(@status)
23
+
24
+ expected_arg_string = GPGStatusParser::STATUS_CODES[@status]
25
+ expected_args = GPGStatusParser::Arguments.extract_expected_arguments(expected_arg_string)
26
+ @args = GPGStatusParser::Arguments.extract_argument_values(expected_args, match[2])
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ require 'test/unit'
2
+ require 'gpg_status_parser'
3
+ require 'gpg_status_parser/arguments'
4
+
5
+ class ArgumentsTest < Test::Unit::TestCase
6
+
7
+ def test_expected_argument_extraction
8
+ GPGStatusParser::STATUS_CODES.each_pair do |key, val|
9
+ assert_nothing_raised do
10
+ GPGStatusParser::Arguments.extract_expected_arguments(val)
11
+ end
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,70 @@
1
+ require 'test/unit'
2
+ require 'stringio'
3
+
4
+ class MainApiTest < Test::Unit::TestCase
5
+ def test_parse_line
6
+ sig_id_msg = "[GNUPG:] SIG_ID jRWzDyjdbbGjvn9nNJJxF7HA7MA 2013-02-10 1360499004"
7
+ msg = GPGStatusParser::parse_line(sig_id_msg)
8
+
9
+ assert (msg.status == :SIG_ID), "extracted status should be SIG_ID"
10
+
11
+ args = {
12
+ :radix64_string=>"jRWzDyjdbbGjvn9nNJJxF7HA7MA",
13
+ :sig_creation_date=>"2013-02-10",
14
+ :sig_timestamp=>"1360499004"
15
+ }
16
+ assert (msg.args == args), "Args didn't match"
17
+ end
18
+
19
+ def test_parse_line_not_status_line
20
+ assert_raise GPGStatusParser::NotGPGStatus do
21
+ GPGStatusParser.parse_line("sfdsdfdsaf")
22
+ end
23
+ end
24
+
25
+ def test_parse_line_invalid_status
26
+ assert_raise GPGStatusParser::InvalidStatus do
27
+ GPGStatusParser.parse_line("[GNUPG:] X509SIG_ID jRWzDyjdbbGjvn9nNJJxF7HA7MA 2013-02-10 1360499004")
28
+ end
29
+ end
30
+
31
+ STATUS_TEXT = <<STATUS
32
+ [GNUPG:] PLAINTEXT 74 0
33
+ [GNUPG:] SIG_ID jRWzDyjdbbGjvn9nNJJxF7HA7MA 2013-02-10 1360499004
34
+ [GNUPG:] GOODSIG 703B0C0E25D38721 Test User <test@example.org>
35
+ [GNUPG:] VALIDSIG B2AE14D84135BA08C0FC27C7703B0C0E25D38721 2013-02-10 1360499004 0 4 0 1 2 01 B2AE14D84135BA08C0FC27C7703B0C0E25D38721
36
+ [GNUPG:] TRUST_ULTIMATE
37
+ STATUS
38
+
39
+ def test_parse_no_block
40
+ status_file = StringIO.new(STATUS_TEXT)
41
+ res = GPGStatusParser.parse(status_file).map{|msg| msg.status}
42
+ good_res = [:PLAINTEXT, :SIG_ID, :GOODSIG, :VALIDSIG, :TRUST_ULTIMATE]
43
+ assert (res == good_res), "Results didn't match expected"
44
+ end
45
+
46
+ def test_parse_block
47
+ good_res = [:PLAINTEXT, :SIG_ID, :GOODSIG, :VALIDSIG, :TRUST_ULTIMATE].reverse
48
+
49
+ status_file = StringIO.new(STATUS_TEXT)
50
+ res = GPGStatusParser.parse(status_file) do |msg|
51
+ assert (msg.status == good_res.pop), "Didn't match expected status"
52
+ end
53
+ end
54
+
55
+ def test_parse_string_no_block
56
+ res = GPGStatusParser.parse(STATUS_TEXT).map{|msg| msg.status}
57
+ good_res = [:PLAINTEXT, :SIG_ID, :GOODSIG, :VALIDSIG, :TRUST_ULTIMATE]
58
+ assert (res == good_res), "Results didn't match expected"
59
+ end
60
+
61
+ def test_parse_string_block
62
+ good_res = [:PLAINTEXT, :SIG_ID, :GOODSIG, :VALIDSIG, :TRUST_ULTIMATE].reverse
63
+
64
+ res = GPGStatusParser.parse(STATUS_TEXT) do |msg|
65
+ assert (msg.status == good_res.pop), "Didn't match expected status"
66
+ end
67
+ end
68
+
69
+
70
+ end
@@ -0,0 +1,132 @@
1
+ require 'test/unit'
2
+ require 'gpg_status_parser'
3
+
4
+ class StatusMessageTest < Test::Unit::TestCase
5
+ def test_sig_id
6
+ sig_id_msg = "[GNUPG:] SIG_ID jRWzDyjdbbGjvn9nNJJxF7HA7MA 2013-02-10 1360499004"
7
+ msg = GPGStatusParser::StatusMessage.new(sig_id_msg)
8
+
9
+ assert (msg.status == :SIG_ID), "extracted status should be SIG_ID"
10
+
11
+ args = {
12
+ :radix64_string=>"jRWzDyjdbbGjvn9nNJJxF7HA7MA",
13
+ :sig_creation_date=>"2013-02-10",
14
+ :sig_timestamp=>"1360499004"
15
+ }
16
+ assert (msg.args == args), "Args didn't match"
17
+ end
18
+
19
+ def test_goodsig
20
+ goodsig_msg = "[GNUPG:] GOODSIG 703B0C0E25D38721 Test User <test@example.org>"
21
+ msg = GPGStatusParser::StatusMessage.new(goodsig_msg)
22
+
23
+ assert (msg.status == :GOODSIG), "status should be :GOODSIG"
24
+
25
+ args = {
26
+ :long_keyid_or_fpr=>"703B0C0E25D38721",
27
+ :username=>" Test User <test@example.org>"
28
+ }
29
+ assert (msg.args == args), "Wrong args"
30
+ end
31
+
32
+ def test_validsig
33
+ unparsed_msg = "[GNUPG:] VALIDSIG B2AE14D84135BA08C0FC27C7703B0C0E25D38721 2013-02-10 1360499004 0 4 0 1 2 01 B2AE14D84135BA08C0FC27C7703B0C0E25D38721"
34
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
35
+
36
+ assert (msg.status == :VALIDSIG), ""
37
+
38
+ args = {
39
+ :fingerprint_in_hex=>"B2AE14D84135BA08C0FC27C7703B0C0E25D38721",
40
+ :sig_creation_date=>"2013-02-10", :sig_timestamp=>"1360499004",
41
+ :expire_timestamp=>"0", :sig_version=>"4", :reserved=>"0",
42
+ :pubkey_algo=>"1", :hash_algo=>"2", :sig_class=>"01",
43
+ :primary_key_fpr=>"B2AE14D84135BA08C0FC27C7703B0C0E25D38721"
44
+ }
45
+ assert (msg.args == args), "#{msg.args.inspect}"
46
+ end
47
+
48
+ def test_trust_ultimate
49
+ unparsed_msg = "[GNUPG:] TRUST_ULTIMATE"
50
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
51
+
52
+ assert (msg.status == :TRUST_ULTIMATE), "expected :TRUST_ULTIMATE"
53
+
54
+ args = {}
55
+ assert (msg.args == args), "#{msg.args.inspect}"
56
+ end
57
+
58
+ def test_trust_ultimate_optional_args
59
+ unparsed_msg = "[GNUPG:] TRUST_ULTIMATE 0 foo"
60
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
61
+
62
+ assert (msg.status == :TRUST_ULTIMATE), "expected :TRUST_ULTIMATE"
63
+
64
+ args = {:zero => "0", :validation_model => "foo"}
65
+ assert (msg.args == args), "#{msg.args.inspect}"
66
+ end
67
+
68
+ def test_sig_id_2
69
+ unparsed_msg = "[GNUPG:] SIG_ID kEOcXvBQzVQilo+AYc+Ws8Mutok 2011-05-28 1306618646"
70
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
71
+
72
+ assert (msg.status == :SIG_ID), "expected :SIG_ID"
73
+
74
+ args = {
75
+ :radix64_string=>"kEOcXvBQzVQilo+AYc+Ws8Mutok",
76
+ :sig_creation_date=>"2011-05-28",
77
+ :sig_timestamp=>"1306618646"
78
+ }
79
+ assert (msg.args == args), "#{msg.args.inspect}"
80
+ end
81
+
82
+ def test_goodsig_2
83
+ unparsed_msg = "[GNUPG:] GOODSIG FE45E55DA18A54D6 Grant T. Olson (Personal email) <kgo@grant-olson.net>"
84
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
85
+
86
+ assert (msg.status == :GOODSIG), "Expected :GOODSIG"
87
+
88
+ args = {
89
+ :long_keyid_or_fpr=>"FE45E55DA18A54D6",
90
+ :username=>" Grant T. Olson (Personal email) <kgo@grant-olson.net>"
91
+ }
92
+ assert (msg.args == args), "#{msg.args.inspect}"
93
+ end
94
+
95
+ def test_valid_sig_2
96
+ unparsed_msg = "[GNUPG:] VALIDSIG F64DB95B20F8BA9B68B34346FE45E55DA18A54D6 2011-05-28 1306618646 0 4 0 1 3 00 A530C31CD7620D26E2BAC384B6F6FFD0E3B5806F"
97
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
98
+
99
+ assert (msg.status == :VALIDSIG), "expected :VALIDSIG"
100
+
101
+ args = {
102
+ :fingerprint_in_hex=>"F64DB95B20F8BA9B68B34346FE45E55DA18A54D6",
103
+ :sig_creation_date=>"2011-05-28", :sig_timestamp=>"1306618646",
104
+ :expire_timestamp=>"0", :sig_version=>"4", :reserved=>"0",
105
+ :pubkey_algo=>"1", :hash_algo=>"3", :sig_class=>"00",
106
+ :primary_key_fpr=>"A530C31CD7620D26E2BAC384B6F6FFD0E3B5806F"
107
+ }
108
+ assert (msg.args == args), "#{msg.args.inspect}"
109
+ end
110
+
111
+ def test_trust_undefined
112
+ unparsed_msg = "[GNUPG:] TRUST_UNDEFINED"
113
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
114
+
115
+ assert (msg.status == :TRUST_UNDEFINED), "Expected TRUST_UNDEFINED"
116
+
117
+ args = {}
118
+ assert (msg.args == args), "#{msg.args.inspect}"
119
+ end
120
+
121
+ def test_trust_undefined_with_token
122
+ unparsed_msg = "[GNUPG:] TRUST_UNDEFINED foo"
123
+ msg = GPGStatusParser::StatusMessage.new(unparsed_msg)
124
+
125
+ assert (msg.status == :TRUST_UNDEFINED), "Expected TRUST_UNDEFINED"
126
+
127
+ args = {:error_token=>"foo"}
128
+ assert (msg.args == args), "#{msg.args.inspect}"
129
+ end
130
+
131
+
132
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gpg_status_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Grant T. Olson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-16 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Turns structured status messages provided by gpg into ruby objects for
15
+ easy manipulation in your code.
16
+ email: kgo@grant-olson.net
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - LICENSE
22
+ - Rakefile
23
+ - lib/gpg_status_parser.rb
24
+ - lib/gpg_status_parser/status_codes.rb
25
+ - lib/gpg_status_parser/arguments.rb
26
+ - lib/gpg_status_parser/status_message.rb
27
+ - test/test_status_message.rb
28
+ - test/test_arguments.rb
29
+ - test/test_main_api.rb
30
+ homepage: https://github.com/grant-olson/gpg_status_parser
31
+ licenses:
32
+ - BSD 3 Clause
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubyforge_project:
51
+ rubygems_version: 1.8.24
52
+ signing_key:
53
+ specification_version: 3
54
+ summary: Turns gpg status messages into ruby objects.
55
+ test_files:
56
+ - test/test_status_message.rb
57
+ - test/test_arguments.rb
58
+ - test/test_main_api.rb
metadata.gz.asc ADDED
@@ -0,0 +1,11 @@
1
+ -----BEGIN PGP SIGNATURE-----
2
+ Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
3
+
4
+ iQEcBAABCgAGBQJRICf/AAoJEP5F5V2hilTWHhQH/140mBfZ0bmss+LHrovNIknU
5
+ ptRbwphTP1gTjoxp9WImOhhu2+EpFmD0SkIElxTa8Q55Yr/H2hyZqXUffn56uiJy
6
+ PuIsipdBFvqmZTWXbo7/gu8wmTVSCEU8tnPcd/HhqBVPdN8bO3wX+M/VOXT3o8ST
7
+ 4qS32FIapLjbWBRRweQrKW7BG+LFXa89cNG50ISYafk0ehE4YHpmWEbi4A02a+1j
8
+ Gccw1dkVmEKYJz7hjYUVTLE2Xojg9WytidBvfzl4r+GI3uNfGN2UdjTpQ/sp/siD
9
+ L35Sr5uVe7AO6JYUC1TcuU5ANA07bs9tr0XgxmAnmQvN5feC6lTceXA39H5a9kw=
10
+ =X4IE
11
+ -----END PGP SIGNATURE-----