r509-validity-redis 0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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