Module: PWN::Plugins::DAOSQLite3

Defined in:
lib/pwn/plugins/dao_sqlite3.rb

Overview

This plugin is a data access object used for interacting w/ SQLite3 databases.

Class Method Summary collapse

Class Method Details

.authors ⇒ Object

Author(s)

0day Inc. [email protected]



100
101
102
103
104
# File 'lib/pwn/plugins/dao_sqlite3.rb', line 100

public_class_method def self.authors
  "AUTHOR(S):
    0day Inc. <[email protected]>
  "
end

.connect(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::DAOSQLite3.connect( db_path: 'Required - Path of SQLite3 DB File' )



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/pwn/plugins/dao_sqlite3.rb', line 15

public_class_method def self.connect(opts = {})
  db_path = opts[:db_path]

  sqlite3_conn = SQLite3::Database.new(db_path)
  sqlite3_conn.results_as_hash = true
  # Be sure to enable foreign key support for each connection
  sql_enable_fk = 'PRAGMA foreign_keys = ON;'
  res = sql_statement(
    sqlite3_conn: sqlite3_conn,
    prepared_statement: sql_enable_fk
  )
  # TODO: better handling since sqlite3 gem always returns SQLite3::Database
  # whether DB exists or not
  unless sqlite3_conn.instance_of?(SQLite3::Database)
    raise "
      Connection Error - class should be SQLite3::Database...received:
      sqlite3_conn = #{sqlite3_conn.inspect}
      sqlite3_conn.class = #{sqlite3_conn.class}
    "
  end

  sqlite3_conn
rescue StandardError => e
  raise e
end

.disconnect(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::DAOSQLite3.disconnect( sqlite3_conn: sqlite3_conn )



89
90
91
92
93
94
95
96
# File 'lib/pwn/plugins/dao_sqlite3.rb', line 89

public_class_method def self.disconnect(opts = {})
  sqlite3_conn = opts[:sqlite3_conn]
  validate_sqlite3_conn(sqlite3_conn: sqlite3_conn)

  sqlite3_conn.close
rescue StandardError => e
  raise e
end

.help ⇒ Object

Display Usage for this Module



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/pwn/plugins/dao_sqlite3.rb', line 108

public_class_method def self.help
  puts "USAGE:
    # Run connect and return its result
    #{self}.connect(
      db_path: 'required - Path of SQLite3 DB File'
    )

    # Run sql statement and return its result
    #{self}.sql_statement(
      sqlite3_conn: 'optional - sqlite3 conn value consumed by #sql_statement',
      prepared_statement: 'optional - SELECT * FROM tn_users WHERE state = ?;',
      statement_params: 'required - statement params value consumed by #sql_statement'
    )

    # Run disconnect and return its result
    #{self}.disconnect(
      sqlite3_conn: 'optional - sqlite3 conn value consumed by #disconnect'
    )

    # Print the AUTHOR(S) string for this module.
    #{self}.authors
  "
  constants.sort
end

.sql_statement(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::DAOSQLite3.sql_statement( sqlite3_conn: sqlite3_conn, prepared_statement: 'SELECT * FROM tn_users WHERE state = ?;', statement_params: ['Active'] )



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/pwn/plugins/dao_sqlite3.rb', line 60

public_class_method def self.sql_statement(opts = {})
  sqlite3_conn = opts[:sqlite3_conn]
  validate_sqlite3_conn(sqlite3_conn: sqlite3_conn)
  prepared_statement = opts[:prepared_statement] # Can also be leveraged for 'select * from user;'
  statement_params = opts[:statement_params] # << Array of Params
  raise "Error: :statement_params => #{statement_params.class}. Pass as an Array object" unless statement_params.instance_of?(Array) || statement_params.nil?

  begin
    if statement_params.nil?
      res = sqlite3_conn.execute(prepared_statement)
    else
      res = sqlite3_conn.execute(prepared_statement, statement_params)
    end
  rescue SQLite3::BusyException
    puts 'Database In Use - Retrying...'
    sleep 0.3
    retry
  end

  res
rescue StandardError => e
  raise e
end