
    \Mj5:                     j   d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ  ee      j=                         j>                  Z e d	z  Z!e d
z  dz  Z"h dZ# e       Z$ e       Z%de%_&        d Z' G d dee$jP                        Z) G d de$jP                        Z* G d de$jP                        Z+ G d de$jP                        Z,e%jZ                  d        Z.d Z/d Z0d Z1d Z2d Z3d Z4 e'       Z5e6dk(  re5jo                  dd d!"       yy)#    N)datetime)Path)Flaskabortflashjsonifyredirectrender_templaterequesturl_for)LoginManager	UserMixincurrent_userlogin_required
login_userlogout_user)
SQLAlchemy)check_password_hashgenerate_password_hash)secure_filenameinstancestaticuploads>   gifjpgpngjpegwebploginc            	         t        t        t        t              d      } t        j	                  d       t
        j	                  dd       t        dz  }|j                         s&|j                  t        j                  d      d       | j                  j                  |j                  d      j                         d	t        d
z   ddt        t
                     t        j                  |        t         j                  |        t#        |        | j%                         5  t'                d d d        | S # 1 sw Y   | S xY w)NT)instance_pathinstance_relative_config)exist_ok)parentsr#   zsecret_key.txt    utf-8encodingz
sqlite:///zsite.dbFi   )
SECRET_KEYSQLALCHEMY_DATABASE_URISQLALCHEMY_TRACK_MODIFICATIONSMAX_CONTENT_LENGTHUPLOAD_FOLDER)r   __name__strINSTANCE_DIRmkdir
UPLOAD_DIRexists
write_textsecrets	token_hexconfigupdate	read_textstripdbinit_applogin_managerregister_routesapp_contextinit_db)appsecret_files     /var/www/html/app.py
create_apprD      s
   
