
    h                     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JrJrJrJrJrJrJrJrJrJrJrJr  S SKJr  S SKJrJr  \" S5        \" S5        \ RB                  RE                  \ RB                  RG                  \$5      5      r%\ RB                  RM                  \%S5      r'\ RB                  RM                  \%S5      r(\ RB                  RM                  \'S5      r)\ RB                  RM                  \%SS5      r*\ RB                  RM                  \(S5      r+\ RB                  RM                  \(S5      r,1 Skr-Sr.Sr/Sr0Sr1Sr2\" S5         \" S5        \" \35      r4S\4l5        S\4Rl                  S'   \Rn                  " 5         S\Rp                  ;  a  \Rr                  " SS5        \Rr                  " SS 5        \Rr                  " S!S"5        \Rr                  " S#S$5        \Rr                  " S%S&5        \" S'5        \" S)5         \'\(\)\*4 H  r;\ Rx                  " \;S*S+9  M     \ RB                  RM                  \(S,5      r=\>" \=S-5       r?\?R                  S.5        SSS5        \ R                  " \=5        \" S/\% 35        \" S55        \" S65        S7 rDS8 rE\" S95        \" S:5        S; rFS< rGS= rHS> rIS? rJS@ rKSA rLSB rMSC rNSD rOSE rPSF rQSG rR\" SH5        \" SI5        \4R                  SJ 5       rT\" SK5        \" SL5        \4R                  SM5      SN 5       rV\4R                  SOSPSQ/SR9SS 5       rW\4R                  ST5      SU 5       rX\4R                  SV5      \ESW 5       5       rY\4R                  SX5      SY 5       rZ\4R                  SZ5      S[ 5       r[\" S\5        \" S]5        \4R                  S^SQ/SR9S_ 5       r\\4R                  S`5      Sa 5       r]\4R                  Sb5      Sc 5       r^\4R                  Sd5      Se 5       r_\4R                  Sf5      Sg 5       r`\4R                  ShSQ/SR9\ESi 5       5       ra\" Sj5        \" Sk5        \4R                  SlSP/SR9Sm 5       rb\4R                  SlSQ/SR9Sn 5       rc\4R                  SoSQ/SR9Sp 5       rd\4R                  SqSP/SR9Sr 5       re\4R                  SqSQ/SR9Ss 5       rf\4R                  StSQ/SR9Su 5       rg\4R                  SvSQ/SR9Sw 5       rh\3Sx:X  a   \" Sy5        \4R                  SzS{S*S|9  gg! \ a8  r\" S\ 35        \" S5        \" S	5        \R@                  " S
5         SrCGNSrCff = f! \: a(  r\" S(\ 35        \R@                  " S
5         SrCGNnSrCff = f! , (       d  f       GN= f! \B aF  r\" S0\ 35        \" S1\ R                  " 5        S2\% S335        \R@                  " S
5         SrCGNLSrCf\: a(  r\" S4\ 35        \R@                  " S
5         SrCGNxSrCff = f! \: a'  r\" S}\ 35        \R@                  " S
5         SrCgSrCff = f)~    Nwraps)Flaskrender_templaterequestredirecturl_forsend_from_directoryjsonifyabortsessionflashResponse	send_filemake_response)secure_filename)ImageUnidentifiedImageErrorz+DEBUG: Flask and PIL imported successfully.zFATAL IMPORT ERROR: zHPlease ensure Flask and Pillow are installed in the virtual environment:z+venv/bin/python -m pip install Flask Pillow   zDEBUG: Setting configuration...uploadsdata
thumbnailsstaticimgzchat_messages.jsonzcalendar_events.json>   avibmpdocgifjpgmkvmovmp3mp4oggpdfpngpptrartxtwavxlszipdocxjpegpptxwebmwebpxlsx)x   r3   admin0911zVantastic uploadszDEBUG: Configuration set.z%DEBUG: Creating Flask app instance...z9aendern-sie-diesen-geheimen-schluessel-final-final-final!i  @MAX_CONTENT_LENGTH.pdfapplication/pdf	video/mp4.mp4
video/webm.webm
audio/mpeg.mp3	audio/ogg.oggz"DEBUG: Flask app instance created.z FATAL ERROR creating Flask app: z*--- Server Initializing (Folder Check) ---Texist_okz.permission_testwtestz,INFO: Data and Upload folders accessible at z(FATAL ERROR creating/accessing folders: z&Please check permissions for user UID z
 on path 'z' and subdirectories.z%FATAL UNEXPECTED ERROR during setup: zDEBUG: Folder check finished.z!DEBUG: Defining auth functions...c                 B    [        U [        5      =(       a	    U [        :H  $ )u   Prüft das Aktionspasswort.)
isinstancestrACTION_PASSWORD)passwords    "/var/www/html/fileupload/server.pycheck_action_passwordrK   W   s    h$D_)DD    c                 0   ^  [        T 5      U 4S j5       nU$ )u#   Decorator für Admin-Login-Pflicht.c                     > S[         ;  a-  [        SS5        [        [        S[        R
                  S95      $ T" U 0 UD6$ )Nadmin_logged_inz0Bitte einloggen, um auf diese Seite zuzugreifen.warninglogin)next)r   r   r   r	   r   url)argskwargsfs     rJ   decorated_function*login_required.<locals>.decorated_function]   s<    G+DiPGG'++>??$!&!!rL   r   )rV   rW   s   ` rJ   login_requiredrY   [   s!    
1X" "
 rL   zDEBUG: Auth functions defined.z#DEBUG: Defining helper functions...c                 n    SU ;   =(       a*    U R                  SS5      S   R                  5       [        ;   $ )u'   Prüft, ob die Dateiendung erlaubt ist..r   )rsplitlowerALLOWED_EXTENSIONSfilenames    rJ   allowed_filera   h   s0    (?WxsA6q9??AEWWWrL   c                      [         R                  R                  U 5      nUS:  a  U S3$ US:  a	  US-  S S3$ US:  a	  US-  S S3$ US-  S S3$ ! [         a     g	f = f)
u)   Gibt die Dateigröße formatiert zurück.i   z Bi   z.1fz KBi   @z MBz GBzN/A)ospathgetsizeOSError)filepathsizes     rJ   get_file_sizeri   l   s    wwx($;V2;G^4i_C((G^7l3's++7l3's++ s!   )A A A 
A 
A A c                 v    [         R                  " U 5      u  pU(       a  U$ [        R                  R	                  U 5      S   R                  5       nUS:X  a  gUS;   a  gUS:X  a  gUS:X  a  g	US
;   a  gUS;   a  gUS;   a  gUS;   a  gUS;   a  gg! [         a  n[        SU  SU 35         SnAgSnAff = f)z$Ermittelt den MIME-Type einer Datei.r   r7   r8   )z.jpgz.jpegz
image/jpegz.png	image/pngz.gifz	image/gif)r:   r9   )r<   r;   )r>   r=   )z.wavz	audio/wav)r@   r?   zapplication/octet-streamz Error determining mime type for : N)	mimetypes
guess_typerc   rd   splitextr]   	Exceptionprint)rg   	mime_type_extes        rJ   get_mime_typerv   {   s    * ++H5	ggx(+113&=$%%F]F]H_IH_H_H_) *0
"QC@A)*sL    B 6B B !B (B /B 6B =B B B 
B8B33B8c                 b    SU ;   a#  U R                  SS5      S   R                  5       OSnUS;   $ )u"   Prüft, ob die Datei ein Bild ist.r[   r    )r&   r   r.   r   r   r1   r\   r]   r`   rt   s     rJ   is_image_filer{      s4    03x(//#q
!!
$
*
*
,RC>>>rL   c                 b    SU ;   a#  U R                  SS5      S   R                  5       OSnUS;   $ )u#   Prüft, ob die Datei ein Video ist.r[   r   rx   )r#   r!   r   r    r0   ry   rz   s     rJ   is_video_filer}      s4    03x(//#q
!!
$
*
*
,RC666rL   c                 b    SU ;   a#  U R                  SS5      S   R                  5       OSnUS;   $ )u)   Prüft, ob die Datei eine Audiodatei ist.r[   r   rx   )r"   r*   r$   ry   rz   s     rJ   is_audio_filer      s4    03x(//#q
!!
$
*
*
,RC'''rL   c                 b    SU ;   a#  U R                  SS5      S   R                  5       OSnUS:H  $ )u!   Prüft, ob die Datei ein PDF ist.r[   r   rx   r%   ry   rz   s     rJ   is_pdf_filer      s2    03x(//#q
!!
$
*
*
,RC%<rL   c                 T   [         R                  R                  [        U5      n [         R                  R	                  U5      (       + nU(       d@   [         R                  R                  U 5      [         R                  R                  U5      :  nU(       a  [        R                  " U 5       nUR                  [        [        R                  R                  5        UnUR                  S;  a}  UR                  S:X  d  SUR                  ;   aL  [        R                  " SUR                   S5      nSn UR#                  5       S   nUR'                  US	US
9  UnOUR)                  S5      nUR+                  USSS9  [-        SU 35        SSS5        [         R                  R	                  U5      (       a
  [/        SUS9$ [-        SU 35        g! [         a    Sn GNNf = f! [$         a     Nf = f! , (       d  f       Nn= f! [0         a    [-        SU S35         g[2         a  n[-        SU SU 35        [         R                  R	                  U5      (       a@   [         R4                  " U5        O(! [         a  n[-        SU SU 35         SnAOSnAff = f SnAgSnAff = f)u=   Erstellt Thumbnail und gibt URL zurück oder None bei Fehler.T)RGBLRGBAtransparencyr   )   r   r   N   )r   r   )maskU   )qualityoptimizezThumbnail created/updated: uploaded_thumbnailr_   z-Thumbnail check failed after potential save: zThumbnail Error (z): Cannot identify image file.): z,ERROR: Could not remove corrupted thumbnail rl   )rc   rd   joinTHUMBNAIL_FOLDERexistsgetmtimerf   r   open	thumbnailTHUMBNAIL_SIZE
ResamplingLANCZOSmodeinfonewrh   split
IndexErrorpasteconvertsaverq   r	   r   rp   remove)	rg   r`   
thumb_pathshould_creater   img_to_save
backgroundr   ru   s	            rJ   create_thumbnailr      s<   .9J+GGNN:66% " 0 0 :RWW=M=Mj=Y Y H%ne.>.>.F.FG!88</xx6)^sxx-G%*YYuchh%P
#!#&99;q>D #((f4(@&0&)kk%&8  R$ G3J<@A! && 77>>*%%/(CCA*NO7  % $%  * ! ! &%0 " !(+IJK !(3qc2377>>*%%X		*% XDZLPRSTRUVWWXs   +H ?G H .BG34G#AG35H H G H G  H #
G0-G3/G00G33
H=H J'	J'(5J"I54J"5
J?JJ"JJ""J'c                     / n  [         R                  " [        5      nU GHF  nUS:X  d  UR                  S5      (       a  M"  [         R                  R                  [        U5      n[         R                  R                  U5      (       d  Ml   [         R                  R                  U5      n[        U5      (       a  [        XC5      OSnUc
  [        SSS9nSU;   a#  UR                  SS	5      S	   R                  5       OS
n[        U5      nU R!                  U[#        U5      [        SUS9[        SUS9UUU[        U5      [%        U5      ['        U5      [)        U5      S.5        GMI     U R+                  S SS9  U $ ! [         a!  n[	        S[         SU 35        / s SnA$ SnAff = f! [         a  n[	        SU SU 35         SnAGM  SnAff = f)u=   Holt Dateien, sortiert nach Änderungsdatum (neueste zuerst).zError listing rl   Nr   r[   r   zimg/generic_file.pngr_   r   rx   direct_filefile_preview)namerh   rS   preview_urlthumbnail_urlmtimerr   is_imageis_pdfis_videois_audioz Error processing file props for c                     U S   $ )Nr    )xs    rJ   <lambda>$get_uploaded_files.<locals>.<lambda>	  s    !G*rL   T)keyreverse)rc   listdirUPLOAD_FOLDERrf   rq   
startswithrd   r   isfiler   r{   r   r	   r\   r]   rv   appendri   r   r}   r   sort)	
files_list	filenamesru   r`   rg   r   r   rt   rr   s	            rJ   get_uploaded_filesr      s   JJJ}-	
 |#x':':3'?'?77<<x877>>(##J((2HUV^H_H_ 0 Dei ($+H?U$VM<?8Ohooc1-a0668QS)(3	!!$)(3"=8D#*>H#M%2"!* -h 7)(3 -h 7 -h 7# ! @ OO,dO;K  }oRs34	B  J8
"QCHIIJs6   E> CF,>
F)F$F)$F),
G6GGc                    / n[        SU  35         [        R                  R                  U 5      (       a  [        R                  " U [        R
                  5      (       d  [        SU  35        / $ [        R                  R                  U 5      S:  aC  [        U SSS9 n[        R                  " U5      nSSS5        [        S[        U5       S	35        O[        S
U  35        [        U SSS9 n[        R                  " / U5        SSS5        Ok[        SU  35        [        R                  " [        R                  R                  U 5      SS9  [        U SSS9 n[        R                  " / U5        SSS5        ['        U[(        5      (       d  [        S[+        U5       S35        / $ U$ ! , (       d  f       N= f! , (       d  f       NP= f! , (       d  f       Na= f! [        R                   a  n[        SU  SU S35        U S-   n[        R                  R                  U5      (       a  [        SU 35        [        U5      s SnA$ [        U SSS9 n[        R                  " / U5        SSS5         SnAGM  ! , (       d  f        SnAGN= fSnAf[         ["        4 a  n[        SU  SU S35         SnAGNDSnAf[$         a  n[        SU  SU S35         SnAGNiSnAff = f)u4   Lädt JSON sicher und gibt immer eine Liste zurück.zLOAD: Attempting from: z'LOAD ERROR: Cannot read (permissions): r   rutf-8encodingNzLOAD: Success, loaded z items.z(LOAD Warning: File exists but is empty: rC   zLOAD Info: File not found: TrA   zLOAD ERROR: Invalid JSON in rl   r[   .bakz'LOAD INFO: Trying to load from backup: zLOAD ERROR (IO/OS) from zLOAD UNEXPECTED ERROR from z-LOAD WARNING: Loaded data is not list (type: z). Returning empty.)rq   rc   rd   r   accessR_OKre   r   jsonloadlendumpmakedirsdirnameJSONDecodeError	load_dataIOErrorrf   rp   rF   listtype)rg   r   rV   ru   backup_filepaths        rJ   r   r     sT   D	#H:
./">77>>(##99Xrww//?zJK	wwx(1,(C':a99Q<D ;.s4ykAB@
KL(C':aIIb!$ ;: /z:;KK1DAhg6!		"a  7$ dD!!=d4j\I\]^	KC ;: ;: 76 	!,XJb1=>"V+77>>/**;O;LMN_-- hg6!		"a  76666W ;(
"QCq9:: >+H:Rs!<==>s   AG 0.G F,5 G G /F=G AG G3G ,
F:6G =
GG G 
GG G K)3AJK)JI>/J>
J	JJK)'J??K)K$$K)c                 F   [        S[        U5       SU  35        [        U[        5      (       d  [        S5        g[        R
                  R                  U 5      n[        R                  " USS9  [        R                  " U[        R                  5      (       d  [        SU 35        gU S-   nU S	-   n [        US
SS9 n[        R                  " XSSS9  SSS5        [        R
                  R                  U 5      (       a$  [        R                  " X5        [        SU 35        [        R                  " X05        [        R
                  R                  U5      (       a  [        R                  " U5        [        S5        g! , (       d  f       N= f! [          a  n[        SU SU 35         SnAN=SnAff = f! ["         a  n[        SU  SU 35         SnAOSnAff = f[        R
                  R                  U5      (       a   [        R                  " U5        O! [          a     Of = f[        R
                  R                  U5      (       aN   [        R                  " X@5        [        SU 35        g! ["         a  n[        SU SU 35         SnAgSnAff = fgg)z:Speichert JSON sicher mit Backup und atomarem Verschieben.zSAVE: Attempting to save z items to: zSAVE ERROR: Data is not a list!FTrA   z5SAVE ERROR: Cannot write to directory (permissions): z.tmpr   rC   r   r      )indentensure_asciiNzSAVE: Created backup: z&SAVE WARNING: Could not remove backup rl   zSAVE: Success.zSAVE ERROR to zSAVE: Restored backup zSAVE CRITICAL: No restore )rq   r   rF   r   rc   rd   r   r   r   W_OKr   r   r   r   replacer   rf   rp   )rg   r   dirpathtmpbakrV   ru   res           rJ   	save_datar   :  s   	%c$i[H:
FGdD!!/1ggooh'GKK$'99Wbgg&&EgYOP
V
C
V
C0#sW-IIdae< .77>>(##JJx%*3%01


3!77>>#3  .- [)OPSuTVWXVY'Z![![[  0xj1#.//0	ww~~c	IIcN 		77>>#@

3).se45   @23%r">??@ s   4F; ?FB
F;  F 6F; 
FF; 
F8F3.F; 3F88F; ;
G GG H 
H,+H,$I9 9
JJJc                     U (       d  gSnU  H  n[        U5      US-  U-
  -   nM     [        U5      n/ SQnX1[        U5      -     $ )z0Generiert eine Farbe basierend auf dem Nickname.#3498dbr      )z#1abc9cz#2ecc71r   z#9b59b6z#34495ez#f1c40fz#e67e22z#e74c3cz#16a085z#27ae60z#2980b9z#8e44adz#f39c12z#d35400z#c0392b)ordabsr   )nickname	hash_codeccolorss       rJ   get_color_for_nicknamer   b  sQ    IFyA~:;	 II cFc&k)**rL   c                 j    U (       d  g[         R                  " S5      nS nUR                  X 5      nU$ )z8Wandelt URLs in klickbare Links um (ohne HTML-Escaping).rx   z4((?:https?://|www\.)[^\s/$.?#].[^\s<>]*[^\s<>.,)\]])c                 p    U R                  S5      nUR                  S5      (       a  UOSU-   nSU SU S3$ )Nr   httpzhttp://z	<a href="z," target="_blank" rel="noopener noreferrer">z</a>)groupr   )matchrS   hrefs      rJ   replace_urllinkify.<locals>.replace_urly  s?    kk!nnnV,,s)c/4& LSEQUVVrL   )r   compilesub)texturl_patternr   linked_texts       rJ   linkifyr   o  s5     **TUKW
 //+4KrL   z DEBUG: Helper functions defined.z$DEBUG: Defining context processor...c                  L    [         R                   R                  5       [        S.$ )u-   Übergibt gemeinsame Daten an alle Templates.)now
page_title)datetimer   
PAGE_TITLEr   rL   rJ   inject_common_datar     s     $$((**EErL   z!DEBUG: Context processor defined.zDEBUG: Defining main routes.../c                  *    [        5       n [        SU S9$ )Nz
index.htmlfilesr   r   r   s    rJ   indexr    s     E<u55rL   z/loginGETPOST)methodsc                  H   S[         ;   a  [        [        S5      5      $ [        R                  S:X  a  [        R
                  R                  S5      n [        R
                  R                  S5      n[        SU  S35        U [        :X  a  U[        :X  ay  S[         S'   S[         l
        [        R                  " S	S
9[        l        [        SS5        [        R                   R                  S5      n[        U=(       d    [        S5      5      $ [        SS5        [#        S5      $ )NrO   
verwaltungr  usernamerI   zLogin attempt: User=''T   )dayszEingeloggt!successrR   z$Falscher Benutzername oder Passwort.dangerz
login.html)r   r   r	   r   methodformgetrq   ADMIN_USERNAMEADMIN_PASSWORD	permanentr   	timedeltaapppermanent_session_lifetimer   rT   r   )unpwnext_urls      rJ   rQ   rQ     s   G#HW\5J,K%K~~\\j)0@0@0L2eVklnkoopTqNrB.$8)-G%&4w/@jrj|j|  CD  kEIg  GL  MZ  \e  Gf  sz  s  s  sC  sC  DJ  sK  hpH=(=>>:HE<((rL   z/logoutc                  p    [         R                  " SS 5        [        SS5        [        [	        S5      5      $ )NrO   zAusgeloggt.r   r  )r   popr   r   r	   r   rL   rJ   logoutr    s+    KK!4(%v*FxX_`gXhOiHirL   z/verwaltungc                  *    [        5       n [        SU S9$ )Nzverwaltung.htmlr   r  r   s    rJ   r  r    s      E9JRW)X"XrL   z/chatc                  2    [         R                  R                  [        5      (       de  [         R                  " [         R                  R                  [        5      SS9  [        [        SSS9 n [        R                  " / U 5        SSS5        [        [        5      n[        S[        U5       S35        [        S	5      $ ! , (       d  f       N@= f! [         a:  n[        S
U 35        [        S[        U5       3S5        [        S	SS9s SnA$ SnAff = f)zChat-Seite rendern.TrA   rC   r   r   NzChat geladen: z Nachrichten gefundenz	chat.htmlzERROR in chat route: zFehler beim Laden des Chats: r  )error)rc   rd   r   	CHAT_FILEr   r   r   r   r   r   rq   r   r   rp   r   rG   )rV   msgsru   s      rJ   chatr#    s    8ww~~i((KK	2TBiw71		"a  8 #s4yk)>?@{++ 87  8%aS)*-c!fX6A{$778s6   A-C /C9C 
CC 
D/DDDz	/kalenderc                  T   [         R                  R                  [        5      (       de  [         R                  " [         R                  R                  [        5      SS9  [        [        SSS9 n [        R                  " / U 5        S S S 5        [        S5      $ ! , (       d  f       N= f)NTrA   rC   r   r   zkalender.html)
rc   rd   r   CALENDAR_FILEr   r   r   r   r   r   )rV   s    rJ   kalenderr&    sg     77>>-((
BGGOOM2TB-w71IIb! 8?++ 87s   .B
B'zDEBUG: Main routes defined.z(DEBUG: Defining file operation routes...z/uploadc                  ,   [         R                  R                  S5      n [        SU  S[	        U 5      R
                   S[         S[	        [        5      R
                   S[        U 5       3
5        [        U 5      (       d  [        SSS.5      S	4$ [         R                  R                  S
5      nU(       a  [        S U 5       5      (       a  [        SSS.5      S4$ / n/ n/ nU GH  nU(       Ga`  [        UR                  5      (       GaE  UR                  n[        U5      n[        R                   R#                  [$        U5      nSn	[        R                   R'                  U5      (       a  [        R                   R)                  [        U5      5      u  pU
 SU	 U 3n[        R                   R#                  [$        U5      oS-  n	[        R                   R'                  U5      (       a  M   UR+                  U5        [        SU 35        [-        U5      (       a  [/        X5        UR1                  USS.5        UR1                  U5        GMl  U(       d  GMv  UR                  S:w  d  GM  UR1                  UR                  SSS.5        GM     U(       d  [        S[7        U5       S3S.5      $ U(       d  [        SS[7        U5       S3US .5      S4$ [        S[7        U5       S![7        U5       S"3X4S#.5      S$4$ ! [2         a  n[        SU SU SU 35        UR1                  USSS.5        S Vs/ s H?  n[        R                   R'                  U5      (       d  M)  [        R4                  " U5      PMA     Os  snf   n SnAGM  SnAff = f)%z)Verarbeitet Datei-Uploads (auch mehrere).rI   zUPLOAD: Received='z'(z), Expected='z	), Match=FzFalsches Aktionspasswort!r  r     filec              3   >   #    U  H  oR                   S :H  v   M     g7f)rx   Nr_   ).0rV   s     rJ   	<genexpr>upload_file.<locals>.<genexpr>  s      J>ar!1>s   u   Keine Dateien ausgewählt!  r   rs   zFile saved: T)r`   r  zERROR saving z (orig: r   zSpeicherfehler.)r`   r  r   )rx   Nrx   zTyp nicht erlaubt.z Datei(en) hochgeladen.r  messagezFehler bei allen z	 Dateien.)r  r   detailsz OK, z Fehler.)r  r1  r2  saved   )r   r  r  rq   r   __name__rH   rK   r   r  getlistallra   r`   r   rc   rd   r   r   r   ro   r   r{   r   r   rp   r   r   )rI   uploaded_filesresultserrorssaved_filenamesr*  original_filenamer`   rg   counterr   rt   ru   rs   s                 rJ   upload_filer>    sG    ||
+H	xj4>+B+B*C=Q`Paacdhixdy  eC  eC  dD  DM  Nc  dl  Nm  Mn  o  p **7uWr;s3tvy3y,y]]**62NS J> JJJSZgl  xT  \U  TV  X[  T[  M[G2&L// $/J[:\xikipipiuiu  wD  FN  jO^fG''..**8H8HYjIk8lID  }A  |B  BC  DK  CL  MP  LQ  zRnv  _a  _f  _f  _k  _k  ly  {C  _D  T\  QR  FR  FM"''..**E		(#U\(+D%E **$X8HFGI_I_`hIiTdmmr)6==dmm`e  qE  :F  ,G  'd#oBVAWWn?o"pqqWCTUXY_U`TaajAkx~%  A  CF  F  FU#g,uSQW[MYa7bou  Q  R  TW  W  W	   E5=
(K\J]]`ab`c)d#egmgtgt  CT  af  qB  vC  hD  dh  FE  dh  _`  ln  ls  ls  lz  lz  {C  lD  GZ  GI  GP  GP  QY  GZ  dh  FE  FE  Es+   0AL
N-N9(N %N ?NNz/direct-file/<path:filename>c                     [        U 5      nX:w  a  [        S5        [        R                  R	                  [
        U 5      n[        R                  R                  U5      (       a$  [        R                  R                  U5      (       d  [        S5        [        U5      n[        UUSU S9nSUR                  S'   U$ ! [         a&  n[        SU  SU 35        [        S5         S	nAg	S	nAff = f)
z)Liefert Dateien direkt zum Herunterladen.  F)mimetypeas_attachmentdownload_namenosniffX-Content-Type-OptionszError sending file rl     N)r   r   rc   rd   r   r   r   r   rv   r   headersrp   rq   )r`   secure_namerg   rr   responseru   s         rJ   r   r     s    %h/"#J77<<x8ww~~h''rww~~h/G/G#J "(+	 "	
 6?12 #H:Rs34c

s   B9B< <
C,C''C,z#/uploads/thumbnails/<path:filename>c                     [        U 5      nX:w  a  [        S5        [        R                  R	                  [
        U 5      n[        R                  R                  U5      (       d.  [        R                  R	                  [        S5      n[        USS9$ [        U5      n[        UUSS9nSUR                  S'   U$ ! [         a&  n[        S	U  S
U 35        [        S5         SnAgSnAff = f)zLiefert Thumbnails aus.r@  zgeneric_file.pngrk   )rA  F)rA  rB  rD  rE  zError sending thumbnail rl   rF  N)r   r   rc   rd   r   r   r   STATIC_IMG_FOLDERr   rv   rG  rp   rq   )r`   rH  r   fallback_pathrr   rI  ru   s          rJ   r   r     s    %h/"#JWW\\"2H=
ww~~j))GGLL):<NOM][AA "*-	 
 6?12 (
"QC89c

s   BB: &B: :
C*C%%C*z/file-preview/<path:filename>c                 6    [        U 5      nX:w  a  [        S5        [        R                  R	                  [
        U 5      n[        R                  R                  U5      (       a$  [        R                  R                  U5      (       d  [        S5        [        U5      n[        U5      n[        R                  R                  [        R                  R                  U5      5      R                  5       nU [        SU S9UUU[        U 5      [!        U 5      [#        U 5      [%        U 5      S.	n['        SU  SU 35        [)        SUS9$ ! [*         aG  n['        S	U  S
U 35        [-        S[/        U5       3S5        [1        [        S5      5      s SnA$ SnAff = f)u;   Zeigt eine Dateivorschau in einer eigenständigen Seite an.r@  r   r_   )	r   rS   rh   modifiedrr   r   r   r   r   zFile preview generated for: z, mime: zfile_preview.html)r*  zError generating preview for rl   zFehler bei der Vorschau: r  r  N)r   r   rc   rd   r   r   r   r   rv   ri   r   fromtimestampr   	isoformatr	   r{   r   r}   r   rq   r   rp   r   rG   r   )r`   rH  rg   rr   rh   r   	file_dataru   s           rJ   r   r     sS   "*%h/"#J77<<x8ww~~h''rww~~h/G/G#J "(+	X&!!//0@0@0JKUUW =8<"%h/!(+%h/%h/

	 	,XJhykJK2CC *-hZr!=>)#a&2H=())*s   EE 
F<FFFz/preview-api/<path:filename>c                     [        U 5      nX:w  a  [        SSS.5      S4$ [        R                  R	                  [
        U 5      n[        R                  R                  U5      (       a$  [        R                  R                  U5      (       d  [        SSS.5      S4$ [        U5      n[        U5      n[        R                  R                  [        R                  R                  U5      5      R                  5       n[        SU UUU[        SU S	9[        S
U S	9[        U 5      [!        U 5      [#        U 5      [%        U 5      S.5      $ ! [&         a4  n[)        SU  SU 35        [        S[+        U5      S.5      S4s SnA$ SnAff = f)uC   Liefert Dateiinformationen im JSON-Format für JavaScript-Vorschau.Fu   Ungültiger Dateinamer(  r/  Datei nicht gefundenr@  Tr   r_   r   )r  r`   rr   rh   rN  rS   r   r   r   r   r   zError generating API data for rl   rF  N)r   r   rc   rd   r   r   r   r   rv   ri   r   rO  r   rP  r	   r{   r   r}   r   rp   rq   rG   )r`   rH  rg   rr   rh   r   ru   s          rJ   preview_apirT  C  s[   A%h/"u7NOPRUUU77<<x8ww~~h''rww~~h/G/Gu7MNOQTTT "(+	X&!!//0@0@0JKUUW "=8<">HE%h/!(+%h/%h/
  	  A.xj1#>?53q6:;S@@As*   E	 A;E	 B*E	 	
F)F<FFz/delete_file/<path:filename>c                    [        U 5      nX:w  a  [        SSS.5      S4$  [        R                  R	                  [
        U5      n[        R                  R	                  [        U5      nSn[        R                  R                  U5      (       aJ  [        R                  R                  U5      (       a&  [        R                  " U5        Sn[        SU 35        [        R                  R                  U5      (       aI  [        R                  R                  U5      (       a%   [        R                  " U5        [        SU 35        U(       a  [        SU S3S5        [        SS05      $ [        SU 35        [        SSS.5      S4$ ! [         a  n[        SU S	U 35         S
nANbS
nAff = f! [         a+  n[        SU S	U 35        [        SSS.5      S4s S
nA$ S
nAff = f)u%   Löscht eine Datei und ihr Thumbnail.Fu   Ungültiger Dateiname.r(  r/  TzDeleted file: zDeleted thumbnail: z$Warning: Could not remove thumbnail rl   NzDatei "u   " gelöscht.r  zDelete Error: File not found: rS  r@  zError deleting u   Fehler beim Löschen.rF  )r   r   rc   rd   r   r   r   r   r   r   rq   rf   r   )r`   sfnfptpferu   s         rJ   delete_filerZ  g  s    (
#C
w5C['\]_bbbRWW\\--WW\\*C077>>""''.."4"4IIbMBN2$'(77>>""''.."4"4H		"+B401 GC5-y9It,--22$78u7MNOQTTT  H<RD1#FGGH  RuBqc*+53JKLcQQRsN   D F1 #$F	 #F1 +F1 	
F.F)$F1 )F..F1 1
G&; G!G&!G&z%DEBUG: File operation routes defined.z DEBUG: Defining API endpoints...z/api/chat/messagesc                      [        [        5      n / nU  Hz  n[        U[        5      (       a:  SU;   a4  UR	                  5       n[        US   5      US'   UR                  U5        MR  [        U[        5      (       d  Mi  UR                  U5        M|     [        U5      $ ! [         a%  n[        SU 35        [        / 5      S4s SnA$ SnAff = f)zLiefert alle Chat-Nachrichten.r   colorzERROR in get_chat_messages: rF  N)
r   r!  rF   dictcopyr   r   r   rp   rq   )r"  processed_msgsmmessage_copyru   s        rJ   get_chat_messagesrb    s     #A!T""zQ vvx(>|J?W(XW%
 %%l3 a&&"))!,  ~&&  ,QC01r{C s$   A8B >B 
C(CCCc                      [         R                  n U R                  S5      nU R                  S5      nU R                  S5      n[        SU S[	        U5       35        [	        U5      (       d  [        SSS.5      S	4$ U(       a  U(       d  [        SS
S.5      S4$ [        [        5      nUR                  5       nUR                  5       nUR                  SS5      R                  SS5      R                  SS5      n[        U5      n[        [        R                  " 5       5      UU[        R                  R                  [        R                   R"                  5      R%                  5       ['        U5      S.nUR)                  U5        [+        [        U5      (       a  [        SUS.5      $ [        SSS.5      S4$ ! [,         a(  n	[        SU	 35        [        SSS.5      S4s Sn	A	$ Sn	A	ff = f)z#Speichert eine neue Chat-Nachricht.rI   r   r1  zCHAT POST: Received password='	', Match=F   Ungültiges Aktionspasswort!r(  r)  z Nickname/Nachricht erforderlich!r/  &z&amp;<z&lt;>z&gt;)idr   r1  	timestampr\  Tr0  Speichern fehlgeschlagen.rF  zERROR in post_chat_message: zInterner ServerfehlerN)r   r   r  rq   rK   r   r   r!  stripr   r   rG   uuiduuid4r   r   timezoneutcrP  r   r   r   rp   )
dr  nnmtr"  cnclean_messagemessage_with_linksnmru   s
             rJ   post_chat_messagerx    s   &RLLUU:UU:UU9.rd)<QRT<U;VWX$R((u7UVWY\\\u7YZ[]```#XXZ 
%--c7;CCCPXXY\^de %]3 djjl#)!**..x/@/@/D/DEOOQ+B/
 	BY%%t;<<u7RSTVYYY R,QC0153JKLcQQRs1   A<F= ?F= DF= -F= =
G/G*$G/*G/z/api/chat/delete/<message_id>c                    [         R                  oR                  S5      n[        SU S[	        U5       35        [	        U5      (       d  [        SSS.5      S4$ [        [        5      n[        U5      oC Vs/ s H  oUR                  S5      U :w  d  M  UPM     nn[        U5      U:  a2  [        [        U5      (       a  [        S	S
05      $ [        SSS.5      S4$ [        SSS.5      S4$ s  snf )u   Löscht eine Chat-Nachricht.rI   z CHAT DELETE: Received password='rd  Fre  r(  r)  ri  r  Trk  rF  zNachricht nicht gefundenr@  )
r   r   r  rq   rK   r   r   r!  r   r   )
message_idrq  r  r"  ilr`  msgs_news          rJ   delete_chat_messager}    s     	A55,be6VWYVZZcdyz|d}c~4  /A $$WQo5p-qsv-v&vYDc$i<j1PUPUVZP[_iPiQ<j
8}rY))'9d:K2L+L9TUVX[[[U5OPQSVV
V	 =ks   8C-C-z/api/calendar/eventsc            
      4   [        [        5      n / nU  GH%  n So2R                  S5      oBR                  SS5      oRR                  S5      obR                  S5      nU(       a  U(       d.  U(       a'  U SU 3n[        R                  R	                  U5        O#Un[        R
                  R	                  U5        SnU(       a   [        R
                  R	                  U5        OOM  UR                  S	5      UR                  S
S5      X5SUR                  SS5      0S.nU(       a  XHS'   UR                  U5        GM(     [        U5      $ ! [         a    Sn Nrf = f! [        [        4 a,  n	[        SUR                  S	5       SU	 35         Sn	A	GM~  Sn	A	ff = f)z.Liefert Kalenderevents im FullCalendar-Format.Nend_dateallDayFdatetimeTTri  r   ?descriptionrx   ri  titlestartr  extendedPropsendzWarnung: Invalid Event ID rl   )r   r%  r  r   fromisoformatr  
ValueErrorr   	TypeErrorrq   r   )
events_datafullcalendar_eventseventstart_dt_str
end_dt_strall_daydate_valtime_valfc_eventru   s
             rJ   get_calendar_eventsr    s    M*K",?	gLii
.CyyYachOiWvv  AG  wHks  U^  U^  _e  Uf  JR8xj(<T\V^VgVgVuVu  wC  WD%-lx}}/J/J</XdhZa!44Z@  #iio		&#8NYe  MZ  \a  \e  \e  fs  uw  \x  Ly  zHZE?&&x0  &'' &8Dz8
 9%fE4NuyyY]N__abcad2e,f,ffsC   B)EE	!E%AE	EEEEF+ FFc                  L    [         R                  n [        SU  35        U R                  S5      nU R                  S5      nU R                  SS5      nU R                  S5      nU R                  SS5      nU R                  S5      n[	        U5      (       d  [        S	S
S.5      S4$ U(       a  U(       d  [        S	SS.5      S4$ [        SU S[        U5       35         [        R                  R                  U5      nSnSn	U(       a  UR                  5       (       a   UR                  5       R                  S5      n
[        U
5      S:  a\  [        U
S   5      n[        U
S   5      nSUs=::  a  S::  a3  O  O0SUs=::  a  S::  a#  O  O UR                  5       n	S	n[        SU	 35        U(       a  UnOU SU	 3nSnSnU(       a*   [        R                  R                  U5      nUU:  a  UnUn[!        ["        5      n[%        [&        R(                  " 5       5      nUUR                  5       UR                  5       UR                  5       UU	UUU[        R                  R+                  [        R,                  R.                  5      R1                  5       S.
nUR3                  U5        [5        ["        U5      (       a+  UUS   UUUS   U	S.S.nU(       a  UUS '   [        SUS!.5      $ [        S	S"S.5      S#4$ ! [         a  n[        SU 35         SnAGNlSnAff = f! [         a     GN;f = f! [         a(  n[        S$U 35        [        S	S%S.5      S4s SnA$ SnAff = f! [         a4  n[        S&U 35        [        S	S'[%        U5       3S.5      S#4s SnA$ SnAff = f)(u(   Fügt einen neuen Kalendereintrag hinzu.z'Kalender-Event POST: Empfangene Daten: rI   r  r  rx   r  r  r  Fre  r(  r)  Titel/Startdatum erforderlich!r/  zDebug Zeit: 'z', Typ: TN:r   r   r      ;   u   Gültige Zeit erkannt: zZeit-Parsing Fehler: r  )
ri  r   r  r  r  r  r  r  r  
created_atr   r  r  r  r  r  r  rk  rF  zKalender ValueError: u   Ungültiges Datum/Uhrzeit!zKalender unerwarteter Fehler: Interner Fehler: )r   r   rq   r  rK   r   r   r   r  r  rl  r   r   intrp   r  r   r%  rG   rm  rn  r   ro  rp  rP  r   r   )r   rI   r  r  date_strtime_strend_date_str
start_dater  
start_time
time_partshoursminutestestart_iso_for_calendarend_iso_for_calendarvalid_end_dater  eventsnew_id	new_eventfullcalendar_eventru   s                          rJ   add_calendar_eventr    s   rW||7v>?88J'!hh}b188F#88FB'xx
+ %X..u7UVWY\\\ Hu7WXY[^^^ 	hZxX/?@AW	[!44X>J GJ HNN,,8!)!1!7!7!<J:!+ #JqM 2"%jm"4++W0B0B)1)9J&+G!$;J<"HI )1&,4:Qzl)C& $( !N'}}::<HH*,/;,)5
 }-F &F*002 "*!/&//33H4E4E4I4IJTTVI MM)$ // !&v.3%'0'? *&	&" (0D&u-4:LMNN5;VWXZ]]] ! 81"6778( " Z  	[)!-.u7STUWZZZ	[  W.qc2355Fs1vh3OPQSVVVWs   B%M% (M% M% !?L0 !AK9 :L0 ;K9 
L0  K9 +L0 )L 1C7L0 )L0 9
LLL0 LL0 
L-)L0 ,L--L0 0
M":MM"M% M""M% %
N#/)NN#N#z/api/calendar/delete/<event_id>c                     [         R                  R                  SU  35        [        R                  nU(       d/  [         R                  R                  S5        [        SSS.5      S4$ UR                  S5      n[         R                  R                  S[        U5       35        [        U5      (       d/  [         R                  R                  S	5        [        SS
S.5      S4$ [        [        5      n[        U5      n[         R                  R                  SU S35        U Vs/ s H  oUR                  S5      U :w  d  M  UPM     nn[        U5      U:  a  [         R                  R                  SU  S35        [        [        U5      (       a0  [         R                  R                  SU  S35        [        SS05      $ [         R                  R                  S5        [        SSS.5      S4$ [         R                  R                  SU  S35        [        SSS.5      S4$ s  snf ! [          aQ  n[         R                  R                  S[#        U5       35        [        SS[#        U5       3S.5      S4s SnA$ SnAff = f)u   Löscht einen Kalendereintrag.u   Löschanfrage für Event ID: u%   Keine JSON-Daten in der LöschanfrageFzKeine Daten empfangenr(  r/  rI   zPasswort wurde empfangen: u#   Falsches Passwort bei Löschanfragere  r)  u   Vor dem Löschen: z Eventsri  zEvent u    wird gelöschtu    erfolgreich gelöschtr  Tu'   Fehler beim Speichern nach dem Löschenrk  rF  z nicht gefundenzEintrag nicht gefundenr@  u#   Unerwarteter Fehler beim Löschen: zServerfehler: N)r  loggerr   r   r   r   r   r  debugboolrK   rP   r   r%  r   r   rp   rG   )event_idr   rI   r  initial_lengthr  events_after_deleteru   s           rJ   delete_calendar_eventr  e  s*   +T

7zBC ||JJDFu7NOPRUUU88J'

5d8n5EFG %X..JJ!DFu7UVWY\\\ =)V

-n-=WEF 39X&IIdOx<Wu&X "#n4JJOOfXJo>? (;<<

&
2H IJ	4011

  #JL5;VWXZ]]]JJzABu7OPQSVVV Y"  T

>s1vhGH5^CF83LMNPSSSTsR   A'H( *A:H( %AH( &H#H#A8H( .H( 02H( #H( (
J2AI>8J>Jz/api/calendar/update/<event_id>c                 r    [         R                  n[        SU  SU 35        UR                  S5      nUR                  S5      nUR                  SS5      nUR                  S5      nUR                  SS5      nUR                  S	5      n[	        U5      (       d  [        S
SS.5      S4$ U(       a  U(       d  [        S
SS.5      S4$ [        [        5      nS
n	Sn
U GH  nUR                  S5      U :X  d  M  Sn	SnSnU(       a  UR                  5       (       a}   UR                  5       R                  S5      n[        U5      S:  aN  [        US   5      n[        US   5      nSUs=::  a  S::  a%  O  O"SUs=::  a  S::  a  O  OUR                  5       nS
nU(       a  UnOU SU 3nSnU(       aG   [        R                  R                  U5      n[        R                  R                  U5      nUU:  a  UnUR                  5       US'   UR                  5       US'   UR                  5       US'   X[S'   XS'   UUS	'   XS'   UUS'   [        R                  R#                  [        R$                  R&                  5      R)                  5       US'   SU;   a  U(       d  US	 OU(       a  UUS'   Un
  O   U	(       d  [        S
S S.5      S!4$ [+        [        U5      (       aR  U U
S   U
S   U
S   U
S   U
R                  S5      S".S#.nU
R                  S	5      (       a  U
S	   US'   [        SUS$.5      $ [        S
S%S.5      S&4$ ! [         a  n[        SU 35         SnAGNSnAff = f! [          a     GN{f = f! [         a4  n[        S'U 35        [        S
S([-        U5       3S.5      S&4s SnA$ SnAff = f))z/Aktualisiert einen bestehenden Kalendereintrag.zKalender-Event UPDATE: ID=z	, Daten: rI   r  r  rx   r  r  r  Fre  r(  r)  r  r/  Nri  Tr  r   r   r   r  r  z Zeit-Parsing Fehler bei Update: r  r   r  r  
updated_atr  zEvent nicht gefundenr@  r  r  r  rk  rF  zKalender Update Fehler: r  )r   r   rq   r  rK   r   r   r%  rl  r   r   r  rp   r   r  r  r  r   ro  rp  rP  r   rG   )r  r   rI   r  r  r  r  r  r  event_foundupdated_eventr  r  r  r  r  r  r  r  r  r  r  r  ru   s                           rJ   update_calendar_eventr    s   lW||*8*IdVDE88J'!hh}b188F#88FB'xx
+ %X..u7UVWY\\\ Hu7WXY[^^^ =) Eyy(*" !
 0 0	G%-^^%5%;%;C%@
z?a/$'
1$6E&)*Q-&8G E/R/A4FB4F-5^^-=
*/
 -5*08z:,-G* "&#+==#>#>|#L%-]]%@%@%J
#j0-9N
 !&f!&g'2'8'8':m$ (f *f$2j!")h!7g&.&7&7&;&;H<M<M<Q<Q&R&\&\&^l#E>.e##1E%L %m p u7MNOQTTT ]F++ &v.&w/'1#0#?)--f5"	"   ,,,9*,E"5)t6HIJJu7RSTVYYY{ % G @EFFG" & \  W(,-55Fs1vh3OPQSVVVWs   B(M8 +M8 	,M8 9"M8 AM5M8 6MM8 MM8 3AM'9CM8 
A&M8 1M8 
M$MM8 M$$M8 '
M51M8 4M55M8 8
N6)N1+N61N6__main__z'--- Starting Flask Server Execution ---z0.0.0.0i  )hostportr  zFATAL ERROR during app.run: )jrc   r   r   rm  r   sysshutilrm   	functoolsr   flaskr   r   r   r   r	   r
   r   r   r   r   r   r   r   werkzeug.utilsr   PILr   r   rq   ImportErrorru   exitrd   abspathr   __file__BASE_DIRr   r   DATA_FOLDERr   rK  r!  r%  r^   r   r  r  rH   r   r5  r  
secret_keyconfiginit	types_mapadd_typerp   folderr   	test_filer   rV   writer   rf   geteuidrK   rY   ra   ri   rv   r{   r}   r   r   r   r   r   r   r   r   context_processorr   router  rQ   r  r  r#  r&  r>  r   r   r   rT  rZ  rb  rx  r}  r  r  r  r  runr   rL   rJ   <module>r     s   	    	 
   8 8 8 8 /1	
78 ' (77??277??845Xy1ggll8V,77<<|< GGLL8U; GGLL&:;	[*@AO   
 ! "	
12
/CPCN'8CJJ#$NNY(((,f5{F+|W-|V,{F+	
./ 2 3 +/?ARS
FT* T[*<=I	i	AGGFO	IIi	8

CD % & ) *E & ' + ,X*B?
7
(

.`*X,\&P+" ( ) , -F F ) * & '36 6 8eV_-) .) 9j j =Y  Y 78 8& ;, , # $ 0 19vh'W (W0 )* +< 01 2< *+$* ,$*L )*!A +!AF )F8<R  =R6 - . ( )%1  2 2 &2(R 3(RT *VH=W >W !E73( 4(& !F84tW 5tWn ,vh?-T @-Td ,vh?nW @nWb z78YT6 o  	 
$%	
TU	
78HHQKK	X  	,QC
01HHQKK 
	  	4QC
89	22::<.
8*Ti
jkHHQKK 	1!
56HHQKK|  ,QC01s   4T
 B.U AV U<$%V /X	 
U-UUU9U44U9<
VV X;W	XXX	X6X11X6