
    JSiE                         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Zd dl	m
Z
mZ d dlZd dl d Z G d dej                   j"                        Zy)	    N)BytesIO)Path)Responsestream_with_context)*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idr5   _sdesk_check_access_pub_check_writesharelink_access_requestCmfAccessListcheck_accessperm_effective_acl_idvalue
class_name)	r   req_filenamer;   
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%         r2   r3   r4      z--url)namer5   r7   z
?version=1)rF   rP   rT   CmfAttachmentrI   )r`   ra   rc   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-   r5   abspathrW   r7   rW   r    F)backupmake_preview)r   rl   strr5   rT   CmfRFilerI   r$   	get_rfile_process_imagetmp_readonly_pathrr   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        d      | j                  |      rY| 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t        d|       t*        j,                  j                  d      }|r|j.                  dv s|j.                  j	                  d      rtt         j                  j                  |j0                  j2                  j4                  j7                  dd            }|j9                  |      }	|	d    d|j.                   }
n|j9                  |      }	|	d   }
t         j                  j                  |
ddg      }t         j:                  j=                  t        j                  j?                  d|             }|xr |j.                  xs |j.                  j4                  }d
}|j.                  j4                  jA                  d      \  }}}|dv rd}tB        jD                  jG                  |jI                         ||      S tK        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/   Неверный доступ!r5   rr   rs   r%   rh   r4   r   Nrj   r6   z/obj/u   Файл не найден: version)r,   r+   zfullview.pdfr-   r.   r/   r)    rt   r   ./files/)rk   )gztgzzapplication/octet-stream)download_namemimetypeerror   Нет доступа)&rT   r[   activate_admin_modeCmfPermissionErrorrO   	Exceptionrf   r   rx   rI   rK   rL   unquote_plusrF   insertrP   joinrC   rD   rp   ry   rA   argsrl   r5   rW   r^   replaceget_versionrm   sgetquote
rpartitionflaskhelpers	send_filer{   jsonify)r   r`   	cmf_rfilepartsr_   ero   r   parent_rfilerfile_version	file_path
attachmentr   r   _file_exts                   r   rI   zFileView.get   s   (	  446 &&v.<==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]/^	">|n MNN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/[	  --22v||7I7IGT`SaJb7c2dJ&::??Rinn>R>RM H&^^11<<SANAq(=(5 ==**++-+! +   G%<=>>G " 		( ! GGAJJs*   N4 	BO 4	O O	O-O((O-c           	         |j                  d      st        d      	 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+                  |       |j-                          t.        j1                  |j2                  |d
t5        |j2                              s$t7        d       t9        ddd      }|cddd       S 	 ddd       	 |j;                         r|j=                  |       nD|j?                         r|jA                  |       n"|jC                  |dt        jD                         t9        d|jL                  jN                  d      S # t
        $ r Y w xY w# 1 sw Y   xY w# t        $ r+}tG        jH                  |       |jK                           d}~ww xY w)u   
        Сохраняем файл в объекте

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

        :return: Ответ клиенту
        :rtype: Response
        r   r   r   r   u   Не передан файлr   r   )rk   r7   u.   Сначала создайте CmfAttachment!POST)req_urlrB   rn   u'   Недопустимый контент	Forbidden)resultr   NF)smart_backup	file_sizeOK)r   
attach_url)(rO   r   rT   r[   r   r   rf   rA   filesrI   rK   rL   r   rm   rC   global_settingsicap_enabler   r   tempfileNamedTemporaryFiler$   flushr
   
icap_checkrl   rw   	cmf_alertr   sdesk_check_writesdesk_upload_stream_filepub_check_writepub_upload_stream_fileupload_stream_filecontent_lengthlogging	exceptionr|   rk   r^   )	r   r`   	load_filerk   r   content	temp_fileresponser   s	            r   postzFileView.post   s'    &&v.<==	  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   H, A2H<$A&I ,	H98H9<I	I<&I77I<)returnN)__name__
__module____qualname____url__r   rf   staticmethodrw   rp   r   cmfviewsactionrI   r   __classcell__)r   s   @r   r   r      s    $GY(v c     ( 	YYX? X?t 	YYBM BM BMr    r   )r   r   urllib.parserK   ior   pathlibr   	mimetypesr   r   r   shutilcmf.includer   r   r   BaseViewr    r    r   <module>r      s?          /  iMsyy!! iMr    