L(9TX
YC%TD1!11Kw004wGJJ(('(:@@B",\I-E,F G',**o   KK3C		 	JJs   &D;;Ec                      e Zd Zej	                  ej
                  d      Zej	                  ej                  d      dd      Zej	                  ej                  d      d      Z	ej	                  ej                  d      dd	
      Z
ej	                  ej                  dd      Zej	                  ej                  ej                  d      Zd Zd Zed        Zed        Zed        Zy)UserTprimary_keyP   Funiquenullable   rL      user)rL   defaultrQ   rL   c                 $    t        |      | _        y N)r   password_hashselfpasswords     rC   set_passwordzUser.set_password:   s    3H=    c                 .    t        | j                  |      S rT   )r   rU   rV   s     rC   check_passwordzUser.check_password=   s    "4#5#5x@@rZ   c                      | j                   dk(  S )NadminrolerW   s    rC   is_adminzUser.is_admin@   s    yyG##rZ   c                      | j                   dk(  S )Neditorr_   ra   s    rC   	is_editorzUser.is_editorD   s    yyH$$rZ   c                     | j                   dv S )N>   r^   rd   r_   ra   s    rC   can_write_postszUser.can_write_postsH   s    yy///rZ   N)r.   
__module____qualname__r;   ColumnIntegeridStringusernamerU   r`   Booleanmust_change_passwordDateTimer   utcnow
created_atrY   r\   propertyrb   re   rg    rZ   rC   rF   rF   2   s    	2::4	0Byy2teyDHIIbiinuI=M99RYYr]UF9CD99RZZ9O2;;%PJ>A $ $ % % 0 0rZ   rF   c                   T   e Zd Zej	                  ej
                  d      Zej	                  ej                  d      d      Zej	                  ej                  d      Z
ej	                  ej
                  ej                  d      d      Zej	                  ej
                  ej                  d      d      Zej	                  ej                  ej                   d      Zej	                  ej                  d      Zej'                  degd	
      Zej'                  deg      Zy)PostTrG      FrN   user.idrR   rF   posts)foreign_keysbackref)r{   N)r.   rh   ri   r;   rj   rk   rl   rm   titleTextbody
ForeignKey	author_idedited_by_idrq   r   rr   rs   
updated_atrelationshipauthor	edited_byru   rZ   rC   rw   rw   M   s    	2::4	0BIIbiinuI5E99RWWu9-D		"**bmmI&>	OI99RZZy)AD9QL2;;%PJ2;;6J__V9+w_OFl^DIrZ   rw   c                   4   e Zd Zej	                  ej
                  d      Zej	                  ej
                  ej                  d      d      Zej	                  ej
                  ej                  d      d      Z	ej	                  ej                  d      d      Zej	                  ej                  d      Zej	                  ej                  ej                   d      Zej%                  d	ej'                  d
dd            Zej%                  d      Zy)CommentTrG   zpost.idFrN   ry   rI   rR   rw   commentszall, delete-orphan)cascadelazy)r|   rF   N)r.   rh   ri   r;   rj   rk   rl   r   post_iduser_idrm   nicknamer~   r   rq   r   rr   rs   r   r|   postrP   ru   rZ   rC   r   r   Y   s    	2::4	0Bii

BMM)$<uiMGii

BMM)$<tiLGyy2y7H99RWWu9-D2;;%PJ??62::jJ^ei:+j?kD??6"DrZ   r   c                      e Zd Zej	                  ej
                  d      Zej	                  ej                  d      dd      Zej	                  ej                  d      d      Z	ej	                  ej                  dd	      Zej	                  ej                  d      Zej	                  ej
                  ej                  d
      d      Zej!                  d      Zy)PageContentTrG   (   FrJ   x   rN    rR   ry   rF   N)r.   rh   ri   r;   rj   rk   rl   rm   slugr}   r~   r   rq   r   r   updated_by_idr   
updated_byru   rZ   rC   r   r   d   s    	2::4	0B99RYYr]4%9@DIIbiinuI5E99RWWb599D2;;6JIIbjj"--	*BTIRM(JrZ   r   c                 \    t         j                  j                  t        t	        |             S rT   )r;   sessiongetrF   int)r   s    rC   	load_userr   n   s    ::>>$G--rZ   c                  n   t         j                          dD ]_  \  } }t        j                  j	                  |       j                         r5t         j                  j                  t        | |d             a t        j                  j	                  d      j                         sqt        j                  d      }t        ddd	
      }|j                  |       t         j                  j                  |       t        dz  j                  d| dd       t         j                  j                          y )N))offerOffer)portsPorts)server_speczServer Specr   r   )r   r}   r   Gryzakrn      r^   Trn   r`   rp   zinitial_admin_password.txtzLogin: Gryzak
Haslo: z"
Zmien je po pierwszym logowaniu.
r&   r'   )r;   
create_allr   query	filter_byfirstr   addrF   r5   token_urlsaferY   r0   r4   commit)r   r}   rX   r^   s       rC   r@   r@   s   s    MMO_ Ie  ***5;;=JJNN;DBGHI ::288:((,hW4P8$


u	4	4@@$XJ.RS 	A 	
 JJrZ   c                     t        t        j                  j                        j	                  h d      }ddgg dg dg dd}t        j
                  | xs d||g d	d
      S )N>   psubremh1h2h3h4lioluldivimgprecodespaniframestrong
blockquoteclassstyle)hrefr}   targetrel)srcaltr}   widthheight)r   r   r   allowallowfullscreenframeborder)*ar   r   r   )httphttpsmailtoT)tags
attributes	protocolsr:   )setbleach	sanitizerALLOWED_TAGSunionclean)htmlallowed_tagsallowed_attrss      rC   sanitize_htmlr      sk    v''445;; = L
 w/9W	M <<
