
     $jE                         d dl Z d dlZd dlZd dlmZ d dlmZ d dl d Z	 G d de
j                  j                        Zy)    N)BytesIO)Path)*c              #      K   t         j                  d|        5  t        | d      5 }	 |j                  d      }|sn| 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY ww)NzCmfLock:rbi    )cmfutilCmfLockopenread)pathfilechunks      ./modules/files/views/index.pyfile_dispatch_generatorr   
   sx     	8D6*	+ $ 			$  		 	 	 s3   A-A!AA!	A-A	A!!A*&A-c                        e Zd ZdZd	 fdZd Zedefd       Zedefd       Z	e
j                  j                  d        Ze
j                  j                  defd       Z xZS )
FileViewz/<path:req_filename>c                     t         j                  | _        t        j                  j                  | j                        st        j                  | j                         t        | !          y )N)	config
UPLOAD_DIR
upload_dirosr   existsmakedirssuper__init__)self	__class__s    r   r   zFileView.__init__   s?     ++ww~~doo.KK(    c                    t         j                  dv rdnd}t        j                  d| dt        j                          |j                  d      }|d   dk7  rt        j                  d	|        y
d}t        j                  rPt         j                  j                  d      }|rt        j                  |      }|st        j                  d|        |s t        j                  j                  |d         }|j                  d      rA|d   dv }|d   j!                  d      }|s|r"t        j                  j                  |d         }|d   dk(  r"t        j                  j                  |d         }t#        |      dk  s|d   dk7  rt        j                  d|        y
t        j%                  |dg      }|st        j                  d|        y
t        j&                  dk(  r`t)        |t*        j,                        r6|j/                  |j0                        r|j2                  j5                         S y
|j5                         S t        j&                  dk(  re|dk(  r`t)        |t*        j,                        r6|j/                  |j0                        r|j2                  j7                         S y
|j7                         S t        j8                  r=t        j                  |k7  r*t        j                  dt        j                   d|        y
t*        j:                  j=                  |d
|j>                  j@                  |jB                  |j0                  j@                  d !      S )"u   
        Проверяем доступ к файлу
        g.sharelink_access_request = False
        g.sharelink_access_granted = False
        g.sharelink_access_obj = None
        )GETHEADr   writeuA   Попытка анонимного доступа к файлу z, sharelink=/r   obju`   Анонимный доступ возможен только к файлам вложений: FNRefereru_   Не найден или не определён объект для вложения: referer=.meta)zpreview.docpreview.pdfpreview_img.pngthumbnail.jpgpreview.jpgfullviewexport%   :u;   Недопустимый путь для вложения: parentfieldsuc   Не найден или не определён объект для вложения: path_obj_id=sd_apipub_apizShare link for z, but attachment for attachments)access_levelraise_errorinitial_acl_keyobject_model	object_idobject_field)"requestmethodgdebugsharelink_access_objsplitr   PUBLIC_FILES_HACKheadersgetr   get_url_path_objurllibparseunquoteendswith
startswithlenget_obj_by_id	api_scope
isinstancemodels
CmfCommentcheck_visibilityidr3   _sdesk_check_access_pub_check_writesharelink_access_requestCmfAccessListcheck_accessperm_effective_acl_idvalue
class_name)	r   req_filenamer9   
path_partsr$   refererobj_id
is_previewis_fullviews	            r   _check_accesszFileView._check_access    s$    ")?!Bv 	
ST`Saamno  oE  oE  nF  G  	H "'',
a=E!GGv  xD  wE  F  G ##oo)))4G..w7y  {B  zC  D  E\\))*R.9Fw''^/
(n77
C#\\11*R.AF"~)--jn=6{b F3K3$6UVbUcde''z'BC}  E  ~F  G  H ;;("#v001''/::99;;**,,;;)#(?#v001''/::6688 ''))%%%%,/!*@*@)AAVWZV[\]
 ##00%555;;#..ffll&	 1 ( 	(r   r^   c                    | j                  d      }|d   }|d   }t        |      dk  s|d   dk7  r
|d   }|d   }t        j                  j	                  ||dd	g
      }|s)|dz  }t        j                  j	                  ||dd	g
      }|S )Nr#         r0   r1   r2      z--url)namer3   r5   z
?version=1)rD   rN   rR   CmfAttachmentrG   )r^   r_   ra   filenameattachs        r   _get_attachmentzFileView._get_attachment{   s    !'',
Aa=v;"ss 2]F!!}H%%))xPTV[})] $H))--8FTXZ_S`-aFr   c                 D   t        |       }d }|j                  dk(  rt        |j                  dz        }t        j
                  j                  |ddg      }t        j
                  j                  | ddg      }|r|st        j                  |      }|j                  ddd	       t        j
                  j                  |ddg      }|j                         }|j                  |j                         t        |j                               |j                          |S )
Nr*   r+   r3   abspathrU   r5   rU   r   F)backupmake_preview)r   rj   strr3   rR   CmfRFilerG   r"   	get_rfile_process_imagetmp_readonly_pathrp   delete)r^   req_filename_paththumbnail_rfilethumbnail_id	png_rfilerfiles         r   _fallback_previewzFileView._fallback_preview   s     .""&77077/IJL$oo11\8U^J_1`O++|XyDY+ZI"(//\/"B%%cU%K"(//"5"5xYbNc"5"d!++-$$Y%@%@%BCH_H_D`ar   c                     	 t         j                  j                          |j	                  d      st        j                  d       y| j                  |      rn| j                  |      }|s#t         j                  j                  |ddg      }|s@t         j                  j                  t        j                  j                  |      ddg      }|s	 t        j                  j                  |      j                  d      }|d   j                  d	      d
   }|j                  d|d   dt!        |      dz           t         j                  j                  dj#                  |      ddg      }|s6|j	                  d      r%| j+                  |      }|j-                  ddg      }|s9|j	                  d      s(d| }t         j                  j                  |ddg      }|syt.        j0                  j                  d      }|r|j2                  dv s|j2                  j	                  d      rtt         j                  j                  |j4                  j6                  j8                  j;                  dd            }|j=                  |      }	|	d    d|j2                   }
