From 82b4476d90cc620fdf2ae028a24f50154fe6b9b2 Mon Sep 17 00:00:00 2001 From: Erik Moeller Date: Mon, 20 Jul 2020 22:21:12 -0700 Subject: [PATCH] Prune old, unreachable code and images - Removes old, unreachable "custom header image" logic which was replaced with custom logo upload feature - Remove old, 0.3 era backup script and backup variable from staging.yml - Remove old logo images and AppArmor whitelisting rules for them Resolves #5347 --- .../ansible-base/group_vars/staging.yml | 9 -- .../roles/backup/files/0.3_collect.py | 81 ------------------ .../files/usr.sbin.apache2 | 2 - securedrop/journalist_app/__init__.py | 8 -- securedrop/journalist_templates/base.html | 5 -- securedrop/source_app/__init__.py | 8 -- securedrop/source_templates/base.html | 6 -- securedrop/source_templates/index.html | 6 -- securedrop/static/i/securedrop.png | Bin 18314 -> 0 bytes securedrop/static/i/securedrop_small.png | Bin 1613 -> 0 bytes 10 files changed, 125 deletions(-) delete mode 100755 install_files/ansible-base/roles/backup/files/0.3_collect.py delete mode 100644 securedrop/static/i/securedrop.png delete mode 100644 securedrop/static/i/securedrop_small.png diff --git a/install_files/ansible-base/group_vars/staging.yml b/install_files/ansible-base/group_vars/staging.yml index 282ccb9bf5..a4dc5d6c48 100644 --- a/install_files/ansible-base/group_vars/staging.yml +++ b/install_files/ansible-base/group_vars/staging.yml @@ -55,15 +55,6 @@ enable_ssh_over_tor: false # v3 onion services should be available in staging for testing. v3_onion_services: true -### Use for backup restores ### -# If the `backup_zip` variable is defined ansible will copy the defined file to -# the app server and run the 0.3_collect.py script to unzip and restore those -# files. -# ex: backup_zip: "sd-backup-2015-01-15--21-03-32.zip" -# To use uncomment the following line and enter the correct decrypted zip -# filename between the quotes. -#backup_zip: "" - install_local_packages: true # Don't install app-code package from the FPF apt repo, since we want to run diff --git a/install_files/ansible-base/roles/backup/files/0.3_collect.py b/install_files/ansible-base/roles/backup/files/0.3_collect.py deleted file mode 100755 index fb7412fc16..0000000000 --- a/install_files/ansible-base/roles/backup/files/0.3_collect.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/opt/venvs/securedrop-app-code/bin/python -""" - -This script should be copied to the App server and ran by the anisble -plabook. When run (as root), it collects all of the necessary information -to backup the 0.3 system and stores it in /tmp/sd-backup-0.3-TIME_STAMP.zip.gpg - -""" - -import sys -import os -import io -import zipfile -from datetime import datetime -# Import the application config.py file -sys.path.append("/var/www/securedrop") -import config # noqa: F403 -import gnupg # noqa: F403 - -TOR_SERVICES = "/var/lib/tor/services" -TOR_CONFIG = "/etc/tor/torrc" - - -def collect_config_file(zf): - config_file_path = os.path.join(config.SECUREDROP_ROOT, "config.py") - zf.write(config_file_path) - - -def collect_securedrop_data_root(zf): - # The store and key dirs are shared between both interfaces - for root, dirs, files in os.walk(config.SECUREDROP_DATA_ROOT): - for name in files: - zf.write(os.path.join(root, name)) - - -def collect_custom_header_image(zf): - # The custom header image is copied over the deafult `static/i/logo.png`. - zf.write(os.path.join(config.SECUREDROP_ROOT, "static/i/logo.png")) - - -def collect_tor_files(zf): - # All of the tor Onion Service private keys are stored in the THS specific - # subdirectory `/var/lib/tor/services` backing up this directory will back - # up all of the THS and ATHS required keys needed to restore all the hidden - # services on that system. - for root, dirs, files in os.walk(TOR_SERVICES): - for name in files: - zf.write(os.path.join(root, name)) - - # The tor config file has the ATHS client names required to restore - # the ATHS info. These names are also in the the specific client_key file - # but backing up this file makes it easier than parsing the files during a - # restore. - zf.write(TOR_CONFIG) - - -def encrypt_zip_file(zf_fn): - # Encrypt the backup zip file with the application's gpg public key - gpg = gnupg.GPG(binary='gpg2', homedir=config.GPG_KEY_DIR) - e_fn = '{}.gpg'.format(zf_fn) - - stream = io.open(zf_fn, "rb") - gpg.encrypt_file(stream, config.JOURNALIST_KEY, always_trust='True', - output=e_fn) - - -def main(): - # name append a timestamp to the sd-backup zip filename - dt = str(datetime.utcnow().strftime("%Y-%m-%d--%H-%M-%S")) - zf_fn = 'sd-backup-{}.zip'.format(dt) - with zipfile.ZipFile(zf_fn, 'w') as zf: - collect_config_file(zf) - collect_securedrop_data_root(zf) - collect_custom_header_image(zf) - collect_tor_files(zf) - encrypt_zip_file(zf_fn) - print(zf_fn) - - -if __name__ == "__main__": - main() diff --git a/install_files/ansible-base/roles/build-securedrop-app-code-deb-pkg/files/usr.sbin.apache2 b/install_files/ansible-base/roles/build-securedrop-app-code-deb-pkg/files/usr.sbin.apache2 index 9480b35afc..90a7796566 100644 --- a/install_files/ansible-base/roles/build-securedrop-app-code-deb-pkg/files/usr.sbin.apache2 +++ b/install_files/ansible-base/roles/build-securedrop-app-code-deb-pkg/files/usr.sbin.apache2 @@ -280,8 +280,6 @@ /var/www/securedrop/static/i/logo-footer.png r, /var/www/securedrop/static/i/no16-global.png r, /var/www/securedrop/static/i/no16.png r, - /var/www/securedrop/static/i/securedrop.png r, - /var/www/securedrop/static/i/securedrop_small.png r, /var/www/securedrop/static/i/server_upload.png r, /var/www/securedrop/static/i/star.png r, /var/www/securedrop/static/i/success_checkmark.png r, diff --git a/securedrop/journalist_app/__init__.py b/securedrop/journalist_app/__init__.py index 51a6dda475..8d54e5cf44 100644 --- a/securedrop/journalist_app/__init__.py +++ b/securedrop/journalist_app/__init__.py @@ -111,14 +111,6 @@ def _handle_http_exception( app.jinja_env.trim_blocks = True app.jinja_env.lstrip_blocks = True app.jinja_env.globals['version'] = version.__version__ - if hasattr(config, 'CUSTOM_HEADER_IMAGE'): - app.jinja_env.globals['header_image'] = \ - config.CUSTOM_HEADER_IMAGE # type: ignore - app.jinja_env.globals['use_custom_header_image'] = True - else: - app.jinja_env.globals['header_image'] = 'logo.png' - app.jinja_env.globals['use_custom_header_image'] = False - app.jinja_env.filters['rel_datetime_format'] = \ template_filters.rel_datetime_format app.jinja_env.filters['filesizeformat'] = template_filters.filesizeformat diff --git a/securedrop/journalist_templates/base.html b/securedrop/journalist_templates/base.html index 068bd40486..9b38ebaf92 100644 --- a/securedrop/journalist_templates/base.html +++ b/securedrop/journalist_templates/base.html @@ -41,11 +41,6 @@ {% endblock %} diff --git a/securedrop/source_app/__init__.py b/securedrop/source_app/__init__.py index 2668be4b9a..0af9a19890 100644 --- a/securedrop/source_app/__init__.py +++ b/securedrop/source_app/__init__.py @@ -91,14 +91,6 @@ def handle_csrf_error(e): app.jinja_env.globals['version'] = version.__version__ # Exported to source templates for being included in instructions app.jinja_env.globals['submission_key_fpr'] = config.JOURNALIST_KEY - if getattr(config, 'CUSTOM_HEADER_IMAGE', None): - app.jinja_env.globals['header_image'] = \ - config.CUSTOM_HEADER_IMAGE # type: ignore - app.jinja_env.globals['use_custom_header_image'] = True - else: - app.jinja_env.globals['header_image'] = 'logo.png' - app.jinja_env.globals['use_custom_header_image'] = False - app.jinja_env.filters['rel_datetime_format'] = \ template_filters.rel_datetime_format app.jinja_env.filters['nl2br'] = evalcontextfilter(template_filters.nl2br) diff --git a/securedrop/source_templates/base.html b/securedrop/source_templates/base.html index 331917ecaf..68d1be8a5f 100644 --- a/securedrop/source_templates/base.html +++ b/securedrop/source_templates/base.html @@ -20,12 +20,6 @@ {% include 'locales.html' %} - {% if use_custom_header_image %} -
- {{ gettext('Powered by') }}
- SecureDrop -
- {% endif %} {% endblock %} diff --git a/securedrop/source_templates/index.html b/securedrop/source_templates/index.html index 0f381a36d2..cd014eef52 100644 --- a/securedrop/source_templates/index.html +++ b/securedrop/source_templates/index.html @@ -27,12 +27,6 @@
{{ gettext('Logo Image') }} - {% if use_custom_header_image %} -
- {{ gettext('Powered by') }}
- SecureDrop -
- {% endif %}
{% include 'locales.html' %}
diff --git a/securedrop/static/i/securedrop.png b/securedrop/static/i/securedrop.png deleted file mode 100644 index 91447330ad58c52018417ffb96326148d1e1a2de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18314 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

