a
    ;h;                     @   s\  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z	d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ ddlmZmZmZ ddlmZm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 dd	l2m3Z3 h d
Z4e4ddhB Z5G dd de1Z6dd Z7G dd de'Z8dd Z9de6 fdddddZ:dd Z;dd Z<dd Z=dd Z>d d! Z?d"d# Z@G d$d% d%ZAddd&d'd(ZBG d)d* d*eAZCG d+d, d,eAZDG d-d. d.eAZEd/d0 ZFG d1d2 d2eGZHG d3d4 d4ZId5d6 ZJd7d8 ZKd9d: ZLd;d< ZMde6 fd=d>ZNG d?d@ d@eZOG dAdB dBeZPePjQR ZSdCdD ZTdEdF ZUdGdH ZVdIdJ ZWdKdL ZXdMdN ZYdOdP ZZdQdR Z[dSdT Z\dqdWdXZ]drdYdZZ^d[d\ Z_d]d^ Z`d_d` Zadadb Zbdcdd Zcdedf Zddgdh Zedidj ZfdsdkdlZgG dmdn dne	jhjiZjG dodp dpe	jkjlZmdS )t    N)Enumauto   )aes_cbc_decrypt_bytes aes_gcm_decrypt_and_verify_bytesunpad_pkcs7)!_SECRETSTORAGE_UNAVAILABLE_REASONsecretstoragesqlite3)MultilinePrinterQuietMultilinePrinter)
DownloadErrorYoutubeDLErrorPopenerror_to_strexpand_pathis_path_likesanitize_urlstr_or_nonetry_callwrite_string)
_YDLLogger)normalize_url>   chromewhalebraveedgeoperavivaldichromiumfirefoxsafaric                       s6   e Zd Zd fdd	ZG dd deZdd Z  ZS )		YDLLoggerFc                    s   t  j||dS )N)once)superwarning)selfmessage	only_once	__class__ S/var/www/html/swiplay.fr/scambot/venv/lib/python3.9/site-packages/yt_dlp/cookies.pyr%   6   s    zYDLLogger.warningc                   @   s   e Zd Zd\ZZdd ZdS )zYDLLogger.ProgressBar)g?r   c                 C   s4   t   | j | jkr0| d| d t   | _d S )Nz
[Cookies] r   )time_timer_DELAYZprint_at_line)r&   r'   r+   r+   r,   print<   s    zYDLLogger.ProgressBar.printN)__name__
__module____qualname__r/   r.   r0   r+   r+   r+   r,   ProgressBar9   s   r4   c                 C   sf   | j r"| j jds"| j jdr&dS | j jj}z| s@W dS W n tyV   Y dS 0 | j|ddS )z8Return a context manager with a print method. (Optional)Z
noprogressloggerNF)Zpreserve_output)Z_ydlparamsgetZ
_out_fileserrorisattyBaseExceptionr4   )r&   filer+   r+   r,   progress_barA   s    "

zYDLLogger.progress_bar)F)r1   r2   r3   r%   r   r4   r<   __classcell__r+   r+   r)   r,   r"   5   s   r"   c                 C   s.   t | dr|  }|r|S t }dd |_|S )Nr<   c                 S   s   d S Nr+   )_r+   r+   r,   <lambda>U       z&_create_progress_bar.<locals>.<lambda>)hasattrr<   r   r0   )r5   printerr+   r+   r,   _create_progress_barO   s    

rD   c                   @   s   e Zd ZdS )CookieLoadErrorNr1   r2   r3   r+   r+   r+   r,   rE   Y   s   rE   c           
   	   C   s   zg }|d ur:t | \}}}}|t||t|||d | d urt| }|rVt| } t| }	|rpt| tj	rx|	
  ||	 t|W S  ty   tdY n0 d S )Nkeyring	containerzfailed to load cookies)_parse_browser_specificationappendextract_cookies_from_browserr"   r   r   YoutubeDLCookieJarosaccessR_OKload_merge_cookie_jars	ExceptionrE   )
Zcookie_fileZbrowser_specificationZydlZcookie_jarsbrowser_nameprofilerH   rI   is_filenamejarr+   r+   r,   load_cookies]   s$    

