midb 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/midb/dbengine_model.rb +47 -5
- data/lib/midb/errors_view.rb +5 -5
- data/lib/midb/security_controller.rb +20 -9
- data/lib/midb/server_controller.rb +19 -9
- data/lib/midb/server_model.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a61365a18572ed93ed1115447612d6f1f1463f5
|
4
|
+
data.tar.gz: dbc56dd3cb04e326c2a12e23d887b28f9d389584
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88389b80d4ad740ea1bbf541dd2ee5fc54faf8e99de8266dc26d5350ae0bf1ca5a27bd4776eaef062e73c1040403ba63947899ebb368753f259c8d374b284514
|
7
|
+
data.tar.gz: abc6f7ae590fc3013402739769f6a5f9252cab0c63483c93897931a825abda899d993fd75e01037babe1082cd619ca47c518d06bb82c7bed0102883f8ef4043f
|
data/lib/midb/dbengine_model.rb
CHANGED
@@ -3,8 +3,25 @@ require 'sqlite3'
|
|
3
3
|
require 'mysql2'
|
4
4
|
|
5
5
|
module MIDB
|
6
|
+
# @author unrar
|
7
|
+
# This class handles engine-dependent database operations
|
6
8
|
class DbengineModel
|
9
|
+
|
10
|
+
# @!attribute engine
|
11
|
+
# @return [Symbol] The database engine being used
|
12
|
+
# @!attribute host
|
13
|
+
# @return [String] Host name where the database is located
|
14
|
+
# @!attribute uname
|
15
|
+
# @return [String] Username for the database
|
16
|
+
# @!attribute pwd
|
17
|
+
# @return [String] Password for the database.
|
18
|
+
# @!attribute port
|
19
|
+
# @return [Fixnum] Port for the database
|
20
|
+
# @!attribute db
|
21
|
+
# @return [String] Name of the database
|
7
22
|
attr_accessor :engine, :host, :uname, :pwd, :port, :db
|
23
|
+
|
24
|
+
# Constructor - initializes the attributes with the configuration from ServerController
|
8
25
|
def initialize()
|
9
26
|
@engine = MIDB::ServerController.config["dbengine"]
|
10
27
|
@host = MIDB::ServerController.config["dbhost"]
|
@@ -13,20 +30,28 @@ module MIDB
|
|
13
30
|
@pwd = MIDB::ServerController.config["dbpassword"]
|
14
31
|
@db = MIDB::ServerController.db
|
15
32
|
end
|
16
|
-
|
33
|
+
|
17
34
|
# Connect to the specified database
|
35
|
+
#
|
36
|
+
# @return [SQLite3::Database, Mysql2::Client] A resource referencing to the database
|
18
37
|
def connect()
|
38
|
+
# Connect to an SQLite3 database
|
19
39
|
if @engine == :sqlite3
|
20
40
|
sq = SQLite3::Database.open("./db/#{@db}.db")
|
21
41
|
sq.results_as_hash = true
|
22
42
|
return sq
|
43
|
+
# Connect to a MySQL database
|
23
44
|
elsif @engine == :mysql
|
24
45
|
return Mysql2::Client.new(:host => @host, :username => @uname, :password => @pwd, :database => @db)
|
25
46
|
end
|
26
47
|
end
|
27
48
|
|
28
|
-
#
|
29
|
-
#
|
49
|
+
# Perform a query to the database.
|
50
|
+
#
|
51
|
+
# @param res [SQLite3::Database, Mysql2::Client] An existing database resource.
|
52
|
+
# @param query [String] The SQL query to be ran.
|
53
|
+
#
|
54
|
+
# @return [Array, Hash] Returns an array of hashes for SQLite3 or a hash for MySQL
|
30
55
|
def query(res, query)
|
31
56
|
if @engine == :sqlite3
|
32
57
|
return res.execute(query)
|
@@ -35,8 +60,12 @@ module MIDB
|
|
35
60
|
end
|
36
61
|
end
|
37
62
|
|
38
|
-
#
|
39
|
-
#
|
63
|
+
# Extract a field from a query, because different engines return different types (see #query)
|
64
|
+
#
|
65
|
+
# @param result [Array, Hash] The result of a query obtained via #query
|
66
|
+
# @param field [String] The name of the field to be extracted.
|
67
|
+
#
|
68
|
+
# @return [String, Fixnum] The field extracted from a query
|
40
69
|
def extract(result, field)
|
41
70
|
if @engine == :sqlite3
|
42
71
|
return result[0][field] || result[field]
|
@@ -46,5 +75,18 @@ module MIDB
|
|
46
75
|
end
|
47
76
|
end
|
48
77
|
end
|
78
|
+
|
79
|
+
# Returns the length of a result, because different engines return diferent types (see #query)
|
80
|
+
#
|
81
|
+
# @param result [Array, Hash] The result of a query obtained via #query
|
82
|
+
#
|
83
|
+
# @return [Fixnum] Length of the result.
|
84
|
+
def length(result)
|
85
|
+
if @engine == :sqlite3
|
86
|
+
return result.length
|
87
|
+
elsif @engine == :mysql
|
88
|
+
return result.count
|
89
|
+
end
|
90
|
+
end
|
49
91
|
end
|
50
92
|
end
|
data/lib/midb/errors_view.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'midb/server_controller'
|
2
2
|
|
3
|
-
# This controller handles errors.
|
4
3
|
module MIDB
|
4
|
+
# A view that outputs errors.
|
5
5
|
class ErrorsView
|
6
|
-
|
7
|
-
# Handles
|
8
|
-
#
|
6
|
+
|
7
|
+
# Handles fatal errors that will cause the application to abrort.
|
8
|
+
#
|
9
|
+
# @param err [Symbol] The ID of the error that's to be reported.
|
9
10
|
def self.die(err)
|
10
11
|
errmsg = case err
|
11
12
|
when :noargs then "No command supplied. See `midb help`."
|
@@ -25,7 +26,6 @@ module MIDB
|
|
25
26
|
else "Unknown error: #{err.to_s}"
|
26
27
|
end
|
27
28
|
abort("Fatal error: #{errmsg}")
|
28
|
-
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -2,29 +2,40 @@ require 'hmac-sha1'
|
|
2
2
|
require 'base64'
|
3
3
|
require 'cgi'
|
4
4
|
|
5
|
-
# midb security controller - handles API authentication
|
6
|
-
# this will probably become another different project soon!
|
7
5
|
module MIDB
|
6
|
+
# Controller that handles API HMAC authentication.
|
7
|
+
#
|
8
|
+
# @note This will probably become a separate project soon.
|
8
9
|
class SecurityController
|
9
10
|
|
10
|
-
# Method: is_auth?
|
11
11
|
# Checks if an HTTP header is the authorization one
|
12
|
+
#
|
13
|
+
# @deprecated It's no longer used but kept for historical reasons.
|
14
|
+
# @param header [String] A line of an HTTP header.
|
15
|
+
# @return [Boolean] Whether it's an auth header or not.
|
12
16
|
def self.is_auth?(header)
|
13
17
|
return header.split(":")[0].downcase == "authentication"
|
14
18
|
end
|
15
19
|
|
16
|
-
#
|
17
|
-
#
|
20
|
+
# Parses an authentication header so to get the HMAC digest.
|
21
|
+
#
|
22
|
+
# @param header [String] A line of an HTTP header (should have been checked
|
23
|
+
# to be an auth header)
|
24
|
+
# @return [String] The HMAC digest as a string.
|
18
25
|
def self.parse_auth(header)
|
19
26
|
return header.split(" ")[1]
|
20
27
|
end
|
21
28
|
|
22
|
-
#
|
23
|
-
#
|
29
|
+
# Checks if an HMAC digest is properly authenticated.
|
30
|
+
#
|
31
|
+
# @param header [String] A line of an HTTP header (see #parse_auth)
|
32
|
+
# @param params [String] The data passed via the HTTP request.
|
33
|
+
# @param key [String] The private API key.
|
34
|
+
#
|
35
|
+
# @return [Boolean] Whether the given digest matches the correct one or not.
|
24
36
|
def self.check?(header, params, key)
|
25
|
-
signature = params
|
26
37
|
hmac = HMAC::SHA1.new(key)
|
27
|
-
hmac.update(
|
38
|
+
hmac.update(params)
|
28
39
|
return self.parse_auth(header) == CGI.escape(Base64.encode64("#{hmac.digest}"))
|
29
40
|
end
|
30
41
|
end
|
@@ -12,23 +12,33 @@ require 'sqlite3'
|
|
12
12
|
module MIDB
|
13
13
|
# This controller controls the behavior of the midb server.
|
14
14
|
class ServerController
|
15
|
-
|
15
|
+
|
16
|
+
# Attribute declaration here
|
16
17
|
class << self
|
17
|
-
# args
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
18
|
+
# @!attribute args
|
19
|
+
# @return [Array<String>] Arguments passed to the binary.
|
20
|
+
# @!attribute config
|
21
|
+
# @return [Hash] Contains the project's configuration, saved in .midb.yaml
|
22
|
+
# @!attribute db
|
23
|
+
# @return [String] Database name (if SQLite is the engine, file name without extension)
|
24
|
+
# @!attribute http_status
|
25
|
+
# @return [String] HTTP status code and string representation for the header
|
26
|
+
# @!attribute port
|
27
|
+
# @return [Fixnum] Port where the server will listen.
|
21
28
|
attr_accessor :args, :config, :db, :http_status, :port
|
22
29
|
end
|
23
|
-
#
|
24
|
-
#
|
30
|
+
# Default values
|
31
|
+
#
|
32
|
+
# @see #http_status
|
33
|
+
# @see #args
|
34
|
+
# @see #config
|
35
|
+
# @see #port
|
25
36
|
@http_status = "200 OK"
|
26
37
|
@args = []
|
27
38
|
@config = Hash.new()
|
28
39
|
@port = 8081
|
29
40
|
|
30
|
-
#
|
31
|
-
# Decide what to do according to the supplied command!
|
41
|
+
# Decide the server's behavior depending on the arguments.
|
32
42
|
def self.init()
|
33
43
|
# We should have at least one argument, which can be `run` or `serve`
|
34
44
|
MIDB::ErrorsView.die(:noargs) if @args.length < 1
|
data/lib/midb/server_model.rb
CHANGED
@@ -244,7 +244,7 @@ module MIDB
|
|
244
244
|
else
|
245
245
|
query = dbe.query(dblink, "SELECT #{field} from #{table} WHERE id=#{row['id']};")
|
246
246
|
end
|
247
|
-
jso[row["id"]][name] =
|
247
|
+
jso[row["id"]][name] = dbe.length(query) > 0 ? dbe.extract(query,field) : "unknown"
|
248
248
|
end
|
249
249
|
end
|
250
250
|
MIDB::ServerController.http_status = "200 OK"
|
@@ -284,7 +284,7 @@ module MIDB
|
|
284
284
|
else
|
285
285
|
query = dbe.query(dblink, "SELECT #{field} from #{table} WHERE id=#{row['id']};")
|
286
286
|
end
|
287
|
-
jso[row["id"]][name] =
|
287
|
+
jso[row["id"]][name] = dbe.length(query) > 0 ? dbe.extract(query,field) : "unknown"
|
288
288
|
end
|
289
289
|
end
|
290
290
|
return jso
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- unrar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mysql2
|