Skip to content

Commit 2e21716

Browse files
committed
Refactor backend code ensuring to use nacl.encoding.Base64Encoder in place of python base64
1 parent 88ad0f1 commit 2e21716

File tree

11 files changed

+71
-66
lines changed

11 files changed

+71
-66
lines changed

backend/globaleaks/db/migrations/update_54/__init__.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# -*- coding: UTF-8
2-
import base64
32
import os
43

4+
from nacl.encoding import Base64Encoder
5+
56
from globaleaks.db.migrations.update import MigrationBase
67
from globaleaks.handlers.admin.file import special_files
78
from globaleaks.models import Model
@@ -31,7 +32,7 @@ def migrate_File(self):
3132
new_obj.id = uuid4()
3233
new_obj.name = old_obj.id
3334

34-
data = base64.b64decode(old_obj.data)
35+
data = Base64Encoder.decode(old_obj.data)
3536

3637
filepath = os.path.join(State.settings.files_path, new_obj.id)
3738
with open(filepath, 'wb') as out_file:

backend/globaleaks/db/migrations/update_65/__init__.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# -*- coding: UTF-8
2-
import base64
32
import os
43
import shutil
54

5+
from nacl.encoding import Base64Encoder
6+
67
from globaleaks.db.migrations.update import MigrationBase
78
from globaleaks.models import Model
89
from globaleaks.models.enums import _Enum, EnumUserRole
@@ -248,7 +249,7 @@ def migrate_InternalTip(self):
248249
new_obj.deprecated_crypto_files_pub_key = old_obj.crypto_files_pub_key
249250

250251
if new_obj.crypto_tip_pub_key and new_obj.label:
251-
new_obj.label = base64.b64encode(GCE.asymmetric_encrypt(new_obj.crypto_tip_pub_key, new_obj.label))
252+
new_obj.label = Base64Encoder.encode(GCE.asymmetric_encrypt(new_obj.crypto_tip_pub_key, new_obj.label))
252253

253254
self.session_new.add(new_obj)
254255

backend/globaleaks/handlers/base.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# -*- coding: utf-8 -*-
2-
import base64
32
import json
43
import mimetypes
54
import os
@@ -9,6 +8,7 @@
98

109
from tempfile import NamedTemporaryFile
1110

11+
from nacl.encoding import Base64Encoder
1212
from twisted.internet import abstract
1313
from twisted.protocols.basic import FileSender
1414

@@ -30,7 +30,7 @@
3030

3131

3232
def decodeString(string):
33-
string = base64.b64decode(string)
33+
string = Base64Encoder.decode(string)
3434
uint8_array = [c for c in string]
3535
uint16_array = []
3636
for i in range(len(uint8_array)):
@@ -87,7 +87,7 @@ def db_confirmation_check(session, tid, user_id, secret):
8787
State.totp_verify(user.two_factor_secret, secret)
8888
else:
8989
if GCE.is_base64_key(secret):
90-
hash = sha512(base64.b64decode(secret.encode())).decode()
90+
hash = sha512(Base64Encoder.decode(secret.encode())).decode()
9191
else:
9292
hash = GCE.hash_password(secret, user.salt)
9393

backend/globaleaks/handlers/custodian/__init__.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# -*- coding: utf-8 -*-
22
#
33
# Handlers dealing with custodian user functionalities
4-
import base64
4+
5+
from nacl.encoding import Base64Encoder
56

67
from globaleaks import models
78
from globaleaks.handlers.admin.context import admin_serialize_context
@@ -30,13 +31,13 @@ def get_identityaccessrequest_list(session, tid, user_id, user_key):
3031
elem = serializers.serialize_identityaccessrequest(session, iar)
3132

3233
if iarc.crypto_tip_prv_key:
33-
crypto_tip_prv_key = GCE.asymmetric_decrypt(user_key, base64.b64decode(iarc.crypto_tip_prv_key))
34+
crypto_tip_prv_key = GCE.asymmetric_decrypt(user_key, Base64Encoder.decode(iarc.crypto_tip_prv_key))
3435

3536
if elem['request_motivation']:
36-
elem['request_motivation'] = GCE.asymmetric_decrypt(crypto_tip_prv_key, base64.b64decode(elem['request_motivation'])).decode()
37+
elem['request_motivation'] = GCE.asymmetric_decrypt(crypto_tip_prv_key, Base64Encoder.decode(elem['request_motivation'])).decode()
3738

3839
if elem['reply_motivation']:
39-
elem['reply_motivation'] = GCE.asymmetric_decrypt(crypto_tip_prv_key, base64.b64decode(elem['reply_motivation'])).decode()
40+
elem['reply_motivation'] = GCE.asymmetric_decrypt(crypto_tip_prv_key, Base64Encoder.decode(elem['reply_motivation'])).decode()
4041