rX   rG   c                C   sN   | dkrt |||S | dkr&t||S | tv r<t| |||S td|  d S )Nr    r!   zunknown browser: )_extract_firefox_cookies_extract_safari_cookiesCHROMIUM_BASED_BROWSERS_extract_chrome_cookies
ValueError)rT   rU   r5   rH   rI   r+   r+   r,   rL   t   s    
rL   c                    s   | d ts|d t S d u r2tt }n$trBg}nfddt D }dtt	|}t
t|}|d u rtd| |d| d d } d	vrZtjtj|d
}tj|rt|tjstd| t|dd"}t|dg }	W d    n1 s0    Y  t fdd|	D d }t|tsZtd  dtjdd}
d }ztt||
}t|tr|d  d|  |dd| d| df n* dkr|d |d n
|d t }t |}|! }t"|}t#|D ]t\}\}}}}}}|$d|dd |d t%j&j'd!||d d"|t(||)d#|t(|||d"d d i d$}|*| qW d    n1 s0    Y  | d%t"| d& |W |d ur|j+,  W  d    S n|d ur|j+,  0 W d    n1 s0    Y  d S )'NzExtracting cookies from firefoxzzCannot extract cookies from firefox without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportc                    s   g | ]}t j| qS r+   )rN   pathjoin).0r^   )rU   r+   r,   
<listcomp>   rA   z,_extract_firefox_cookies.<locals>.<listcomp>z, z+could not find firefox cookies database in Extracting cookies from: "")Nnonezcontainers.jsonz"could not read containers.json in utf8encoding
identitiesc                 3   s6   | ].   d t fddfv r  dV  qdS )namec                      s   t d d  S )NzuserContext([^\.]+)\.labelZl10nID)re	fullmatchgroupr+   contextr+   r,   r@      rA   z4_extract_firefox_cookies.<locals>.<genexpr>.<lambda>ZuserContextIdN)r7   r   )r`   )rI   rm   r,   	<genexpr>   s   z+_extract_firefox_cookies.<locals>.<genexpr>z"could not find firefox container "z" in containers.jsonyt_dlpprefixz-Only loading cookies from firefox container "z", ID zzSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE originAttributes LIKE ? OR originAttributes LIKE ?z%userContextId=z&%rd   z3Only loading cookies not belonging to any containerztSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE NOT INSTR(originAttributes,"userContextId=")zASELECT host, name, value, path, expiry, isSecure FROM moz_cookiesLoading cookie  6d/r   F.versionri   valueportport_specifieddomaindomain_specifieddomain_initial_dotr^   path_specifiedsecureexpiresdiscardcommentcomment_urlrest
Extracted z cookies from firefox)-infor
   r%   rM   list_firefox_browser_dirs_is_pathr_   maprepr_newest_firefox_cookie_dbsFileNotFoundErrordebugrN   r^   dirnameisfilerO   rP   openjsonrQ   r7   next
isinstanceintr]   tempfileTemporaryDirectory_open_database_copyexecuterD   fetchalllen	enumerater0   http	cookiejarCookiebool
startswith
set_cookie
connectionclose)rU   rI   r5   Zsearch_rootssearch_rootcookie_database_pathZcontainer_idZcontainers_pathZ
containersrh   tmpdircursorrW   r<   tabletotal_cookie_countihostri   ry   r^   Zexpiry	is_securecookier+   )rI   rU   r,   rY      s    


2





.

 
rY   c                   c   sR   t jdv r ttjjdE d H  n.t jdkr:tjdV  nttjjdE d H  d S )Ncygwinwin32)z"%APPDATA%\Mozilla\Firefox\Profilesza%LOCALAPPDATA%\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox\Profilesdarwinz.~/Library/Application Support/Firefox/Profiles)z~/.mozilla/firefoxz&~/snap/firefox/common/.mozilla/firefoxz/~/.var/app/org.mozilla.firefox/.mozilla/firefox)sysplatformr   rN   r^   
expandvars
expanduserr+   r+   r+   r,   r      s
    

r   c              	   c   s>   t tjj| D ]*}dD ] }ttj||dE d H  qqd S )N) z*/zProfiles/*/zcookies.sqlite)r   rN   r^   abspathglobiglobr_   )rootsrootpatternr+   r+   r,   r      s    r   c              
   C   s  t jdv rtjd}tjd}tj|dtj|dtj|dtj|dtj|dtj|d	tj|d
d|  }nt jdkrtjd}tj|dtj|dtj|dtj|dtj|dtj|dtj|dd|  }ndt }tj|dtj|dtj|dtj|dtj|dtj|dtj|dd|  }dddt jdkrrdndt jdkrdndt jdkrdnddd|  }dh}||| |vdS ) Nr   z%LOCALAPPDATA%z	%APPDATA%z%BraveSoftware\Brave-Browser\User DatazGoogle\Chrome\User DatazChromium\User DatazMicrosoft\Edge\User DatazOpera Software\Opera StablezVivaldi\User DatazNaver\Naver Whale\User Data)r   r   r   r   r   r   r   r   z~/Library/Application SupportzBraveSoftware/Brave-BrowserzGoogle/ChromeZChromiumzMicrosoft Edgezcom.operasoftware.OperaZVivaldizNaver/Whalezgoogle-chromer   zmicrosoft-edger   r   znaver-whaleZBraveZChromeZOperaZWhale)browser_dirkeyring_namesupports_profiles)r   r   rN   r^   r   r_   r   _config_home)rT   Zappdata_localZappdata_roamingr   Zappdataconfigr   Zbrowsers_without_profilesr+   r+   r,   $_get_chromium_based_browser_settings   sf    



r   c                 C   sT  | d|   ts,|d|  d t S t| }|d u rF|d }n^t|rp|}|d rftj|n||d< n4|d rtj	|d |}n|
|  d |d }tt|d|}|d u rtd|  d	| d
|d| d
 tjddL}d }zzt||}t|d d }	t|d |d |||	d}
t|j_t|d}d|v rZdnd}|d| d t }d}d}t|}| }t|}t|D ]d\}}|d|dd|d t|
g|R  \}}|s|d7 }qn|s|d7 }| | qW d    n1 s0    Y  |dkr>d| d}nd}| dt| d|  |  |
j!" }||d < |d!|  |W W |d ur|j#  W  d    S  t$y  } z<tj%d"kr|j&d#krd$}|
| t'| W Y d }~n
d }~0 0 W |d ur0|j#  n|d ur.|j#  0 W d    n1 sF0    Y  d S )%NzExtracting cookies from zCannot extract cookies from zW without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportr   r   z does not support profilesZCookieszcould not find z cookies database in "rc   rb   rp   rq   z,SELECT value FROM meta WHERE key = "version"r   r   rH   meta_versioncookiesr   r   zBSELECT host_key, name, value, encrypted_value, path, expires_utc, z FROM cookiesrs   rt   ru   r    (z could not be decrypted)r   r   z cookies from Zunencryptedzcookie version breakdown: nt   zgCould not copy Chrome cookie database. See  https://github.com/yt-dlp/yt-dlp/issues/7271  for more info)(r   r
   r%   rM   r   r   rN   r^   r   r_   r8   r   _find_filesr   r   r   r   r   r   r   Zfetchoneget_cookie_decryptorbytesr   Ztext_factory_get_column_namesrD   r   r   r   r0   _process_chrome_cookier   _cookie_countscopyr   PermissionErrorri   errnor   )rT   rU   rH   r5   r   r   r   r   r   r   	decryptorZcolumn_namesZsecure_columnrW   Zfailed_cookiesZunencrypted_cookiesr<   r   r   r   lineis_encryptedr   Zfailed_messagecountsr8   r'   r+   r+   r,   r\     s    



.






r\   c           	      C   s   |  }|  }|  }|  }| o(|}|rH| |}|d u rH|d fS |sPd }|tjjd||d d|t||d|t|||dd d i dfS )Nr   Frv   rw   )decodedecryptr   r   r   r   r   )	r   Zhost_keyri   ry   encrypted_valuer^   Zexpires_utcr   r   r+   r+   r,   r   f  s"    


r   c                   @   s   e Zd ZdZi Zdd ZdS )ChromeCookieDecryptoraf  
    Overview:

        Linux:
        - cookies are either v10 or v11
            - v10: AES-CBC encrypted with a fixed key
                - also attempts empty password if decryption fails
            - v11: AES-CBC encrypted with an OS protected key (keyring)
                - also attempts empty password if decryption fails
            - v11 keys can be stored in various places depending on the activate desktop environment [2]

        Mac:
        - cookies are either v10 or not v10
            - v10: AES-CBC encrypted with an OS protected key (keyring) and more key derivation iterations than linux
            - not v10: 'old data' stored as plaintext

        Windows:
        - cookies are either v10 or not v10
            - v10: AES-GCM encrypted with a key which is encrypted with DPAPI
            - not v10: encrypted with DPAPI

    Sources:
    - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/
    - [2] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_linux.cc
        - KeyStorageLinux::CreateService
    c                 C   s   t dd S )Nz"Must be implemented by sub classes)NotImplementedError)r&   r   r+   r+   r,   r     s    zChromeCookieDecryptor.decryptN)r1   r2   r3   __doc__r   r   r+   r+   r+   r,   r   ~  s   r   r   c                C   s@   t jdkrt|||dS t jdv r0t| ||dS t||||dS )Nr   )r   )r   r   r   )r   r   MacChromeCookieDecryptorWindowsChromeCookieDecryptorLinuxChromeCookieDecryptor)browser_rootbrowser_keyring_namer5   rH   r   r+   r+   r,   r     s
    

r   c                   @   s>   e Zd ZdddddZejdd Zedd Zd	d
 Z	dS )r   Nr   c                C   sF   || _ | d| _| d| _dddd| _|| _|| _|p>d| _d S )Ns   peanutsrA   r   )v10v11other)_logger
derive_key_v10_key
_empty_keyr   _browser_keyring_name_keyring_meta_version)r&   r   r5   rH   r   r+   r+   r,   __init__  s    z#LinuxChromeCookieDecryptor.__init__c                 C   s(   t | j| j| j}|d u rd S | |S r>   )_get_linux_keyring_passwordr   r   r   r   )r&   passwordr+   r+   r,   _v11_key  s    z#LinuxChromeCookieDecryptor._v11_keyc                 C   s   t | ddddS )N	   saltysaltr      salt
iterations
key_lengthpbkdf2_sha1r   r+   r+   r,   r     s    z%LinuxChromeCookieDecryptor.derive_keyc                 C   s   |dd }|dd }|dkrR| j d  d7  < t|| j| jf| j| jdkdS |dkr| j d	  d7  < | jdu r| jjd
dd dS t|| j| jf| j| jdkdS | jjd| ddd | j d  d7  < dS dS )a  

        following the same approach as the fix in [1]: if cookies fail to decrypt then attempt to decrypt
        with an empty password. The failure detection is not the same as what chromium uses so the
        results won't be perfect

        References:
            - [1] https://chromium.googlesource.com/chromium/src/+/bbd54702284caca1f92d656fdcadf2ccca6f4165%5E%21/
                - a bugfix to try an empty password as a fallback
        N      v10r   r      hash_prefixs   v11r   z(cannot decrypt v11 cookies: no key foundTr(   zunknown cookie version: "rc   r   )r   _decrypt_aes_cbc_multir   r   r   r   r   r%   r&   r   rx   
ciphertextr+   r+   r,   r     s(    
z"LinuxChromeCookieDecryptor.decrypt)
r1   r2   r3   r   	functoolscached_propertyr   staticmethodr   r   r+   r+   r+   r,   r     s   	

r   c                   @   s*   e Zd ZdddZedd Zdd ZdS )	r   Nc                 C   sB   || _ t||}|d u rd n| || _ddd| _|p:d| _d S Nr   )r   r   )r   _get_mac_keyring_passwordr   r   r   r   )r&   r   r5   r   r   r+   r+   r,   r     s
    
z!MacChromeCookieDecryptor.__init__c                 C   s   t | ddddS )Nr   i  r   r   r   r   r+   r+   r,   r     s    z#MacChromeCookieDecryptor.derive_keyc                 C   s   |d d }|dd  }|dkrl| j d  d7  < | jd u rP| jjddd d S t|| jf| j| jdkd	S | j d
  d7  < |S d S )Nr   r   r   r   (cannot decrypt v10 cookies: no key foundTr   r   r   r   )r   r   r   r%   r  r   r  r+   r+   r,   r     s    
z MacChromeCookieDecryptor.decrypt)N)r1   r2   r3   r   r  r   r   r+   r+   r+   r,   r     s   

r   c                   @   s   e Zd ZdddZdd ZdS )r   Nc                 C   s,   || _ t||| _ddd| _|p$d| _d S r  )r   _get_windows_v10_keyr   r   r   )r&   r   r5   r   r+   r+   r,   r     s    z%WindowsChromeCookieDecryptor.__init__c           	      C   s   |d d }|dd  }|dkr| j d  d7  < | jd u rP| jjddd d S d}d	}|}|d | }|||  }|| d  }t|| j||| j| jd
kdS | j d  d7  < t|| j S d S )Nr   r   r   r   r	  Tr      r   r   r   r   )r   r   r   r%   _decrypt_aes_gcmr   _decrypt_windows_dpapir   )	r&   r   rx   r  Znonce_lengthZauthentication_tag_lengthZraw_ciphertextnonceauthentication_tagr+   r+   r,   r   	  s&    
z$WindowsChromeCookieDecryptor.decrypt)N)r1   r2   r3   r   r   r+   r+   r+   r,   r     s   
r   c                 C   s   t jdkrtdt j | r@tj| }tj|stdnBtjd}tj|s|d tjd}tj|stdt	|d}|
 }W d    n1 s0    Y  t||d	}|d
t| d |S )Nr   zunsupported platform: z(custom safari cookies database not foundz'~/Library/Cookies/Cookies.binarycookiesz Trying secondary cookie locationzP~/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookiesz&could not find safari cookies databaserb)r5   r   z cookies from safari)r   r   r]   rN   r^   r   r   r   r   r   readparse_safari_cookiesr   r   )rU   r5   Zcookies_pathfZcookies_datarW   r+   r+   r,   rZ   *  s"    


&rZ   c                   @   s   e Zd ZdS )ParserErrorNrF   r+   r+   r+   r,   r  D  s   r  c                   @   s^   e Zd Zdd Zdd Zdd Zddd	Zdd
dZdd ZdddZ	dddZ
dddZdS )
DataParserc                 C   s   || _ d| _|| _d S )Nr   )_datar   r   )r&   datar5   r+   r+   r,   r   I  s    zDataParser.__init__c                 C   sR   |dk rt d| d| j| }|t| jkr8t d| j| j| }|| _|S )Nr   zinvalid read of  byteszreached end of input)r  r   r   r  )r&   	num_bytesendr  r+   r+   r,   
read_bytesN  s    
zDataParser.read_bytesc                 C   s6   |  t|}||kr2td| d| d| dd S )Nzunexpected value: z != r   ))r  r   r  )r&   Zexpected_valuer'   ry   r+   r+   r,   expect_bytesX  s    zDataParser.expect_bytesFc                 C   s"   |rdnd}t || dd S )Nz>Iz<I   r   structunpackr  r&   
big_endianZdata_formatr+   r+   r,   	read_uint]  s    zDataParser.read_uintc                 C   s"   |rdnd}t || dd S )Nz>dz<d   r   r  r"  r+   r+   r,   read_doublea  s    zDataParser.read_doublec                 C   s4   g }|  d}|dkr$d| S || qd S )Nr       rA   )r  r_   r   rK   )r&   buffercr+   r+   r,   read_cstringe  s
    
zDataParser.read_cstringunknownc              
   C   sJ   |dkr.| j d| d| d| | n|dk rFtd| dd S )Nr   z	skipping z bytes (z): zinvalid skip of r  )r   r   r  r  )r&   r  descriptionr+   r+   r,   skipn  s    &zDataParser.skipc                 C   s   |  || j | d S r>   )r-  r   )r&   offsetr,  r+   r+   r,   skip_tot  s    zDataParser.skip_toc                 C   s   |  t| j| d S r>   )r/  r   r  )r&   r,  r+   r+   r,   skip_to_endw  s    zDataParser.skip_to_endN)F)F)r+  )r+  )r+  )r1   r2   r3   r   r  r  r$  r&  r*  r-  r/  r0  r+   r+   r+   r,   r  H  s   


	

r  c              	   C   s.   t tjdddddtjjdtj| d  S )Ni  r   r   )tzinfo)seconds)r   dtdatetimetimezoneutc	timedelta	timestamp)r8  r+   r+   r,   _mac_absolute_time_to_posix{  s    r9  c                    sB   t | |  dd  jdd} fddt|D }| jfS )Ns   cookzdatabase signatureTr#  c                    s   g | ]} j d dqS )Tr:  r$  r`   r?   pr+   r,   ra     rA   z0_parse_safari_cookies_header.<locals>.<listcomp>)r  r  r$  ranger   )r  r5   Znumber_of_pages
page_sizesr+   r=  r,   _parse_safari_cookies_header  s
    
