
    aiD                        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ej        j        dk    rej        j        dk     rd dlZnd dlZddddZded	efd
Zded	efdZdZdej        j        fdZ G d dej                  Zdej        d	ej        fdZ dej        j        d	e!ej"        ef         fdZ#dej        j        ded	e!e$ef         fdZ%dej        j        d	e$fdZ& G d d          Z' G d de'ej        j(                  Z( G d de'ej        j)                  Z)d Z*dej        d	ej+        fdZ,d  Z-d! Z.dS )"    N      lightz
light darkdarkr   autor   themereturnc                 ^    t          dt                              |           z   dz   d          S )Nz<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
<meta name="viewport" content="width=device-width, user-scalable=no" />
<meta name="color-scheme" content="u  ">
</head>
<body>
<h1>File Upload</h1>
<form action="upload" method="POST" enctype="multipart/form-data">
<input name="files" type="file" multiple />
<br />
<br />
<input type="submit" />
</form>
<p id="task"></p>
<p id="status"></p>
</body>
<script>
document.getElementsByTagName('form')[0].addEventListener('submit', async e => {
  e.preventDefault()
  
  const uploadFormData = new FormData(e.target)
  const filenames = uploadFormData.getAll('files').map(v => v.name).join(', ')
  const uploadRequest = new XMLHttpRequest()
  uploadRequest.open(e.target.method, e.target.action)
  uploadRequest.timeout = 3600000
  
  uploadRequest.onreadystatechange = () => {
    if (uploadRequest.readyState === XMLHttpRequest.DONE) {
      let message = `${uploadRequest.status}: ${uploadRequest.statusText}`
      if (uploadRequest.status === 0) message = 'Connection failed'
      if (uploadRequest.status === 204) {
        message = `Success: ${uploadRequest.statusText}`
      }
      document.getElementById('status').textContent = message
    }
  }
  
  uploadRequest.upload.onprogress = e => {
    document.getElementById('status').textContent = (e.loaded === e.total ?
      'Saving…' :
      `${Math.floor(100*e.loaded/e.total)}% ` +
      `[${Math.floor(e.loaded/1024)} / ${Math.floor(e.total/1024)}KiB]`
    )
  }
  
  uploadRequest.send(uploadFormData)
  
  document.getElementById('task').textContent = `Uploading ${filenames}:`
  document.getElementById('status').textContent = '0%'
})
</script>
</html>utf-8bytesCOLOR_SCHEMEgetr	   s    M/local/notesjava/.local/lib/python3.11/site-packages/uploadserver/__init__.pyget_upload_pager      sD     '
 *6)9)9%)@)@A
0D5j k5 5 5    c                 ^    t          dt                              |           z   dz   d          S )Nz{<!-- Injected by uploadserver -->
<meta name="viewport" content="width=device-width" />
<meta name="color-scheme" content="z*">
<!-- End injection by uploadserver -->
r   r   r   s    r   get_directory_head_injectionr   M   s@     ')5)9)9%)@)@AD 	  r   s   <!-- Injected by uploadserver -->
<a href="/upload">File upload</a>
(provided by uploadserver, all files go to server root)
<hr>
<!-- End injection by uploadserver -->
handlerc                 x   |                      t          j        j                   |                     dd           |                     dt          t          t          j                                       | 	                                 | j
                            t          t          j                             d S )NzContent-Typeztext/html; charset=utf-8zContent-Length)send_responsehttp