4142
ret.append(elem)
4243

@@ -91,7 +92,7 @@ def update_identityaccessrequest(session, tid, user_id, identityaccessrequest_id
9192
models.InternalTip.id == models.IdentityAccessRequest.internaltip_id).one()
9293

9394
if request['reply_motivation'] and itip.crypto_tip_pub_key:
94-
request['reply_motivation'] = base64.b64encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, request['reply_motivation']))
95+
request['reply_motivation'] = Base64Encoder.encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, request['reply_motivation']))
9596

9697
if iar.reply == 'pending':
9798
iar.reply_date = datetime_now()

backend/globaleaks/handlers/recipient/__init__.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# -*- coding: utf-8 -*-
22
#
33
# API handling recipient user functionalities
4-
import base64
54
import json
65

76
from datetime import datetime
87

8+
from nacl.encoding import Base64Encoder
99
from sqlalchemy.sql.expression import distinct, func, and_, or_
1010

1111
from globaleaks import models
@@ -91,12 +91,12 @@ def get_receivertips(session, tid, receiver_id, user_key, language, args={}):
9191
label = itip.label
9292
accessible = rtip.receiver_id == receiver_id
9393
if itip.crypto_tip_pub_key and accessible:
94-
tip_key = GCE.asymmetric_decrypt(user_key, base64.b64decode(rtip.crypto_tip_prv_key))
94+
tip_key = GCE.asymmetric_decrypt(user_key, Base64Encoder.decode(rtip.crypto_tip_prv_key))
9595

9696
if label:
97-
label = GCE.asymmetric_decrypt(tip_key, base64.b64decode(label.encode())).decode()
97+
label = GCE.asymmetric_decrypt(tip_key, Base64Encoder.decode(label.encode())).decode()
9898

99-
answers = json.loads(GCE.asymmetric_decrypt(tip_key, base64.b64decode(answers.encode())).decode())
99+
answers = json.loads(GCE.asymmetric_decrypt(tip_key, Base64Encoder.decode(answers.encode())).decode())
100100
elif itip.crypto_tip_pub_key:
101101
# remove useless and unusable crypted data
102102
answers = ""

backend/globaleaks/handlers/recipient/export.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# API handling export of submissions
44
import os
55
from io import BytesIO
6+
from nacl.encoding import Base64Encoder
67
from twisted.internet.defer import inlineCallbacks
78
from twisted.internet.threads import deferToThread
89

@@ -19,7 +20,7 @@
1920
from globaleaks.orm import transact
2021
from globaleaks.rest import errors
2122
from globaleaks.settings import Settings
22-
from globaleaks.utils.crypto import Base64Encoder, GCE
23+
from globaleaks.utils.crypto import GCE
2324
from globaleaks.utils.fs import directory_traversal_check
2425
from globaleaks.utils.securetempfile import SecureTemporaryFile
2526
from globaleaks.utils.templating import Templating

backend/globaleaks/handlers/recipient/rtip.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# -*- coding: utf-8 -*-
22
#
33
# Handlers dealing with tip interface for receivers (rtip)
4-
import base64
54
import copy
65
import json
76
import os
@@ -10,6 +9,7 @@
109

1110
from datetime import datetime, timedelta
1211

12+
from nacl.encoding import Base64Encoder
1313
from twisted.internet.threads import deferToThread
1414
from twisted.internet.defer import inlineCallbacks, returnValue
1515

@@ -90,14 +90,14 @@ def db_grant_tip_access(session, tid, user_id, user_cc, itip, rtip, receiver_id)
9090

9191
_tip_key = b''
9292
if itip.crypto_tip_pub_key:
93-
_tip_key = GCE.asymmetric_decrypt(user_cc, base64.b64decode(rtip.crypto_tip_prv_key))
93+
_tip_key = GCE.asymmetric_decrypt(user_cc, Base64Encoder.decode(rtip.crypto_tip_prv_key))
9494
_tip_key = GCE.asymmetric_encrypt(new_receiver.crypto_pub_key, _tip_key)
9595