n|j=                  |      }	|	d   }
t         j                  j                  |
ddg      }t        j                  j?                  d|       }t         j@                  jC                  |      }|r|j2                  r|j2                  }n-|r#|j2                  r|j2                  j8                  }nd| ddfS d}|j2                  j8                  jE                  d      \  }}}|dv rd}tF        jH                  jK                  |jM                         ||      S tO        d d!i      S # t        $ r Y w xY w# t$        $ r }t&        j)                  |       Y d}~d}~ww xY w)"u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        obj/   Неверный доступ!zBad requesti  r3   rp   rq   r#   rf   r2   r   Nrh   r4   z/obj/)z	Not found  version)r*   r)   zfullview.pdfr+   r,   r-   r'    rr   r   ./files/)ri   u   Объект u7    не найден или возможно удалёнr   )gztgzzapplication/octet-stream)download_namemimetypeerror   Нет доступа)(rR   rY   activate_admin_modeCmfPermissionErrorrM   loggingwarningrd   r   rv   rG   rI   rJ   unquote_plusrD   insertrN   join	ExceptionrA   rB   rn   rw   r?   argsrj   r3   rU   r\   replaceget_versionquoterk   sget
rpartitionflaskhelpers	send_filery   jsonify)r   r^   	cmf_rfilepartsr]   erm   r   parent_rfilerfile_version	file_path	full_path
attachmentr   r   _file_exts                    r   rG   zFileView.get   s   (	  446 &&v.OO<=%l+..|<I"OO//<S\H]/^	"OO//6<<3L3L\3Zdlnwcx/y	"LL55lCII#NE!&q!4Q!7JLLE!H-Ac*o.A$BC & 3 3sxxPXZcOd 3 eI !8!8!@--l;",,Xy4I,J	\%<%<V%D!&|n5"OO//<S\H]/^	'll&&y1G>>%ww^^..z:#)??#6#6):J:J:M:M:S:S:[:[\cdf:g#6#hL$0$<$<W$EM#0#8"99>>:J KI$-$9$9'$BM -f 5I"OO//9hPYEZ/[	 **W\N+CDI--22y2AJjoo *y~~ ) 4 4%i[0ghjmmm H&^^11<<SANAq(=(5 ==**++-+! +   G%<=>>W " 		* ! GGAJJs*   O BO$ 	O! O!$	P-PPc           	         |j                  d      st        j                  d       y	 t        j                  j                          | j                  |      st        d      t        j                  j                  d      }|st        d      t        j                  j                  d|       }t        j                  j                  |dg	      }|st        d
      t         j"                  j$                  r|j'                         }t)        |      }t+        j,                         5 }|j/                  |       |j1                          t2        j5                  |j6                  |dt9        |j6                              s$t;        d       t=        ddd      }|cddd       S 	 ddd       	 |j?                         r|jA                  |       nD|jC                         r|jE                  |       n"|jG                  |dt        jH                         t=        d|jN                  jP                  d      S # t        $ r Y w xY w# 1 sw Y   xY w# t        $ r+}t        jJ                  |       |jM                           d}~ww xY w)u   
        Сохраняем файл в объекте

        :param req_filename: Путь к сохраняемому файлу

        :return: Ответ клиенту
        :rtype: Response
        r   r   r   r   r   u   Не передан файлr   r   )ri   r5   u.   Сначала создайте CmfAttachment!POST)req_urlr@   rl   u'   Недопустимый контент	Forbidden)resultr   NF)smart_backup	file_sizeOK)r   
attach_url))rM   r   r   rR   rY   r   r   rd   r   r?   filesrG   rI   rJ   r   rk   rA   global_settingsicap_enabler   r   tempfileNamedTemporaryFiler"   flushr   
icap_checkrj   ru   	cmf_alertr   sdesk_check_writesdesk_upload_stream_filepub_check_writepub_upload_stream_fileupload_stream_filecontent_length	exceptionrz   ri   r\   )	r   r^   	load_fileri   r   content	temp_fileresponser   s	            r   postzFileView.post  s+    &&v.OO<=%	  446 !!,/344 MM%%f-	:;;ll  7<.!9:))--#se-D
LMM ((nn&G(I,,. 	$) (!)))..#f_bcmcrcr_s)tGH&+Hq'rsH#	$ 	$
 u	$
	++-33I>++-11)<--ieW^WmWm-n $jnn6J6JKLL[ " 		(	$ 	$(  	a 	s7   H7 )A2I/A&I 7	III	J&JJ)returnN)__name__
__module____qualname____url__r   rd   staticmethodru   rn   r   cmfviewsactionrG   r   __classcell__)r   s   @r   r   r      s    $GY(v c     ( 	YY`? `?D 	YYCM CM CMr   r   )r   r   urllib.parserI   ior   pathlibr   cmf.includer   r   r   BaseViewr    r   r   <module>r      s6         rMsyy!! rMr   