
    i                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  SSKJrJrJr  1 Skr1 SkrSS	1r\\-  \-  r\R,                  " S
5      rS r  SES jrSFS jr  SES jrSFS jrS rS rS rS r SGS jr!SGS jr"S r#S r$ SHS jr% " S S5      r& " S S\&5      r' " S S\&5      r( " S S \&5      r)S! r*S" r+S# r,S$ r-S% r.S& r/S' r0 " S( S)\15      r2 " S* S+5      r3 " S, S-5      r4S. r5 S/r6S0r7S1r8S2r9S3r:S4r;S5r< S6r=S7r>S8r?1 S9kr@S: rAS; rBS< rC  SIS= jrDSJS> jrES? rFS@ rGSA rH SKSB jrI\J" 5       rK\R                  rM\R                  rOSC rPSD rQg)L    Npbkdf2_hmac)Cookie   )aestextutil>   edgebraveoperachromethoriumvivaldichromium>   zenfloorpfirefox	librewolfsafariorioncookiesc                     [        U 6 u  pp4nU[        ;   a  [        XXE5      $ U[        ;   a  [	        XU5      $ U[
        ;   a  [        XX55      $ [        SU S35      e)Nzunknown browser '')_parse_browser_specificationSUPPORTED_BROWSERS_FIREFOXload_cookies_firefoxSUPPORTED_BROWSERS_WEBKITload_cookies_webkitSUPPORTED_BROWSERS_CHROMIUMload_cookies_chromium
ValueError)browser_specificationbrowser_nameprofilekeyring	containerdomains         ?/app/mltbenv/lib/python3.13/site-packages/gallery_dl/cookies.pyload_cookiesr)   '   sm    $&;< 6L7v11#L9MM	2	2"<&AA	4	4$\GLL,\N!<==    c                    [        XU5      u  pESn/ n/ nUSL a  UR                  S5        O&U(       a  SU 3n	UR                  S5        XU	S-   4-  nU(       aA  US   S:X  a  UR                  S	5        XS
S  SU-   4-  nOUR                  S5        XSU-   4-  nU(       a  U SSR                  U5       S3n[        U5       n
U
R	                  Xh5       VVVVVVs/ s H>  u  pp4p[        SXS SX3(       a  SOSU(       a  US   S:H  OSXD(       a  SOSXSS S 0 5      PM@     nnnnnnnS S S 5        [        S[        W5      U R                  5       5        U$ s  snnnnnnf ! , (       d  f       N>= f)NzASELECT name, value, host, path, isSecure, expiry FROM moz_cookiesFz,NOT INSTR(originAttributes,'userContextId=')z%userContextId=z2originAttributes LIKE ? OR originAttributes LIKE ?z&%r   .zhost == ? OR host LIKE ?r   %zhost == ? OR host == ?z	 WHERE ( z	 ) AND ( z )TExtracted %s cookies from %s)	_firefox_cookies_databaseappendjoinDatabaseConnectionexecuter   	_log_infolen
capitalize)r#   r$   r&   r'   pathcontainer_idsql
conditions
parametersuiddbnamevaluesecureexpiresr   s                   r(   r   r   4   s   2y*DCJJuHI	~.NOC$J''
!989!":sV|44J673<00JY{//
;<B?	D	!R ?Ajj?!

 

?!:V6 4eE$*q	S ddvtT2?! 	 

 
" ,'lL3357N

 
"	!s   E AE!E 
E  
E.c                    U S:X  a$  [        5        nUR                  5       nSSS5        O9U S:X  a$  [        5        nUR                  5       nSSS5        O[        SU  S35      e[	        W5      u  pV[        XFS 5      n/ nU H  n	[        UR                  U	5      U5        M      [        S[        U5      U R                  5       5        U$ ! , (       d  f       Nt= f! , (       d  f       N= f)a  Ref.: 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
r   Nr   zunknown webkit browser 'r   r.   )_safari_cookies_databaseread_orion_cookies_databaser!   _webkit_parse_cookies_header
DataParser_webkit_parse_cookies_page
read_bytesr4   r5   r6   )
r#   r$   r'   fpdata
page_sizes
body_startpr   	page_sizes
             r(   r   r   b   s     x%'2779D ('		 $&"779D '& 3L>CDD9$?J4$%AG	"1<<	#:GD  ,'lL3357 N# (' '&s   C
C

C
C)c                    [        U 5      n[        X5      n[        SU5        U(       a   US   S:X  a  SnUSS  SU-   4nOSnUSU-   4nOSnS	n[        U5       n[        Ul        UR                  5       n	 [        U	R                  S
5      R                  5       S   5      n
 U	R                  SU-   U5      nSnSn[!        US   US   X*5      n/ nU H  u  nnnnnnnU(       d#  U(       a  UR#                  U5      nUc  US-  nM4  OUR%                  5       nUS-  nU(       a  [        U5      S-  S-
  nOS nUR%                  5       nUR%                  5       nUR%                  5       nUR'                  [)        SUUS SX3(       a  SOSU(       a  US   S:H  OSXU(       a  SOSUUSS S 0 5      5        M     S S S 5        WS:  a  SU S3nOSn[+        S[-        W5      U R/                  5       U5        WR0                  nWUS'   [        SU5        U$ ! [         a.  n[        SUR                  R                  U5        Sn
 S nAGNS nAff = f! [        R                   a    U	R                  SU-   U5      n GNf = f! , (       d  f       N= f)NExtracting cookies from %sr   r,   z' WHERE host_key == ? OR host_key LIKE ?r   r-   z% WHERE host_key == ? OR host_key == ?  z,SELECT value FROM meta WHERE key = 'version'z3Failed to get cookie database meta version (%s: %s)zXSELECT host_key, name, value, encrypted_value, path, expires_utc, is_secure FROM cookieszUSELECT host_key, name, value, encrypted_value, path, expires_utc, secure FROM cookies	directoryr%   i@B l    !l
 FT (z could not be decrypted)zExtracted %s cookies from %s%sunencryptedzversion breakdown: %s)_chromium_browser_settings_chromium_cookies_database
_log_debugr2   bytestext_factorycursorintr3   fetchone	Exception_log_warning	__class____name__sqlite3OperationalError_chromium_cookie_decryptordecryptdecoder0   r   r4   r5   r6   cookie_counts)r#   r$   r%   r'   configr7   	conditionr;   r=   r\   meta_versionexcrowsfailed_cookiesunencrypted_cookies	decryptorr   r>   r?   	enc_valuerA   r@   failed_messagecountss                           r(   r    r       s   '5F%g6D+T2!9AI *cFl3J?I #,/J	
	D	!R	v~~> @@H
1 N OL	L>>68ABCMOD .;	!2GK	 EIAFD%D'6Y!)))4="a'N ! #q(#g,'1K?]]_F;;=D;;=DNN64eE$*q	S ddvwtT2 + FJ7 
"p n--EF.'lL335~G$$F/F=&/Nw  	N//6L	 '' 	L>>35>?@JLD	L! 
"	!sU   I96+H"I	7C<I9
I#I;I9II9	)I62I95I66I99
Jc                 4   U(       d  [        U 5      nO[        U5      (       a  UnOo[        U 5      n[        U[        5      (       a   [        R
                  R                  X15      nO/U Vs/ s H"  n[        R
                  R                  XA5      PM$     nn[        US5      nUc  [        SU R                  5        S35      e[        SU5        U(       a  US:X  a  Sn[        S5        XV4$ US:X  a  S nXV4$ [        R
                  R                  [        R
                  R                  U5      S	5      n [        US
S9 n[        R                  " UR                  5       5      S   n	S S S 5        W	 HJ  n
X*R'                  S5      :X  d.  U[(        R*                  " U
R'                  SS5      SS5      :X  d  ME  U
S   n  O   [-        SU S35      e[        SX&5        XV4$ s  snf ! , (       d  f       N= f! [          a    [#        SU5        e [$         a    Sn	 Nf = f)Nzcookies.sqliteUnable to find z cookies databaserQ   noneFz3Only loading cookies not belonging to any containerallzcontainers.jsonutf-8encoding
identitiesz1Unable to read Firefox container database at '%s'rS   r>   l10nIDrR   userContextz.labeluserContextIdz"Unable to find Firefox container 'r   z0Only loading cookies from container '%s' (ID %s))_firefox_browser_directory_is_path
isinstancestrosr7   r1   _find_most_recently_used_fileFileNotFoundErrorr6   rY   dirnameopenr	   
json_loadsrD   OSError
_log_errorKeyErrorgetr   extrr!   )r#   r$   r&   search_rootdirr7   r8   containers_pathrJ   r{   contexts              r(   r/   r/      s   0>	'		0>k3'''',,{<KALM#277<<5KM(6FGD|/,2I2I2K1L M3 !4 5 	5 +T2	V+HI: 7 
e	4 / '',,GGOOD!#46	o8B!__RWWY7E
 9 "GKK//9		KK"-}hAH 4H&7	 " A)ANOOE	, Q N* 98 	J&( 	J	s6   +)G4
G2 >(G!&G2 !
G/+G2 /G2 2"HHc                    [         R                  R                  n[        R                  S;   aE  [         R                  R                  S5      nU" US5      U" US5      U" US5      U" US5      S.U    $ [        R                  S:X  aE  [         R                  R                  S	5      nU" US
5      U" US5      U" US5      U" US5      S.U    $ [         R                  R                  S5      nU S:X  a_  [         R                  R                  S5      =(       d    [         R                  R                  S5      nU" US5      US-   US-   US-   US-   4$ U SU  3$ )Nwin32cygwin	%APPDATA%zMozilla\Firefox\Profileszlibrewolf\Profileszzen\ProfileszFloorp\Profiles)r   r   r   r   darwin~/Library/Application SupportzFirefox/Profileszlibrewolf/Profileszzen/ProfileszFloorp/Profiles~r   XDG_CONFIG_HOME	~/.configzmozilla/firefoxz/.mozilla/firefoxz4/.var/app/org.mozilla.firefox/config/mozilla/firefoxz./.var/app/org.mozilla.firefox/.mozilla/firefoxz%/snap/firefox/common/.mozilla/firefoxz/.	r   r7   r1   sysplatform
expandvars
expanduserenvironr   )r#   r1   appdatahomeri   s        r(   r   r     sj   77<<D
||**''$$[1g'BCg'<=g7g'9:	

  	 
	!''$$%DEg':;g'<=g7g'9:	

  	 ww!!#&9$jjnn%67 6gg((5  V./**MMGG>>
 
 r,((r*   c                       [         R                  R                  S5      n [        U S5      $ ! [         a9    [        S5        [         R                  R                  S5      n [        U S5      s $ f = f)Nz'~/Library/Cookies/Cookies.binarycookiesrbz Trying secondary cookie locationzP~/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies)r   r7   r   r   r   rY   r7   s    r(   rC   rC   7  si     ww!!"KLD$  56ww!! #K LD$	 s   *- A A0/A0c                  X    [         R                  R                  S5      n [        U S5      $ )Nz7~/Library/HTTPStorages/com.kagi.kagimacOS.binarycookiesr   )r   r7   r   r   r   s    r(   rE   rE   B  s'    77ACDdr*   c                     [        U 5      nUR                  SS5        UR                  SS9n[        U5       Vs/ s H  nUR                  SS9PM     nnXAR                  4$ s  snf )Ns   cookzdatabase signatureT)
big_endian)rG   expect_bytes	read_uintranger\   )rK   rN   number_of_pages_rL   s        r(   rF   rF   H  sm    4ANN701kkTk2O 131a +++.1  3xx3s   A"c                    [        U 5      nUR                  SS5        UR                  5       n[        U5       Vs/ s H  oSR                  5       PM     nnUS:X  a  [	        S[        U 5      5        g UR                  US   S5        [        U5       H6  u  pxUR                  US5        [        XS  X5      n	UR                  U	5        M8     UR                  S5        g s  snf )Ns      zpage signaturer   z&Cookies page of size %s has no cookieszunknown page header fieldzspace between recordszspace in between pages)rG   r   r   r   rY   r5   skip_to	enumerate_webkit_parse_cookies_recordrI   skip_to_end)
rK   r   r'   rN   number_of_cookiesr   record_offsetsirecord_offsetrecord_lengths
             r(   rH   rH   Q  s    4ANN&(89-23D-EF-Ekkm-ENFA;SYGIInQ!<=%n5			-!894 '3	]#	 6
 MM*+ Gs   Cc                 B   [        U 5      nUR                  5       nUR                  SS5        UR                  5       nUS-  (       a  SOSnUR                  SS5        UR                  5       nUR                  5       nUR                  5       n	UR                  5       n
UR                  SS5        [        UR	                  5       5      n[        UR	                  5       5      n UR                  U5        UR                  5       nU(       a;  US	   S
:X  a"  USS  U:w  a  UR                  U5      (       d  U$ OX-:w  a  S
U-   U:w  a  U$ UR                  U5        UR                  5       nUR                  U	5        UR                  5       nUR                  U
5        UR                  5       nUR                  US5        UR                  [        S	UUS SX(       a  SOSU(       a  US	   S
:H  OSX(       a  SOSXkSS S 0 5      5        U$ ! [         a    [        S5        Us $ f = f)N   zunknown record field 1r   TFzunknown record field 2   zunknown record field 3r   r,   zFailed to parse WebKit cookiezspace at the end of the record)rG   r   skip_mac_absolute_time_to_posixread_doubler   read_cstringendswithUnicodeDecodeErrorr`   r0   r   )rK   r   hostrN   record_sizeflags	is_securedomain_offsetname_offsetpath_offsetvalue_offsetexpiration_date_creation_dater'   r>   r7   r?   s                    r(   r   r   d  s   4A++-KFF1&'KKMEeIFF1&'KKMM++-K++-K;;=LFF1&'1!--/BO0AN			- !Aw#~8v%food.C.C&&>sTzf&<&&			+~~			+~~			, 
 IIk;<NN6	4eE"q	SddytT2    45s    #AH 5H A#H HHc                 f   U c  US   nO[        U 5      (       a1  U nUS   (       a  [        R                  R                  U 5      OU US'   OBUS   (       a$  [        R                  R	                  US   U 5      nO[        SUS   5        US   n[        US5      nUc  [        SUS    SU S35      eU$ )	NrT   profilesz%s does not support profilesbrowserCookiesru   z cookies database in 'r   )r   r   r7   r   r1   r`   r   r   )r$   ri   r   r7   s       r(   rX   rX     s    [)	'		"("4  "www7:A 	{	
	ggll6+#6@3VI5FG[)(i@D|/&2C1D E00;}A!? @ 	@Kr*   c           
         [         R                  R                  n[        R                  S;   a}  [         R                  R                  S5      n[         R                  R                  S5      nU" US5      U" US5      U" US5      U" US5      U" US5      U" US	5      U" US
5      S.U    nO[        R                  S:X  a^  [         R                  R                  S5      nU" US5      U" US5      U" US5      U" US5      U" US5      U" US5      U" US5      S.U    nO[         R                  R                  S5      =(       d    [         R                  R                  S5      nU" US5      U" US5      U" US5      U" US5      U" US5      U" US5      U" US5      S.U    nSSS[        R                  S:X  a  SOS[        R                  S:X  a  SOSS[        R                  S:X  a  SOSS.U    nS1nU UUX;  S.$ ) Nr   z%LOCALAPPDATA%r   z%BraveSoftware\Brave-Browser\User DatazGoogle\Chrome\User DatazChromium\User DatazMicrosoft\Edge\User DatazOpera Software\Opera StablezThorium\User DatazVivaldi\User Data)r   r   r   r
   r   r   r   r   r   zBraveSoftware/Brave-BrowserzGoogle/ChromeChromiumzMicrosoft Edgezcom.operasoftware.OperaThoriumVivaldir   r   zgoogle-chromer   zmicrosoft-edger   r   BraveChromeOpera)r   rT   r%   r   r   )	r#   r1   appdata_localappdata_roamingbrowser_dirr   ri   keyring_namebrowsers_without_profiless	            r(   rW   rW     s%    77<<D
||****+;<'',,[9]EG],FG],AB],GH_.LM],@A],@A	
 	 
	!''$$%DEW&CDWo6Wj1W&67W&?@Wi0Wi0
  **..!23 2''$$[1 	 V%BCV_5VZ0V%56VW-VY/VY/
  (+(@$"||x7GZ!$!9Ix	 	L ")	 " !!B	 r*   c                     [         R                  S;   a  [        X5      $ [         R                  S:X  a  [        X5      $ [	        XU5      $ )Nr   r   )r   r   WindowsChromiumCookieDecryptorMacChromiumCookieDecryptorLinuxChromiumCookieDecryptor)browser_rootbrowser_keyring_namer%   rk   s       r(   re   re     sO    
||**-( 	(		!) 0 	0 , <9 	9r*   c                   .    \ rS rSrSrS r\S 5       rSrg)ChromiumCookieDecryptori   a  
Overview:

    Linux:
    - cookies are either v10 or v11
        - v10: AES-CBC encrypted with a fixed key
        - v11: AES-CBC encrypted with an OS protected key (keyring)
        - 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/key_storage_linux.cc
    - KeyStorageLinux::CreateService
c                     [        S5      eNz"Must be implemented by sub classesNotImplementedError)selfencrypted_values     r(   rf   ChromiumCookieDecryptor.decrypt  s    !"FGGr*   c                     [        S5      er   r   r   s    r(   rh   %ChromiumCookieDecryptor.cookie_counts!  s    !"FGGr*   rS   N)	rb   
__module____qualname____firstlineno____doc__rf   propertyrh   __static_attributes__rS   r*   r(   r   r      s#    :H H Hr*   r   c                   :    \ rS rSrSS jrS r\S 5       rS rSr	g)	r   i&  Nc                     [        X5      nU R                  S5      U l        U R                  S5      U l        Uc  S OU R                  U5      U l        SSSS.U l        US:  a  SU l        g SU l        g )Nr*   s   peanutsr   )v10v11other       )_get_linux_keyring_password
derive_key
_empty_key_v10_key_v11_key_cookie_counts_offset)r   r   r%   rk   passwords        r(   __init__%LinuxChromiumCookieDecryptor.__init__'  sg    ./CM//#.
3 ( 0dooh6O&'A>*b0ar*   c                     [        USSSS9$ )N	   saltysaltr      salt
iterations
key_lengthpbkdf2_sha1r   r  s     r(   r   'LinuxChromiumCookieDecryptor.derive_key/  s     8,&'B8 	8r*   c                     U R                   $ Nr   r   s    r(   rh   *LinuxChromiumCookieDecryptor.cookie_counts6      """r*   c                    US S nUSS  nUS:X  a8  U R                   S==   S-  ss'   [        X0R                  U R                  5      nOoUS:X  aQ  U R                   S==   S-  ss'   U R                  c  [        S5        g [        X0R                  U R                  5      nOU R                   S==   S-  ss'   g Uc.  [        X0R                  U R                  5      nUc  [        S	5        U$ )
N      v10r   r   s   v11r   z+Unable to decrypt v11 cookies: no key foundr   z"Failed to decrypt cookie (AES-CBC))r   _decrypt_aes_cbcr   r  r   r`   r   )r   r   version
ciphertextr?   s        r(   rf   $LinuxChromiumCookieDecryptor.decrypt:  s    !"1%$QR(
f&!+&$ZME&!+&}}$JK$ZME (A-(=$Z$,,OE}ABr*   )r   r   r  r   r   Nr   
rb   r   r   r   r  r   r   rh   rf   r   rS   r*   r(   r   r   &  s%    98 # #r*   r   c                   :    \ rS rSrSS jrS r\S 5       rS rSr	g)	r   iT  c                     [        U5      nUc  S OU R                  U5      U l        SSS.U l        US:  a  SU l        g SU l        g Nr   )r   r   r   r   )_get_mac_keyring_passwordr   r   r   r  )r   r   rk   r  s       r(   r  #MacChromiumCookieDecryptor.__init__U  sE    ,-AB ( 0dooh6O&'!4*b0ar*   c                     [        USSSS9$ )Nr  i  r  r  r  r  s     r(   r   %MacChromiumCookieDecryptor.derive_key[  s     8,&*r; 	;r*   c                     U R                   $ r  r  r   s    r(   rh   (MacChromiumCookieDecryptor.cookie_countsb  r  r*   c                     US S nUSS  nUS:X  aP  U R                   S==   S-  ss'   U R                  c  [        S5        g [        X0R                  U R                  5      $ U R                   S==   S-  ss'   U$ )Nr  r  r   r   +Unable to decrypt v10 cookies: no key foundr   )r   r   r`   r  r  )r   r   r  r  s       r(   rf   "MacChromiumCookieDecryptor.decryptf  s    !"1%$QR(
f&!+&}}$JK#Jt||LL (A-(
 #"r*   r   r  r   Nr   r  rS   r*   r(   r   r   T  s%    9; # ##r*   r   c                   4    \ rS rSrSS jr\S 5       rS rSrg)r   iz  c                 b    [        U5      U l        SSS.U l        US:  a  SU l        g SU l        g r   )_get_windows_v10_keyr   r   r  )r   r   rk   s      r(   r  'WindowsChromiumCookieDecryptor.__init__{  s/    ,\:&'!4*b0ar*   c                     U R                   $ r  r  r   s    r(   rh   ,WindowsChromiumCookieDecryptor.cookie_counts  r  r*   c                 N   US S nUSS  nUS:X  af  U R                   S==   S-  ss'   U R                  c  [        S5        g SnSnUnUS U nUXE*  nXe* S  n[        X0R                  XxU R                  5      $ U R                   S==   S-  ss'   [        U5      R                  5       $ )	Nr  r  r   r   r(     r  r   )r   r   r`   _decrypt_aes_gcmr  _decrypt_windows_dpapirg   )	r   r   r  r  nonce_lengthauthentication_tag_lengthraw_ciphertextnonceauthentication_tags	            r(   rf   &WindowsChromiumCookieDecryptor.decrypt  s    !"1%$QR(
f&!+&}}$JK
 #L )+%'N"=L1E'79J!/0J0K!L#MM5 
 (A-( */:AACCr*   r*  Nr+  )	rb   r   r   r   r  r   rh   rf   r   rS   r*   r(   r   r   z  s!    9
 # #!Dr*   r   c                      [        [        R                  5      n [        SU 5        U [        :X  a  [
        $ U [        :X  a  [        $ [        $ )z
https://chromium.googlesource.com/chromium/src/+/refs/heads
/main/components/os_crypt/key_storage_util_linux.cc
SelectBackend
z Detected desktop environment: %s)	_get_linux_desktop_environmentr   r   rY   DE_KDEKEYRING_KWALLETDE_OTHERKEYRING_BASICTEXTKEYRING_GNOMEKEYRING)desktop_environments    r(   _choose_linux_keyringrD    sA     9D13FGf$h&  r*   c                  2   Sn  [        SSSSSS5      u  pUR                  S:w  a  [        S	5        U $ UR                  5       R	                  5       n[        S
U5        U$ ! [         a-  n[        SUR                  R                  U5        U s SnA$ SnAff = f)aJ  The name of the wallet used to store network passwords.

https://chromium.googlesource.com/chromium/src/+/refs/heads
/main/components/os_crypt/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
	kdewalletz	dbus-sendz	--sessionz--print-reply=literalz--dest=org.kde.kwalletd5z/modules/kwalletd5zorg.kde.KWallet.networkWalletr   zFailed to read NetworkWalletzNetworkWallet = '%s'z,Error while obtaining NetworkWallet (%s: %s)N)	Popen_communicate
returncoder`   rg   striprY   r_   ra   rb   )default_walletprocstdoutnetwork_walletrl   s        r(   _get_kwallet_network_walletrN    s     !N(&=& +	
 ??a78!!#]]_224N-~>!! C]]++S	2s"   .A +A 
B)"BBBc                    [        S5        [        R                  " S5      c  [        S5        g[	        5       n [        SSU S-   SU S-   U5      u  p#UR                  S	:w  a  [        S
UR                   S35        gUR                  5       R                  S5      (       a  [        S5        gUSS  S:X  a  US S nU$ ! [         a+  n[        SUR                  R                  U5         S nAgS nAff = f)Nz3Using kwallet-query to obtain password from kwalletzkwallet-queryzkwallet-query command not found. KWallet and kwallet-query must be installed to read from KWallet. kwallet-query should be included in the kwallet package for your distributionr*   z--read-password Safe Storagez--folderz Keysr   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 instead   
z)Error when running kwallet-query (%s: %s))rY   shutilwhichr   rN  rG  rH  lower
startswithr_   r`   ra   rb   )r   rM  rK  rL  rl   s        r(   _get_kwallet_passwordrW    s
   DE||O$,D	E 02N!(3oE,w6	
 ??a?//* +./ 0 <<>$$%677 4 5 bc{e#M @]]++S	2s$   AB< </B< ,B< <
C1!C,,C1c                     SS K nUR                  5       n UR	                  U5      nU S-   nUR                  5        H9  nUR                  5       U:X  d  M  UR                  5       s  UR                  5         $    [        S5         UR                  5         g! [         a    [        S5         gf = f! UR                  5         f = f)Nr   z,'secretstorage' Python package not availabler*   rP  z!Failed to read from GNOME keyring)	secretstorageImportErrorr   	dbus_initget_default_collectionget_all_items	get_label
get_secretclose)r   rY  concollabelitems         r(   _get_gnome_keyring_passwordre  
  s     
!
!
#C
2237$6%%'D~~5(((
 			 ( :;		)  AB( 			s(   B ;B2 B2 8B2 B/.B/2Cc                     U(       d
  [        5       n[        SU5        U[        :X  a  [        U 5      $ U[        :X  a  [        U 5      $ U[        :X  a  g  SU-   5       e)NzChosen keyring: %szUnknown keyring )rD  rY   r?  rW  rB  re  rA  )r   r%   s     r(   r   r   $  sa     ')#W-/!$%9::	(	(*+?@@	%	% .$w..5r*   c           
          [        S5         [        SSSSU SU S-   5      u  pUSS  S	:X  a  US S nU$ ! [         a+  n[        S
UR                  R
                  U5         S nAg S nAff = f)Nz@Using find-generic-password to obtain password from OSX keychainsecurityzfind-generic-passwordz-wz-az-srP  rQ  rR  z/Error when using find-generic-password (%s: %s))rY   rG  r_   r`   ra   rb   )r   rK  rL  rl   s       r(   r!  r!  ;  s     , -(/&&8	
 "#;%CR[F F]]++S	2s   %3 
A(!A##A(c                    [        U S5      nUc  [        S5        g [        SU5        [        USS9 n[        R
                  " UR                  5       5      nS S S 5         WS   S   n[        R                  " U5      nS	nUR                  U5      (       d  [        S
5        g [        U[        U5      S  5      $ ! , (       d  f       Nh= f! [         a    [        S5         g f = f)NzLocal StatezUnable to find Local State filezFound Local State file at '%s'rx   ry   os_cryptencrypted_keyz+Unable to find encrypted key in Local States   DPAPIzInvalid Local State key)r   r   rY   r   r	   r   rD   r   binascii
a2b_base64rV  r5  r5   )r   r7   rJ   rK   
base64_keyrk  prefixs          r(   r.  r.  O  s    (}ED|45/6	dW	%rwwy) 
&*%o6
 ''
3MF##F++,-!-F"=>> 
&	%  @As   %B9 C
 9
C
C"!C"c                       \ rS rSrSrg)ParserErrorig  rS   N)rb   r   r   r   r   rS   r*   r(   rq  rq  g  s    r*   rq  c                   ^    \ rS rSrS rS rS rSS jrSS jrS r	SS jr
SS	 jrSS
 jrSrg)rG   ik  c                     SU l         Xl        g r  )r\   _data)r   rK   s     r(   r  DataParser.__init__l  s    
r*   c                     US:  a  [        SU S35      eU R                  U-   nU[        U R                  5      :  a  [        S5      eU R                  U R                  U nX l        U$ )Nr   zinvalid read of  byteszreached end of input)rq  r\   r5   rt  )r   	num_bytesendrK   s       r(   rI   DataParser.read_bytesp  sf    q= 06BCCkkI%TZZ 455zz$++c*r*   c           	      l    U R                  [        U5      5      nX1:w  a  [        SU SU SU S35      eg )Nzunexpected value: z != rU   ))rI   r5   rq  )r   expected_valuemessager?   s       r(   r   DataParser.expect_bytesz  sM    N 34" 25'n=M N"")!- . . #r*   c                 h    U(       a  SOSn[         R                  " X R                  S5      5      S   $ )Nz>Iz<Ir   r   structunpackrI   r   r   data_formats      r(   r   DataParser.read_uint  (    (dd}}[//!*<=a@@r*   c                 h    U(       a  SOSn[         R                  " X R                  S5      5      S   $ )Nz>dz<dr   r   r  r  s      r(   r   DataParser.read_double  r  r*   c                     / n U R                  S5      nUS:X  a  SR                  U5      R                  5       $ UR                  U5        MI  )Nr       r*   )rI   r1   rg   r0   )r   buffercs      r(   r   DataParser.read_cstring  sH    "AG|xx'..00a  r*   c           
          US:  a%  [        SU SU SU R                  U5      < 35        g US:  a  [        SU S35      eg )Nr   z	Skipping z bytes (z): zInvalid skip of rw  )rY   rI   rq  )r   rx  descriptions      r(   r   DataParser.skip  sT    q=9+Xk]#//)479 :] 06BCC r*   c                 @    U R                  XR                  -
  U5        g r  )r   r\   )r   offsetr  s      r(   r   DataParser.skip_to  s    		&;;&4r*   c                 N    U R                  [        U R                  5      U5        g r  )r   r5   rt  )r   r  s     r(   r   DataParser.skip_to_end  s    S_k2r*   )rt  r\   N)F)unknown)rb   r   r   r   r  rI   r   r   r   r   r   r   r   r   rS   r*   r(   rG   rG   k  s2    .AA!D53r*   rG   c                   &    \ rS rSrS rS rS rSrg)r2   i  c                 ,    Xl         S U l        S U l        g r  )r7   databaserT   )r   r7   s     r(   r  DatabaseConnection.__init__  s    	r*   c                 6    U R                   R                  SS5      R                  SS5      n[        R                  (       a"  S[        R                   R                  U5      -   nSU S3n[        R                  " USS S	S
9U l        U R                  $ ! [         a+  n[        SUR                  R                  U5         S nAOS nAff = f [        R                  " SS9U l        [        R                   R!                  U R                  R"                  S5      n[$        R&                  " U R                   U5        [        R                  " US S	S9U l        U R                  $ ! [(         a-    U R                  (       a  U R                  R+                  5         e f = f)N?z%3f#z%23/zfile:z?mode=ro&immutable=1TF)uriisolation_levelcheck_same_threadz0Falling back to temporary database copy (%s: %s)zgallery-dl-)ro  zcopy.sqlite)r  r  )r7   replacer	   WINDOWSr   abspathrc   connectr  r_   rY   ra   rb   tempfileTemporaryDirectoryrT   r1   r>   rS  copyfileBaseExceptioncleanup)r   r7   r  rl   	path_copys        r(   	__enter__DatabaseConnection.__enter__  s<   	499$$S%088eDD||RWW__T22$34C#OOtuNDM==  	4I}}--s4 4	4
	%88NDNT^^%8%8-HIOODIIy1#OO45JDM==  	~~&&(	s%   BB 
C!CCBE! !7Fc                     U R                   R                  5         U R                  (       a  U R                  R                  5         g g r  )r  r`  rT   r  )r   exc_type	exc_value	tracebacks       r(   __exit__DatabaseConnection.__exit__  s.    >>NN""$ r*   )r  rT   r7   N)rb   r   r   r   r  r  r  r   rS   r*   r(   r2   r2     s    
6%r*   r2   c                      [         R                  " U [        R                  [        R                  S9n UR                  5       u  p#X4$ ! [         a"    UR                  5         UR                  5         e f = f)N)rL  stderr)	r	   Popen
subprocessPIPEDEVNULLcommunicater  killwait)argsrK  rL  r  s       r(   rG  rG    sg    ::Z__Z-?-?AD))+
 <	  				s   A	 	,A5r   cinnamongnomekdepantheonunityxfcekwalletgnomekeyring	basictext>   r  r  r  c                    U R                  S5      nU R                  S5      nU(       a  UR                  S5      S   R                  5       R                  5       nUS:X  a  U(       a  SU;   a  [        $ [
        $ US:X  a  [        $ US:X  a  [        $ US	:X  a  [        $ US
:X  a  [        $ US:X  a  [        $ U(       a$  US;   a  [        $ S	U;   a  [        $ SU;   a  [        $ SU ;   a  [        $ SU ;   a  [        $ [        $ )zz
Ref: https://chromium.googlesource.com/chromium/src/+/refs/heads
     /main/base/nix/xdg_util.cc - GetDesktopEnvironment
XDG_CURRENT_DESKTOPDESKTOP_SESSION:r   r  zgnome-fallbackr  z
x-cinnamonr  r  r  )mater  GNOME_DESKTOP_SESSION_IDKDE_FULL_SESSION)r   	partitionrI  rU  DE_GNOMEDE_UNITYDE_CINNAMONr>  DE_PANTHEONDE_XFCEr@  )envxdg_current_desktopdesktop_sessions      r(   r=  r=    s    
 ''"78gg/0O2<<SA!D % 	 ')#3#F G+O L0 E)M J. F*N//OO#M_$N!S(S Or*   c                     S[        U 5      -   $ )NiO:)r]   )	timestamps    r(   r   r     s    s9~%%r*   c                     [        SXX#5      $ )Nsha1r   )r  r	  r
  r  s       r(   r  r    s    vxzFFr*   c                     [         R                  " [         R                  " XU5      5      nU(       a  XBS  n UR                  5       $ ! [         a     g f = fr  )r   unpad_pkcs7aes_cbc_decrypt_bytesrg   r   )r  keyr  initialization_vector	plaintexts        r(   r  r    sV     9 9.!0 1Ig&	!! s   A 
AAc                      [         R                  " XX25      nU(       a  XTS  nUR                  5       $ ! [         a    [	        S5         g [
         a    [	        S5         g f = f)Nz*Failed to decrypt cookie (AES-GCM Unicode)z&Failed to decrypt cookie (AES-GCM MAC))r    aes_gcm_decrypt_and_verify_bytesrg   r   r`   r!   )r  r  r9  r:  r  r  s         r(   r4  r4  *  sm    	?88/8	!'*I!! CAB   ?=>?s   14 A"A"!A"c                 P  ^ SSK Jm   " U4S jS[        R                  5      n[        R                  " U 5      nU" [        R
                  " U5      U5      nU" 5       n[        R                  R                  R                  [        R                  " U5      SSSSS[        R                  " U5      5      nU(       d  [        S5        g[        R                  " UR                  UR                  5      n[        R                  R                  R                  UR                  5        U$ )zo
References:
    - https://docs.microsoft.com/en-us/windows
      /win32/api/dpapi/nf-dpapi-cryptunprotectdata
r   DWORDc                   \   > \ rS rSrS Y 4S\R
                  " \R                  5      4/rSrg))_decrypt_windows_dpapi.<locals>.DATA_BLOBi@  cbDatapbDatarS   N)	rb   r   r   r   ctypesPOINTERc_char_fields_r   r  s   r(   	DATA_BLOBr  @  s'    u%v~~fmm<=?r*   r  Nz Failed to decrypt cookie (DPAPI))ctypes.wintypesr  r  	Structurecreate_string_buffersizeofwindllcrypt32CryptUnprotectDatabyrefr`   	string_atr  r  kernel32	LocalFree)r  r  r  blob_inblob_outretresultr  s          @r(   r5  r5  8  s     &?F$$ ? ((4Ff-v6G{H
--


2
2W	XC 78hoox?F
MM$$X__5Mr*   c           	         [        U [        5      (       a  U 4n U  HJ  n[        R                  R	                  X!5      n[        R                  R                  U5      (       d  MH  Us  $    / nU  Ha  n[        R                  " U5       HD  u  pVnU H8  nX:X  d  M
  UR                  [        R                  R	                  XX5      5        M:     MF     Mc     U(       d  g [        US S9$ )Nc                 B    [         R                  " U 5      R                  $ r  )r   lstatst_mtimer   s    r(   <lambda>/_find_most_recently_used_file.<locals>.<lambda>m  s    rxx~'>'>r*   )r  )	r   r   r   r7   r1   existswalkr0   max)	rootsfilenamerootfirst_choicepaths	curr_rootdirsfilesfiles	            r(   r   r   Y  s    % ww||D377>>,''  E&(ggdm"IU#LLi!>?  '4 
 u>??r*   c                 <    [         R                  R                  U ;   $ r  )r   r7   sep)r?   s    r(   r   r   p  s    77;;%r*   c                 
   U R                  5       n U [        ;  a  [        SU  S35      eU(       a  U[        ;  a  [        SU S35      eU(       a/  [	        U5      (       a  [
        R                  R                  U5      nXX#U4$ )NzUnsupported browser 'r   zUnsupported keyring ')rU  SUPPORTED_BROWSERSr!   SUPPORTED_KEYRINGSr   r   r7   r   )r   r$   r%   r&   r'   s        r(   r   r   t  sy    mmoG((0	;<<7"440	;<<8G$$''$$W-W77r*   c                 r    U [         ;  a-  [         R                  U 5        [        R                  " U /UQ76   g g r  )
_log_cacheaddloggerwarningmsgr  s     r(   r`   r`     s,    
*ss"T" r*   c                 r    U [         ;  a-  [         R                  U 5        [        R                  " U /UQ76   g g r  )r  r  r  errorr  s     r(   r   r     s,    
*sS 4  r*   )NNN)NNr  r  )r   s                   r+  )NNNN)Rrl  r  loggingr   rS  rc   r  r  r   r  hashlibr   http.cookiejarr   rR   r   r   r	   r   r   r   r  	getLoggerr  r)   r   r   r    r/   r   rC   rE   rF   rH   r   rX   rW   re   r   r   r   r   rD  rN  rW  re  r   r!  r.  r_   rq  rG   r2   rG  r@  r  r  r>  r  r  r  r?  rB  rA  r  r=  r   r  r  r4  r5  r   r   r   setr  debugrY   infor4   r`   r   rS   r*   r(   <module>r&     s      	     
   !  J F %w/  !  
 
		9	%
> 0404+\: 15/3Sr2j#)T  ,&1n(AJ HI
9#H #HL+#: +\##!8 ##L+D%< +Db @-`4/.(?0	) 	13 13h%% %%P	 	
 %  = (V&
G ./+4	B@. 
 EI	8 U
\\
KK	#!r*   