cloudkit 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +2 -0
- data/COPYING +20 -0
- data/README +55 -0
- data/Rakefile +35 -0
- data/TODO +22 -0
- data/cloudkit.gemspec +82 -0
- data/doc/curl.html +329 -0
- data/doc/images/example-code.gif +0 -0
- data/doc/images/json-title.gif +0 -0
- data/doc/images/oauth-discovery-logo.gif +0 -0
- data/doc/images/openid-logo.gif +0 -0
- data/doc/index.html +87 -0
- data/doc/main.css +151 -0
- data/doc/rest-api.html +358 -0
- data/examples/1.ru +3 -0
- data/examples/2.ru +3 -0
- data/examples/3.ru +6 -0
- data/examples/4.ru +5 -0
- data/examples/5.ru +10 -0
- data/examples/6.ru +10 -0
- data/examples/TOC +17 -0
- data/lib/cloudkit.rb +74 -0
- data/lib/cloudkit/flash_session.rb +22 -0
- data/lib/cloudkit/oauth_filter.rb +273 -0
- data/lib/cloudkit/oauth_store.rb +56 -0
- data/lib/cloudkit/openid_filter.rb +198 -0
- data/lib/cloudkit/openid_store.rb +101 -0
- data/lib/cloudkit/rack/builder.rb +120 -0
- data/lib/cloudkit/rack/router.rb +20 -0
- data/lib/cloudkit/request.rb +159 -0
- data/lib/cloudkit/service.rb +135 -0
- data/lib/cloudkit/store.rb +459 -0
- data/lib/cloudkit/store/adapter.rb +9 -0
- data/lib/cloudkit/store/extraction_view.rb +57 -0
- data/lib/cloudkit/store/response.rb +51 -0
- data/lib/cloudkit/store/response_helpers.rb +72 -0
- data/lib/cloudkit/store/sql_adapter.rb +36 -0
- data/lib/cloudkit/templates/authorize_request_token.erb +19 -0
- data/lib/cloudkit/templates/oauth_descriptor.erb +43 -0
- data/lib/cloudkit/templates/oauth_meta.erb +8 -0
- data/lib/cloudkit/templates/openid_login.erb +31 -0
- data/lib/cloudkit/templates/request_authorization.erb +23 -0
- data/lib/cloudkit/templates/request_token_denied.erb +18 -0
- data/lib/cloudkit/user_store.rb +44 -0
- data/lib/cloudkit/util.rb +60 -0
- data/test/ext_test.rb +57 -0
- data/test/flash_session_test.rb +22 -0
- data/test/helper.rb +50 -0
- data/test/oauth_filter_test.rb +331 -0
- data/test/oauth_store_test.rb +12 -0
- data/test/openid_filter_test.rb +54 -0
- data/test/openid_store_test.rb +12 -0
- data/test/rack_builder_test.rb +41 -0
- data/test/request_test.rb +197 -0
- data/test/service_test.rb +718 -0
- data/test/store_test.rb +99 -0
- data/test/user_store_test.rb +12 -0
- data/test/util_test.rb +13 -0
- metadata +190 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
module CloudKit
|
2
|
+
|
3
|
+
# An ExtractionView observes a resource collection and extracts specified
|
4
|
+
# elements for querying.
|
5
|
+
class ExtractionView
|
6
|
+
attr_accessor :name, :observe, :extract
|
7
|
+
|
8
|
+
# Initialize an ExtractionView.
|
9
|
+
#
|
10
|
+
# ==Examples
|
11
|
+
#
|
12
|
+
# Observe a "notes" collection and extract the titles and colors.
|
13
|
+
# view = ExtractionView.new(
|
14
|
+
# :name => :note_features,
|
15
|
+
# :observe => :notes,
|
16
|
+
# :extract => [:title, :color])
|
17
|
+
#
|
18
|
+
def initialize(name, options)
|
19
|
+
@name = name
|
20
|
+
@observe = options[:observe]
|
21
|
+
@extract = options[:extract]
|
22
|
+
end
|
23
|
+
|
24
|
+
# Map the provided data into a collection for querying.
|
25
|
+
def map(db, collection, uri, data)
|
26
|
+
if @observe == collection
|
27
|
+
elements = @extract.inject({}) do |e, field|
|
28
|
+
e.merge(field.to_s => data[field.to_s])
|
29
|
+
end
|
30
|
+
elements.merge!('uri' => uri)
|
31
|
+
db.transaction do
|
32
|
+
db[@name].filter(:uri => uri).delete
|
33
|
+
db[@name].insert(elements)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Remove the data with the specified URI from the view
|
39
|
+
def unmap(db, type, uri)
|
40
|
+
if @observe == type
|
41
|
+
db[@name].filter(:uri => uri).delete
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Initialize the storage for this view
|
46
|
+
def initialize_storage(db)
|
47
|
+
extractions = @extract
|
48
|
+
db.create_table @name do
|
49
|
+
extractions.each do |field|
|
50
|
+
text field
|
51
|
+
end
|
52
|
+
primary_key :id
|
53
|
+
varchar :uri
|
54
|
+
end unless db.table_exists?(@name)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module CloudKit
|
2
|
+
|
3
|
+
# A response wrapper for CloudKit::Store
|
4
|
+
class Response
|
5
|
+
include Util
|
6
|
+
|
7
|
+
attr_reader :status, :meta, :content
|
8
|
+
|
9
|
+
# Create an instance of a Response.
|
10
|
+
def initialize(status, meta, content='')
|
11
|
+
@status = status; @meta = meta; @content = content
|
12
|
+
end
|
13
|
+
|
14
|
+
# Return the header value specified by key.
|
15
|
+
def [](key)
|
16
|
+
meta[key]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Set the header specified by key to value.
|
20
|
+
def []=(key, value)
|
21
|
+
meta[key] = value
|
22
|
+
end
|
23
|
+
|
24
|
+
# Translate to the standard Rack representation: [status, headers, content]
|
25
|
+
def to_rack
|
26
|
+
[status, meta, [content]]
|
27
|
+
end
|
28
|
+
|
29
|
+
# Parse and return the JSON content
|
30
|
+
def parsed_content
|
31
|
+
JSON.parse(content)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Clear only the content of the response. Useful for HEAD requests.
|
35
|
+
def clear_content
|
36
|
+
@content = ''
|
37
|
+
end
|
38
|
+
|
39
|
+
# Return a response suitable for HEAD requests.
|
40
|
+
def head
|
41
|
+
response = self.dup
|
42
|
+
response.clear_content
|
43
|
+
response
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return the ETag for this response without the surrounding quotes.
|
47
|
+
def etag
|
48
|
+
unquote(meta['ETag'])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# A set of mixins for building CloudKit::Response objects.
|
2
|
+
module CloudKit::ResponseHelpers
|
3
|
+
def status_404
|
4
|
+
json_error_response(404, 'not found')
|
5
|
+
end
|
6
|
+
|
7
|
+
def status_405(methods)
|
8
|
+
response = json_error_response(405, 'method not allowed')
|
9
|
+
response['Allow'] = methods.join(', ')
|
10
|
+
response
|
11
|
+
end
|
12
|
+
|
13
|
+
def status_410
|
14
|
+
json_error_response(410, 'entity previously deleted')
|
15
|
+
end
|
16
|
+
|
17
|
+
def status_412
|
18
|
+
json_error_response(412, 'precondition failed')
|
19
|
+
end
|
20
|
+
|
21
|
+
def status_422
|
22
|
+
json_error_response(422, 'unprocessable entity')
|
23
|
+
end
|
24
|
+
|
25
|
+
def internal_server_error
|
26
|
+
json_error_response(500, 'unknown server error')
|
27
|
+
end
|
28
|
+
|
29
|
+
def data_required
|
30
|
+
json_error_response(400, 'data required')
|
31
|
+
end
|
32
|
+
|
33
|
+
def invalid_entity_type
|
34
|
+
json_error_response(400, 'valid entity type required')
|
35
|
+
end
|
36
|
+
|
37
|
+
def etag_required
|
38
|
+
json_error_response(400, 'etag required')
|
39
|
+
end
|
40
|
+
|
41
|
+
def allow(methods)
|
42
|
+
CloudKit::Response.new(200, {'Allow' => methods.join(', ')})
|
43
|
+
end
|
44
|
+
|
45
|
+
def response(status, content='', etag=nil, last_modified=nil, options={})
|
46
|
+
cache_control = options[:cache] == false ? 'no-cache' : 'proxy-revalidate'
|
47
|
+
headers = {
|
48
|
+
'Content-Type' => 'application/json',
|
49
|
+
'Cache-Control' => cache_control}
|
50
|
+
headers.merge!('ETag' => "\"#{etag}\"") if etag
|
51
|
+
headers.merge!('Last-Modified' => last_modified) if last_modified
|
52
|
+
CloudKit::Response.new(status, headers, content)
|
53
|
+
end
|
54
|
+
|
55
|
+
def json_meta_response(status, uri, etag, last_modified)
|
56
|
+
json = JSON.generate(
|
57
|
+
:ok => true,
|
58
|
+
:uri => uri,
|
59
|
+
:etag => etag,
|
60
|
+
:last_modified => last_modified)
|
61
|
+
response(status, json, nil, nil, :cache => false)
|
62
|
+
end
|
63
|
+
|
64
|
+
def json_error(message)
|
65
|
+
"{\"error\":\"#{message}\"}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def json_error_response(status, message)
|
69
|
+
"trying to throw a json error message for #{status} #{message}"
|
70
|
+
response(status, json_error(message), nil, nil, :cache => false)
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module CloudKit
|
2
|
+
|
3
|
+
# Adapts a CloudKit::Store to a SQL backend.
|
4
|
+
class SQLAdapter < Adapter
|
5
|
+
|
6
|
+
# Initialize a new SQL backend. Defaults to in-memory SQLite.
|
7
|
+
def initialize(uri=nil, options={})
|
8
|
+
@db = uri ? Sequel.connect(uri, options) : Sequel.sqlite
|
9
|
+
# TODO accept views as part of a store, then initialize them here
|
10
|
+
initialize_storage
|
11
|
+
end
|
12
|
+
|
13
|
+
# method_missing is a placeholder for future interface extraction into
|
14
|
+
# CloudKit::Adapter.
|
15
|
+
def method_missing(method, *args, &block)
|
16
|
+
@db.send(method, *args, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
# Initialize the HTTP-oriented storage if it does not exist.
|
22
|
+
def initialize_storage
|
23
|
+
@db.create_table store_key do
|
24
|
+
primary_key :id
|
25
|
+
varchar :uri, :unique => true
|
26
|
+
varchar :etag
|
27
|
+
varchar :collection_reference
|
28
|
+
varchar :resource_reference
|
29
|
+
varchar :last_modified
|
30
|
+
varchar :remote_user
|
31
|
+
text :content
|
32
|
+
boolean :deleted, :default => false
|
33
|
+
end unless @db.table_exists?(store_key)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,19 @@
|
|
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>OAuth Request Token Authorized</title>
|
7
|
+
<style type="text/css">
|
8
|
+
body {
|
9
|
+
font-family: 'Helvetica', 'Arial', san-serif;
|
10
|
+
}
|
11
|
+
</style>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<p>
|
15
|
+
Your OAuth Request Token has been authorized. Please return to the application
|
16
|
+
that initiated this request to complete the setup.
|
17
|
+
</p>
|
18
|
+
</body>
|
19
|
+
</html>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<XRDS xmlns="xri://$xrds">
|
3
|
+
<XRD xml:id="oauth" xmlns:simple="http://xrds-simple.net/core/1.0" xmlns="xri://$XRD*($v*2.0)" version="2.0">
|
4
|
+
<Type>xri://$xrds*simple</Type>
|
5
|
+
<Expires><%= Time.at(Time.now.to_i + 2592000).utc.xmlschema %></Expires>
|
6
|
+
<Service priority="10">
|
7
|
+
<Type>http://oauth.net/core/1.0/endpoint/request</Type>
|
8
|
+
<Type>http://oauth.net/core/1.0/parameters/auth-header</Type>
|
9
|
+
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
|
10
|
+
<Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type>
|
11
|
+
<URI><%= request.scheme %>://<%= request.env['HTTP_HOST'] %>/oauth/request_tokens</URI>
|
12
|
+
</Service>
|
13
|
+
<Service priority="10">
|
14
|
+
<Type>http://oauth.net/core/1.0/endpoint/authorize</Type>
|
15
|
+
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
|
16
|
+
<URI><%= request.scheme %>://<%= request.env['HTTP_HOST'] %>/oauth/authorization</URI>
|
17
|
+
</Service>
|
18
|
+
<Service priority="10">
|
19
|
+
<Type>http://oauth.net/core/1.0/endpoint/access</Type>
|
20
|
+
<Type>http://oauth.net/core/1.0/parameters/auth-header</Type>
|
21
|
+
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
|
22
|
+
<Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type>
|
23
|
+
<URI><%= request.scheme %>://<%= request.env['HTTP_HOST'] %>/oauth/access_tokens</URI>
|
24
|
+
</Service>
|
25
|
+
<Service priority="10">
|
26
|
+
<Type>http://oauth.net/core/1.0/endpoint/resource</Type>
|
27
|
+
<Type>http://oauth.net/core/1.0/parameters/auth-header</Type>
|
28
|
+
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
|
29
|
+
<Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type>
|
30
|
+
</Service>
|
31
|
+
<Service priority="10">
|
32
|
+
<Type>http://oauth.net/discovery/1.0/consumer-identity/static</Type>
|
33
|
+
<LocalID>cloudkitconsumer</LocalID>
|
34
|
+
</Service>
|
35
|
+
</XRD>
|
36
|
+
<XRD xmlns="xri://$XRD*($v*2.0)" version="2.0">
|
37
|
+
<Type>xri://$xrds*simple</Type>
|
38
|
+
<Service priority="10">
|
39
|
+
<Type>http://oauth.net/discovery/1.0</Type>
|
40
|
+
<URI>#oauth</URI>
|
41
|
+
</Service>
|
42
|
+
</XRD>
|
43
|
+
</XRDS>
|
@@ -0,0 +1,31 @@
|
|
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>Sign Up or Sign In</title>
|
7
|
+
<style type="text/css">
|
8
|
+
body {
|
9
|
+
font-family: 'Helvetica', 'Arial', san-serif;
|
10
|
+
}
|
11
|
+
#openid_url {
|
12
|
+
background: url(data:image/gif;base64,R0lGODlhEAAQANUAAPr6+t/f37Gxsby8vJycnKWlpaampq+vr/zUpfz8/Lm5ufLy8r6+vp2dncvLy/muVsjIyLW1tcTExKGhof7+/sDAwMHBwbS0tNnZ2erq6qioqPn5+bi4uLu7u+np6e3t7evr66mpqeXl5b29vaqqqtfX18zMzO7u7u/v756enveTHv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAQABAAAAZlwJVwKEQQj0eECslcqZbN4zMqhTY/EoFzKbCAVoDNKjFIERTbFaeRcpwWCU3qgBJOVxVDhOEpH4hTFBkBIyQiKSkBgFZEiBiLTBApBgBDd0gXKROKaU0mZiEFl0wAJR0FD1SqQ0EAOw%3D%3D) no-repeat #FFF 5px;
|
13
|
+
padding-left: 25px;
|
14
|
+
width: 300px;
|
15
|
+
}
|
16
|
+
#submit {
|
17
|
+
display: block;
|
18
|
+
margin-top: 10px;
|
19
|
+
}
|
20
|
+
</style>
|
21
|
+
</head>
|
22
|
+
<body>
|
23
|
+
<%= request.flash[:error] %>
|
24
|
+
<%= request.flash[:info] %>
|
25
|
+
<p>Sign Up or Sign In with OpenID</p>
|
26
|
+
<form action="/login" method="POST">
|
27
|
+
<input type="text" id="openid_url" name="openid_url"/>
|
28
|
+
<input id="submit" type="submit" value="Sign In"/>
|
29
|
+
</form>
|
30
|
+
</body>
|
31
|
+
</html>
|
@@ -0,0 +1,23 @@
|
|
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>OAuth Authorization Requested</title>
|
7
|
+
<style type="text/css">
|
8
|
+
body {
|
9
|
+
font-family: 'Helvetica', 'Arial', san-serif;
|
10
|
+
}
|
11
|
+
</style>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<p>
|
15
|
+
Another application or website has requested access to your data.
|
16
|
+
</p>
|
17
|
+
<form action="/oauth/authorized_request_tokens/<%= request['oauth_token'] %>" method="POST">
|
18
|
+
<input type="hidden" name="_method" value="PUT"/>
|
19
|
+
<input type="submit" value="Approve"/>
|
20
|
+
<input type="submit" value="Deny"/>
|
21
|
+
</form>
|
22
|
+
</body>
|
23
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
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>OAuth Request Token Authorization Denied</title>
|
7
|
+
<style type="text/css">
|
8
|
+
body {
|
9
|
+
font-family: 'Helvetica', 'Arial', san-serif;
|
10
|
+
}
|
11
|
+
</style>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<p>
|
15
|
+
Your OAuth Request Token was not denied and has been removed.
|
16
|
+
</p>
|
17
|
+
</body>
|
18
|
+
</html>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module CloudKit
|
2
|
+
|
3
|
+
# A thin layer on top of CloudKit::Store providing consistent URIs and
|
4
|
+
# automatic schema upgrades if required for future releases.
|
5
|
+
class UserStore
|
6
|
+
@@store = nil
|
7
|
+
|
8
|
+
def initialize(uri=nil)
|
9
|
+
unless @@store
|
10
|
+
login_view = ExtractionView.new(
|
11
|
+
:cloudkit_login_view,
|
12
|
+
:observe => :cloudkit_users,
|
13
|
+
:extract => [:identity_url, :remember_me_token, :remember_me_expiration])
|
14
|
+
@@store = Store.new(
|
15
|
+
:collections => [:cloudkit_users],
|
16
|
+
:views => [login_view],
|
17
|
+
:adapter => SQLAdapter.new(uri))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(uri, options={}) #:nodoc:
|
22
|
+
@@store.get(uri, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def post(uri, options={}) #:nodoc:
|
26
|
+
@@store.post(uri, options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def put(uri, options={}) #:nodoc:
|
30
|
+
@@store.put(uri, options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete(uri, options={}) #:nodoc:
|
34
|
+
@@store.delete(uri, options)
|
35
|
+
end
|
36
|
+
|
37
|
+
def resolve_uris(uris) #:nodoc:
|
38
|
+
@@store.resolve_uris(uris)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Return the version for this UserStore
|
42
|
+
def version; 1; end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module CloudKit
|
2
|
+
module Util
|
3
|
+
|
4
|
+
# Render ERB content
|
5
|
+
def erb(request, template, headers={'Content-Type' => 'text/html'}, status=200)
|
6
|
+
template_file = open(
|
7
|
+
File.join(File.dirname(__FILE__),
|
8
|
+
'templates',
|
9
|
+
"#{template.to_s}.erb"))
|
10
|
+
template = ERB.new(template_file.read)
|
11
|
+
[status, headers, [template.result(binding)]]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Build a Rack::Router instance
|
15
|
+
def r(method, path, params=[])
|
16
|
+
Rack::Router.new(method, path, params)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Remove the outer double quotes from a given string.
|
20
|
+
def unquote(text)
|
21
|
+
(text =~ /^\".*\"$/) ? text[1..-2] : text
|
22
|
+
end
|
23
|
+
|
24
|
+
# Return the key used to store the authenticated user.
|
25
|
+
def auth_key; 'cloudkit.user'; end
|
26
|
+
|
27
|
+
# Return the key used to indicate the presence of auth in a stack.
|
28
|
+
def auth_presence_key; 'cloudkit.auth'; end
|
29
|
+
|
30
|
+
# Return the key used to store auth challenge headers shared between
|
31
|
+
# OpenID and OAuth middleware.
|
32
|
+
def challenge_key; 'cloudkit.challenge'; end
|
33
|
+
|
34
|
+
# Return the 'via' key used to announce and track upstream middleware.
|
35
|
+
def via_key; 'cloudkit.via'; end
|
36
|
+
|
37
|
+
# Return the key used to store the 'flash' in the session.
|
38
|
+
def flash_key; 'cloudkit.flash'; end
|
39
|
+
|
40
|
+
# Return the 'via' key for the OAuth filter.
|
41
|
+
def oauth_filter_key; 'cloudkit.filter.oauth'; end
|
42
|
+
|
43
|
+
# Return the 'via' key for the OpenID filter.
|
44
|
+
def openid_filter_key; 'cloudkit.filter.openid'; end
|
45
|
+
|
46
|
+
# Return the key used to store the shared storage URI for the stack.
|
47
|
+
def storage_uri_key; 'cloudkit.storage.uri'; end
|
48
|
+
|
49
|
+
# Return the key for the login URL used in OpenID and OAuth middleware
|
50
|
+
# components.
|
51
|
+
def login_url_key; 'cloudkit.filter.openid.url.login'; end
|
52
|
+
|
53
|
+
# Return the key for the logout URL used in OpenID and OAuth middleware
|
54
|
+
# components.
|
55
|
+
def logout_url_key; 'cloudkit.filter.openid.url.logout'; end
|
56
|
+
|
57
|
+
# Return the outer namespace key for the JSON store.
|
58
|
+
def store_key; :cloudkit_json_store; end
|
59
|
+
end
|
60
|
+
end
|