mirror of
https://github.com/nmap/nmap.git
synced 2025-12-07 13:11:28 +00:00
Remove trailing whitespace in lua files
Whitespace is not significant, so this should not be a problem. https://secwiki.org/w/Nmap/Code_Standards
This commit is contained in:
174
nselib/mysql.lua
174
nselib/mysql.lua
@@ -17,7 +17,7 @@ _ENV = stdnse.module("mysql", stdnse.seeall)
|
||||
|
||||
-- Version 0.3
|
||||
--
|
||||
-- Created 01/15/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
|
||||
-- Created 01/15/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
|
||||
-- Revised 01/23/2010 - v0.2 - added query support, cleanup, documentation
|
||||
-- Revised 08/24/2010 - v0.3 - added error handling for recieveGreeting
|
||||
-- fixed a number of incorrect receives and changed
|
||||
@@ -27,7 +27,7 @@ local tab = require('tab')
|
||||
|
||||
local HAVE_SSL, openssl = pcall(require,'openssl')
|
||||
|
||||
Capabilities =
|
||||
Capabilities =
|
||||
{
|
||||
LongPassword = 0x1,
|
||||
FoundRows = 0x2,
|
||||
@@ -58,7 +58,7 @@ Charset =
|
||||
latin1_COLLATE_latin1_swedish_ci = 0x8
|
||||
}
|
||||
|
||||
ServerStatus =
|
||||
ServerStatus =
|
||||
{
|
||||
InTransaction = 0x1,
|
||||
AutoCommit = 0x2,
|
||||
@@ -72,7 +72,7 @@ ServerStatus =
|
||||
NoBackslashEscapes = 0x200
|
||||
}
|
||||
|
||||
Command =
|
||||
Command =
|
||||
{
|
||||
Query = 3
|
||||
}
|
||||
@@ -86,14 +86,14 @@ local HEADER_SIZE = 4
|
||||
-- @param data string of raw data
|
||||
-- @return response table containing the fields <code>len</code> and <code>packetno</code>
|
||||
local function decodeHeader( data, pos )
|
||||
|
||||
|
||||
local response = {}
|
||||
local pos, tmp = pos or 1, 0
|
||||
|
||||
|
||||
pos, tmp = bin.unpack( "I", data, pos )
|
||||
response.len = bit.band( tmp,255 )
|
||||
response.number = bit.rshift( tmp, 24 )
|
||||
|
||||
|
||||
return pos, response
|
||||
end
|
||||
|
||||
@@ -106,21 +106,21 @@ end
|
||||
-- <code>status</code> or error message on failure (status == false)
|
||||
function receiveGreeting( socket )
|
||||
|
||||
local catch = function() socket:close() stdnse.print_debug("receiveGreeting(): failed") end
|
||||
local catch = function() socket:close() stdnse.print_debug("receiveGreeting(): failed") end
|
||||
local try = nmap.new_try(catch)
|
||||
local data = try( socket:receive_bytes(HEADER_SIZE) )
|
||||
local pos, response, tmp, _
|
||||
|
||||
pos, response = decodeHeader( data, 1 )
|
||||
|
||||
pos, response = decodeHeader( data, 1 )
|
||||
|
||||
-- do we need to read the remainder
|
||||
if ( #data - HEADER_SIZE < response.len ) then
|
||||
local tmp = try( socket:receive_bytes( response.len - #data + HEADER_SIZE ) )
|
||||
data = data .. tmp
|
||||
end
|
||||
|
||||
|
||||
local is_error
|
||||
pos, is_error = bin.unpack( "C", data, pos )
|
||||
pos, is_error = bin.unpack( "C", data, pos )
|
||||
|
||||
if ( is_error == 0xff ) then
|
||||
pos, response.errorcode = bin.unpack( "S", data, pos )
|
||||
@@ -128,7 +128,7 @@ function receiveGreeting( socket )
|
||||
|
||||
return false, response.errormsg
|
||||
end
|
||||
|
||||
|
||||
pos, response.proto = bin.unpack( "C", data, pos )
|
||||
pos, response.version = bin.unpack( "z", data, pos )
|
||||
pos, response.threadid = bin.unpack( "I", data, pos )
|
||||
@@ -138,12 +138,12 @@ function receiveGreeting( socket )
|
||||
pos, response.status = bin.unpack( "S", data, pos )
|
||||
pos, _ = bin.unpack( "A13", data, pos )
|
||||
pos, tmp = bin.unpack( "A12", data, pos )
|
||||
|
||||
|
||||
response.salt = response.salt .. tmp
|
||||
response.errorcode = 0
|
||||
|
||||
|
||||
return true, response
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -193,7 +193,7 @@ end
|
||||
-- @return response table or error message on failure
|
||||
function loginRequest( socket, params, username, password, salt )
|
||||
|
||||
local catch = function() socket:close() stdnse.print_debug("loginRequest(): failed") end
|
||||
local catch = function() socket:close() stdnse.print_debug("loginRequest(): failed") end
|
||||
local try = nmap.new_try(catch)
|
||||
local packetno = 1
|
||||
local authversion = params.authversion or "post41"
|
||||
@@ -201,7 +201,7 @@ function loginRequest( socket, params, username, password, salt )
|
||||
|
||||
if not(HAVE_SSL) then
|
||||
return false, "No OpenSSL"
|
||||
end
|
||||
end
|
||||
|
||||
if authversion ~= "post41" then
|
||||
return false, "Unsupported authentication version: " .. authversion
|
||||
@@ -214,70 +214,70 @@ function loginRequest( socket, params, username, password, salt )
|
||||
clicap = clicap + Capabilities.InteractiveClient
|
||||
clicap = clicap + Capabilities.SupportsTransactions
|
||||
clicap = clicap + Capabilities.Support41Auth
|
||||
|
||||
|
||||
local extcapabilities = ExtCapabilities.SupportsMultipleStatments
|
||||
extcapabilities = extcapabilities + ExtCapabilities.SupportsMultipleResults
|
||||
|
||||
|
||||
local packet = bin.pack( "S", clicap )
|
||||
packet = packet .. bin.pack( "S", extcapabilities )
|
||||
packet = packet .. bin.pack( "I", MAXPACKET )
|
||||
packet = packet .. bin.pack( "C", Charset.latin1_COLLATE_latin1_swedish_ci )
|
||||
packet = packet .. bin.pack( "A", string.char(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) )
|
||||
packet = packet .. bin.pack( "z", username )
|
||||
|
||||
|
||||
if ( password ~= nil and password:len() > 0 ) then
|
||||
local hash = createLoginHash( password, salt )
|
||||
packet = packet .. bin.pack( "A", string.char( 0x14 ) .. hash )
|
||||
else
|
||||
packet = packet .. bin.pack( "C", 0 )
|
||||
end
|
||||
|
||||
|
||||
local tmp = packet:len() + bit.lshift( packetno, 24 )
|
||||
|
||||
|
||||
packet = bin.pack( "I", tmp ) .. packet
|
||||
|
||||
|
||||
try( socket:send(packet) )
|
||||
packet = try( socket:receive_bytes(HEADER_SIZE) )
|
||||
local pos, response = decodeHeader( packet )
|
||||
|
||||
|
||||
-- do we need to read the remainder
|
||||
if ( #packet - HEADER_SIZE < response.len ) then
|
||||
local tmp = try( socket:receive_bytes( response.len - #packet + HEADER_SIZE ) )
|
||||
packet = packet .. tmp
|
||||
end
|
||||
|
||||
|
||||
local is_error
|
||||
|
||||
pos, is_error = bin.unpack( "C", packet, pos )
|
||||
|
||||
|
||||
pos, is_error = bin.unpack( "C", packet, pos )
|
||||
|
||||
if is_error > 0 then
|
||||
pos, response.errorcode = bin.unpack( "S", packet, pos )
|
||||
|
||||
|
||||
local has_sqlstate
|
||||
pos, has_sqlstate = bin.unpack( "C", packet, pos )
|
||||
|
||||
|
||||
if has_sqlstate == 35 then
|
||||
pos, response.sqlstate = bin.unpack( "A5", packet, pos )
|
||||
end
|
||||
|
||||
pos, response.errormessage = bin.unpack( "z", packet, pos )
|
||||
|
||||
pos, response.errormessage = bin.unpack( "z", packet, pos )
|
||||
|
||||
return false, response.errormessage
|
||||
else
|
||||
response.errorcode = 0
|
||||
pos, response.affectedrows = bin.unpack( "C", packet, pos )
|
||||
pos, response.serverstatus = bin.unpack( "S", packet, pos )
|
||||
pos, response.warnings = bin.unpack( "S", packet, pos )
|
||||
pos, response.warnings = bin.unpack( "S", packet, pos )
|
||||
end
|
||||
|
||||
|
||||
return true, response
|
||||
|
||||
|
||||
end
|
||||
|
||||
--- Decodes a single column field
|
||||
--
|
||||
-- http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Field_Packet
|
||||
--
|
||||
--
|
||||
-- @param data string containing field packets
|
||||
-- @param pos number containing position from which to start decoding
|
||||
-- the position should point to the data in this buffer (ie. after the header)
|
||||
@@ -286,14 +286,14 @@ end
|
||||
-- <code>origt_table</code>, <code>name</code>, <code>orig_name</code>,
|
||||
-- <code>length</code> and <code>type</code>
|
||||
function decodeField( data, pos )
|
||||
|
||||
|
||||
local header, len
|
||||
local def, _
|
||||
local field = {}
|
||||
|
||||
pos, len = bin.unpack( "C", data, pos )
|
||||
pos, field.catalog = bin.unpack( "A" .. len, data, pos )
|
||||
|
||||
|
||||
pos, len = bin.unpack( "C", data, pos )
|
||||
pos, field.database = bin.unpack( "A" .. len, data, pos )
|
||||
|
||||
@@ -311,15 +311,15 @@ function decodeField( data, pos )
|
||||
|
||||
-- should be 0x0C
|
||||
pos, _ = bin.unpack( "C", data, pos )
|
||||
|
||||
|
||||
-- charset, in my case 0x0800
|
||||
pos, _ = bin.unpack( "S", data, pos )
|
||||
|
||||
pos, field.length = bin.unpack( "I", data, pos )
|
||||
pos, field.type = bin.unpack( "A6", data, pos )
|
||||
|
||||
|
||||
return pos, field
|
||||
|
||||
|
||||
end
|
||||
|
||||
--- Decodes the result set header packet into it's sub components
|
||||
@@ -330,13 +330,13 @@ end
|
||||
-- @return table containing the following <code>header</code>, <code>fields</code> and <code>data</code>
|
||||
function decodeQueryResponse( socket )
|
||||
|
||||
local catch = function() socket:close() stdnse.print_debug("decodeQueryResponse(): failed") end
|
||||
local catch = function() socket:close() stdnse.print_debug("decodeQueryResponse(): failed") end
|
||||
local try = nmap.new_try(catch)
|
||||
local data, header, pos
|
||||
local rs, blocks = {}, {}
|
||||
local block_start, block_end
|
||||
local EOF_MARKER = 254
|
||||
|
||||
|
||||
data = try( socket:receive_bytes(HEADER_SIZE) )
|
||||
pos, header = decodeHeader( data, pos )
|
||||
|
||||
@@ -346,9 +346,9 @@ function decodeQueryResponse( socket )
|
||||
if data:len() < header.len then
|
||||
data = data .. try( socket:receive_bytes( header.len - #data + HEADER_SIZE ) )
|
||||
end
|
||||
|
||||
|
||||
rs.header = data:sub( 1, HEADER_SIZE + header.len )
|
||||
|
||||
|
||||
-- abort on MySQL error
|
||||
if rs.header:sub(HEADER_SIZE + 1, HEADER_SIZE + 1) == string.char(0xFF) then
|
||||
-- is this a 4.0 or 4.1 error message
|
||||
@@ -360,29 +360,29 @@ function decodeQueryResponse( socket )
|
||||
end
|
||||
|
||||
pos = HEADER_SIZE + header.len + 1
|
||||
|
||||
|
||||
-- Second, Let's attempt to read the "Field Packets" and "Row Data Packets"
|
||||
-- They're separated by an "EOF Packet"
|
||||
for i=1,2 do
|
||||
|
||||
|
||||
-- marks the start of our block
|
||||
block_start = pos
|
||||
|
||||
|
||||
while true do
|
||||
|
||||
|
||||
if data:len() - pos < HEADER_SIZE then
|
||||
data = data .. try( socket:receive_bytes( HEADER_SIZE - ( data:len() - pos ) ) )
|
||||
data = data .. try( socket:receive_bytes( HEADER_SIZE - ( data:len() - pos ) ) )
|
||||
end
|
||||
|
||||
|
||||
pos, header = decodeHeader( data, pos )
|
||||
|
||||
|
||||
if data:len() - pos < header.len - 1 then
|
||||
data = data .. try( socket:receive_bytes( header.len - ( data:len() - pos ) ) )
|
||||
end
|
||||
|
||||
|
||||
if header.len > 0 then
|
||||
local _, b = bin.unpack("C", data, pos )
|
||||
|
||||
local _, b = bin.unpack("C", data, pos )
|
||||
|
||||
-- Is this the EOF packet?
|
||||
if b == EOF_MARKER then
|
||||
-- we don't want the EOF Packet included
|
||||
@@ -397,15 +397,15 @@ function decodeQueryResponse( socket )
|
||||
end
|
||||
|
||||
blocks[i] = data:sub( block_start, block_end )
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
rs.fields = blocks[1]
|
||||
rs.data = blocks[2]
|
||||
|
||||
|
||||
return true, rs
|
||||
|
||||
|
||||
end
|
||||
|
||||
--- Decodes as field packet and returns a table of field tables
|
||||
@@ -415,23 +415,23 @@ end
|
||||
-- @param data string containing field packets
|
||||
-- @param count number containing the amount of fields to decode
|
||||
-- @return status boolean (true on success, false on failure)
|
||||
-- @return fields table containing field tables as returned by <code>decodeField</code>
|
||||
-- @return fields table containing field tables as returned by <code>decodeField</code>
|
||||
-- or string containing error message if status is false
|
||||
function decodeFieldPackets( data, count )
|
||||
|
||||
|
||||
local pos, header
|
||||
local field, fields = {}, {}
|
||||
|
||||
|
||||
if count < 1 then
|
||||
return false, "Field count was less than one, aborting"
|
||||
end
|
||||
|
||||
|
||||
for i=1, count do
|
||||
pos, header = decodeHeader( data, pos )
|
||||
pos, field = decodeField( data, pos )
|
||||
table.insert( fields, field )
|
||||
end
|
||||
|
||||
|
||||
return true, fields
|
||||
end
|
||||
|
||||
@@ -442,15 +442,15 @@ end
|
||||
-- @param data string containing the result set header packet
|
||||
-- @return number containing the amount of fields
|
||||
function decodeResultSetHeader( data )
|
||||
|
||||
|
||||
local _, fields
|
||||
|
||||
|
||||
if data:len() ~= HEADER_SIZE + 1 then
|
||||
return false, "Result set header was incorrect"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
_, fields = bin.unpack( "C", data, HEADER_SIZE + 1 )
|
||||
|
||||
|
||||
return true, fields
|
||||
end
|
||||
|
||||
@@ -463,25 +463,25 @@ end
|
||||
-- @return status true on success, false on failure
|
||||
-- @return rows table containing row tables
|
||||
function decodeDataPackets( data, count )
|
||||
|
||||
|
||||
local len, pos = 0, 1, 1
|
||||
local header, row, rows = {}, {}, {}
|
||||
|
||||
while pos < data:len() do
|
||||
row = {}
|
||||
pos, header = decodeHeader( data, pos )
|
||||
|
||||
|
||||
for i=1, count do
|
||||
pos, len = bin.unpack("C", data, pos )
|
||||
pos, row[i] = bin.unpack("A" .. len, data, pos)
|
||||
end
|
||||
|
||||
|
||||
table.insert( rows, row )
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
return true, rows
|
||||
|
||||
|
||||
end
|
||||
|
||||
--- Sends the query to the MySQL server and then attempts to decode the response
|
||||
@@ -492,13 +492,13 @@ end
|
||||
-- @return rows table containing row tabels as decoded by <code>decodeDataPackets</code>
|
||||
function sqlQuery( socket, query )
|
||||
|
||||
local catch = function() socket:close() stdnse.print_debug("sqlQuery(): failed") end
|
||||
local catch = function() socket:close() stdnse.print_debug("sqlQuery(): failed") end
|
||||
local try = nmap.new_try(catch)
|
||||
local packetno = 0
|
||||
local querylen = query:len() + 1
|
||||
local packet, packet_len, pos, header
|
||||
local status, fields, field_count, rows, rs
|
||||
|
||||
|
||||
packet = bin.pack("ICA", querylen, Command.Query, query )
|
||||
|
||||
--
|
||||
@@ -509,18 +509,18 @@ function sqlQuery( socket, query )
|
||||
-- (EOF Packet) marker: end of Field Packets
|
||||
-- (Row Data Packets) row contents
|
||||
-- (EOF Packet) marker: end of Data Packets
|
||||
|
||||
|
||||
try( socket:send(packet) )
|
||||
|
||||
|
||||
--
|
||||
-- Let's read all the data into a table
|
||||
-- This way we avoid the hustle with reading from the socket
|
||||
status, rs = decodeQueryResponse( socket )
|
||||
|
||||
|
||||
if not status then
|
||||
return false, rs
|
||||
end
|
||||
|
||||
|
||||
status, field_count = decodeResultSetHeader(rs.header)
|
||||
|
||||
if not status then
|
||||
@@ -528,7 +528,7 @@ function sqlQuery( socket, query )
|
||||
end
|
||||
|
||||
status, fields = decodeFieldPackets(rs.fields, field_count)
|
||||
|
||||
|
||||
if not status then
|
||||
return false, fields
|
||||
end
|
||||
@@ -538,8 +538,8 @@ function sqlQuery( socket, query )
|
||||
if not status then
|
||||
return false, rows
|
||||
end
|
||||
|
||||
return true, { cols = fields, rows = rows }
|
||||
|
||||
return true, { cols = fields, rows = rows }
|
||||
end
|
||||
|
||||
---
|
||||
@@ -557,16 +557,16 @@ function formatResultset(rs, options)
|
||||
|
||||
local restab = tab.new(#rs.cols)
|
||||
local colnames = {}
|
||||
|
||||
|
||||
if ( not(options.noheaders) ) then
|
||||
for _, col in ipairs(rs.cols) do table.insert(colnames, col.name) end
|
||||
tab.addrow(restab, table.unpack(colnames))
|
||||
end
|
||||
|
||||
|
||||
for _, row in ipairs(rs.rows) do
|
||||
tab.addrow(restab, table.unpack(row))
|
||||
end
|
||||
|
||||
|
||||
return tab.dump(restab)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user