rA  c           	   	      s   t | |  dd   } fddt|D }|dkrV|dt|  d d S  |d d t|f}t|D ]L\}}|	d	|d
d|d
  |d t
| |d  ||} | qxW d    n1 s0    Y   d d S )Ns      zpage signaturec                    s   g | ]}   qS r+   r;  r<  r=  r+   r,   ra     rA   z._parse_safari_cookies_page.<locals>.<listcomp>r   za cookies page of size z has no cookieszunknown page header fieldrs   rt   ru   zspace between recordszspace in between pages)r  r  r$  r?  r   r   r/  rD   r   r0   _parse_safari_cookies_recordr  r0  )	r  rW   r5   Znumber_of_cookiesZrecord_offsetsr<   r   Zrecord_offsetZrecord_lengthr+   r=  r,   _parse_safari_cookies_page  s    

*rC  c                 C   sH  t | |}| }|dd | }t|d@ }|dd | }| }| }	| }
|dd t| }t| }zL|| | }|| | }||	 | }||
 | }W n$ ty   |j	ddd	 | Y S 0 ||d
 t
jjd||d d|t||d|t|||dd d i d}|| |S )Nr  zunknown record field 1r   zunknown record field 2r%  zunknown record field 3z;failed to parse Safari cookie because UTF-8 decoding failedTr   zspace at the end of the recordr   Frv   rw   )r  r$  r-  r   r9  r&  r/  r*  UnicodeDecodeErrorr%   r   r   r   r   r   )r  rW   r5   r>  Zrecord_sizeflagsr   Zdomain_offsetZname_offsetZpath_offsetZvalue_offsetZexpiration_dateZ_creation_dater|   ri   r^   ry   r   r+   r+   r,   rB    sD    







