r509-validity-redis 0.3

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.
@@ -0,0 +1,124 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <base id="base_target" target="_parent" />
19
+ </head>
20
+ <body>
21
+ <script type="text/javascript" charset="utf-8">
22
+ if (window.top.frames.main) {
23
+ document.getElementById('base_target').target = 'main';
24
+ document.body.className = 'frames';
25
+ }
26
+ </script>
27
+ <div id="content">
28
+ <h1 id="full_list_header">Method List</h1>
29
+ <div id="nav">
30
+
31
+ <span><a target="_self" href="class_list.html">
32
+ Classes
33
+ </a></span>
34
+
35
+ <span><a target="_self" href="method_list.html">
36
+ Methods
37
+ </a></span>
38
+
39
+ <span><a target="_self" href="file_list.html">
40
+ Files
41
+ </a></span>
42
+
43
+ </div>
44
+ <div id="search">Search: <input type="text" /></div>
45
+
46
+ <ul id="full_list" class="method">
47
+
48
+
49
+ <li class="r1 ">
50
+ <span class='object_link'><a href="R509/Validity/Redis/Checker.html#check-instance_method" title="R509::Validity::Redis::Checker#check (method)">#check</a></span>
51
+
52
+ <small>R509::Validity::Redis::Checker</small>
53
+
54
+ </li>
55
+
56
+
57
+ <li class="r2 ">
58
+ <span class='object_link'><a href="R509/Validity/Redis/Writer.html#initialize-instance_method" title="R509::Validity::Redis::Writer#initialize (method)">#initialize</a></span>
59
+
60
+ <small>R509::Validity::Redis::Writer</small>
61
+
62
+ </li>
63
+
64
+
65
+ <li class="r1 ">
66
+ <span class='object_link'><a href="R509/Validity/Redis/Checker.html#initialize-instance_method" title="R509::Validity::Redis::Checker#initialize (method)">#initialize</a></span>
67
+
68
+ <small>R509::Validity::Redis::Checker</small>
69
+
70
+ </li>
71
+
72
+
73
+ <li class="r2 ">
74
+ <span class='object_link'><a href="R509/Validity/Redis/Checker.html#is_available%3F-instance_method" title="R509::Validity::Redis::Checker#is_available? (method)">#is_available?</a></span>
75
+
76
+ <small>R509::Validity::Redis::Checker</small>
77
+
78
+ </li>
79
+
80
+
81
+ <li class="r1 ">
82
+ <span class='object_link'><a href="R509/Validity/Redis/Writer.html#is_available%3F-instance_method" title="R509::Validity::Redis::Writer#is_available? (method)">#is_available?</a></span>
83
+
84
+ <small>R509::Validity::Redis::Writer</small>
85
+
86
+ </li>
87
+
88
+
89
+ <li class="r2 ">
90
+ <span class='object_link'><a href="R509/Validity/Redis/Writer.html#issue-instance_method" title="R509::Validity::Redis::Writer#issue (method)">#issue</a></span>
91
+
92
+ <small>R509::Validity::Redis::Writer</small>
93
+
94
+ </li>
95
+
96
+
97
+ <li class="r1 ">
98
+ <span class='object_link'><a href="Kernel.html#require_relative-instance_method" title="Kernel#require_relative (method)">#require_relative</a></span>
99
+
100
+ <small>Kernel</small>
101
+
102
+ </li>
103
+
104
+
105
+ <li class="r2 ">
106
+ <span class='object_link'><a href="R509/Validity/Redis/Writer.html#revoke-instance_method" title="R509::Validity::Redis::Writer#revoke (method)">#revoke</a></span>
107
+
108
+ <small>R509::Validity::Redis::Writer</small>
109
+
110
+ </li>
111
+
112
+
113
+ <li class="r1 ">
114
+ <span class='object_link'><a href="R509/Validity/Redis/Writer.html#unrevoke-instance_method" title="R509::Validity::Redis::Writer#unrevoke (method)">#unrevoke</a></span>
115
+
116
+ <small>R509::Validity::Redis::Writer</small>
117
+
118
+ </li>
119
+
120
+
121
+ </ul>
122
+ </div>
123
+ </body>
124
+ </html>
@@ -0,0 +1,112 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.8.2.1
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!" + escape(window.location.href);
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+
36
+
37
+ <span class="title">Top Level Namespace</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a class="full_list_link" id="class_list_link"
46
+ href="class_list.html">
47
+ Class List
48
+ </a>
49
+
50
+ <a class="full_list_link" id="method_list_link"
51
+ href="method_list.html">
52
+ Method List
53
+ </a>
54
+
55
+ <a class="full_list_link" id="file_list_link"
56
+ href="file_list.html">
57
+ File List
58
+ </a>
59
+
60
+ </div>
61
+ <div class="clear"></div>
62
+ </div>
63
+
64
+ <iframe id="search_frame"></iframe>
65
+
66
+ <div id="content"><h1>Top Level Namespace
67
+
68
+
69
+
70
+ </h1>
71
+
72
+ <dl class="box">
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+ </dl>
82
+ <div class="clear"></div>
83
+
84
+ <h2>Defined Under Namespace</h2>
85
+ <p class="children">
86
+
87
+
88
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Kernel.html" title="Kernel (module)">Kernel</a></span>, <span class='object_link'><a href="R509.html" title="R509 (module)">R509</a></span>
89
+
90
+
91
+
92
+
93
+ </p>
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ </div>
104
+
105
+ <div id="footer">
106
+ Generated on Mon Oct 15 10:51:03 2012 by
107
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
108
+ 0.8.2.1 (ruby-1.9.3).
109
+ </div>
110
+
111
+ </body>
112
+ </html>
@@ -0,0 +1,30 @@
1
+ require "r509"
2
+
3
+ module R509::Validity::Redis
4
+ class Checker < R509::Validity::Checker
5
+ def initialize(redis)
6
+ raise ArgumentError.new("Redis must be provided") if redis.nil?
7
+ @redis = redis
8
+ end
9
+
10
+ # @return [R509::Validity::Status]
11
+ def check(issuer,serial)
12
+ raise ArgumentError.new("Serial and issuer must be provided") if serial.to_s.empty? or issuer.to_s.empty?
13
+
14
+ hash = @redis.hgetall("cert:#{issuer}:#{serial}")
15
+ if not hash.nil? and hash.has_key?("status")
16
+ R509::Validity::Status.new(
17
+ :status => hash["status"].to_i,
18
+ :revocation_time => hash["revocation_time"].to_i || nil,
19
+ :revocation_reason => hash["revocation_reason"].to_i || 0
20
+ )
21
+ else
22
+ R509::Validity::Status.new(:status => R509::Validity::UNKNOWN)
23
+ end
24
+ end
25
+
26
+ def is_available?
27
+ (@redis.ping == "PONG")? true : false
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module R509
2
+ module Validity
3
+ module Redis
4
+ VERSION="0.3"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,43 @@
1
+ require "r509"
2
+
3
+ module R509::Validity::Redis
4
+ class Writer < R509::Validity::Writer
5
+ def initialize(redis)
6
+ raise ArgumentError.new("Redis must be provided") if redis.nil?
7
+ @redis = redis
8
+ end
9
+
10
+ def issue(issuer, serial)
11
+ raise ArgumentError.new("Serial and issuer must be provided") if serial.to_s.empty? or issuer.to_s.empty?
12
+ cert = @redis.hgetall("cert:#{issuer}:#{serial}")
13
+ if cert.nil? or not cert.has_key?("status")
14
+ @redis.hmset("cert:#{issuer}:#{serial}", "status", 0)
15
+ else
16
+ raise R509::R509Error.new("Serial #{serial} for issuer #{issuer} is already present")
17
+ end
18
+ end
19
+
20
+ def revoke(issuer, serial, revocation_time=Time.now.to_i, reason=0)
21
+ raise ArgumentError.new("Serial and issuer must be provided") if serial.to_s.empty? or issuer.to_s.empty?
22
+ @redis.hmset("cert:#{issuer}:#{serial}",
23
+ "status", 1,
24
+ "revocation_time", revocation_time || Time.now.to_i,
25
+ "revocation_reason", reason || 0
26
+ )
27
+ end
28
+
29
+ def unrevoke(issuer, serial)
30
+ raise ArgumentError.new("Serial and issuer must be provided") if serial.to_s.empty? or issuer.to_s.empty?
31
+ cert = @redis.hgetall("cert:#{issuer}:#{serial}")
32
+ if cert.nil? or not cert.has_key?("status")
33
+ raise R509::R509Error.new("Serial #{serial} for issuer #{issuer} is not present")
34
+ else
35
+ @redis.hmset("cert:#{issuer}:#{serial}", "status", 0)
36
+ end
37
+ end
38
+
39
+ def is_available?
40
+ (@redis.ping == "PONG")? true : false
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,15 @@
1
+ require 'r509'
2
+
3
+ unless Kernel.respond_to?(:require_relative)
4
+ module Kernel
5
+ def require_relative(path)
6
+ require File.join(File.dirname(caller[0]), path.to_str)
7
+ end
8
+ end
9
+ end
10
+
11
+ module R509::Validity::Redis
12
+ require_relative('redis/checker.rb')
13
+ require_relative('redis/writer.rb')
14
+ end
15
+
@@ -0,0 +1,68 @@
1
+ require "spec_helper"
2
+
3
+ describe R509::Validity::Redis::Checker do
4
+ context "constructor" do
5
+ it "when redis is nil" do
6
+ expect { R509::Validity::Redis::Checker.new(nil) }.to raise_error(ArgumentError, "Redis must be provided")
7
+ end
8
+ end
9
+ context "check" do
10
+ it "throws an exception when issuer is nil/empty string" do
11
+ redis = double("redis")
12
+ checker = R509::Validity::Redis::Checker.new(redis)
13
+ expect { checker.check(nil,123) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
14
+ end
15
+ it "throws an exception when serial is nil/empty string" do
16
+ redis = double("redis")
17
+ checker = R509::Validity::Redis::Checker.new(redis)
18
+ expect { checker.check("abcdef",nil) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
19
+ end
20
+ it "gets unknown when serial is not found (returns {})" do
21
+ redis = double("redis")
22
+ checker = R509::Validity::Redis::Checker.new(redis)
23
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return({})
24
+ status = checker.check("abcdef",123)
25
+ status.status.should == R509::Validity::UNKNOWN
26
+ end
27
+ it "gets unknown when serial is not found (returns nil)" do
28
+ redis = double("redis")
29
+ checker = R509::Validity::Redis::Checker.new(redis)
30
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return(nil)
31
+ status = checker.check("abcdef",123)
32
+ status.status.should == R509::Validity::UNKNOWN
33
+ end
34
+ it "gets valid" do
35
+ redis = double("redis")
36
+ checker = R509::Validity::Redis::Checker.new(redis)
37
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return({"status" => "0" })
38
+ status = checker.check("abcdef",123)
39
+ status.status.should == R509::Validity::VALID
40
+ status.revocation_time.should == 0
41
+ status.revocation_reason.should == 0
42
+ end
43
+ it "gets revoked with revocation time and reason" do
44
+ redis = double("redis")
45
+ checker = R509::Validity::Redis::Checker.new(redis)
46
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return({"status" => "1", "revocation_time" => "789", "revocation_reason" => "5" })
47
+ status = checker.check("abcdef",123)
48
+ status.status.should == R509::Validity::REVOKED
49
+ status.revocation_time.should == 789
50
+ status.revocation_reason.should == 5
51
+ end
52
+ end
53
+ context "is available" do
54
+ it "returns true if redis is available" do
55
+ redis = double("redis")
56
+ redis.should_receive(:ping).and_return("PONG")
57
+ checker = R509::Validity::Redis::Checker.new(redis)
58
+ checker.is_available?.should == true
59
+ end
60
+
61
+ it "raises error if redis is unavailable" do
62
+ redis = double("redis")
63
+ redis.should_receive(:ping).and_return(StandardError)
64
+ checker = R509::Validity::Redis::Checker.new(redis)
65
+ checker.is_available?.should == false
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,11 @@
1
+ if (RUBY_VERSION.split('.')[1].to_i > 8)
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
5
+
6
+ $:.unshift File.expand_path("../../lib", __FILE__)
7
+ $:.unshift File.expand_path("../", __FILE__)
8
+ require 'rubygems'
9
+ #require 'fixtures'
10
+ require 'rspec'
11
+ require 'r509/validity/redis'
@@ -0,0 +1,127 @@
1
+ require "spec_helper"
2
+
3
+ describe R509::Validity::Redis::Writer do
4
+ context "constructor" do
5
+ it "when redis is nil" do
6
+ expect { R509::Validity::Redis::Writer.new(nil) }.to raise_error(ArgumentError, "Redis must be provided")
7
+ end
8
+ end
9
+
10
+ context "issue" do
11
+ it "when issuer is nil/empty string" do
12
+ redis = double("redis")
13
+ writer = R509::Validity::Redis::Writer.new(redis)
14
+ expect { writer.issue(nil,123) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
15
+ end
16
+ it "when serial is nil/empty string" do
17
+ redis = double("redis")
18
+ writer = R509::Validity::Redis::Writer.new(redis)
19
+ expect { writer.issue("abcdef",nil) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
20
+ end
21
+ it "when serial/issuer is provided (check returns nil)" do
22
+ redis = double("redis")
23
+ writer = R509::Validity::Redis::Writer.new(redis)
24
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return(nil)
25
+ redis.should_receive(:hmset).with("cert:abcdef:123", "status", 0)
26
+ writer.issue("abcdef",123)
27
+ end
28
+ it "when serial/issuer is provided (check returns {})" do
29
+ redis = double("redis")
30
+ writer = R509::Validity::Redis::Writer.new(redis)
31
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return({})
32
+ redis.should_receive(:hmset).with("cert:abcdef:123", "status", 0)
33
+ writer.issue("abcdef",123)
34
+ end
35
+ it "when serial/issuer is already present" do
36
+ redis = double("redis")
37
+ writer = R509::Validity::Redis::Writer.new(redis)
38
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return({"status"=>0})
39
+ expect { writer.issue("abcdef",123) }.to raise_error(R509::R509Error, "Serial 123 for issuer abcdef is already present")
40
+ end
41
+ end
42
+
43
+ context "revoke" do
44
+ it "when issuer is nil/empty string" do
45
+ redis = double("redis")
46
+ writer = R509::Validity::Redis::Writer.new(redis)
47
+ expect { writer.revoke(nil,123) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
48
+ end
49
+ it "when serial is nil/empty string" do
50
+ redis = double("redis")
51
+ writer = R509::Validity::Redis::Writer.new(redis)
52
+ expect { writer.revoke("abcdef",nil) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
53
+ end
54
+ it "when time and reason aren't provided" do
55
+ redis = double("redis")
56
+ writer = R509::Validity::Redis::Writer.new(redis)
57
+ redis.should_receive(:hmset).with("cert:abcdef:123", "status", 1, "revocation_time", Time.now.to_i, "revocation_reason", 0)
58
+ writer.revoke("abcdef",123)
59
+ end
60
+ it "when time and reason are nil" do
61
+ redis = double("redis")
62
+ writer = R509::Validity::Redis::Writer.new(redis)
63
+ redis.should_receive(:hmset).with("cert:abcdef:123", "status", 1, "revocation_time", Time.now.to_i, "revocation_reason", 0)
64
+ writer.revoke("abcdef",123, nil, nil)
65
+ end
66
+ it "when time is provided, but not reason" do
67
+ redis = double("redis")
68
+ writer = R509::Validity::Redis::Writer.new(redis)
69
+ redis.should_receive(:hmset).with("cert:abcdef:123", "status", 1, "revocation_time", 100, "revocation_reason", 0)
70
+ writer.revoke("abcdef",123, 100)
71
+ end
72
+ it "when time and reason are provided" do
73
+ redis = double("redis")
74
+ writer = R509::Validity::Redis::Writer.new(redis)
75
+ redis.should_receive(:hmset).with("cert:abcdef:123", "status", 1, "revocation_time", 100, "revocation_reason", 2)
76
+ writer.revoke("abcdef",123, 100, 2)
77
+ end
78
+ end
79
+
80
+ context "unrevoke" do
81
+ it "when issuer is nil/empty string" do
82
+ redis = double("redis")
83
+ writer = R509::Validity::Redis::Writer.new(redis)
84
+ expect { writer.unrevoke(nil,123) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
85
+ end
86
+ it "when serial is nil/empty string" do
87
+ redis = double("redis")
88
+ writer = R509::Validity::Redis::Writer.new(redis)
89
+ expect { writer.unrevoke("abcdef",nil) }.to raise_error(ArgumentError, "Serial and issuer must be provided")
90
+ end
91
+ it "when serial/issuer is provided" do
92
+ redis = double("redis")
93
+ writer = R509::Validity::Redis::Writer.new(redis)
94
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return({"status" => 1})
95
+ redis.should_receive(:hmset).with("cert:abcdef:123", "status", 0)
96
+ writer.unrevoke("abcdef",123)
97
+ end
98
+ it "when cert record doesn't exist (nil)" do
99
+ redis = double("redis")
100
+ writer = R509::Validity::Redis::Writer.new(redis)
101
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return(nil)
102
+ expect { writer.unrevoke("abcdef",123) }.to raise_error(R509::R509Error, "Serial 123 for issuer abcdef is not present")
103
+ end
104
+ it "when cert record doesn't exist ({})" do
105
+ redis = double("redis")
106
+ writer = R509::Validity::Redis::Writer.new(redis)
107
+ redis.should_receive(:hgetall).with("cert:abcdef:123").and_return({})
108
+ expect { writer.unrevoke("abcdef",123) }.to raise_error(R509::R509Error, "Serial 123 for issuer abcdef is not present")
109
+ end
110
+ end
111
+
112
+ context "is available" do
113
+ it "returns true if redis is available" do
114
+ redis = double("redis")
115
+ redis.should_receive(:ping).and_return("PONG")
116
+ writer = R509::Validity::Redis::Writer.new(redis)
117
+ writer.is_available?.should == true
118
+ end
119
+
120
+ it "raises error if redis is unavailable" do
121
+ redis = double("redis")
122
+ redis.should_receive(:ping).and_return(StandardError)
123
+ writer = R509::Validity::Redis::Writer.new(redis)
124
+ writer.is_available?.should == false
125
+ end
126
+ end
127
+ end