HTTPStatusOKsend_headerlenr   argsr	   end_headerswfilewrite)r   s    r   send_upload_pager#   [   s    $/,---(BCCC(#odj.I.I*J*JKKKM
3344444r   c                       e Zd ZdefdZdS )PersistentFieldStorager
   c                     | j         r!t          j        dt          j        d          S t          j        dt          j        d| j        d          S )Nzwb+F)modedirdeletezw+
)r(   r)   encodingnewline)_binary_filetempfileNamedTemporaryFiler   	directoryr+   selfs    r   	make_filez PersistentFieldStorage.make_filef   s`     	J.enu6 6 6 6 .t4>4=DJ J J Jr   N)__name__
__module____qualname__objectr3    r   r   r%   r%   b   s6        J6 J J J J J Jr   r%   pathc                 B   t           j                            |           s| S t           j                            |           \  }}t	          dt
          j                  D ]/}| d| d| }t           j                            |          s|c S 0t          d|  d          )N   z ()zFile z already exists.)osr9   existssplitextrangesysmaxsizeFileExistsError)r9   baseextirenamed_paths        r   auto_renamerH   p   s    7>>$ '""4((KT31ck""    ++!++c++w~~l++ 	 	 
8$888
9
99r   c                 j   t           j        j        df}d}t          | j        | j        ddi          }d|vrt           j        j        dfS |d         }t          |t                    s|g}t          d |D                       st           j        j        d	fS |D ]}|j
        r&|j        rt          j        |j                  j        }nd }|rct          j        t          j                  |z  }t"          j                            |          rQt          j        r4t"          j                            |          rt#          j        |           nt/          |          }d
}t1          |j
        d          r;|j
        j        }|j
                                         t#          j        ||           nTt7          |d          5 }	|	                    |j
                                                   d d d            n# 1 swxY w Y   |                     d||           t           j        j        |rdndf}|S )NzServer errorFREQUEST_METHODPOST)fpheadersenvironfileszField "files" not foundc              3   2   K   | ]}|j         o|j        V  d S N)filefilename).0fields     r   	<genexpr>z!receive_upload.<locals>.<genexpr>   s+      AAuz,enAAAAAAr   zNo files selectedTnamewbz[Uploaded] "%s" --> %sz-Some filename(s) changed due to name conflictzFiles accepted) r   r   INTERNAL_SERVER_ERRORr%   rfilerM   BAD_REQUEST
isinstancelistallrR   rS   pathlibPathrW   r   r0   r=   r9   r>   allow_replaceisfileremoverH   hasattrcloserenameopenr"   readlog_message
NO_CONTENT)
r   resultname_conflictformfieldsrU   rS   destinationsourcefs
             r   receive_uploadrr   z   sq   o3^DFM!W]GO!6*, , ,Dd+-FGG']Ffd## AA&AAAAA B+-@AA O O: 	%. 	|EN338HHH 	O!,t~66AKw~~k** )% )"'..*E*E )Ik****"-k":":K$(Muz6** /
  """	&+.... +t,, /GGEJOO--.../ / / / / / / / / / / / / / / 8(KPPPo0*73N 3' 3'=MOF Ms   ?-G88G<	?G<	authc                    | j                             d          }|dS |                    d          }t          |          dk    rdS |d                                         dk    rdS 	 t          j        |d                                                   }n# t          j	        $ r Y dS w xY w|                    d	d          \  }}|                    d	d          \  }}||k    rd
S ||k    rdS dS )NAuthorization)FzNo credentials given    )Fz!Credentials incorrectly formattedr   basicr;   :)FzBad username)FzBad password)TN)
rM   r   splitr   lowerbase64	b64decodedecodebinasciiError)	r   rs   auth_headerauth_header_wordshttp_username_passwordhttp_usernamehttp_passwordargs_usernameargs_passwords	            r    check_http_authentication_headerr      s!    /%%o66K..#))#..
"";;!!##w..;;<!'!12CA2F!G!G!N!N!P!P> < < <;;;< $:#?#?Q#G#G M=#'::c1#5#5 M=%%.E.E%%.E.E<s   *,B B*)B*c                 *   t           j        s,t           j        sdS t          | t           j                  \  }}ns| j        dk    rt          | t           j                  \  }}nJt           j        sdS t          | t           j                  \  }}|st          | t           j                  \  }}|se|                     d|           |                     t          j        j	        |           | 
                    dd           |                                  |S )z
    This function should be called in at the beginning of HTTP method handler.
    It validates Authorization header and sends back 401 response on failure.
    It returns False if this happens.
    T/uploadzRequest rejected (%s)zWWW-AuthenticatezBasic realm="uploadserver")r   basic_auth_upload
basic_authr   r9   ri   r   r   r   UNAUTHORIZEDr   r    )r   validmessages      r   check_http_authenticationr      s    ! g 	4 :'4?SSww <9$$=g&( (NE77
 ? 	gt
 "B'4?![![w g%EgtOe%f%fNE7 3W===do:GDDD.0LMMMLr   c                   4    e Zd Zd Zd Zdej        defdZdS )ListDirectoryInterceptionc                    t          | j                  D ]\  }}|d d         dk    rut          |dd                    t          t                    z   t          t          t          j                            z   }d| d                    dd          | j        |<   t          j
        j                            |            d S )N   s   Content-Length:zContent-Length: z
zlatin-1strict)	enumerate_headers_bufferintr   DIRECTORY_BODY_INJECTIONr   r   r	   encoder   serverSimpleHTTPRequestHandlerflush_headers)r2   rF   headerlengths       r   flush_headers_interceptorz3ListDirectoryInterception.flush_headers_interceptor   s    "4#788 	1 	1IAvcrc{000VBCC[))C0H,I,II4TZ@@AAB +JV*I*I*IVIx00 $Q' 	,::4@@@@@r   c                     |                                 }|                    dt          t          j                  dz             }|                    dt
          dz             }|                    |           d S )Ns   </head>s   <ul>)rh   replacer   r   r	   r   r"   )r2   rp   
outputfilecontents       r   copyfile_interceptorz.ListDirectoryInterception.copyfile_interceptor   sk    ++--//*(44zAC C//'+Cg+MNN!!!!!r   r9   r
   c                     t          | d| j                   t          | d| j                   t          j        j                            | |          S )Nr   copyfile)setattrr   r   r   r   r   list_directory)r2   r9   s     r   r   z(ListDirectoryInterception.list_directory  sI    ot'EFFFj$";<<< {3BB4NNNr   N)	r4   r5   r6   r   r   r_   r`   r7   r   r8   r   r   r   r      sa        A A A" " "O7< OF O O O O O Or   r   c                   *     e Zd Z fdZd Zd Z xZS )r   c                     t          |           sd S | j        dk    rt          |            d S t                                                       d S Nr   r   r9   r#   superdo_GETr2   	__class__s    r   r   zSimpleHTTPRequestHandler.do_GET  P    (..69	!!T"""""GGNNr   c                    t          |           sd S | j        dk    rt          |           }|d         t          j        j        k     r8|                     |d         |d                    |                                  d S |                     |d         |d                    d S |                     t          j        j	        d           d S )Nr   r   r;   zCan only POST/PUT to /upload)
r   r9   rr   r   r   r[   r   r    
send_error	NOT_FOUND)r2   rk   s     r   do_POSTz SimpleHTTPRequestHandler.do_POST  s    (..69	!!#D))Fay4?666""6!9fQi888  """""q	6!955555OODO5.0 0 0 0 0r   c                 .    |                                   d S rQ   r   r1   s    r   do_PUTzSimpleHTTPRequestHandler.do_PUT&      r   r4   r5   r6   r   r   r   __classcell__r   s   @r   r   r     sV            0 0 0      r   r   c                   .     e Zd Z fdZ fdZd Z xZS )CGIHTTPRequestHandlerc                     t          |           sd S | j        dk    rt          |            d S t                                                       d S r   r   r   s    r   r   zCGIHTTPRequestHandler.do_GET+  r   r   c                    t          |           sd S | j        dk    rt          |           }|d         t          j        j        k     r8|                     |d         |d                    |                                  d S |                     |d         |d                    d S t                      
                                 d S )Nr   r   r;   )r   r9   rr   r   r   r[   r   r    r   r   r   )r2   rk   r   s     r   r   zCGIHTTPRequestHandler.do_POST3  s    (..69	!!#D))Fay4?666""6!9fQi888  """""q	6!955555GGOOr   c                 .    |                                   d S rQ   r   r1   s    r   r   zCGIHTTPRequestHandler.do_PUTA  r   r   r   r   s   @r   r   r   )  s`                      r   r   c                  ^    t           j        rt          j        fd} | t          _        d S d S )Nc                       | d                              dd                               dd          fi | t          _        d S )Nr   HTTPHTTPSr   https)r   builtinsprint)r   kwargs	old_prints     r   	new_printz(intercept_first_print.<locals>.new_printH  sS    Id1goofg66>>vwOO    &HNNNr   )r   server_certificater   r   )r   r   s    @r   intercept_first_printr   D  sE     #N		' 	' 	' 	' 	' ## #r   socketc                    t          j        t           j        j                  }t	          j        t          j                                                  }t	          j        t          j	                                                  }|
                                s't          d| d           t          j        d           ||j        v r*t          d| d| d           t          j        d           	 |                    |           nC# t           j        $ r1}t          d| d	           t          j        d           Y d }~nd }~ww xY wt          j        rt	          j        t          j                                                  }|
                                s't          d
| d           t          j        d           ||j        v r*t          d
| d| d           t          j        d           |                    |           t           j        |_        	 |                    | d          S # t           j        $ rA}t          d                    |                     t          j        d           Y d }~d S d }~ww xY w)NzServer certificate "z" not found, exiting   z" is inside web server root "z
", exitingr   )certfilezUnable to load certificate "z", exiting

NOTE: Certificate must be a single file in .pem format. If you have multiple certificate files, such as Let's Encrypt provides, you can cat them together to get one file.zClient certificate ")cafileT)server_sidezSSL error: "{}", exiting   )sslcreate_default_contextPurposeCLIENT_AUTHr_   r`   r   r0   resolver   is_filer   rA   exitparentsload_cert_chainSSLErrorclient_certificateload_verify_locationsCERT_REQUIREDverify_modewrap_socketformat)r   contextserver_rootr   er   s         r   ssl_wrapr   N  s   ()@AAG,t~..6688K !d&=>>FFHH%%'' M%7MMMNNN(000 -%7 - - - - - 	. 	. 	.);<<<<<    9-? 9 9 9 	: 	: 	: 	  0$\$*ABBJJLL!))++ 	 );      HQKKK,444 8); 8 8 +8 8 8 9 9 9HQKKK%%-?%@@@!/""6t"<<<<   (//22333s0   3D
 
E
'EE
H6 6J6JJc                  *   t          t          d          r t          t          j                  t          u sJ t          t          d          r t          t          j                  t          u sJ t          t          d          r t          t          j                  t          u sJ t          t          d          sJ t          t          d          sJ t          t          d          sJ t          t          d          sJ t          t          d          sJ t          t          d	          sJ t          t          d
          r t          t          j                  t          u sJ t          j        rt          } n%t          j        t          t          j                  } t          d            G d dt          j        j                  }|}t%                       t          j                            | |t          j        t          j                   d S )Nportcgira   bindr	   r   r   r   r   r0   )r0   z File upload available at /uploadc                        e Zd Z fdZ xZS )&serve_forever.<locals>.DualStackServerc                 T   t          j        t                    5  | j                            t          j        t          j        d           d d d            n# 1 swxY w Y   t                                                      }t          j
        rt          | j                  | _        |S )Nr   )