rB  c                 C   sX   |du rt  }t| |\}}t| |d |}|D ]}t|||| q2|d |S )a9  
    References:
        - https://github.com/libyal/dtformats/blob/main/documentation/Safari%20Cookies.asciidoc
            - this data appears to be out of date but the important parts of the database structure is the same
            - there are a few bytes here and there which are skipped during parsing
    Nfooter)rM   rA  r  rC  r  r0  )r  rW   r5   r@  Z
body_startr>  Z	page_sizer+   r+   r,   r    s    
r  c                   @   s^   e Zd ZdZe Ze Ze Ze Ze Z	e Z
e Ze Ze Ze Ze Ze Ze ZdS )_LinuxDesktopEnvironmentzu
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/nix/xdg_util.h
    DesktopEnvironment
    N)r1   r2   r3   r   r   OTHERCINNAMONDEEPINGNOMEKDE3KDE4KDE5KDE6PANTHEONUKUIUNITYXFCELXQTr+   r+   r+   r,   rG    s   rG  c                   @   s.   e Zd ZdZe Ze Ze Ze Ze Z	dS )_LinuxKeyringz
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_util_linux.h
    SelectedLinuxBackend
    N)
r1   r2   r3   r   r   KWALLETKWALLET5KWALLET6GNOMEKEYRING	BASICTEXTr+   r+   r+   r,   rU    s   rU  c                 C   s&  |  dd}|  dd}|durbttj|dD ]}|dkr`d|v rTtj  S tj  S q4|dkrrtj  S |d	krtj  S |d
krtj	  S |dkr |  dd}|dkrtj
  S |dkrtj  S |dkrtj  S |d| d tj  S q4|dkrtj  S |dkr(tj  S |dkr<tj  S |dkr4tj  S q4|d| d |dkrrtjS |dv rtjS |dv rtjS |dkrd| v rtjS tjS n<d|v s|dkrtjS |dkrtjS |d| d d | v r tjS d!| v r d| v rtjS tjS tjS )"zy
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/nix/xdg_util.cc
    GetDesktopEnvironment
    ZXDG_CURRENT_DESKTOPNZDESKTOP_SESSIONr   :ZUnityzgnome-fallbackZDeepinrK  z
X-CinnamonZKDEZKDE_SESSION_VERSION564zunknown KDE version: "z". Assuming KDE4ZPantheonrS  rQ  ZLXQtz1XDG_CURRENT_DESKTOP is set to an unknown value: "rc   Zdeepin)ZmateZgnome)Zkde4z
kde-plasmaZkdeZxfceZxubuntuZukuiz-DESKTOP_SESSION is set to an unknown value: "ZGNOME_DESKTOP_SESSION_IDZKDE_FULL_SESSION)r7   r   strstripsplitrG  rK  rR  rJ  rI  rN  rO  rM  r   rP  rS  rQ  rT  r   rL  rH  )envr5   Zxdg_current_desktopZdesktop_sessionpartZkde_versionr+   r+   r,   _get_linux_desktop_environment  sn    























rd  c                 C   sz   t tj| }| d|j  |tjkr0tj}nF|tj	krBtj
}n4|tjkrTtj}n"|tjtjtjfv rptj}ntj}|S )aG  
    SelectBackend in [1]

    There is currently support for forcing chromium to use BASIC_TEXT by creating a file called
    `Disable Local Encryption` [1] in the user data dir. The function to write this file (`WriteBackendUse()` [1])
    does not appear to be called anywhere other than in tests, so the user would have to create this file manually
    and so would be aware enough to tell yt-dlp to use the BASIC_TEXT keyring.

    References:
        - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_util_linux.cc
    zdetected desktop environment: )rd  rN   environr   ri   rG  rM  rU  rV  rN  rW  rO  rX  rL  rT  rH  rZ  rY  )r5   Zdesktop_environmentZlinux_keyringr+   r+   r,   _choose_linux_keyring?  s    


rf  c           	   
   C   s   d}z| t jkrd}d}n0| t jkr.d}d}n| t jkrBd}d}nt| tjdd	d
d| |dgdtjtj	d\}}}|r|
d |W S |d|  d | W S W n8 ty } z |
d|  |W  Y d}~S d}~0 0 dS )ag   The name of the wallet used to store network passwords.

    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/kwallet_dbus.cc
    KWalletDBus::NetworkWallet
    which does a dbus call to the following function:
    https://api.kde.org/frameworks/kwallet/html/classKWallet_1_1Wallet.html
    Wallet::NetworkWallet
    Z	kdewalletzorg.kde.kwalletdz/modules/kwalletdzorg.kde.kwalletd5z/modules/kwalletd5zorg.kde.kwalletd6z/modules/kwalletd6z	dbus-sendz	--sessionz--print-reply=literalz--dest=zorg.kde.KWallet.networkWalletT)textstdoutstderrzfailed to read NetworkWalletzNetworkWallet = "rc   z)exception while obtaining NetworkWallet: N)rU  rV  rW  rX  r]   r   run
subprocessPIPEDEVNULLr%   r   r`  rS   )	rH   r5   Zdefault_walletZservice_nameZwallet_pathrh  r?   
returncodeer+   r+   r,   _get_kwallet_network_wallet\  s8    	




