Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3b9fe3e

Browse files
committed
everything is ready for testing (smoke and live)
1 parent dc11ae0 commit 3b9fe3e

2 files changed

Lines changed: 86 additions & 47 deletions

File tree

lib/core/testing.py

Lines changed: 68 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import logging
2626
import os
2727
import re
28+
import shutil
2829
import sys
2930
import tempfile
3031
import time
@@ -49,11 +50,11 @@ def smokeTest():
4950
import doctest
5051
retVal = True
5152
count, length = 0, 0
52-
53+
5354
for root, _, files in os.walk(paths.SQLMAP_ROOT_PATH):
5455
for file in files:
5556
length += 1
56-
57+
5758
for root, _, files in os.walk(paths.SQLMAP_ROOT_PATH):
5859
for file in files:
5960
if os.path.splitext(file)[1].lower() == '.py' and file != '__init__.py':
@@ -81,10 +82,10 @@ def smokeTest():
8182

8283
dataToStdout("\r%s\r" % (" "*(getConsoleWidth()-1)))
8384
if retVal:
84-
logger.info("smoke test final result: passed")
85+
logger.info("smoke test final result: PASSED")
8586
else:
86-
logger.info("smoke test final result: failed")
87-
87+
logger.error("smoke test final result: FAILED")
88+
8889
return retVal
8990