contextlibsuppress	Exceptionr   
setsockoptIPPROTO_IPV6IPV6_V6ONLYr   server_bindr   r   r   )r2   r   r   s     r   r   z2serve_forever.<locals>.DualStackServer.server_bind  s    $Y// @ @&&');Q@ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 77&&((D& 4&t{33Ks   1AAA)r4   r5   r6   r   r   r   s   @r   DualStackServerr     s8        	 	 	 	 	 	 	 	 	r   r   )HandlerClassServerClassr   r   )rd   r   typer   r   r   boolra   r0   strr   	functoolspartialr   r   r   r   ThreadingHTTPServerr   testr   )handler_classr   server_classs      r   serve_foreverr  ~  s   4  ;T$)__%;%;%;%;4:DNNd$:$:$:$:4))Nd43E.F.F$.N.N.N.N4     4!!!!!4-.....4-.....4&&&&&4,-----4%%E$t~*>*>#*E*E*E*Ex &-!)*Bn& & & 

,---	 	 	 	 	$+9 	 	 	 #LK" YY	      r   c                     t          j                    } |                     dt          ddd           |                     ddd	           |                     d
ddd           |                     dddd           |                     ddt	          j                    d           |                     dt          dg dd           |                     dddd            |                     d!d"            |                     d#d$            |                     d%d&            |                                 at          t          d'          st	          j                    t          _
        t                       d S )(Nr   i@  ?z&Specify alternate port [default: 8000])r   defaultnargshelpz--cgi
