Class: OAuthProvider::Backends::Mysql

Inherits:
Abstract
  • Object
show all
Defined in:
lib/oauth_provider/backends/mysql.rb

Instance Method Summary collapse

Methods inherited from Abstract

#add_consumer, #add_user_access, #add_user_request, #destroy_user_access, #provider, #save_consumer

Constructor Details

#initialize(host, user, password, db, port = nil) ⇒ Mysql

Returns a new instance of Mysql.



11
12
13
14
15
16
17
18
19
# File 'lib/oauth_provider/backends/mysql.rb', line 11

def initialize(host, user, password, db, port=nil)
  @db = ::Mysql::real_connect(host, user, password, db, port)
  @db.reconnect = true
  @db.real_query("SET NAMES 'UTF8'")
  # FIXME: The key column widths are perhaps not right. What is the max width of each?
  @db.real_query("CREATE TABLE IF NOT EXISTS consumers (name CHAR(50), shared_key CHAR(43) PRIMARY KEY, secret_key CHAR(43), callback CHAR(255))")
  @db.real_query("CREATE TABLE IF NOT EXISTS request_tokens (shared_key CHAR(22) PRIMARY KEY, secret_key CHAR(43), authorized INT, consumer_shared_key CHAR(43))")
  @db.real_query("CREATE TABLE IF NOT EXISTS access_tokens (shared_key CHAR(22) PRIMARY KEY, secret_key CHAR(43), request_shared_key CHAR(43), consumer_shared_key CHAR(43))")
end

Instance Method Details

#clear!Object



21
22
23
24
25
# File 'lib/oauth_provider/backends/mysql.rb', line 21

def clear!
  @db.real_query("DROP TABLE IF EXISTS consumers")
  @db.real_query("DROP TABLE IF EXISTS request_tokens")
  @db.real_query("DROP TABLE IF EXISTS access_tokens")
end

#consumersObject



44
45
46
47
48
49
50
# File 'lib/oauth_provider/backends/mysql.rb', line 44

def consumers
  rtrn = []
  @db.query("SELECT name, callback, shared_key, secret_key FROM consumers").each do |row|
    rtrn << OAuthProvider::Consumer.new(self, @provider, row[1], OAuthProvider::Token.new(row[2], row[3]))
  end
  rtrn
end

#create_consumer(consumer) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/oauth_provider/backends/mysql.rb', line 27

def create_consumer(consumer)
  # XXX: Should come up with a better way to store names than forcing the gem user to hack it in manually.
  # Also, OAuthProvider::DuplicateCallback is a bit silly... multiple consumers with the same callback may be useful (especially since callbacks are optional.
  @db.query("SELECT callback FROM consumers WHERE callback='#{consumer.callback}' LIMIT 1").each do
    raise OAuthProvider::DuplicateCallback.new(consumer)
  end
  @db.real_query("INSERT INTO consumers (name, shared_key, secret_key, callback) " \
                              "VALUES ('', '#{consumer.shared_key}', '#{consumer.secret_key}', '#{consumer.callback}')")
end

#create_user_access(token) ⇒ Object



77
78
79
80
# File 'lib/oauth_provider/backends/mysql.rb', line 77

def create_user_access(token)
  @db.real_query("INSERT INTO access_tokens (shared_key, secret_key, consumer_shared_key, request_shared_key) " \
              "VALUES ('#{token.shared_key}','#{token.secret_key}','#{token.consumer.shared_key}', '#{token.request_shared_key}')")
end

#create_user_request(token) ⇒ Object



56
57
58
59
# File 'lib/oauth_provider/backends/mysql.rb', line 56

def create_user_request(token)
  @db.real_query("INSERT INTO request_tokens (shared_key, secret_key, authorized, consumer_shared_key) " \
              "VALUES ('#{token.shared_key}','#{token.secret_key}',#{token.authorized? ? 1 : 0},'#{token.consumer.shared_key}')")
end

#destroy_consumer(consumer) ⇒ Object



52
53
54
# File 'lib/oauth_provider/backends/mysql.rb', line 52

def destroy_consumer(consumer)
  @db.real_query("DELETE FROM consumers WHERE shared_key='#{consumer.shared_key}' AND secret_key='#{consumer.secret_key}'")
end

#destroy_user_request(user_request) ⇒ Object



73
74
75
# File 'lib/oauth_provider/backends/mysql.rb', line 73

def destroy_user_request(user_request)
  @db.real_query("DELETE FROM request_tokens WHERE shared_key='#{user_request.shared_key}' AND secret_key='#{user_request.secret_key}'")
end

#find_consumer(shared_key) ⇒ Object



37
38
39
40
41
42
# File 'lib/oauth_provider/backends/mysql.rb', line 37

def find_consumer(shared_key)
  @db.query("SELECT name, callback, shared_key, secret_key FROM consumers WHERE shared_key='#{shared_key}' LIMIT 1").each do |row|
    return OAuthProvider::Consumer.new(self, @provider, row[1], OAuthProvider::Token.new(row[2], row[3]))
  end
  nil
end

#find_user_access(shared_key) ⇒ Object



82
83
84
85
86
87
# File 'lib/oauth_provider/backends/mysql.rb', line 82

def find_user_access(shared_key)
  @db.query("SELECT shared_key, secret_key, request_shared_key, consumer_shared_key FROM access_tokens WHERE shared_key = '#{shared_key}' LIMIT 1").each do |row|
    return OAuthProvider::UserAccess.new(self, self.find_consumer(row[3]), row[2], OAuthProvider::Token.new(row[0], row[1]))
  end
  nil
end

#find_user_request(shared_key) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/oauth_provider/backends/mysql.rb', line 61

def find_user_request(shared_key)
  @db.query("SELECT shared_key, secret_key, authorized, consumer_shared_key FROM request_tokens WHERE shared_key = '#{shared_key}' LIMIT 1").each do |row|
    return OAuthProvider::UserRequest.new(self, self.find_consumer(row[3]), row[2].to_i!=0, OAuthProvider::Token.new(row[0], row[1]))
  end
  raise OAuthProvider::UserRequestNotFound.new(shared_key)
  nil
end

#save_user_request(user_request) ⇒ Object



69
70
71
# File 'lib/oauth_provider/backends/mysql.rb', line 69

def save_user_request(user_request)
  @db.real_query("UPDATE request_tokens SET authorized=#{user_request.authorized? ? '1' : '0'} WHERE shared_key='#{user_request.shared_key}' AND secret_key='#{user_request.secret_key}'")
end