|
7 | 7 |
|
8 | 8 | import binascii |
9 | 9 | import codecs |
| 10 | +import collections |
10 | 11 | import contextlib |
11 | 12 | import copy |
12 | 13 | import distutils |
@@ -228,7 +229,7 @@ def getDbms(versions=None): |
228 | 229 | if versions is None and Backend.getVersionList(): |
229 | 230 | versions = Backend.getVersionList() |
230 | 231 |
|
231 | | - return Backend.getDbms() if versions is None else "%s %s" % (Backend.getDbms(), " and ".join(filter(None, versions))) |
| 232 | + return Backend.getDbms() if versions is None else "%s %s" % (Backend.getDbms(), " and ".join(filterNone(versions))) |
232 | 233 |
|
233 | 234 | @staticmethod |
234 | 235 | def getErrorParsedDBMSes(): |
@@ -501,15 +502,15 @@ def getIdentifiedDbms(): |
501 | 502 |
|
502 | 503 | @staticmethod |
503 | 504 | def getVersion(): |
504 | | - versions = filter(None, flattenValue(kb.dbmsVersion)) |
| 505 | + versions = filterNone(flattenValue(kb.dbmsVersion)) |
505 | 506 | if not isNoneValue(versions): |
506 | 507 | return versions[0] |
507 | 508 | else: |
508 | 509 | return None |
509 | 510 |
|
510 | 511 | @staticmethod |
511 | 512 | def getVersionList(): |
512 | | - versions = filter(None, flattenValue(kb.dbmsVersion)) |
| 513 | + versions = filterNone(flattenValue(kb.dbmsVersion)) |
513 | 514 | if not isNoneValue(versions): |
514 | 515 | return versions |
515 | 516 | else: |
@@ -787,7 +788,7 @@ def getManualDirectories(): |
787 | 788 | else: |
788 | 789 | targets.add('.'.join(_[:-1])) |
789 | 790 |
|
790 | | - targets = filter(None, targets) |
| 791 | + targets = filterNone(targets) |
791 | 792 |
|
792 | 793 | for prefix in BRUTE_DOC_ROOT_PREFIXES.get(Backend.getOs(), DEFAULT_DOC_ROOTS[OS.LINUX]): |
793 | 794 | if BRUTE_DOC_ROOT_TARGET_MARK in prefix and re.match(IP_ADDRESS_REGEX, conf.hostname): |
@@ -1473,7 +1474,7 @@ def parseTargetUrl(): |
1473 | 1474 | errMsg += "in the hostname part" |
1474 | 1475 | raise SqlmapGenericException(errMsg) |
1475 | 1476 |
|
1476 | | - hostnamePort = urlSplit.netloc.split(":") if not re.search(r"\[.+\]", urlSplit.netloc) else filter(None, (re.search(r"\[.+\]", urlSplit.netloc).group(0), re.search(r"\](:(?P<port>\d+))?", urlSplit.netloc).group("port"))) |
| 1477 | + hostnamePort = urlSplit.netloc.split(":") if not re.search(r"\[.+\]", urlSplit.netloc) else filterNone((re.search(r"\[.+\]", urlSplit.netloc).group(0), re.search(r"\](:(?P<port>\d+))?", urlSplit.netloc).group("port"))) |
1477 | 1478 |
|
1478 | 1479 | conf.scheme = (urlSplit.scheme.strip().lower() or "http") if not conf.forceSSL else "https" |
1479 | 1480 | conf.path = urlSplit.path.strip() |
@@ -2389,13 +2390,13 @@ def getUnicode(value, encoding=None, noneToNull=False): |
2389 | 2390 | return value |
2390 | 2391 | elif isinstance(value, six.binary_type): |
2391 | 2392 | # Heuristics (if encoding not explicitly specified) |
2392 | | - candidates = filter(None, (encoding, kb.get("pageEncoding") if kb.get("originalPage") else None, conf.get("encoding"), UNICODE_ENCODING, sys.getfilesystemencoding())) |
| 2393 | + candidates = filterNone((encoding, kb.get("pageEncoding") if kb.get("originalPage") else None, conf.get("encoding"), UNICODE_ENCODING, sys.getfilesystemencoding())) |
2393 | 2394 | if all(_ in value for _ in ('<', '>')): |
2394 | 2395 | pass |
2395 | 2396 | elif any(_ in value for _ in (":\\", '/', '.')) and '\n' not in value: |
2396 | | - candidates = filter(None, (encoding, sys.getfilesystemencoding(), kb.get("pageEncoding") if kb.get("originalPage") else None, UNICODE_ENCODING, conf.get("encoding"))) |
| 2397 | + candidates = filterNone((encoding, sys.getfilesystemencoding(), kb.get("pageEncoding") if kb.get("originalPage") else None, UNICODE_ENCODING, conf.get("encoding"))) |
2397 | 2398 | elif conf.get("encoding") and '\n' not in value: |
2398 | | - candidates = filter(None, (encoding, conf.get("encoding"), kb.get("pageEncoding") if kb.get("originalPage") else None, sys.getfilesystemencoding(), UNICODE_ENCODING)) |
| 2399 | + candidates = filterNone((encoding, conf.get("encoding"), kb.get("pageEncoding") if kb.get("originalPage") else None, sys.getfilesystemencoding(), UNICODE_ENCODING)) |
2399 | 2400 |
|
2400 | 2401 | for candidate in candidates: |
2401 | 2402 | try: |
@@ -2837,7 +2838,7 @@ def extractTextTagContent(page): |
2837 | 2838 | except MemoryError: |
2838 | 2839 | page = page.replace(REFLECTED_VALUE_MARKER, "") |
2839 | 2840 |
|
2840 | | - return filter(None, (_.group("result").strip() for _ in re.finditer(TEXT_TAG_REGEX, page))) |
| 2841 | + return filterNone(_.group("result").strip() for _ in re.finditer(TEXT_TAG_REGEX, page)) |
2841 | 2842 |
|
2842 | 2843 | def trimAlphaNum(value): |
2843 | 2844 | """ |
@@ -2996,6 +2997,21 @@ def filterControlChars(value, replacement=' '): |
2996 | 2997 |
|
2997 | 2998 | return filterStringValue(value, PRINTABLE_CHAR_REGEX, replacement) |
2998 | 2999 |
|
| 3000 | +def filterNone(values): |
| 3001 | + """ |
| 3002 | + Emulates filterNone([...]) functionality |
| 3003 | +
|
| 3004 | + >>> filterNone([1, 2, "", None, 3]) |
| 3005 | + [1, 2, 3] |
| 3006 | + """ |
| 3007 | + |
| 3008 | + retVal = values |
| 3009 | + |
| 3010 | + if isinstance(values, collections.Iterable): |
| 3011 | + retVal = [_ for _ in values if _] |
| 3012 | + |
| 3013 | + return retVal |
| 3014 | + |
2999 | 3015 | def isDBMSVersionAtLeast(version): |
3000 | 3016 | """ |
3001 | 3017 | Checks if the recognized DBMS version is at least the version |
@@ -3537,7 +3553,7 @@ def maskSensitiveData(msg): |
3537 | 3553 |
|
3538 | 3554 | retVal = getUnicode(msg) |
3539 | 3555 |
|
3540 | | - for item in filter(None, (conf.get(_) for _ in SENSITIVE_OPTIONS)): |
| 3556 | + for item in filterNone(conf.get(_) for _ in SENSITIVE_OPTIONS): |
3541 | 3557 | regex = SENSITIVE_DATA_REGEX % re.sub(r"(\W)", r"\\\1", getUnicode(item)) |
3542 | 3558 | while extractRegexResult(regex, retVal): |
3543 | 3559 | value = extractRegexResult(regex, retVal) |
@@ -3640,14 +3656,14 @@ def _(value): |
3640 | 3656 | regex = _(filterStringValue(payload, r"[A-Za-z0-9]", REFLECTED_REPLACEMENT_REGEX.encode("string_escape"))) |
3641 | 3657 |
|
3642 | 3658 | if regex != payload: |
3643 | | - if all(part.lower() in content.lower() for part in filter(None, regex.split(REFLECTED_REPLACEMENT_REGEX))[1:]): # fast optimization check |
| 3659 | + if all(part.lower() in content.lower() for part in filterNone(regex.split(REFLECTED_REPLACEMENT_REGEX))[1:]): # fast optimization check |
3644 | 3660 | parts = regex.split(REFLECTED_REPLACEMENT_REGEX) |
3645 | 3661 | retVal = content.replace(payload, REFLECTED_VALUE_MARKER) # dummy approach |
3646 | 3662 |
|
3647 | 3663 | if len(parts) > REFLECTED_MAX_REGEX_PARTS: # preventing CPU hogs |
3648 | 3664 | regex = _("%s%s%s" % (REFLECTED_REPLACEMENT_REGEX.join(parts[:REFLECTED_MAX_REGEX_PARTS // 2]), REFLECTED_REPLACEMENT_REGEX, REFLECTED_REPLACEMENT_REGEX.join(parts[-REFLECTED_MAX_REGEX_PARTS // 2:]))) |
3649 | 3665 |
|
3650 | | - parts = filter(None, regex.split(REFLECTED_REPLACEMENT_REGEX)) |
| 3666 | + parts = filterNone(regex.split(REFLECTED_REPLACEMENT_REGEX)) |
3651 | 3667 |
|
3652 | 3668 | if regex.startswith(REFLECTED_REPLACEMENT_REGEX): |
3653 | 3669 | regex = r"%s%s" % (REFLECTED_BORDER_REGEX, regex[len(REFLECTED_REPLACEMENT_REGEX):]) |
@@ -4482,7 +4498,7 @@ def resetCookieJar(cookieJar): |
4482 | 4498 | logger.info(infoMsg) |
4483 | 4499 |
|
4484 | 4500 | content = readCachedFileContent(conf.loadCookies) |
4485 | | - lines = filter(None, (line.strip() for line in content.split("\n") if not line.startswith('#'))) |
| 4501 | + lines = filterNone(line.strip() for line in content.split("\n") if not line.startswith('#')) |
4486 | 4502 | handle, filename = tempfile.mkstemp(prefix=MKSTEMP_PREFIX.COOKIE_JAR) |
4487 | 4503 | os.close(handle) |
4488 | 4504 |
|
|
0 commit comments