Fix UTF-8 decoding error when verifying signatures with international characters

Issue: GPG verification crashed with UnicodeDecodeError when signatures
contained international characters (German ö, Turkish ü, etc.) in the
signed content.

Error: "'utf-8' codec can't decode byte 0xf6 in position 160"

Root cause: subprocess.Popen was using default text decoding without
handling encoding errors gracefully.

Solution:
1. Changed LC_ALL/LANG from 'C' to 'C.UTF-8' to ensure GPG uses UTF-8
2. Added explicit encoding='utf-8' parameter to Popen
3. Added errors='replace' to replace invalid UTF-8 bytes instead of crashing

This allows the verification to proceed even if GPG's output contains
characters that don't decode cleanly, ensuring robustness with
multilingual content.
This commit is contained in:
Claude
2025-12-14 14:01:03 +00:00
parent f68c8389da
commit 2a7d00d221

View File

@@ -46,8 +46,8 @@ class Crypto:
# Force English output for consistent parsing across locales # Force English output for consistent parsing across locales
import os import os
env = os.environ.copy() env = os.environ.copy()
env['LC_ALL'] = 'C' env['LC_ALL'] = 'C.UTF-8' # Use UTF-8 variant to handle international characters
env['LANG'] = 'C' env['LANG'] = 'C.UTF-8'
proc = subprocess.Popen( proc = subprocess.Popen(
['gpg', '--verify'], ['gpg', '--verify'],
@@ -55,6 +55,8 @@ class Crypto:
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stderr=subprocess.PIPE,
text=True, text=True,
encoding='utf-8',
errors='replace', # Replace invalid UTF-8 sequences instead of crashing
env=env env=env
) )
stdout, stderr = proc.communicate(input=signed_content, timeout=10) stdout, stderr = proc.communicate(input=signed_content, timeout=10)