U
    #sgd                     @   s  d dl m Z  d dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dl	Z	d dl
mZ dejkZdZdZdd	d
ZedZedZedddZedddZejerenedZeeZeZe Zeejerened eddreddZ ndZ eejerened dd Z!dZ"eddrLe#ddZ"dZ$z$e%e!dd Z&e&d krre&d Z$W n e'k
r   Y nX dZ(z$e%e!dd Z)e)d kre)d Z(W n e'k
r   Y nX e!ddZ*dZ+dZ,ed d!re#d d!Z,e-e.Z/dd"d#Z0d$d% Z1d&d' Z2d(d) Z3d*d+ Z4d,d- Z5d.d/ Z6d0d1 Z7d2d3 Z8dd5d6Z9d7d8 Z:d9d: Z;d;d< Z<d=d> Z=d?d@ Z>dAdB Z?dCdD Z@dEdF ZAdGdH ZBdIdJ ZCdKdL ZDdMdN ZEdOdP ZFdQdR ZGdSdT ZHdUdV ZIdWdX ZJdYdZ ZKd[d\ ZLd]d^ ZMd_d` ZNdadb ZOdcdd ZPdedf ZQdgdh ZRdidj ZSdkdl ZTdmdn ZUdodp ZVdqdr ZWdsdt ZXdudv ZYdwdx ZZdydz Z[d{d| Z\d}d~ Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd ZldddZmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dddZ}dd Z~dd ZddĄ ZdddǄZddɄ Zdd˄ Zdd̈́ Zddτ ZdS )    )datetimeN)urlparse)SearpcErrorZSEAFILE_DEBUG)CCNET_CONF_DIRSEAFILE_CONF_DIRiTc                 C   sN   t j| d}|s&|r"td|  d S tr:td| |f  t jt j|S )N zISeaserv cannot be imported, because environment variable %s is undefined.zLoading %s from %s)	osenvirongetImportError_DEBUGprintpathnormpath
expanduser)keycheckv r   c/opt/seafile-pro-server-build/seafile-server/seafile/lib/python3.8/site-packages/seaserv/service.py_load_path_from_env   s    r   r   r   SEAFILE_CENTRAL_CONF_DIRF)r   SEAFILE_RPC_PIPE_PATHzseafile.sockz
ccnet.confZLDAPZHOSTzseafile.confc                 C   s*   dD ] }t || rt ||   S q|S )z.
    "fileserver" used to be "httpserver"
    )