9696
new_rtip = db_create_receivertip(session, new_receiver, itip, _tip_key)
9797
new_rtip.new = False
9898
if itip.deprecated_crypto_files_pub_key:
99-
_files_key = GCE.asymmetric_decrypt(user_cc, base64.b64decode(rtip.deprecated_crypto_files_prv_key))
100-
new_rtip.deprecated_crypto_files_prv_key = base64.b64encode(
99+
_files_key = GCE.asymmetric_decrypt(user_cc, Base64Encoder.decode(rtip.deprecated_crypto_files_prv_key))
100+
new_rtip.deprecated_crypto_files_prv_key = Base64Encoder.encode(
101101
GCE.asymmetric_encrypt(new_receiver.crypto_pub_key, _files_key))
102102

103103
wbfiles = session.query(models.WhistleblowerFile) \
@@ -431,7 +431,7 @@ def db_redact_comment(session, tid, user_id, itip_id, redaction, redaction_data,
431431
content = redact_content(currentMaskedContent.get('content'), new_permanent_redaction)
432432

433433
comment = session.query(models.Comment).get(redaction_data['reference_id'])
434-
comment.content = base64.b64encode(GCE.asymmetric_encrypt(itip_id.crypto_tip_pub_key, content)).decode()
434+
comment.content = Base64Encoder.encode(GCE.asymmetric_encrypt(itip_id.crypto_tip_pub_key, content)).decode()
435435

436436

437437
def db_redact_answers(answers, redaction):
@@ -484,7 +484,7 @@ def db_redact_answers_recursively(session, tid, user_id, itip_id, redaction, red
484484
_content = answers
485485

486486
if itip_id.crypto_tip_pub_key:
487-
_content = base64.b64encode(
487+
_content = Base64Encoder.encode(
488488
GCE.asymmetric_encrypt(itip_id.crypto_tip_pub_key, json.dumps(_content, cls=JSONEncoder).encode())).decode()
489489

490490
itip_answers = session.query(models.InternalTipAnswers) \
@@ -514,7 +514,7 @@ def db_redact_whistleblower_identity(session, tid, user_id, itip_id, redaction,
514514

515515
_content = whistleblower_identity
516516
if itip_id.crypto_tip_pub_key:
517-
_content = base64.b64encode(
517+
_content = Base64Encoder.encode(
518518
GCE.asymmetric_encrypt(itip_id.crypto_tip_pub_key, json.dumps(_content, cls=JSONEncoder).encode())).decode()
519519

520520
itip_whistleblower_identity = session.query(models.InternalTipData) \
@@ -617,7 +617,7 @@ def register_rfile_on_db(session, tid, user_id, itip_id, uploaded_file):
617617
for k in ['name', 'description', 'type', 'size']:
618618
if k == 'size':
619619
uploaded_file[k] = str(uploaded_file[k])
620-
uploaded_file[k] = base64.b64encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, uploaded_file[k]))
620+
uploaded_file[k] = Base64Encoder.encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, uploaded_file[k]))
621621

622622
new_file = models.ReceiverFile()
623623
new_file.id = uploaded_file['filename']
@@ -660,7 +660,7 @@ def db_get_rtip(session, tid, user_id, itip_id, language):
660660

661661
db_log(session, tid=tid, type='access_report', user_id=user_id, object_id=itip.id)
662662

663-
return serializers.serialize_rtip(session, itip, rtip, language), base64.b64decode(rtip.crypto_tip_prv_key)
663+
return serializers.serialize_rtip(session, itip, rtip, language), Base64Encoder.decode(rtip.crypto_tip_prv_key)
664664

665665

666666
@transact
@@ -876,7 +876,7 @@ def set_internaltip_variable(session, tid, user_id, itip_id, key, value):
876876
_, _, itip = db_access_rtip(session, tid, user_id, itip_id)
877877

878878
if itip.crypto_tip_pub_key and value and key in ['label']:
879-
value = base64.b64encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, value))
879+
value = Base64Encoder.encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, value))
880880

881881
setattr(itip, key, value)
882882