rp  c              
   C   s   | d|j  tdd u r.|d dS t||}ztjdd|  dd|  d|gtj	tj
d	\}}}|r|d
| d W dS | dr| d W dS | d |dW S W n< t y } z"|dt|  W Y d }~dS d }~0 0 d S )Nz,using kwallet-query to obtain password from zkwallet-queryzkwallet-query command not found. KWallet and kwallet-query must be installed to read from KWallet. kwallet-query should beincluded in the kwallet package for your distributionrA   z--read-password Safe Storagez--folderz Keysrh  ri  z&kwallet-query failed with return code z7. Please consult the kwallet-query man page for detailss   failed to readz@failed to read password from kwallet. Using empty string insteadzpassword found   
z!exception running kwallet-query: )r   ri   shutilwhichr8   rp  r   rj  rk  rl  rm  lowerr   rstriprS   r%   r   )r   rH   r5   Znetwork_walletrh  r?   rn  ro  r+   r+   r,   _get_kwallet_password  s2    




	
rx  c                 C   s   t s|dt  dS tt  `}t |}| D ]0}| |  dkr:|	   W  d    S q:|d W d    dS 1 s0    Y  d S )Nzsecretstorage not available rA   rq  zfailed to read from keyring)
r	   r8   r   
contextlibclosingZ	dbus_initZget_default_collectionZget_all_itemsZ	get_labelZ
get_secret)r   r5   concolitemr+   r+   r,   _get_gnome_keyring_password  s    

r~  c                 C   s~   |rt | nt|}|d|j  |t jt jt jfv rFt| ||S |t jkrZt	| |S |t j
krhd S dszJ d| d S )NzChosen keyring: FzUnknown keyring )rU  rf  r   ri   rV  rW  rX  rx  rY  r~  rZ  )r   rH   r5   r+   r+   r,   r     s    


r   c              
   C   s   | d zNtjdddd| d|  dgtjtjd\}}}|rN|d	 W d S |d
W S  ty } z"|dt	|  W Y d }~d S d }~0 0 d S )Nz@using find-generic-password to obtain password from OSX keychainsecurityzfind-generic-passwordz-wz-az-srq  rr  zfind-generic-password failedrs  z)exception running find-generic-password: )
r   r   rj  rk  rl  rm  r%   rw  rS   r   )r   r5   rh  r?   rn  ro  r+   r+   r,   r    s"    


r  c                 C   s   t t| d|}|du r&|d dS |d| d t|dd}t|}W d   n1 sd0    Y  z|d d	 }W n ty   |d
 Y dS 0 t	|}d}|
|s|d dS t|t|d |S )z
    References:
        - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/os_crypt_win.cc
    zLocal StateNzcould not find local state filezFound local state file at "rc   re   rf   Zos_cryptencrypted_keyzno encrypted key in Local States   DPAPIzinvalid key)r   r   r8   r   r   r   rQ   KeyErrorbase64	b64decoder   r  r   )r   r5   r^   r  r  Z
base64_keyr  rr   r+   r+   r,   r
    s$    
(



r
  c                 C   s   t d| |||S )Nsha1)hashlibpbkdf2_hmac)r   r   r   r   r+   r+   r,   r     s    r                      Fc              	   C   sh   |D ]P}t t| ||}z(|r4|dd   W   S | W   S  tyR   Y q0 q|jddd d S )N    z\failed to decrypt cookie (AES-CBC) because UTF-8 decoding failed. Possibly the key is wrong?Tr   )r   r   r   rD  r%   )r  keysr5   Zinitialization_vectorr   key	plaintextr+   r+   r,   r    s    r  c                 C   s~   zt | |||}W n" ty4   |jddd Y d S 0 z |rN|dd   W S | W S  tyx   |jddd Y d S 0 d S )Nz[failed to decrypt cookie (AES-GCM) because the MAC check failed. Possibly the key is wrong?Tr   r  z\failed to decrypt cookie (AES-GCM) because UTF-8 decoding failed. Possibly the key is wrong?)r   r]   r%   r   rD  )r  r  r  r  r5   r   r  r+   r+   r,   r    s    
r  c           	         s   ddl  ddl G  fddd j} | }| ||}| } jj |ddddd |}|sd}|	| t
| |j|j} jj|j |S )zt
    References:
        - https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata
    r   Nc                       s(   e Zd Zd jjfd  jfgZdS )z)_decrypt_windows_dpapi.<locals>.DATA_BLOBcbDatapbDataN)r1   r2   r3   ZwintypesZDWORDPOINTERc_char_fields_r+   ctypesr+   r,   	DATA_BLOB,  s   
r  z_Failed to decrypt with DPAPI. See  https://github.com/yt-dlp/yt-dlp/issues/10927  for more info)r  Zctypes.wintypes	Structurecreate_string_buffersizeofwindllZcrypt32ZCryptUnprotectDatabyrefr8   r   	string_atr  r  kernel32Z	LocalFree)	r  r5   r  r(  Zblob_inZblob_outretr'   resultr+   r  r,   r  #  s,    
	
r  c                   C   s   t jdt jdS )NXDG_CONFIG_HOMEz	~/.config)rN   re  r7   r^   r   r+   r+   r+   r,   r   F  s    r   c                 C   s,   t j|d}t| | t|}| S )Nztemporary.sqlite)rN   r^   r_   rt  r   r
   connectr   )Zdatabase_pathr   Zdatabase_copy_pathconnr+   r+   r,   r   J  s    
r   c                 C   s$   |  d| d }dd |D S )NzPRAGMA table_info(r  c                 S   s   g | ]}|d    qS )r   )r   )r`   rowr+   r+   r,   ra   T  rA   z%_get_column_names.<locals>.<listcomp>)r   r   )r   Z
table_nameZ
table_infor+   r+   r,   r   R  s    r   c                 C   s   t | dd d dS )Nc                 S   s   t | jS r>   )rN   lstatst_mtime)r^   r+   r+   r,   r@   X  rA   z_newest.<locals>.<lambda>)r  default)max)filesr+   r+   r,   r   W  s    r   c           	   
   c   s   d}t |j}t| D ]N\}}}|D ]>}|d7 }|d| d|dd ||kr&tj||V  q&qW d    n1 s|0    Y  d S )Nr   r   zSearching for "z": rt   z files searched)rD   rN   walkr0   r^   r_   )	r   filenamer5   r   r<   Z	curr_rootr?   r  r;   r+   r+   r,   r   [  s    
r   c                 C   s:   t  }| D ]*}|D ]}|| q|jd ur
|j|_q
|S r>   )rM   r   r  )ZjarsZ
output_jarrW   r   r+   r+   r,   rR   g  s    