fileserverZ
httpserver)config
has_optionr
   )r   defaultZsectionr   r   r   get_fileserver_option6   s    r   r   Zuse_go_fileserverZmax_upload_sizei   i  @Zmax_download_dir_sizeZportZ8082ZquotaZcalc_share_usagec                 C   s0   |dkrd}n|dkrd}nd}t | |||S )NTZactiveFZinactiver   )ccnet_threaded_rpcget_emailusers)sourcestartlimitZ	is_activeZstatusr   r   r   r   `   s    r   c                  C   s6   zt  } W n tk
r$   d} Y nX | dk r2dS | S Nr   )r   count_emailusersr   retr   r   r   r%   j   s
    
r%   c                 C   s
   t | S N)r   get_emailuser_with_import)emailr   r   r   r)   q   s    r)   c                 C   s4   t | }zt|}W n tk
r.   d }Y nX |S r(   )intr   	get_groupr   )group_idgroup_id_intgroupr   r   r   r,   u   s    
r,   c                 C   s8   zt | |}W n tk
r(   g  Y S X dd |D S )Nc                 S   s   g | ]}t |js|qS r   is_org_groupid.0xr   r   r   
<listcomp>   s     
 z'get_personal_groups.<locals>.<listcomp>)r   Zget_all_groupsr   )r!   r"   
groups_allr   r   r   get_personal_groups}   s
    
r8   c                 C   s6   zt | }W n tk
r&   g  Y S X dd |D S )Nc                 S   s   g | ]}t |js|qS r   r0   r3   r   r   r   r6      s     
 z/get_personal_groups_by_user.<locals>.<listcomp>r   Z
get_groupsr   )r*   r7   r   r   r   get_personal_groups_by_user   s
    
r:   c                 C   s.   zt | |}W n tk
r(   d}Y nX |S Nr   )r   is_group_userr   )r-   userr'   r   r   r   r<      s
    
r<   c              
   C   sZ   t | } zt| |}W n0 tk
rH } zt| d}W 5 d}~X Y nX |dkrVdS dS )zCheck where user is group staffr   N   TF)r+   r   check_group_staffr   loggererror)r-   usernamer'   er   r   r   r?      s    
r?   c                 C   s
   t | S )z)
    Remove group user relationship.
    )r   remove_group_user)r=   r   r   r   rD      s    rD   r$   c                 C   s8   t | }zt|||}W n tk
r2   g }Y nX |S r(   )r+   r   get_group_membersr   )r-   r!   r"   r.   membersr   r   r   rE      s    
rE   c                 C   s8   zt | }W n tk
r&   d}Y nX |dkr4dS dS Nr$   r>   TF)r   r1   r   )r-   r'   r   r   r   r1      s
    
r1   c                 C   s,   zt | }W n tk
r&   d}Y nX |S Nr$   )r   get_org_id_by_groupr   )r-   org_idr   r   r   rI      s
    
rI   c                 C   s0   zt | ||}W n tk
r*   g }Y nX |S r(   )r   get_org_groupsr   )rJ   r!   r"   groupsr   r   r   rK      s
    
rK   c                    s:   zt |}W n tk
r&   g  Y S X  fdd|D S )z#
    Get user's groups in org.
    c                    s   g | ]} t |jkr|qS r   )rI   r2   r3   rJ   r   r   r6      s      z*get_org_groups_by_user.<locals>.<listcomp>r9   )rJ   r=   r7   r   rM   r   get_org_groups_by_user   s
    
rN   c                 C   s   t | || d S r(   )r   
create_org)Zorg_name
url_prefixrB   r   r   r   rO      s    rO   c                 C   s,   zt | }W n tk
r&   d }Y nX |S r(   )r   get_org_by_url_prefixr   )rP   orgr   r   r   rQ      s
    
rQ   c                 C   s,   zt | }W n tk
r&   d }Y nX |S r(   )r   get_org_by_idr   )rJ   rR   r   r   r   rS      s
    
rS   c                 C   s,   zt | || W n tk
r&   Y nX d S r(   )r   add_org_userr   )rJ   r*   Zis_staffr   r   r   rT      s    rT   c                 C   s*   zt | | W n tk
r$   Y nX d S r(   )r   remove_org_userr   )rJ   r*   r   r   r   rU      s    rU   c                 C   s:   zt | |}W n tk
r(   d}Y nX |dkr6dS dS rG   )r   org_user_existsr   rJ   r=   r'   r   r   r   rV      s
    
rV   c                 C   s(   zt | ||}W n   g }Y nX |S )z
    List org users.
    )r   Zget_org_emailusers)rP   r!   r"   usersr   r   r   get_org_users_by_url_prefix   s
    
rY   c                 C   s,   zt | }W n tk
r&   g }Y nX |S r(   )r   get_orgs_by_userr   )r=   orgsr   r   r   rZ      s
    
rZ   c                 C   s:   zt | |}W n tk
r(   d}Y nX |dkr6dS dS )z/
    Check whether user is staff of a org.
    r$   r>   TF)r   is_org_staffr   rW   r   r   r   r\     s
    
r\   c                 C   s(   t | }|D ]}|j|kr|  S qd S r(   )rZ   rP   )r=   rP   r[   rR   r   r   r   get_user_current_org  s
    

r]   c                 C   s*   t  }||  |jd }t | |S )N   )pool
get_clientZsend_cmdZresponsereturn_client)Zcommandclientr'   r   r   r   send_command  s
    


rc   c                 C   s"   t  }|| | t | d S r(   )r_   r`   send_messagera   )Zmsg_typeZcontentrb   r   r   r   rd      s    rd   c                 C   s\   zt | }W n tk
r&   g  Y S X |s0g S g }|dD ]}|dkrLq>|| q>|S )zGet peer ids of a given email
r   )r   get_binding_peeridsr   splitappend)r*   Zpeer_idsZpeerid_listZpeer_idr   r   r   rf   %  s    
rf   c                   C   s   t ddS )z"
    Return repository list.

    r   d   )seafserv_threaded_rpcZget_repo_listr   r   r   r   	get_repos9  s    rk   c                 C   s
   t | S r(   )rj   get_reporepo_idr   r   r   rl   @  s    rl   c              
   C   sL   zt | |||}W n& tk