-[v  C  D  DrZ   c                  \    t         j                  rt         j                  st        d       y y )N  )r   is_authenticatedrb   r   ru   rZ   rC   require_adminr      s     ((0E0Ec
 1FrZ   c                     t         j                  xrA t         j                  xs/ t         j                  xr | j                  t         j
                  k(  S rT   )r   r   rb   re   r   rl   r   s    rC   can_edit_postr      sY    ((  Gl.C.C  /FH^H^  IEcgcqcq  vB  vE  vE  dE  GrZ   c                    t        | j                  xs d      }d|v r#|j                  dd      d   j                         nd}|t        vry | j
                  j                  d       | j
                  j                  d      }| j
                  j                  d       |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      xr |dd dk(  d}|j                  |      sy |S )Nr   .   r   r%   s   PNG

s   )s   GIF87as   GIF89as   RIFF      s   WEBP)r   r   r   r   r   )
r   filenamersplitlowerALLOWED_IMAGE_EXTENSIONSstreamseekread
startswithr   )file_storager   extheader
signaturess        rC   valid_imager      s    |44:;H14(//#q
!"
%
+
+
-bC
**Q  %%b)FQ  !56  1!!/2  !78!!'*Fva|w/FJ >>#JrZ   c                 &   | j                  d      d        }| j                  d      d        }| j                  d      d        }| j                  d      t        d               }| j                  d	      d
        }| j                  dddg      d        }| j                  d      t        d               }| j                  dddg      t        d               }| j                  dddg      t        d               }	| j                  dddg      t        d               }
| j                  ddg      t        d               }| j                  ddg      d        }| j                  ddg      t        d               }| j                  dddg      t        d               }| j                  d dg      t        d!               }| j                  d"ddg      t        d#               }| j                  d$dg      t        d%               }y )&Ndtc                 ,    | r| j                  d      S dS )Nz%Y-%m-%d %H:%M:%Sr   )strftime)values    rC   	format_dtz"register_routes.<locals>.format_dt   s    6;u~~12CCrZ   /c                     t         j                  j                  ddt              } t        j
                  j                  t        j                  j                               j                  | dd      }t        d|t              S )	Npager   )type   F)r  per_page	error_outz	home.html)rz   r   )r   argsr   r   rw   r   order_byrs   descpaginater
   r   )r  rz   s     rC   homezregister_routes.<locals>.home   sa    ||4

##DOO$8$8$:;DD$YZfkDl{%}UUrZ   z/offerc                  x    t         j                  j                  d      j                         } t	        d|       S )Nr   r   	page.htmlr  r   r   r   first_or_404r
   r  s    rC   r   zregister_routes.<locals>.offer   s1      ***8EEG{66rZ   z/portsc                  x    t         j                  j                  d      j                         } t	        d|       S )Nr   r   r  r  r  r  s    rC   r   zregister_routes.<locals>.ports   s3       ***8EEG{66rZ   z/server-specc                  x    t         j                  j                  d      j                         } t	        d|       S )Nr   r   r  r  r  r  s    rC   r   z$register_routes.<locals>.server_spec   s1      ***>KKM{66rZ   z/loginGETPOST)methodsc                     t         j                  dk(  rt        j                  j	                  t         j
                  j                  dd      j                               j                         } | rn| j                  t         j
                  j                  dd            r?t        |        | j                  rt        t        d            S t        t        d            S t        dd	       t        d
      S )Nr  rn   r   r   rX   change_passwordr  zNieprawidlowy login lub haslo.errorz
login.html)r   methodrF   r   r   formr   r:   r   r\   r   rp   r	   r   r   r
   )rP   s    rC   r   zregister_routes.<locals>.login   s    >>V#::''1A1A*b1Q1W1W1Y'Z``bD++GLL,<,<Z,LM4 ,,#G,=$>??002G<|,,rZ   z/logoutc                  >    t                t        t        d            S Nr  )r   r	   r   ru   rZ   rC   logoutzregister_routes.<locals>.logout   s     	((rZ   z/change-passwordc                     t         j                  dk(  rt         j                  j                  dd      } t	        |       dk  rt        dd       t        d      S | t         j                  j                  dd      k7  rt        dd       t        d      S t        j                  |        d	t        _        t        j                  j                          t        d
d       t        t        d            S t        d      S )Nr  rX   r   
   z"Haslo musi miec minimum 10 znakow.r  password_confirmzHasla nie sa takie same.FzHaslo zostalo zmienione.successr  zchange_password.html)r   r  r  r   lenr   r   rY   rp   r;   r   r   r	   r   r
   )rX   s    rC   r  z(register_routes.<locals>.change_password   s     >>V#||''
B7H8}r!:GD 566 W\\--.@"EE0': 566 ))(3491

