introduce flake8-no-implicit-concat linter

This commit is contained in:
Willi Ballenthin
2023-07-09 22:18:01 +02:00
parent 54203f3be9
commit 7fe738e28f
4 changed files with 16 additions and 15 deletions

View File

@@ -585,7 +585,7 @@ class CapaExplorerForm(idaapi.PluginForm):
rules_message.setText("You must specify a directory containing capa rules before running analysis.") rules_message.setText("You must specify a directory containing capa rules before running analysis.")
rules_message.setInformativeText( rules_message.setInformativeText(
"Click 'Ok' to specify a local directory of rules or you can download and extract the official " "Click 'Ok' to specify a local directory of rules or you can download and extract the official "
"rules from the URL listed in the details." + "rules from the URL listed in the details."
) )
rules_message.setDetailedText(f"{CAPA_OFFICIAL_RULESET_URL}") rules_message.setDetailedText(f"{CAPA_OFFICIAL_RULESET_URL}")
rules_message.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) rules_message.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
@@ -646,9 +646,9 @@ class CapaExplorerForm(idaapi.PluginForm):
logger.error("Failed to load capa rules from %s (error: %s).", settings.user[CAPA_SETTINGS_RULE_PATH], e) logger.error("Failed to load capa rules from %s (error: %s).", settings.user[CAPA_SETTINGS_RULE_PATH], e)
logger.error( logger.error(
"Make sure your file directory contains properly " "Make sure your file directory contains properly " # noqa: G003 [logging statement uses +]
"formatted capa rules. You can download and extract the official rules from %s. " + "formatted capa rules. You can download and extract the official rules from %s. "
"Or, for more details, see the rules documentation here: %s", + "Or, for more details, see the rules documentation here: %s",
CAPA_OFFICIAL_RULESET_URL, CAPA_OFFICIAL_RULESET_URL,
CAPA_RULESET_DOC_URL, CAPA_RULESET_DOC_URL,
) )
@@ -948,9 +948,9 @@ class CapaExplorerForm(idaapi.PluginForm):
"Reanalyze program", "Reanalyze program",
"", "",
ida_kernwin.ASKBTN_YES, ida_kernwin.ASKBTN_YES,
f"This database contains capa results generated on " "This database contains capa results generated on "
f"{results.meta.timestamp.strftime('%Y-%m-%d at %H:%M:%S')}.\n" + results.meta.timestamp.strftime("%Y-%m-%d at %H:%M:%S")
f"Load existing data or analyze program again?", + ".\nLoad existing data or analyze program again?",
) )
if btn_id == ida_kernwin.ASKBTN_CANCEL: if btn_id == ida_kernwin.ASKBTN_CANCEL:

View File

@@ -555,7 +555,7 @@ def get_extractor(
except ImportError: except ImportError:
raise RuntimeError( raise RuntimeError(
"Cannot import binaryninja module. Please install the Binary Ninja Python API first: " "Cannot import binaryninja module. Please install the Binary Ninja Python API first: "
"https://docs.binary.ninja/dev/batch.html#install-the-api)." + "https://docs.binary.ninja/dev/batch.html#install-the-api)."
) )
import capa.features.extractors.binja.extractor import capa.features.extractors.binja.extractor
@@ -1069,9 +1069,9 @@ def handle_common_args(args):
sigs_path = os.path.join(get_default_root(), "sigs") sigs_path = os.path.join(get_default_root(), "sigs")
if not os.path.exists(sigs_path): if not os.path.exists(sigs_path):
logger.error( logger.error(
"Using default signature path, but it doesn't exist. " "Using default signature path, but it doesn't exist. " # noqa: G003 [logging statement uses +]
"Please install the signatures first: " + "Please install the signatures first: "
"https://github.com/mandiant/capa/blob/master/doc/installation.md#method-2-using-capa-as-a-python-library." + "https://github.com/mandiant/capa/blob/master/doc/installation.md#method-2-using-capa-as-a-python-library."
) )
raise IOError(f"signatures path {sigs_path} does not exist or cannot be accessed") raise IOError(f"signatures path {sigs_path} does not exist or cannot be accessed")
else: else:
@@ -1170,8 +1170,8 @@ def main(argv=None):
except (IOError, capa.rules.InvalidRule, capa.rules.InvalidRuleSet) as e: except (IOError, capa.rules.InvalidRule, capa.rules.InvalidRuleSet) as e:
logger.error("%s", str(e)) logger.error("%s", str(e))
logger.error( logger.error(
"Make sure your file directory contains properly formatted capa rules. You can download the standard " "Make sure your file directory contains properly formatted capa rules. You can download the standard " # noqa: G003 [logging statement uses +]
"collection of capa rules from https://github.com/mandiant/capa-rules/releases." + "collection of capa rules from https://github.com/mandiant/capa-rules/releases."
) )
logger.error( logger.error(
"Please ensure you're using the rules that correspond to your major version of capa (%s)", "Please ensure you're using the rules that correspond to your major version of capa (%s)",

View File

@@ -516,7 +516,7 @@ class FeatureNegativeNumber(Lint):
recommendation = "specify the number's two's complement representation" recommendation = "specify the number's two's complement representation"
recommendation_template = ( recommendation_template = (
"capa treats number features as unsigned values; you may specify the number's two's complement " "capa treats number features as unsigned values; you may specify the number's two's complement "
'representation; will not match on "{:d}"' + 'representation; will not match on "{:d}"'
) )
def check_features(self, ctx: Context, features: List[Feature]): def check_features(self, ctx: Context, features: List[Feature]):
@@ -534,7 +534,7 @@ class FeatureNtdllNtoskrnlApi(Lint):
level = Lint.WARN level = Lint.WARN
recommendation_template = ( recommendation_template = (
"check if {:s} is exported by both ntdll and ntoskrnl; if true, consider removing {:s} " "check if {:s} is exported by both ntdll and ntoskrnl; if true, consider removing {:s} "
"module requirement to improve detection" + "module requirement to improve detection"
) )
def check_features(self, ctx: Context, features: List[Feature]): def check_features(self, ctx: Context, features: List[Feature]):

View File

@@ -79,6 +79,7 @@ setuptools.setup(
"flake8-encodings==0.5.0.post1", "flake8-encodings==0.5.0.post1",
"flake8-comprehensions==3.13.0", "flake8-comprehensions==3.13.0",
"flake8-logging-format==0.9.0", "flake8-logging-format==0.9.0",
"flake8-no-implicit-concat==0.3.4",
"ruff==0.0.275", "ruff==0.0.275",
"black==23.3.0", "black==23.3.0",
"isort==5.11.4", "isort==5.11.4",