r: } zd}W 5 d }~X Y nX |dkrHdS dS )Nr$   r   TF)rj   	edit_repor   )rn   namedescr=   r'   rC   r   r   r   ro   C  s
    ro   c              
   C   sJ   zt | |||}W n0 tk
rD } zt| d}W 5 d}~X Y nX |S )zH
    Return repo id if successfully created a repo, otherwise None.
    N)rj   create_repor   r@   rA   )rp   rq   r=   passwdr'   rC   r   r   r   rr   J  s    
rr   c              
   C   sP   zt | }W n0 tk
r> } zt| d}W 5 d}~X Y nX |dkrLdS dS )zF
    Return true if successfully removed a repo, otherwise false.
    r$   Nr   TF)rj   remove_repor   r@   rA   rn   r'   rC   r   r   r   rt   U  s    
rt   c                 C   s,   zt | }W n tk
r&   g }Y nX |S )z5
    List users owned repos in personal context.
    )rj   Zlist_owned_reposr   )ownerreposr   r   r   list_personal_repos_by_owner`  s
    
rx   c                 C   s   t | |S r(   )rj   get_repo_token_nonnull)rn   rB   r   r   r   ry   j  s    ry   c                 C   s,   zt | }W n tk
r&   d}Y nX |S )z
    Get owner of a repo.
    r   rj   get_repo_ownerr   rn   r'   r   r   r   r{   m  s
    
r{   c                 C   s.   zt | |}W n tk
r(   d}Y nX |S )z+
    Check whether user is repo owner.
    r   )rj   is_repo_ownerr   )r=   rn   r'   r   r   r   r}   w  s
    
r}   c                 C   s,   zt | }W n tk
r&   d}Y nX |S r;   )rj   server_repo_sizer   )rn   sizer   r   r   r~     s
    
r~   c                 C   s4   zt | ||||}W n tk
r.   d}Y nX |S )z;
    Create org repo, return valid repo id if success.
    N)rj   create_org_repor   )Z	repo_nameZ	repo_descr=   rs   rJ   rn   r   r   r   r     s      
r   c                 C   s   t | }|dkrdS dS )Nr   TF)get_org_id_by_repo_idrn   rJ   r   r   r   is_org_repo  s    r   c                 C   s.   zt | |}W n tk
r(   g }Y nX |S r(   )rj   list_org_repos_by_ownerr   )rJ   r=   rw   r   r   r   r     s
    
r   c                 C   sJ   zt | ||}W n tk
r*   g }Y nX |rF|D ]}t|j|_q4|S )z$
    List repos created in org.
    )rj   Zget_org_repo_listr   get_org_repo_ownerr2   rv   )rJ   r!   r"   rw   rr   r   r   get_org_repos  s    
r   c                 C   s,   zt | }W n tk
r&   d}Y nX |S )z'
    Get org id according repo id.
    r$   )rj   r   r   r   r   r   r   r     s
    
r   c                 C   s    t |}|sdS ||krdS dS )z[
    Check whether user is org repo owner.
    NOTE:
    	`org_id` may used in future.
    FT)r   )rJ   rn   r=   rv   r   r   r   is_org_repo_owner  s    r   c                 C   s,   zt | }W n tk
r&   d}Y nX |S )z 
    Get owner of org repo.
    N)rj   r   r   rn   rv   r   r   r   r     s
    
r   c                 C   s0   zt | ||}W n tk
r*   d}Y nX |S )z Get a commit. N)rj   
get_commitr   )rn   Zrepo_versionZcmt_idr'   r   r   r   r     s
    
r   c                 C   s0   zt | ||}W n tk
r*   d}Y nX |S )zGet commit lists.N)rj   Zget_commit_listr   )rn   offsetr"   r'   r   r   r   get_commits  s
    
r   c                 C   s
   t | S )zGet branches of a given repo)rj   Zbranch_getsrm   r   r   r   get_branches  s    r   c                 C   s,   zt | }W n tk
r&   g }Y nX |S )z6
    List user's repos that are sharing to groups
    )rj   get_group_repos_by_ownerr   r=   r'   r   r   r   r     s
    
r   c                 C   sd   zt | }W n tk
r&   d}Y nX |s0g S g }|dD ] }|sHq>t|}|r>|| q>|S Nr   re   )rj   get_shared_groups_by_repor   rg   r,   rh   )rn   	group_idsrL   r-   r/   r   r   r   r     s    
r   c                 C   s4   | sg S g }|  dD ]}|dkr$q|| q|S )z4
    Convert repo ids seperated by "
" to list.
    re   r   )rg   rh   )repo_idsrepoid_listrn   r   r   r   conv_repoids_to_list   s    r   c                 C   s0   zt | }W n tk
r&   g  Y S X t|S )z!Get repo ids of a given group id.)rj   get_group_repoidsr   r   )r-   r   r   r   r   r     s
    
r   c                 C   s   t | }g }|D ]d}|sqt|}|s(qt||_||jkrBdnd|_t|jddd }|rd|jnd|_	|
| q|dd  |S )zGet repos of a given group id.TFr   r>   Nc                 S   s   t |j| jS r(   cmplatest_modifyr5   yr   r   r   <lambda>*      z!get_group_repos.<locals>.<lambda>)r   rl   rj   Zget_group_repo_ownerrv   Zshare_from_mer   r2   ctimer   rh   sort)r-   r=   r   rw   rn   repolast_commitr   r   r   get_group_repos  s    r   c                 C   s   t | || d S r(   )rj   del_org_group_repo)rn   rJ   r-   r   r   r   r   /  s    r   c                 C   s2   zt | |}W n tk
r(   d}Y nX t|S Nr   )rj   get_org_group_repoidsr   r   )rJ   r-   r   r   r   r   r   2  s
    
r   c                 C   s   t | |}|sg S g }|D ]h}|s$qt|}|s2qt| |||_||jkrPdnd|_t|jddd }|rr|jnd|_	|
| q|dd  |S )z"Get org repos of a given group id.TFr   r>   Nc                 S   s   t |j| jS r(   r   r   r   r   r   r   Q  r   z%get_org_group_repos.<locals>.<lambda>)r   rl   rj   Zget_org_group_repo_ownerrv   Zsharecd_from_mer   r2   r   r   rh   r   )rJ   r-   r=   r   rw   rn   r   r   r   r   r   get_org_group_repos:  s(    
r   c                 C   sf   zt | |}W n tk
r(   d}Y nX |s2g S g }|dD ] }|sJq@t|}|r@|| q@|S r   )rj   get_org_groups_by_repor   rg   r,   rh   )rJ   rn   r   rL   r-   r/   r   r   r   r   U  s     
r   c                 C   s,   zt | }W n tk
r&   g }Y nX |S )z(
    List a user's inner pub repos.
    )rj   list_inner_pub_repos_by_ownerr   r   r   r   r   r   h  s
    
r   c                 C   sJ   zt  }W n   g }Y nX |D ]}t|jj| |_q"|dd  |S )z@
    List inner pub repos, which can be access by everyone.
    c                 S   s   t |jj| jjS r(   r   propslast_modifiedr   r   r   r   r   ~  r   z&list_inner_pub_repos.<locals>.<lambda>)rj   list_inner_pub_reposcheck_permissionr   rn   	user_permr   )rB   shared_reposr   r   r   r   r   r  s    
r   c                  C   s6   zt  } W n tk
r$   d} Y nX | dk r2dS | S r#   )rj   count_inner_pub_reposr   r&   r   r   r   r     s
    
r   c                 C   s,   zt | }W n tk
r&   d}Y nX |S )zg
    Check whether a repo is public.
    Return 0 if repo is not inner public, otherwise non-zero.
    r   )rj   is_inner_pub_repor   r|   r   r   r   r     s
    
r   c                 C   s   t |  d S r(   )rj   unset_inner_pub_reporm   r   r   r   r     s    r   c                 C   sT   zt | }W n tk
r&   g }Y nX |D ]}t|jj||_q,|dd  |S )zK
    List org inner pub repos, which can be access by all org members.
    c                 S   s   t |jj| jjS r(   r   r   r   r   r   r     r   z*list_org_inner_pub_repos.<locals>.<lambda>)rj   list_org_inner_pub_reposr   r   r   rn   r   r   )rJ   rB   r!   r"   r   r   r   r   r   r     s    
r   c                 C   s.   zt | |}W n tk
r(   d}Y nX |S )zi
    Check whether user has permission to access repo.
    Return values can be 'rw' or 'r' or None.
    N)rj   r   r   )rn   r=   r'   r   r   r   r     s
    
r   c                 C   s4   zt | }W n tk
r&   d}Y nX |r0dS dS )z.
    Check whether repo is personal repo.
    r   TFrz   r   r   r   r   is_personal_repo  s
    
r   c                 C   s2   zt | |||}W n tk
r,   g }Y nX |S r(   )rj   list_share_reposr   )r=   Z
share_typer!   r"   r'   r   r   r   r     s     
r   c                 C   s   t | || d S r(   )rj   remove_share)rn   	from_userZto_userr   r   r   r     s    r   c                 C   s   t | t||S r(   )rj   Zgroup_unshare_repor+   )rn   r-   r   r   r   r   unshare_group_repo  s    r   c                 C   s:   t | |||}|D ]}t|jj| |_q|dd  |S )z
    List personal repos that user share with others.
    If `user_type` is 'from_email', list repos user shares to others;
    If `user_type` is 'to_email', list repos others share to user.
    c                 S   s   t |j| jS r(   r   r   r   r   r   r   r     r   z,list_personal_shared_repos.<locals>.<lambda>)r   r   r   rn   r   r   )r=   	user_typer!   r"   share_reposr   r   r   r   list_personal_shared_repos  s
    r   c                 C   s\   zt | ||||}W n tk
r.   g }Y nX |D ]}t|jj||_q4|dd  |S )z
    List org repos that user share with others.
    If `user_type` is 'from_email', list repos user shares to others;
    If `user_type` is 'to_email', list repos others sahre to user.
    c                 S   s   t |j| jS r(   r   r   r   r   r   r     r   z'list_org_shared_repos.<locals>.<lambda>)rj   list_org_share_reposr   r   r   rn   r   r   )rJ   r=   r   r!   r"   r   r   r   r   r   list_org_shared_repos  s      
r   c                 C   s0   zt | ||}W n tk
r*   d }Y nX |S r(   )rj   list_dir_by_pathr   )rn   Z	commit_idr   r'   r   r   r   r     s
    
r   c              
   C   sV   zt | |||}W n0 tk
rD } zt| d}W 5 d}~X Y nX |dkrRdS dS )zG
    Return true if successfully make a new file, otherwise false.
    r$   Nr   TF)rj   post_empty_filer   r@   rA   rn   Z
parent_dir	file_namer=   r'   rC   r   r   r   r     s     
r   c              
   C   sV   zt | |||}W n0 tk
rD } zt| d}W 5 d}~X Y nX |dkrRdS dS )zE
    Return true if successfully delete a file, otherwise false.
    r$   Nr   TF)rj   del_filer   r@   rA   r   r   r   r   r     s     
r   c                 C   s.   zt d| }W n tk
r(   d}Y nX |S )z=
    Check whether file name or directory name is valid.
    r   r   )rj   is_valid_filenamer   )Zfile_or_dirr'   r   r   r   r     s
    
r   c              
   C   s>   zt | ||}W n& tk
r8 } zd}W 5 d }~X Y nX |S r;   )rj   get_file_sizer   )Zstore_idversionZfile_idZfsrC   r   r   r   r     s
    r   c              
   C   s<   zt | |}W n& tk
r6 } zd}W 5 d }~X Y nX |S r   )rj   get_file_id_by_pathr   )rn   r   r'   rC   r   r   r   r   "  s
    r   c           	      C   s   t | }|sg S |g}t| }|D ].}t|j}|D ]}|j|kr6||j q6q$t|ddd}|D ]$}|j| krf|j	|krf||j	 qf|S )zGive a repo id, returns a list of users of:
    - the repo owner
    - members of groups to which the repo is shared
    - users to which the repo is shared
    
from_emailr$   )
rj   r{   r   rE   r2   	user_namerh   r   rn   r=   )	rn   rv   rX   rL   r/   rF   memberr   r   r   r   r   get_related_users_by_repo)  s     




r   c           
      C   s   t |}|sg S |g}t| |}|D ].}t|j}|D ]}|j|kr6||j q6q$t| |ddd}|D ]$}	|	j|krj|	j	|krj||	j	 qj|S )z-Org version of get_related_users_by_repo
    r   r$   )
r   r   rE   r2   r   rh   rj   r   rn   r=   )
rJ   rn   rv   rX   rL   r/   rF   r   r   r   r   r   r   get_related_users_by_org_repoF  s*    


   

r   c              
   C   sF   zt | |}W n0 tk
r@ } zt| d}W 5 d }~X Y nX |S rH   )rj   check_quotar   r@   rA   )rn   Zdeltar'   rC   r   r   r   r   d  s    
r   c              
   C   sD   zt | }W n0 tk
r> } zt| d}W 5 d }~X Y nX |S r;   )rj   get_user_quotar   r@   rA   r=   r'   rC   r   r   r   r   l  s    
r   c              
   C   sD   zt | }W n0 tk
r> } zt| d}W 5 d }~X Y nX |S r;   )rj   get_user_quota_usager   r@   rA   r   r   r   r   r   t  s    
r   c              
   C   sD   zt | }W n0 tk
r> } zt| d}W 5 d }~X Y nX |S r;   )rj   get_user_share_usager   r@   rA   r   r   r   r   r   |  s    
r   r>   c              
   C   sB   zt | ||||}W n& tk
r< } zd}W 5 d }~X Y nX |S r   )seafserv_rpcweb_get_access_tokenr   )rn   Zobj_idoprB   Zuse_onetimer'   rC   r   r   r   r     s
    r   c              
   C   s<   zt | |}W n& tk
r6 } zd}W 5 d}~X Y nX |S )zx
    Remove user password of a encrypt repo.
    Arguments:
    - `repo_id`: encrypt repo id
    - `user`: username
    r$   N)rj   Zunset_passwdr   rn   r=   r'   rC   r   r   r   unset_repo_passwd  s
    r   c              
   C   sH   zt | |}W n& tk
r6 } zd}W 5 d }~X Y nX |dkrDdS dS rG   )r   is_passwd_setr   r   r   r   r   r     s
    r   c              
   C   s:   zt | }W n& tk
r4 } zd}W 5 d }~X Y nX |S rH   )rj   get_repo_history_limitr   ru   r   r   r   r     s
    r   c              
   C   s<   zt | |}W n& tk
r6 } zd}W 5 d }~X Y nX |S rH   )rj   set_repo_history_limitr   )rn   Zdaysr'   rC   r   r   r   r     s
    r   )T)N)r$   r$   )NN)r   )r>   )r   ZjsonZloggingr   sysZconfigparserZurllib.parser   ZseafilereZpysearpcr   r	   r   ZENVIRONMENT_VARIABLESZMAX_INTr   ZCCNET_CONF_PATHr   r   r   r   joinZseafile_pipe_pathZServerThreadedRpcClientrj   r   ZConfigParserr   readr   r
   Z	LDAP_HOSTr   ZUSE_GO_FILESERVERZ
getbooleanZMAX_UPLOAD_FILE_SIZEr+   Zmax_upload_size_mb
ValueErrorZMAX_DOWNLOAD_DIR_SIZEZmax_download_dir_size_mbZFILE_SERVER_PORTZFILE_SERVER_ROOTZCALC_SHARE_USAGEZ	getLogger__name__r@   r   r%   r)   r,   r8   r:   r<   r?   rD   rE   r1   rI   rK   rN   rO   rQ   rS   rT   rU   rV   rY   rZ   r\   r]   rc   rd   rf   rk   rl   ro   rr   rt   rx   ry   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s  










	
		





	
	


	
