Minor bug fixes and code refactoring

This commit is contained in:
Bernardo Damele 2010-05-28 15:57:43 +00:00
parent 919a8345d6
commit a138dbe5f6
3 changed files with 51 additions and 56 deletions

View File

@ -37,6 +37,8 @@ import ntpath
import posixpath
import subprocess
from ConfigParser import DEFAULTSECT
from ConfigParser import RawConfigParser
from StringIO import StringIO
from subprocess import PIPE
from subprocess import Popen as execute
@ -1365,3 +1367,22 @@ def getBruteUnicode(string):
for char in string:
retVal += unichr(ord(char))
return retVal
class UnicodeRawConfigParser(RawConfigParser):
def write(self, fp):
"""Write an .ini-format representation of the configuration state."""
if self._defaults:
fp.write("[%s]\n" % DEFAULTSECT)
for (key, value) in self._defaults.items():
fp.write("%s = %s\n" % (key, unicode(value).replace('\n', '\n\t')))
fp.write("\n")
for section in self._sections:
fp.write("[%s]\n" % section)
for (key, value) in self._sections[section].items():
if key != "__name__":
if value is None:
fp.write("%s\n" % (key))
else:
fp.write("%s = %s\n" %
(key, unicode(value).replace('\n', '\n\t')))
fp.write("\n")

View File

@ -33,9 +33,6 @@ import socket
import urllib2
import urlparse
from ConfigParser import DEFAULTSECT
from ConfigParser import RawConfigParser
from lib.core.common import getConsoleWidth
from lib.core.common import getFileType
from lib.core.common import normalizePath
@ -45,6 +42,7 @@ from lib.core.common import parseTargetUrl
from lib.core.common import paths
from lib.core.common import randomRange
from lib.core.common import sanitizeStr
from lib.core.common import UnicodeRawConfigParser
from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
@ -77,26 +75,6 @@ authHandler = urllib2.BaseHandler()
proxyHandler = urllib2.BaseHandler()
redirectHandler = SmartRedirectHandler()
class UnicodeRawConfigParser(RawConfigParser):
def write(self, fp):
"""Write an .ini-format representation of the configuration state."""
if self._defaults:
fp.write("[%s]\n" % DEFAULTSECT)
for (key, value) in self._defaults.items():
fp.write("%s = %s\n" % (key, unicode(value).replace('\n', '\n\t')))
fp.write("\n")
for section in self._sections:
fp.write("[%s]\n" % section)
for (key, value) in self._sections[section].items():
if key != "__name__":
if value is None:
fp.write("%s\n" % (key))
else:
fp.write("%s = %s\n" %
(key, unicode(value).replace('\n', '\n\t')))
fp.write("\n")
def __urllib2Opener():
"""
This function creates the urllib2 OpenerDirector.
@ -118,7 +96,7 @@ def __urllib2Opener():
urllib2.install_opener(opener)
def __feedTargetsDict(reqFile, addedTargetUrls):
fp = codecs.open(reqFile, "r", conf.dataEncoding)
fp = codecs.open(reqFile, "rb", conf.dataEncoding)
fread = fp.read()
fread = fread.replace("\r", "")
@ -856,6 +834,13 @@ def __cleanupOptions():
debugMsg = "cleaning up configuration parameters"
logger.debug(debugMsg)
width = getConsoleWidth()
if conf.eta:
conf.progressWidth = width-26
else:
conf.progressWidth = width-46
if conf.testParameter:
conf.testParameter = conf.testParameter.replace(" ", "")
conf.testParameter = conf.testParameter.split(",")
@ -932,13 +917,6 @@ def __setConfAttributes():
conf.threadException = False
conf.wFileType = None
width = getConsoleWidth()
if conf.eta:
conf.progressWidth = width-26
else:
conf.progressWidth = width-46
def __setKnowledgeBaseAttributes():
"""
This function set some needed attributes into the knowledge base
@ -989,7 +967,6 @@ def __setKnowledgeBaseAttributes():
kb.unionNegative = False
kb.unionFalseCond = False
def __saveCmdline():
"""
Saves the command line options on a sqlmap configuration INI file
@ -1019,6 +996,9 @@ def __saveCmdline():
optionData.sort()
for option, value, datatype in optionData:
if isinstance(datatype, (list, tuple, set)):
datatype = datatype[0]
if value is None:
if datatype == "boolean":
value = "False"
@ -1037,10 +1017,8 @@ def __saveCmdline():
config.set(family, option, value)
print 11111
confFP = codecs.open(paths.SQLMAP_CONFIG, "wb", "UTF8")
confFP = codecs.open(paths.SQLMAP_CONFIG, "wb", conf.dataEncoding)
config.write(confFP)
print 22222
infoMsg = "saved command line options on '%s' configuration file" % paths.SQLMAP_CONFIG
logger.info(infoMsg)
@ -1112,11 +1090,11 @@ def init(inputOptions=advancedDict()):
based upon command line and configuration file options.
"""
__setConfAttributes()
__setKnowledgeBaseAttributes()
__mergeOptions(inputOptions)
__setVerbosity()
__saveCmdline()
__setConfAttributes()
__setKnowledgeBaseAttributes()
__cleanupOptions()
__basicOptionValidation()
__setRequestFromFile()

View File

@ -24,9 +24,9 @@ Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import codecs
from ConfigParser import NoSectionError
from ConfigParser import RawConfigParser
from lib.core.common import checkFile
from lib.core.common import UnicodeRawConfigParser
from lib.core.data import conf
from lib.core.data import logger
from lib.core.exception import sqlmapMissingMandatoryOptionException
@ -43,17 +43,13 @@ def configFileProxy(section, option, boolean=False, integer=False):
global config
if config.has_option(section, option):
if boolean:
value = config.getboolean(section, option)
elif integer:
value = config.getint(section, option)
else:
value = config.get(section, option)
if not value:
value = None
elif value.isdigit():
value = int(value)
elif value in ("false", "False"):
value = False
elif value in ("true", "True"):
value = True
if value:
conf[option] = value
else:
@ -76,8 +72,8 @@ def configFileParser(configFile):
logger.debug(debugMsg)
checkFile(configFile)
config = RawConfigParser()
config.readfp(codecs.open(configFile, "r", "UTF8"))
config = UnicodeRawConfigParser()
config.readfp(codecs.open(configFile, "rb", conf.dataEncoding))
if not config.has_section("Target"):
raise NoSectionError, "Target in the configuration file is mandatory"
@ -92,16 +88,16 @@ def configFileParser(configFile):
raise sqlmapMissingMandatoryOptionException, errMsg
for family, optionData in optDict.items():
for option, data in optionData.items():
for option, datatype in optionData.items():
boolean = False
integer = False
if isinstance(data, (tuple, dict, set)):
data = data[0]
if isinstance(datatype, (list, tuple, set)):
datatype = datatype[0]
if data == "boolean":
if datatype == "boolean":
boolean = True
elif data == "integer":
elif datatype == "integer":
integer = True
configFileProxy(family, option, boolean, integer)