o
    Gý¤hï  ã                   @   s*  d Z ddlZddlZddlmZ ddlZddlZddlZddlmZm	Z	 de
fdd„ZdedB d	e
fd
d„Zde
d	e
fdd„Zded	e
fdd„Zde
d	efdd„Zde
d	e
fdd„Zde
d	e
fdd„Zde
d	e
dB fdd„Zde
ded	e
fdd„Zde
ded	e
fdd „Zde
d	ee
ef dB fd!d"„ZdS )#a„  
helpers.py

Purpose:
  Miscellaneous utilities reused across routes:
    - Timestamp parsing from camera filenames
    - Human-readable formatting
    - Normalization of paths into the `static/User-photos` namespace

Exports:
  - parse_ts_from_any(path_or_name) -> (datetime|None, camera_id|None)
  - format_dt(datetime|None) -> str
  - normalize_to_static_user_photos(path: str) -> str
é    N)Údatetime)Úcurrent_appÚurl_forÚpath_or_namec                 C   sâ   t j | ¡}t d|tj¡}|sdS | ¡ \}}}}}}}	zt|ƒ}
t|ƒ}tt|ƒ||
t|ƒt|ƒt|ƒƒ}||	fW S  t	yD   Y nw zt|ƒ}t|ƒ}
tt|ƒ||
t|ƒt|ƒt|ƒƒ}||	fW S  t	yp   d |	f Y S w )NzBPICT_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})_([A-Za-z0-9]{12}))NN)
ÚosÚpathÚbasenameÚreÚmatchÚ
IGNORECASEÚgroupsÚintr   Ú
ValueError)r   ÚnameÚmÚyearÚaÚbÚhhÚmmÚssÚcamÚdayÚmonthÚts© r   ú$/var/www/html/app_modules/helpers.pyÚparse_ts_from_any   s&   "
ÿ"
ÿr   ÚdtÚreturnc                 C   s   | sdS |   d¡S )NzNema aktivnostiz%d.%m.%Y %H:%M)Ústrftime)r   r   r   r   Ú	format_dt/   s   
r!   r   c                 C   sh   | sdS |   dd¡ d¡}| d¡r|tdƒd … }d|v r)|| d¡d … }|S d|vr2d|› }|S )NzUser-photos/ú\ú/zstatic/)ÚreplaceÚlstripÚ
startswithÚlenÚfind)r   Úpr   r   r   Únormalize_to_static_user_photos5   s   
þ
r*   Údatac                 C   s   t  | ¡ d¡ d¡S )Núutf-8ú=)Úbase64Úurlsafe_b64encodeÚdecodeÚrstrip)r+   r   r   r   Ú_b64url_encodeD   s   r2   c                 C   s    dt | ƒ d  }t | | ¡S )Nr-   é   )r'   r.   Úurlsafe_b64decode)r+   Úpaddingr   r   r   Ú_b64url_decodeH   s   r6   Úrel_pathc                 C   sT   t | ƒ}tj d¡pd d¡}t || d¡tj¡ 	¡ }t
| d¡ƒ› dt
|ƒ› S )zñCreate a deterministic signed token for a relative path under User-photos.
    Token format: base64url(rel) + '.' + base64url(HMAC_SHA256(secret, rel))
    No expiry (stable), access still requires auth + ownership in the serving route.
    Ú
SECRET_KEYÚ r,   ú.)r*   r   ÚconfigÚgetÚencodeÚhmacÚnewÚhashlibÚsha256Údigestr2   )r7   ÚrelÚsecretÚmacr   r   r   Úgenerate_media_tokenM   s   rF   c                 C   s   t | ƒ}td|dS )Númedia_routes.media_get)Útoken)rF   r   )r7   rH   r   r   r   Úbuild_media_urlX   s   rI   rH   c                 C   sŒ   z;|   dd¡\}}t|ƒ d¡}t|ƒ}tj d¡pd d¡}t 	|| d¡t
j¡ ¡ }t|ƒ}t ||¡s9W dS |W S  tyE   Y dS w )zMVerify a media token and return normalized relative path, or None if invalid.r:   é   r,   r8   r9   N)Úsplitr6   r0   r*   r   r;   r<   r=   r>   r?   r@   rA   rB   Úcompare_digestÚ	Exception)rH   Úb64_relÚb64_macrC   rD   ÚexpectedÚprovidedr   r   r   Úresolve_media_token]   s   ÿrR   Úexpires_at_epochc                 C   sr   t | ƒ}tj d¡pd d¡}|› dt|ƒ› d d¡}t ||tj	¡ 
¡ }t| d¡ƒ› dt|ƒ› dt|ƒ› S )z¦Create an expiring token that can be used publicly without a session.
    Format: base64url(rel) + "." + str(exp) + "." + base64url(HMAC(secret, rel|exp|public))
    r8   r9   r,   ú|ú|publicr:   )r*   r   r;   r<   r=   r   r>   r?   r@   rA   rB   r2   )r7   rS   rC   rD   ÚmsgrE   r   r   r   Úgenerate_share_tokeno   s
   &rW   c                 C   s   t | |ƒ}td|ddS )NrG   T)rH   Ú	_external)rW   r   )r7   rS   rH   r   r   r   Úbuild_share_urlz   s   
rY   c           
      C   sª   zJ|   dd¡\}}}t|ƒ d¡}t|ƒ}t|ƒ}tj d¡p d d¡}|› d|› d d¡}t	 
||tj¡ ¡ }t|ƒ}	t	 ||	¡sFW dS ||fW S  tyT   Y dS w )	z>Verify a share token and return (rel, exp) or None if invalid.r:   é   r,   r8   r9   rT   rU   N)rK   r6   r0   r*   r   r   r;   r<   r=   r>   r?   r@   rA   rB   rL   rM   )
rH   rN   Úexp_srO   rC   ÚexprD   rV   rP   rQ   r   r   r   Úresolve_share_token   s   
ÿr]   )Ú__doc__r   r	   r   r.   r>   r@   Úflaskr   r   Ústrr   r!   r*   Úbytesr2   r6   rF   rI   rR   r   rW   rY   Útupler]   r   r   r   r   Ú<module>   s&    "