rR   c                    s"   t  fddtjjtjjfD S )Nc                 3   s   | ]}|r| v V  qd S r>   r+   )r`   sepry   r+   r,   ro   r  rA   z_is_path.<locals>.<genexpr>)anyrN   r^   r  altsepr  r+   r  r,   r   q  s    r   c                 C   s`   | t vrtd|  d|d gtR vr8td| d|d urTtt|rTt|}| |||fS )Nzunsupported browser: "rc   zunsupported keyring: ")SUPPORTED_BROWSERSr]   SUPPORTED_KEYRINGSr   r   )rT   rU   rH   rI   r+   r+   r,   rJ   u  s    rJ   c                       sp   e Zd ZdZded Zeed Zh dZddhZ	e
de d	 e d
 ejejB Z fddZ  ZS )LenientSimpleCookiez1More lenient version of http.cookies.SimpleCookiez\w\dz!#$%&'*+-.:^_`|~z(),/<=>?@[]{}>	   r   samesitezmax-ager|   r^   httponlyr   r   rx   r   r  z
        \s*                            # Optional whitespace at start of cookie
        (?P<key>                       # Start of group 'key'
        [au  ]+?# Any word of at least one letter
        )                              # End of group 'key'
        (                              # Optional group: there may not be a value.
        \s*=\s*                          # Equal Sign
        (                                # Start of potential value
        (?P<val>                           # Start of group 'val'
        "(?:[^\\"]|\\.)*"                    # Any doublequoted string
        |                                    # or
        \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Special case for "expires" attr
        |                                    # or
        [a	  ]*     # Any word or empty string
        )                                  # End of group 'val'
        |                                  # or
        (?P<bad>(?:\\;|[^;])*?)            # 'bad' group fallback for invalid values
        )                                # End of potential value
        )?                             # End of optional value group
        \s*                            # Any number of spaces.
        (\s+|;|$)                      # Ending either at space, semicolon, or EOS.
        c                    s  t |tst |S d }| j|D ]}|dr:d }q&|dd\}}d}|drh|dd  }d}| }|| j	v r|d u rq&|d u r|| j