9091
def liveTest():
@@ -93,75 +94,96 @@ def liveTest():
9394
"""
9495
retVal = True
9596
count = 0
96-
vars = {}
97+
global_ = {}
98+
vars_ = {}
9799
xfile = codecs.open(paths.LIVE_TESTS_XML, 'r', conf.dataEncoding)
98100
livetests = minidom.parse(xfile).documentElement
99101
xfile.close()
100-
101-
global_ = livetests.getElementsByTagName("global")
102-
if global_:
103-
for item in global_:
102+
length = len(livetests.getElementsByTagName("case"))
103+
104+
element = livetests.getElementsByTagName("global")
105+
if element:
106+
for item in element:
104107
for child in item.childNodes:
105108
if child.nodeType == child.ELEMENT_NODE and child.hasAttribute("value"):
106-
vars[child.tagName] = child.getAttribute("value")
109+
global_[child.tagName] = child.getAttribute("value")
110+
111+
element = livetests.getElementsByTagName("vars")
112+
if element:
113+
for item in element:
114+
for child in item.childNodes:
115+
if child.nodeType == child.ELEMENT_NODE and child.hasAttribute("value"):
116+
vars_[child.tagName] = child.getAttribute("value")
107117

108118
for case in livetests.getElementsByTagName("case"):
119+
name = None
109120
log = []
110121
session = []
111-
switches = {}
112-
count += 1
122+
switches = dict(global_)
123+
124+
if case.hasAttribute("name"):
125+
name = case.getAttribute("name")
113126

114127
if case.getElementsByTagName("switches"):
115128
for child in case.getElementsByTagName("switches")[0].childNodes:
116129
if child.nodeType == child.ELEMENT_NODE and child.hasAttribute("value"):
117-
switches[child.tagName] = replaceVars(child.getAttribute("value"), vars)
130+
switches[child.tagName] = replaceVars(child.getAttribute("value"), vars_)
118131

119132
if case.getElementsByTagName("log"):
120133
for item in case.getElementsByTagName("log")[0].getElementsByTagName("item"):
121134
if item.hasAttribute("value"):
122-
log.append(replaceVars(item.getAttribute("value"), vars))
135+
log.append(replaceVars(item.getAttribute("value"), vars_))
123136

124137
if case.getElementsByTagName("session"):
125138
for item in case.getElementsByTagName("session")[0].getElementsByTagName("item"):
126139
if item.hasAttribute("value"):
127-
session.append(replaceVars(item.getAttribute("value"), vars))
128-
129-
result = runCase(switches, log, session)
130-
if not result:
131-
errMsg = "live test failed at case #%d" % count
132-
logger.error(errMsg)
133-
retVal &= result
140+
session.append(replaceVars(item.getAttribute("value"), vars_))
134141

142+
count += 1
143+
msg = "running live test case '%s' (%d/%d)" % (name, count, length)
144+
logger.info(msg)
145+
result = runCase(name, switches, log, session)
146+
if result:
147+
logger.info("test passed")
148+
else:
149+
logger.error("test failed")
150+
retVal &= result
151+
152+
dataToStdout("\n")
135153
if retVal:
136-
logger.info("live test final result: passed")
154+
logger.info("live test final result: PASSED")
137155
else:
138-
logger.info("live test final result: failed")
139-
156+
logger.error("live test final result: FAILED")
157+
140158
return retVal
141159

142-
def initCase():
160+
def initCase(switches=None):
143161
paths.SQLMAP_OUTPUT_PATH = tempfile.mkdtemp()
144162
paths.SQLMAP_DUMP_PATH = os.path.join(paths.SQLMAP_OUTPUT_PATH, "%s", "dump")
145163
paths.SQLMAP_FILES_PATH = os.path.join(paths.SQLMAP_OUTPUT_PATH, "%s", "files")
146164
cmdLineOptions = cmdLineParser()
147165
cmdLineOptions.liveTest = cmdLineOptions.smokeTest = False
148166
cmdLineOptions.verbose = 0
167+
168+
if switches:
169+
for key, value in switches.items():
170+
conf[key] = value
171+
172+
conf.sessionFile = None
149173
init(cmdLineOptions)
150174
__setVerbosity()
151175

152176
def cleanCase():
153-
#remove dir: paths.SQLMAP_OUTPUT_PATH
177+
shutil.rmtree(paths.SQLMAP_OUTPUT_PATH, True)
154178
paths.SQLMAP_OUTPUT_PATH = os.path.join(paths.SQLMAP_ROOT_PATH, "output")
155179
paths.SQLMAP_DUMP_PATH = os.path.join(paths.SQLMAP_OUTPUT_PATH, "%s", "dump")
156180
paths.SQLMAP_FILES_PATH = os.path.join(paths.SQLMAP_OUTPUT_PATH, "%s", "files")
157181
conf.verbose = 1
158182
__setVerbosity()
159183

160-
def runCase(switches, log=None, session=None):
184+
def runCase(name=None, switches=None, log=None, session=None):
161185
retVal = True
162-
initCase()
163-
for key, value in switches.items():
164-
conf[key] = value
186+
initCase(switches)
165187

166188
result = start()
167189
if result == False: #if None ignore
@@ -172,8 +194,11 @@ def runCase(switches, log=None, session=None):
172194
content = file.read()
173195
file.close()
174196
for item in session:
175-
#if not re.search(item, content):
176-
if content.find(item) < 0:
197+
if item.startswith("r'") and item.endswith("'"):
198+
if not re.search(item[2:-1], content):
199+
retVal = False
200+
break
201+
elif content.find(item) < 0:
177202
retVal = False
178203
break
179204

@@ -182,18 +207,21 @@ def runCase(switches, log=None, session=None):
182207
content = file.read()
183208
file.close()
184209
for item in log:
185-
#if not re.search(item, content):
186-
if content.find(item) < 0:
210+
if item.startswith("r'") and item.endswith("'"):
211+
if not re.search(item[2:-1], content):
212+
retVal = False
213+
break
214+
elif content.find(item) < 0:
187215
retVal = False
188216
break
189217

190218
cleanCase()
191219
return retVal
192220

193-
def replaceVars(item, vars):
221+
def replaceVars(item, vars_):
194222
retVal = item
195-
if item and vars:
223+
if item and vars_:
196224
for var in re.findall(getCompiledRegex("\$\{([^}]+)\}"), item):
197-
if var in vars:
198-
retVal = retVal.replace("${%s}" % var, vars[var])
199-
return retVal
225+
if var in vars_:
226+
retVal = retVal.replace("${%s}" % var, vars_[var])
227+
return retVal

xml/livetests.xml

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,44 @@
22

33
<root>
44
<global>
5-
<host value="192.168.228.130"/>
5+
<ignoreProxy value="True"/>
66
</global>
7-
<!-- MySQL -->
8-
<case>
7+
<vars>
8+
<host value="172.16.104.130"/>
9+
</vars>
10+
<case name="Postgres (--is-dba)">
11+
<switches>
12+
<url value="http://${host}/sqlmap/pgsql/get_int.php?id=1"/>
13+
<isDba value="True"/>
14+
</switches>
15+
<log>
16+
<item value="current user is DBA: 'True'"/>
17+
</log>
18+
</case>
19+
<case name="MySQL (--banner --threads=5)">
920
<switches>
1021
<url value="http://${host}/sqlmap/mysql/get_int.php?id=1"/>
1122
<getBanner value="True"/>
23+
<threads value="5"/>
1224
</switches>
1325
<log>
1426
<item value="5.1.41-3~bpo50+1"/>
1527
</log>
1628
</case>
17-
<!-- Oracle
18-
<case>
29+
<case name="Oracle (-o -f --users)">
1930
<switches>
2031
<url value="http://${host}/sqlmap/oracle/get_int.php?id=1"/>
2132
<extensiveFp value="True"/>
33+
<optimize value="True"/>
2234
<getUsers value="True"/>
2335
</switches>
2436
<log>
2537
<item value="database management system users"/>
26-
<item value="SYSMAN"/>
38+
<item value="r'SYS.*N'"/> <!--sample for regex-->
2739
</log>
2840
<session>
2941
<item value="SELECT DISTINCT(USERNAME)"/>
3042
<item value="[DBMS][Oracle]"/>
3143
</session>
3244
</case>
33-
-->
3445
</root>

0 commit comments

Comments
 (0)