!!#0)<00566rZ   z	/post/newc                  
   t         j                  st        d       t        j                  dk(  rt        j
                  j                  dd      j                         } t        t        j
                  j                  dd            }| r|st        dd       nat        j                  j                  t        | |t                      t        j                  j                          t        t!        d	            S t#        d
d       S )Nr   r  r}   r   r   zTytul i tresc sa wymagane.r  )r}   r   r   r  post_form.htmlr   )r   rg   r   r   r  r  r   r:   r   r   r;   r   r   rw   r   r	   r   r
   )r}   r   s     rC   post_newz!register_routes.<locals>.post_new   s     ++#J>>V#LL$$Wb1779E !1!1&"!=>D2G<

t%d<PQ

!!#00/d;;rZ   z/post/<int:post_id>/editc                    t         j                  j                  |       }t        |      st	        d       t
        j                  dk(  rt
        j                  j                  dd      j                         |_
        t        t
        j                  j                  dd            |_        t        j                         |_        t         |_        t$        j&                  j)                          t+        t-        d            S t/        d|      S )	Nr   r  r}   r   r   r  r&  r   )rw   r   
get_or_404r   r   r   r  r  r   r:   r}   r   r   r   rr   r   r   r   r;   r   r   r	   r   r
   r   r   s     rC   	post_editz"register_routes.<locals>.post_edit   s     zz$$W-T"#J>>V# ))'26<<>DJ%gll&6&6vr&BCDI&oo/DO)DNJJGFO,,/d;;rZ   z/post/<int:post_id>/deletec                     t                t        j                  j                  |       }t        j
                  j                  |       t        j
                  j                          t        t        d            S r  )
r   rw   r   r)  r;   r   deleter   r	   r   r*  s     rC   post_deletez$register_routes.<locals>.post_delete  sN     	zz$$W-


$


((rZ   z/post/<int:post_id>/commentc           
      X   t         j                  j                  |       }t        j                  j                  dd      j                         }t        j                  rt        j                  n-t        j                  j                  dd      j                         }|sd}|rft        j                  j                  t        |t        j                  rt        nd |d d |d d              t        j                  j                          t        t!        d      d	|j"                   z         S )
Nr   r   r   AnonimrI   i  )r   rP   r   r   r  z#post-)rw   r   r)  r   r  r   r:   r   r   rn   r;   r   r   r   r   r	   r   rl   )r   r   r   r   s       rC   comment_addz$register_routes.<locals>.comment_add  s    zz$$W-||+113,8,I,I<((w||O_O_`jlnOoOuOuOwHJJNN7<C`C`<fju}  B  @B  vC  JN  OT  PT  JU  V  WJJF477)*<<==rZ   z /comment/<int:comment_id>/deletec                     t                t        j                  j                  |       }t        j
                  j                  |       t        j
                  j                          t        t        d            S r  )
r   r   r   r)  r;   r   r-  r   r	   r   )
comment_idcomments     rC   comment_deletez'register_routes.<locals>.comment_delete"  sN     	--**:6


'"


