Implementation for an Issue #874

This commit is contained in:
Miroslav Stampar 2014-10-27 00:37:46 +01:00
parent 6448d3caf4
commit 19aed90ae5
3 changed files with 50 additions and 3 deletions

View File

@ -9,8 +9,10 @@ import codecs
import contextlib import contextlib
import cookielib import cookielib
import copy import copy
import hashlib
import httplib import httplib
import inspect import inspect
import json
import logging import logging
import ntpath import ntpath
import os import os
@ -23,6 +25,7 @@ import sys
import tempfile import tempfile
import time import time
import urllib import urllib
import urllib2
import urlparse import urlparse
import unicodedata import unicodedata
@ -99,6 +102,7 @@ from lib.core.settings import FORCE_COOKIE_EXPIRATION_TIME
from lib.core.settings import FORM_SEARCH_REGEX from lib.core.settings import FORM_SEARCH_REGEX
from lib.core.settings import GENERIC_DOC_ROOT_DIRECTORY_NAMES from lib.core.settings import GENERIC_DOC_ROOT_DIRECTORY_NAMES
from lib.core.settings import GIT_PAGE from lib.core.settings import GIT_PAGE
from lib.core.settings import GITHUB_REPORT_OAUTH_TOKEN
from lib.core.settings import GOOGLE_ANALYTICS_COOKIE_PREFIX from lib.core.settings import GOOGLE_ANALYTICS_COOKIE_PREFIX
from lib.core.settings import HASHDB_MILESTONE_VALUE from lib.core.settings import HASHDB_MILESTONE_VALUE
from lib.core.settings import HOST_ALIASES from lib.core.settings import HOST_ALIASES
@ -876,7 +880,7 @@ def readInput(message, default=None, checkBatch=True):
message = "\n%s" % message message = "\n%s" % message
kb.prependFlag = False kb.prependFlag = False
if conf.answers: if conf.get("answers"):
for item in conf.answers.split(','): for item in conf.answers.split(','):
question = item.split('=')[0].strip() question = item.split('=')[0].strip()
answer = item.split('=')[1] if len(item.split('=')) > 1 else None answer = item.split('=')[1] if len(item.split('=')) > 1 else None
@ -892,7 +896,7 @@ def readInput(message, default=None, checkBatch=True):
break break
if retVal is None: if retVal is None:
if checkBatch and conf.batch: if checkBatch and conf.get("batch"):
if isListLike(default): if isListLike(default):
options = ",".join(getUnicode(opt, UNICODE_ENCODING) for opt in default) options = ",".join(getUnicode(opt, UNICODE_ENCODING) for opt in default)
elif default: elif default:
@ -2843,6 +2847,43 @@ def unhandledExceptionMessage():
return maskSensitiveData(errMsg) return maskSensitiveData(errMsg)
def createGithubIssue(errMsg, excMsg):
"""
Automatically create a Github issue with unhandled exception information
"""
msg = "\ndo you want to automatically create a new (anonymized) issue "
msg += "with the unhandled exception information at "
msg += "the official Github repository? [y/N] "
test = readInput(msg, default="N")
if test[0] in ("y", "Y"):
ex = None
errMsg = errMsg[errMsg.find("\n"):]
for match in re.finditer(r'File "(.+?)", line', excMsg):
file = match.group(1).replace('\\', "/")
file = file[file.find("sqlmap"):].replace("sqlmap/", "", 1)
excMsg = excMsg.replace(match.group(1), file)
data = {"title": "Unhandled exception (#%s)" % hashlib.md5(excMsg).hexdigest()[:8], "body": "```%s\n```\n```\n%s```" % (errMsg, excMsg)}
req = urllib2.Request(url="https://api.github.com/repos/sqlmapproject/sqlmap/issues", data=json.dumps(data), headers={"Authorization": "token %s" % GITHUB_REPORT_OAUTH_TOKEN})
try:
f = urllib2.urlopen(req)
content = f.read()
except Exception, ex:
content = None
issueUrl = re.search(r"https://github.com/sqlmapproject/sqlmap/issues/\d+", content or "")
if issueUrl:
infoMsg = "created Github issue can been found at the address '%s'" % issueUrl.group(0)
logger.info(infoMsg)
else:
warnMsg = "something went wrong while creating a Github issue"
if ex:
warnMsg += " ('%s')" % ex
logger.warn(warnMsg)
def maskSensitiveData(msg): def maskSensitiveData(msg):
""" """
Masks sensitive data in the supplied message Masks sensitive data in the supplied message

View File

@ -474,6 +474,9 @@ DEFAULT_COOKIE_DELIMITER = ';'
# Unix timestamp used for forcing cookie expiration when provided with --load-cookies # Unix timestamp used for forcing cookie expiration when provided with --load-cookies
FORCE_COOKIE_EXPIRATION_TIME = "9999999999" FORCE_COOKIE_EXPIRATION_TIME = "9999999999"
# Github OAuth token used for creating an automatic Issue for unhandled exceptions
GITHUB_REPORT_OAUTH_TOKEN = "d6c0c7bf3f2298a7b85f82176c46d2f8d494fcc5"
# Skip unforced HashDB flush requests below the threshold number of cached items # Skip unforced HashDB flush requests below the threshold number of cached items
HASHDB_FLUSH_THRESHOLD = 32 HASHDB_FLUSH_THRESHOLD = 32

View File

@ -21,6 +21,7 @@ from lib.utils import versioncheck # this has to be the first non-standard impo
from lib.controller.controller import start from lib.controller.controller import start
from lib.core.common import banner from lib.core.common import banner
from lib.core.common import createGithubIssue
from lib.core.common import dataToStdout from lib.core.common import dataToStdout
from lib.core.common import getUnicode from lib.core.common import getUnicode
from lib.core.common import setColor from lib.core.common import setColor
@ -127,9 +128,11 @@ def main():
except: except:
print print
errMsg = unhandledExceptionMessage() errMsg = unhandledExceptionMessage()
excMsg = traceback.format_exc()
logger.critical(errMsg) logger.critical(errMsg)
kb.stickyLevel = logging.CRITICAL kb.stickyLevel = logging.CRITICAL
dataToStdout(setColor(traceback.format_exc())) dataToStdout(excMsg)
createGithubIssue(errMsg, excMsg)
finally: finally:
if conf.get("showTime"): if conf.get("showTime"):