4YSOM0u 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 Z{ts5#@pQX*IF0001BP)t-s7cM{? zH%cWoMJGH=Ge%WCPhV4Gaba?cW^{mVeyDPRpml?rc7msShmw1TtcQ@WkC>p3o4T2# zzNDg?(7^Yr-o_x=C;nc$7r00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-ss0RsXpYL~B@000GmNkl5{7|6onN5 zOIf)uV!yJUy+tZa4sjTHkBXE;M$7t_m*(W5kBW;a8 zhS9MF9l>(07vYy!R&6q;J1l1+0f8MrfrmvP9R9GTkJH+^(etQU&D%3#-WCGdmZZ*I z3h{HOWRk%oe!LWUfnzw15Q0msakP-QEKCB*0}yVrOfCde2n+&Js)sg86Oihas&BKS zg&x>^)E>$~HngA8@mP(<-$C!7!#P7$2Yz z<9_ispuFfTRs|Gdx%6fypobgDb3Blp4n8AgcD_)WE@>Lm>c7RW})O>J!jb zWf_CXJP=Dj286d-iVa7+_iyvPghLjYm`dcCkF8N2wA>Vw66!lK+w+^2`|K-#m`H_N%3UT-9 zsOLPZ-Kmju3mh*8uMi~{CVvOQ&*E@ra%xILd6#@B0jXyjeCP`FIKm!4_j^PtmB(4v z^#tTz1IPKi+2BJsJZwiq|D23ADf%dTX#bvY!=w3=u{s<5B zL?KbnRn_WJUnLbY02Kul=Llp^Kq<-qB=Jjqlo{F@6-r^RV$q_oH@nH|{_*s!PjG7J zQ&P$&pmBW?)#20-NKadbGSR@PFJa$E*=!#sW2n6Z#8Mto=dh>obZ$3U^dW6+Y(EHy z^!X`&0WzK7l^JliA*U`biP6`xJl}x;?4^7IB9q0^;dAchl2h+tzc*;XhlD6gu>(EV z^_&UtrQDN^Vw5GQ?-4~^@LC>zx& zG13W8h)f2jJ}Z>_TE@<$qe9veI{466ppb@krw&ne1wsPyUKD|VgQTD?waf;Sah6|; zE6bMm#E6eSobMm)1$&!yuL7O7Wz0|L?@VudXU z27izBl!JyM%g3ts*pbxBanst^UoMuQq+kmL=XnWpGB5dW()c&FEya5Og zw+_vpTAdDOt?tdKQ%&!vC0laMTf2U zHo{~LFAc^|Y`C=ZJo_ivbo=_|`sxIL`uQ)tN;g0A_Ltu6|HAkOnIJ#Pav(pX00000 LNkvXXu0mjfJ`wRu