@@ -947,12 +947,12 @@ def create_identityaccessrequest(session, tid, user_id, user_cc, itip_id, reques
947947
"""
948948
user, rtip, itip = db_access_rtip(session, tid, user_id, itip_id)
949949

950-
crypto_tip_prv_key = GCE.asymmetric_decrypt(user_cc, base64.b64decode(rtip.crypto_tip_prv_key))
950+
crypto_tip_prv_key = GCE.asymmetric_decrypt(user_cc, Base64Encoder.decode(rtip.crypto_tip_prv_key))
951951

952952
iar = models.IdentityAccessRequest()
953953
iar.internaltip_id = itip.id
954954
iar.request_user_id = user.id
955-
iar.request_motivation = base64.b64encode(
955+
iar.request_motivation = Base64Encoder.encode(
956956
GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, request['request_motivation']))
957957
session.add(iar)
958958
session.flush()
@@ -962,7 +962,7 @@ def create_identityaccessrequest(session, tid, user_id, user_cc, itip_id, reques
962962
iarc = models.IdentityAccessRequestCustodian()
963963
iarc.identityaccessrequest_id = iar.id
964964
iarc.custodian_id = custodian.id
965-
iarc.crypto_tip_prv_key = base64.b64encode(GCE.asymmetric_encrypt(custodian.crypto_pub_key, crypto_tip_prv_key))
965+
iarc.crypto_tip_prv_key = Base64Encoder.encode(GCE.asymmetric_encrypt(custodian.crypto_pub_key, crypto_tip_prv_key))
966966
session.add(iarc)
967967
custodians += 1
968968

@@ -996,7 +996,7 @@ def create_comment(session, tid, user_id, itip_id, content, visibility='public')
996996

997997
_content = content
998998
if itip.crypto_tip_pub_key:
999-
_content = base64.b64encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, content)).decode()
999+
_content = Base64Encoder.encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, content)).decode()
10001000

10011001
comment = models.Comment()
10021002
comment.internaltip_id = itip.id
@@ -1028,7 +1028,7 @@ def create_redaction(session, tid, user_id, data):
10281028
else:
10291029
content_str = data.get('content', str(data))
10301030
content_bytes = content_str.encode()
1031-
mask_content = base64.b64encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, content_bytes)).decode()
1031+
mask_content = Base64Encoder.encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, content_bytes)).decode()
10321032

10331033
redaction = models.Redaction()
10341034
redaction.id = data.get('id')
@@ -1257,8 +1257,8 @@ def get(self, wbfile_id):
12571257
self.check_file_presence(filelocation)
12581258

12591259
if tip_prv_key:
1260-
tip_prv_key = GCE.asymmetric_decrypt(self.session.cc, base64.b64decode(tip_prv_key))
1261-
name = GCE.asymmetric_decrypt(tip_prv_key, base64.b64decode(name.encode())).decode()
1260+
tip_prv_key = GCE.asymmetric_decrypt(self.session.cc, Base64Encoder.decode(tip_prv_key))
1261+
name = GCE.asymmetric_decrypt(tip_prv_key, Base64Encoder.decode(name.encode())).decode()
12621262

12631263
try:
12641264
# First attempt
@@ -1268,7 +1268,7 @@ def get(self, wbfile_id):
12681268
if not tip_prv_key2:
12691269
raise
12701270

1271-
files_prv_key2 = GCE.asymmetric_decrypt(self.session.cc, base64.b64decode(tip_prv_key2))
1271+
files_prv_key2 = GCE.asymmetric_decrypt(self.session.cc, Base64Encoder.decode(tip_prv_key2))
12721272
filelocation = GCE.streaming_encryption_open('DECRYPT', files_prv_key2, filelocation)
12731273

12741274
yield self.write_file_as_download(name, filelocation, pgp_key)
@@ -1307,7 +1307,7 @@ def download_rfile(self, session, tid, user_id, file_id):
13071307
except:
13081308
raise errors.ResourceNotFound
13091309
else:
1310-
return rfile.name, rfile.id, base64.b64decode(rtip.crypto_tip_prv_key), pgp_key
1310+
return rfile.name, rfile.id, Base64Encoder.decode(rtip.crypto_tip_prv_key), pgp_key
13111311

13121312
@inlineCallbacks
13131313
def get(self, rfile_id):
@@ -1324,7 +1324,7 @@ def get(self, rfile_id):
13241324

13251325
if tip_prv_key:
13261326
tip_prv_key = GCE.asymmetric_decrypt(self.session.cc, tip_prv_key)
1327-
name = GCE.asymmetric_decrypt(tip_prv_key, base64.b64decode(name.encode())).decode()
1327+
name = GCE.asymmetric_decrypt(tip_prv_key, Base64Encoder.decode(name.encode())).decode()
13281328
filelocation = GCE.streaming_encryption_open('DECRYPT', tip_prv_key, filelocation)
13291329

13301330
yield self.write_file_as_download(name, filelocation, pgp_key)

backend/globaleaks/handlers/whistleblower/attachment.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# -*- coding: utf-8 -*-
22
#
33
# Handler dealing with submissions file uploads and subsequent submissions attachments
4-
import base64
4+
5+
from nacl.encoding import Base64Encoder
56

67
from globaleaks import models
78
from globaleaks.handlers.base import BaseHandler
@@ -34,7 +35,7 @@ def register_ifile_on_db(session, tid, internaltip_id, uploaded_file):
3435

3536
if itip.crypto_tip_pub_key:
3637
for k in ['name', 'type', 'size']:
37-
uploaded_file[k] = base64.b64encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, str(uploaded_file[k])))
38+
uploaded_file[k] = Base64Encoder.encode(GCE.asymmetric_encrypt(itip.crypto_tip_pub_key, str(uploaded_file[k])))
3839

3940
new_file = models.InternalFile()
4041
new_file.id = uploaded_file['filename']

0 commit comments

Comments
 (0)