From 4b9d375c90d87b4da4ad1971fffe47853d4b9738 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Wed, 18 Jul 2018 09:52:26 -0700 Subject: [PATCH] remove metadata when hiding project or file names --- wakatime/heartbeat.py | 67 ++++++++++++++++++++++++++++--------------- wakatime/project.py | 20 ++----------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/wakatime/heartbeat.py b/wakatime/heartbeat.py index 504d0b1..21d73a1 100644 --- a/wakatime/heartbeat.py +++ b/wakatime/heartbeat.py @@ -42,6 +42,8 @@ class Heartbeat(object): cursorpos = None user_agent = None + _sensitive = ('dependencies', 'lines', 'lineno', 'cursorpos', 'branch') + def __init__(self, data, args, configs, _clone=None): if not data: self.skip = u('Skipping because heartbeat data is missing.') @@ -141,29 +143,12 @@ class Heartbeat(object): if self.type != 'file': return self - for pattern in self.args.hide_file_names: - try: - compiled = re.compile(pattern, re.IGNORECASE) - if compiled.search(self.entity): - - sanitized = {} - sensitive = ['dependencies', 'lines', 'lineno', 'cursorpos', 'branch'] - for key, val in self.items(): - if key in sensitive: - sanitized[key] = None - else: - sanitized[key] = val - - extension = u(os.path.splitext(self.entity)[1]) - sanitized['entity'] = u('HIDDEN{0}').format(extension) - - return self.update(sanitized) - - except re.error as ex: - log.warning(u('Regex error ({msg}) for hide_file_names pattern: {pattern}').format( - msg=u(ex), - pattern=u(pattern), - )) + if self.should_obfuscate_filename(): + self._sanitize_metadata() + extension = u(os.path.splitext(self.entity)[1]) + self.entity = u('HIDDEN{0}').format(extension) + elif self.should_obfuscate_project(): + self._sanitize_metadata() return self @@ -201,6 +186,38 @@ class Heartbeat(object): is_write=self.is_write, ) + def should_obfuscate_filename(self): + """Returns True if hide_file_names is true or the entity file path + matches one in the list of obfuscated file paths.""" + + for pattern in self.args.hide_file_names: + try: + compiled = re.compile(pattern, re.IGNORECASE) + if compiled.search(self.entity): + return True + except re.error as ex: + log.warning(u('Regex error ({msg}) for hide_file_names pattern: {pattern}').format( + msg=u(ex), + pattern=u(pattern), + )) + return False + + def should_obfuscate_project(self): + """Returns True if hide_project_names is true or the entity file path + matches one in the list of obfuscated project paths.""" + + for pattern in self.args.hide_project_names: + try: + compiled = re.compile(pattern, re.IGNORECASE) + if compiled.search(self.entity): + return True + except re.error as ex: + log.warning(u('Regex error ({msg}) for hide_project_names pattern: {pattern}').format( + msg=u(ex), + pattern=u(pattern), + )) + return False + def _unicode(self, value): if value is None: return None @@ -224,6 +241,10 @@ class Heartbeat(object): return False return find_project_file(self.entity) is None + def _sanitize_metadata(self): + for key in self._sensitive: + setattr(self, key, None) + def __repr__(self): return self.json() diff --git a/wakatime/project.py b/wakatime/project.py index 40219ec..70072f1 100644 --- a/wakatime/project.py +++ b/wakatime/project.py @@ -12,9 +12,8 @@ import os import logging import random -import re -from .compat import open, u +from .compat import open from .projects.git import Git from .projects.mercurial import Mercurial from .projects.projectfile import ProjectFile @@ -69,7 +68,7 @@ def get_project_info(configs, heartbeat, data): if project_name is None: project_name = data.get('project') or heartbeat.args.project - hide_project = should_obfuscate_project(heartbeat) + hide_project = heartbeat.should_obfuscate_project() if project_name is None or branch_name is None: @@ -99,21 +98,6 @@ def get_project_info(configs, heartbeat, data): return project_name, branch_name -def should_obfuscate_project(heartbeat): - """Returns True if hide_project_names is true or the path matches one in - the list of obfuscated project paths.""" - - for pattern in heartbeat.args.hide_project_names: - try: - compiled = re.compile(pattern, re.IGNORECASE) - return compiled.search(heartbeat.entity) - except re.error as ex: - log.warning(u('Regex error ({msg}) for hide_project_names pattern: {pattern}').format( - msg=u(ex), - pattern=u(pattern), - )) - - def get_configs_for_plugin(plugin_name, configs): if configs and configs.has_section(plugin_name): return dict(configs.items(plugin_name))