vrd }q&d}n| |\}}|||< q&|rd }q&|d ur| |tj }| |\}	}
|||	|
 || |< q&d }q&d S )Nbadr  valF$r   T)r   r_  r$   rQ   _COOKIE_PATTERNfinditerrl   r   rv  	_RESERVED_FLAGSvalue_decoder7   r   r   Morselset)r&   r  morselmatchr  ry   Zis_attributeZ	lower_keyr?   
real_valuecoded_valuer)   r+   r,   rQ     s>    







zLenientSimpleCookie.load)r1   r2   r3   r   rj   escapeZ_LEGAL_KEY_CHARSZ_LEGAL_VALUE_CHARSr  r  compileASCIIVERBOSEr  rQ   r=   r+   r+   r)   r,   r    s"   
r  c                       s   e Zd ZdZdZdZdZeddZ	d fdd		Z
ed
d ZejddddZdd ZdddZdddZdd Zdd Z fddZ  ZS ) rM   z]
    See [1] for cookie file format.

    1. https://curl.haxx.se/docs/http-cookies.html
    z
#HttpOnly_   zO# Netscape HTTP Cookie File
# This file is generated by yt-dlp.  Do not edit.

ZCookieFileEntry)Zdomain_nameZinclude_subdomainsr^   Z
https_only
expires_atri   ry   Nc                    s6   t  jd g|R i | t|r,t|}|| _d S r>   )r$   r   r   rN   fspathr  )r&   r  argskwargsr)   r+   r,   r     s    
zYoutubeDLCookieJar.__init__c                 C   s   | rdS dS )NTRUEFALSEr+   )Zcndnr+   r+   r,   _true_or_false  s    z!YoutubeDLCookieJar._true_or_falseFwritec                c   s^   t |rFt||rdnddd}|V  W d    qZ1 s:0    Y  n|rT|d |V  d S )Nwrzutf-8rf   r   )r   r   truncate)r&   r;   r  r  r+   r+   r,   r     s    &
zYoutubeDLCookieJar.openc                 C   s   t   }| D ]}|s|js|s*||r*q|j|j }}|d u rJd| }}|dd|j| 	|j
d|j| 	|jt|jdd||f qd S )Nr   z{}
	rv   )r  )r-   r   