((rZ   z/adminc                  ~   t                t        j                  dk(  rJt        j                  j	                  dd      j                         } t        j                  j	                  dd      }t        j                  j	                  dd      }|dk(  rt        j                  dk7  rt        d	       |d
vrd}| rt        |      dk\  rt        j                  j                  |       j                         sit        | |d      }|j                  |       t        j                   j#                  |       t        j                   j%                          t'        dd       nt'        dd       t        j                  j)                  t        j                  j+                               j-                         }t/        d|      S )Nr  rn   r   rX   r`   rP   rd   r   r   >   rP   rd   r   r   Tr   zUzytkownik zostal dodany.r#  z0Sprawdz login, haslo lub czy konto juz istnieje.r  z
admin.html)users)r   r   r  r  r   r:   r   rn   r   r$  rF   r   r   r   rY   r;   r   r   r   r   r
  ascallr
   )rn   rX   r`   rP   r7  s        rC   r^   zregister_routes.<locals>.admin+  s?    	>>V#||''
B7==?H||''
B7H<<##FF3DxL$9$9X$Ec
--CMQ.tzz7K7KU]7K7^7d7d7fXDtT!!(+

t$

!!#19=H'R

##DMM$5$5$78<<>|599rZ   z/admin/user/<int:user_id>c                    t                t        j                  j                  |       }|j                  dk(  r t        dd       t        t        d            S t        j                  j                  d      }|dk(  r t        j                  j                  |       n|dk(  rOt        j                  j                  dd      }|d	k(  rt        j                  dk7  rt        d
       |dv rS||_        nK|dk(  rFt        j                  j                  dd      }t#        |      dk\  r|j%                  |       d|_        t        j                  j)                          t        t        d            S )Nr   zKonto Gryzak jest chronione.r  r^   actionr-  r`   rP   rd   r   >   rP   rd   rX   r   r   T)r   rF   r   r)  rn   r   r	   r   r   r  r   r;   r   r-  r   r   r`   r$  rY   rp   r   )r   rP   r;  r`   rX   s        rC   admin_user_updatez*register_routes.<locals>.admin_user_updateB  s    	zz$$W-==H$0':GG,--!!(+XJJd#v<<##FF3DxL$9$9X$Ec
)) 	z!||''
B7H8}!!!(+,0)


())rZ   z/admin/page/<slug>c                    t                t        j                  j                  |       j	                         }t
        j                  dk(  rt        t
        j                  j                  dd            |_
        t        j                         |_        t        |_        t         j"                  j%                          | dk(  rdn| }t'        t)        |            S t+        d|      S )Nr   r  r   r   r   zpage_form.htmlr  )r   r   r   r   r  r   r  r   r  r   r   r   rr   r   r   r   r;   r   r   r	   r   r
   )r   r  endpoints      rC   	page_editz"register_routes.<locals>.page_edit[  s     	  ***5BBD>>V#%gll&6&6vr&BCDI&oo/DO*DOJJ(,(=}4HGH-../d;;rZ   z/upload-imagec                     t         j                  st         j                  st        d       t        j
                  j                  d      } | st        ddi      dfS t        |       }|st        ddi      dfS t        j                  d       d| }| j                  t        |z         t        d	t        d
d|       i      S )Nr   filer  z
Brak plikui  z*Dozwolone sa tylko prawdziwe pliki obrazowr   r   locationr   zuploads/)r   )r   rg   rb   r   r   filesr   r   r   r5   r6   saver2   r   )uploadedr   r   s      rC   upload_imagez%register_routes.<locals>.upload_imagei  s     ++L4I4I#J==$$V,G\23S88(#G%QRSUXXX''+,AcU3j8+,
GH(?T$UVWWrZ   )template_filterrouter   )rA   r  r  r   r   r   r   r  r  r'  r+  r.  r1  r5  r^   r<  r?  rF  s                     rC   r>   r>      s   D D 	YYs^V V
 	YYx7 7 	YYx7  7 	YY~7 7 	YYx%Y1	- 2	- 	YYy)  ) 	YY!E6?Y;7  <7 	YY{UFOY4<  5< 	YY)E6?YC<  D< 	YY+fXY>)  ?) 	YY,vhY?	> @	> 	YY1F8YD)  E) 	YYx%Y1:  2:* 	YY*VHY=*  >*. 	YY#eV_Y=
<  >
< 	YYY1X  2XrZ   __main__z0.0.0.0i  T)hostportdebug)8osr5   r   pathlibr   r   flaskr   r   r   r   r	   r
   r   r   flask_loginr   r   r   r   r   r   flask_sqlalchemyr   werkzeug.securityr   r   werkzeug.utilsr   __file__resolveparentBASE_DIRr0   r2   r   r;   r=   
login_viewrD   ModelrF   rw   r   r   user_loaderr   r@   r   r   r   r   r>   rA   r.   runru   rZ   rC   <module>r\     s+   	     [ [ [ f f ' I * >!!#***$ 9,
@ \" 409bhh 06	E288 	E#bhh #)"(( ) . .$D
G(FXR l zGGTG2 rZ   