a few fixes to add Chromium support on Windows

This commit is contained in:
Matthew Broadway 2021-06-12 17:01:55 +01:00
parent 3faf80f02a
commit c9d38e47e1
No known key found for this signature in database
GPG Key ID: DDC0B82B6896B381

View File

@ -130,7 +130,7 @@ def _get_chromium_based_browser_settings(browser_name):
browser_dir = { browser_dir = {
'brave': os.path.join(appdata_local, r'BraveSoftware\Brave-Browser\User Data'), 'brave': os.path.join(appdata_local, r'BraveSoftware\Brave-Browser\User Data'),
'chrome': os.path.join(appdata_local, r'Google\Chrome\User Data'), 'chrome': os.path.join(appdata_local, r'Google\Chrome\User Data'),
'chromium': os.path.join(appdata_local, r'Google\Chromium\User Data'), 'chromium': os.path.join(appdata_local, r'Chromium\User Data'),
'edge': os.path.join(appdata_local, r'Microsoft\Edge\User Data'), 'edge': os.path.join(appdata_local, r'Microsoft\Edge\User Data'),
'opera': os.path.join(appdata_roaming, r'Opera Software\Opera Stable'), 'opera': os.path.join(appdata_roaming, r'Opera Software\Opera Stable'),
'vivaldi': os.path.join(appdata_local, r'Vivaldi\User Data'), 'vivaldi': os.path.join(appdata_local, r'Vivaldi\User Data'),
@ -198,7 +198,10 @@ def _extract_chrome_cookies(browser_name, profile, logger):
try: try:
cursor = _open_database_copy(cookie_database_path, tmpdir) cursor = _open_database_copy(cookie_database_path, tmpdir)
cursor.connection.text_factory = bytes cursor.connection.text_factory = bytes
cursor.execute('SELECT host_key, name, value, encrypted_value, path, expires_utc, is_secure FROM cookies') column_names = _get_column_names(cursor, 'cookies')
secure_column = 'is_secure' if 'is_secure' in column_names else 'secure'
cursor.execute('SELECT host_key, name, value, encrypted_value, path, '
'expires_utc, {} FROM cookies'.format(secure_column))
jar = YoutubeDLCookieJar() jar = YoutubeDLCookieJar()
failed_cookies = 0 failed_cookies = 0
for host_key, name, value, encrypted_value, path, expires_utc, is_secure in cursor.fetchall(): for host_key, name, value, encrypted_value, path, expires_utc, is_secure in cursor.fetchall():
@ -360,7 +363,7 @@ class WindowsChromeCookieDecryptor(ChromeCookieDecryptor):
else: else:
# any other prefix means the data is DPAPI encrypted # any other prefix means the data is DPAPI encrypted
# https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/os_crypt_win.cc # https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/os_crypt_win.cc
return _decrypt_windows_dpapi(encrypted_value, self._logger) return _decrypt_windows_dpapi(encrypted_value, self._logger).decode('utf-8')
def _get_linux_keyring_password(browser_keyring_name): def _get_linux_keyring_password(browser_keyring_name):
@ -487,6 +490,11 @@ def _open_database_copy(database_path, tmpdir):
return conn.cursor() return conn.cursor()
def _get_column_names(cursor, table_name):
table_info = cursor.execute('PRAGMA table_info({})'.format(table_name)).fetchall()
return [row[1].decode('utf-8') for row in table_info]
def _find_most_recently_used_file(root, filename): def _find_most_recently_used_file(root, filename):
# if there are multiple browser profiles, take the most recently used one # if there are multiple browser profiles, take the most recently used one
paths = [] paths = []