store_truezRun as CGI Server)actionr	  z--allow-replaceFzQReplace existing file if uploaded file has the same name. Auto rename by default.)r  r  r	  z--bindz-bADDRESSz8Specify alternate bind address [default: all interfaces])metavarr	  z--directoryz-dz9Specify alternative directory [default:current directory])r  r	  z--themer   r   zASpecify a light or dark theme for the upload page [default: auto])r   r  choicesr	  z--server-certificatez--certificatez-cz7Specify HTTPS server certificate to use [default: none])r	  z--client-certificatezISpecify HTTPS client certificate to accept for mutual TLS [default: none]z--basic-authzBSpecify user:pass for basic authentication (downloads and uploads)z--basic-auth-uploadz9Specify user:pass for basic authentication (uploads only)r0   )argparseArgumentParseradd_argumentr   r=   getcwdr   
parse_argsr   rd   r0   r  )parsers    r   mainr    s    $&&F
S$c5  7 7 7
   " " "
),     $	G  I I I
tRY[[H  J J J
	V)))     .F  H H H
.          -H  J J J D4%%C	t~OOOOOr   )/http.serverr   r_   rA   r  r   r=   r   r.   r|   r   r   r   r   version_infomajorminorr   uploadserver.cgiuploadserverr   r   r   r   r   r   r   BaseHTTPRequestHandlerr#   FieldStorager%   r`   rH   tupler   rr   r   r   r   r   r   r   r   	SSLSocketr   r  r  r8   r   r   <module>r      sR   M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M . . . . . . . . . . . . . . . .  Q3#3#9B#>#>JJJJ  63 65 6 6 6 6p      5dk@ 5 5 5 5
J 
J 
J 
J 
JS- 
J 
J 
J:gl :w| : : : :,DK> ,
4?C , , , ,^		+36
49   4't{'I '	' ' ' 'VO O O O O O O O>    8K(  8    5K%  6# # #.V] .s} . . . .`' ' 'R! ! ! ! !r   