is_expiredri   ry   r  formatr_   r|   r  r   r^   r   r   r   )r&   r  ignore_discardignore_expiresnowr   ri   ry   r+   r+   r,   _really_save  s&    


zYoutubeDLCookieJar._really_saveTc                 C   s   |du r&| j dur| j }nttjj| D ]}|jdu r*d|_q*| j|dd*}|| j | 	||| W d   n1 s~0    Y  dS )z
        Save cookies to a file.
        Code is taken from CPython 3.6
        https://github.com/python/cpython/blob/8d999cbf4adea053be6dbb612b9844635c4dfb8e/Lib/http/cookiejar.py#L2091-L2117 Nr   Tr  )
r  r]   r   r   MISSING_FILENAME_TEXTr   r   r  _HEADERr  )r&   r  r  r  r   r  r+   r+   r,   save  s    

zYoutubeDLCookieJar.savec           
         s0  |du r& j dur j }nttjj fdd}t } |}|D ]}z||| W qJ tjj	y } zP|
  dd dv rtj	dtd| d	|d
 W Y d}~qJW Y d}~qJd}~0 0 qJW d   n1 s0    Y  |d  ||||  D ]}	|	jdkrd|	_d|	_qdS )zLoad cookies from a file.Nc                    s   |   jr| t jd  } |  ds0|  s4| S | d}t| jkrbtjdt|  j	| }|j
r|j
 stjd|j
 | S )N#r  zinvalid length zinvalid expires at )r   _HTTPONLY_PREFIXr   r`  ra  
_ENTRY_LENr   r   	LoadError_CookieFileEntryr  isdigit)r   Zcookie_listr   r&   r+   r,   prepare_line0  s    

z-YoutubeDLCookieJar.load.<locals>.prepare_line r   z[{"zCookies file must be Netscape formatted, not JSON. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlpz+WARNING: skipping cookie file entry due to z: 
T)r  r]   r   r   r  ioStringIOr   r  r  r`  r   seek_really_loadr   r   )
r&   r  r  r  r  cfr  r   ro  r   r+   r  r,   rQ   (  s.    
B

zYoutubeDLCookieJar.loadc                 C   s(   t jtt|}| | |dS )z-Generate a Cookie HTTP header for a given urlr   )urllibrequestRequestr   r   add_cookie_header
get_header)r&   urlZ
cookie_reqr+   r+   r,   get_cookie_header[  s    
z$YoutubeDLCookieJar.get_cookie_headerc                 C   s0   t t  | j_| _| tjtt	|S )z1Generate a list of Cookie objects for a given url)
r   r-   _policy_now_cookies_for_requestr  r  r  r   r   )r&   r  r+   r+   r,   get_cookies_for_urla  s    z&YoutubeDLCookieJar.get_cookies_for_urlc                    s@   t t" t j|i |W  d    S 1 s20    Y  d S r>   )ry  suppressr  r$   clear)r&   r  r  r)   r+   r,   r  h  s    zYoutubeDLCookieJar.clear)N)NTT)NTT)r1   r2   r3   r   r  r  r  collections
namedtupler  r   r  r  ry  contextmanagerr   r  r  rQ   r  r  r  r=   r+   r+   r)   r,   rM     s&   
	

3rM   )r  F)F)NNN)nr  r  ry  r4  r3  r  r   r  http.cookiejarr   http.cookiesr  r   rN   rj   rt  r   rk  r   r   r-   urllib.requestr  enumr   r   Zaesr   r   r   Zdependenciesr   r	   r
   Z
minicursesr   r   utilsr   r   r   r   r   r   r   r   r   r   Zutils._utilsr   Zutils.networkingr   r[   r  r"   rD   rE   rX   rL   rY   r   r   r   r\   r   r   r   r   r   r   rZ   rS   r  r  r9  rA  rC  rB  r  rG  rU  __members__r  r  rd  rf  rp  rx  r~  r   r  r
  r   r  r  r  r   r   r   r   r   rR   r   rJ   r   SimpleCookier  r   MozillaCookieJarrM   r+   r+   r+   r,   <module>   s   0
E<N"8"(3*
F)+

#


[