U
    9¡_„h  ã                   @   sú   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mZ d dlmZ d dlZe 	d¡ d dl
Z
d dlT d dlZd dlZejejejd G d	d
„ d
e jƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZedkröedƒ G dd„ dƒZeƒ  e ¡  dS )é    N)ÚGObject)ÚGLib)ÚGdk)ÚGtkz1.9.60)Ú*)ZdomainÚ	localedirc                   @   sP   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zddd„Zdd„ Z	dd„ Z
dS )Ú_IPPConnectionThreadNc
           
      C   sn   t j | ¡ |  d¡ || _|| _|| _|| _|	| _|| _	|| _
|| _t d¡| _|| _d| _td|  ƒ d S )NTé   Fú+%s)Ú	threadingÚThreadÚ__init__Z	setDaemonÚ_queueÚ_connÚhostÚportÚ_encryptionÚ_reply_handlerÚ_error_handlerÚ_auth_handlerÚqueueÚQueueÚ_auth_queueÚuserÚ
_destroyedÚ
debugprint)
ÚselfZmyqueueÚconnÚreply_handlerÚerror_handlerÚauth_handlerr   r   r   Ú
encryption© r"   ú,/usr/share/system-config-printer/asyncipp.pyr   0   s    
z_IPPConnectionThread.__init__c                 C   s   t  d|  ¡ d S ©Nz-%s©Údebugr   ©r   r"   r"   r#   Ú__del__C   s    z_IPPConnectionThread.__del__c                 C   s   | j  |¡ d S ©N)r   Úput©r   Úpasswordr"   r"   r#   Úset_auth_infoF   s    z"_IPPConnectionThread.set_auth_infoc              
   C   sè  | j d krt ¡ | _ | jd kr(t ¡ | _| jd kr<t ¡ | _| jrPt | j¡ n
t 	¡ | _t 
| j¡ z$tj| j | j| jd}|  d ¡ W n0 tk
rº } zd }|  |¡ W 5 d }~X Y nX tdƒ | j ¡ | _| j ¡ }tdt|ƒ ƒ |d kr| j ¡  q¸n| jr| j ¡  q¼d| _|\}}}}}}	|dkr>|| _|dkrN|| _|	dkr^|	| _|dkr|d | _t | j¡ td| j ƒ t 
| j¡ z6tj| j | j| jd}tdƒ | j ¡  |  d ¡ W q¼ tk
r } z td	ƒ | j ¡  |  |¡ W 5 d }~X Y q¼X q¼zZtd
| ƒ ||f|ž|Ž}
|tjjjkrX|
i krXt tjd¡‚tdƒ |  |
¡ W n> tk
rª } ztdt|ƒ ƒ |  |¡ W 5 d }~X Y nX | j ¡  q¼tdƒ | ` | `| `| `| `| `!~t 
d ¡ d S )N)r   r   r!   zAwaiting further instructionszNext task: %sFTr   zSet user=%s; reconnecting...z...reconnectedz	...failedzCall %sÚ z
...successz...failure (%s)zThread exiting)"r   ÚcupsZ	getServerr   ZgetPortr   ZgetEncryptionr   ZsetUserÚgetUserZsetPasswordCB2Ú_authÚ
ConnectionÚ_replyÚRuntimeErrorÚ_errorr   r   ÚemptyÚidleÚgetÚreprZ	task_doner   r   r   r   ZadminGetServerSettingsÚ__call__ÚIPPErrorÚIPP_NOT_AUTHORIZEDÚ	Exceptionr   r   )r   r   ÚeÚitemÚfnÚargsÚkwdsZrhZehZahÚresultr"   r"   r#   ÚrunI   s˜    






þ








þ


z_IPPConnectionThread.runc                 C   s   d| _ | j d ¡ d S )NT)r   r   r*   r'   r"   r"   r#   Ústop¬   s    z_IPPConnectionThread.stopc                    s:   ‡ ‡‡‡fdd„}ˆj d kr dS t ||¡ ˆj ¡ }|S )Nc                    s>   t  ¡  ˆ d kr ˆ | ˆj¡ nˆ | ˆjˆˆ¡ t  ¡  dS ©NF)r   Úthreads_enterr   r   Úthreads_leave)Úprompt©r   ÚmethodÚresourcer   r"   r#   Úprompt_auth±   s    z/_IPPConnectionThread._auth.<locals>.prompt_authr.   )r   r   Úidle_addr   r8   )r   rI   r   rK   rL   rM   r,   r"   rJ   r#   r1   °   s    


z_IPPConnectionThread._authc                    s,   ‡ fdd„}ˆ j s(ˆ jr(t |ˆ j|¡ d S )Nc                    s&   ˆ j s"t ¡  | ˆ j|ƒ t ¡  dS rF   ©r   r   rG   r   rH   )ÚhandlerrC   r'   r"   r#   Ú
send_replyÃ   s
    z/_IPPConnectionThread._reply.<locals>.send_reply)r   r   r   rN   )r   rC   rQ   r"   r'   r#   r3   Â   s    z_IPPConnectionThread._replyc                    s:   ‡ fdd„}ˆ j s6ˆ jr6tdˆ j ƒ t |ˆ j|¡ d S )Nc                    s&   ˆ j s"t ¡  | ˆ j|ƒ t ¡  dS rF   rO   )rP   Úexcr'   r"   r#   Ú
send_errorÎ   s
    z/_IPPConnectionThread._error.<locals>.send_errorzAdd %s to idle)r   r   r   r   rN   )r   rR   rS   r"   r'   r#   r5   Í   s    z_IPPConnectionThread._error)NNNNNNN)NNN)Ú__name__Ú
__module__Ú__qualname__r   r(   r-   rD   rE   r1   r3   r5   r"   r"   r"   r#   r   /   s            þ
c
r   c                   @   sT   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zddd„Z	dd„ Z
dd„ ZdS )ÚIPPConnectiona¿  
    This class starts a new thread to handle IPP operations.

    Each IPP operation method takes optional reply_handler,
    error_handler and auth_handler parameters.

    If an operation requires a password to proceed, the auth_handler
    function will be called.  The operation will continue once
    set_auth_info (in this class) is called.

    Once the operation has finished either reply_handler or
    error_handler will be called.
    Nc	                 C   sº   t dƒ || _t ¡ | _t| j| |||||||d	| _| j ¡  ttj	j
ƒ}	g }
ttj	ƒD ]H}|d dkrlqZttj	|ƒ}t|ƒ|	kr†qZt| ||  |¡ƒ |
 |¡ qZ|
| _t d|  ƒ d S )NzNew IPPConnection©r   r   r    r   r   r   r!   r   ú r
   )r   Z_parentr   r   r   ÚthreadÚstartÚtyper/   r2   ZgetPrintersÚdirÚgetattrÚsetattrÚ_make_bindingÚappendÚbindings)r   r   r   r    r   r   r   r!   ÚparentZ
methodtyperb   Úfnamer@   r"   r"   r#   r   ì   s2    
  û
zIPPConnection.__init__c                 C   s   t  d|  ¡ d S r$   r%   r'   r"   r"   r#   r(     s    zIPPConnection.__del__c                 C   sP   t d|  ƒ | jD ]}t| |ƒ q| j ¡ rLt dƒ | j ¡  t d| j¡ d S )NzDESTROY: %szStopping worker threadr	   )	r   rb   ÚdelattrrZ   ZisAliverE   r   Ztimeout_add_secondsÚ_reap_thread)r   Zbindingr"   r"   r#   Údestroy  s    


zIPPConnection.destroyc                 C   s(   | j jr| j ¡  dS td| j  ƒ dS )NFz Thread %s still processing tasksT)rZ   r7   r   Újoinr   r'   r"   r"   r#   rf     s
    
zIPPConnection._reap_threadc                 C   s   | j  |¡ dS )z*Call this from your auth_handler function.N)rZ   r-   r+   r"   r"   r#   r-     s    zIPPConnection.set_auth_infoc                 C   s&   t dƒ | j d|fi ||df¡ d S )NzReconnect...TF)r   r   r*   )r   r   r   r   r"   r"   r#   Ú	reconnect!  s      ÿzIPPConnection.reconnectc                    s   ‡ ‡fdd„S )Nc                     s   ˆj ˆ f| ž|ŽS r)   )Ú_call_function)rA   rB   ©r@   r   r"   r#   Ú<lambda>'  ó    z-IPPConnection._make_binding.<locals>.<lambda>r"   )r   r@   r"   rk   r#   r`   &  s    zIPPConnection._make_bindingc                 O   sj   d } }}d|kr"|d }|d= d|kr8|d }|d= d|krN|d }|d= | j  ||||||f¡ d S ©NFr   r   r    )r   r*   )r   r@   rA   rB   r   r   r    r"   r"   r#   rj   )  s      ÿzIPPConnection._call_function)NNNNNNNN)NN)rT   rU   rV   Ú__doc__r   r(   rg   rf   r-   ri   r`   rj   r"   r"   r"   r#   rW   Ý   s               þ


rW   c                   @   sh   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zdd
d„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )Ú_IPPAuthOperationNc                 C   sh   d| _ d| _d| _d| _d| _d| _|| _|| _| jj| _	|| _
|| _|| _|| _|| _td|  ƒ d S )NFr.   r
   )Ú_auth_calledÚ_dialog_shownÚ_use_passwordÚ_cancelÚ
_reconnectÚ_reconnectedÚ_userr   Útry_as_rootÚ_try_as_rootÚ
_client_fnÚ_client_argsÚ_client_kwdsÚ_client_reply_handlerÚ_client_error_handlerr   )r   r   r   r   r   r@   rA   rB   r"   r"   r#   r   A  s    
z_IPPAuthOperation.__init__c                 C   s   t  d|  ¡ d S r$   r%   r'   r"   r"   r#   r(   T  s    z_IPPAuthOperation.__del__c                 C   s   | ` | `| `| `| `| `d S r)   )r   rz   r{   r|   r}   r~   r'   r"   r"   r#   Ú_destroyW  s    z_IPPAuthOperation._destroyc           	      C   s  | j d krtdƒ |  ||¡S | jr:td|  ƒ |  |¡S | jrxd| _d| _td| | jf ƒ |j| j| j	| jd d S d}t
|ƒtjkrà|j\}}|tjks²|tjks²|tjkr¾|tjk}n |tjkrÔ|  ||¡S |  |¡S nRt
|ƒtjkr(|j\}|tjks|tjkr|tjk}n
|  |¡S n
|  |¡S |rFtd|  ƒ ntd|  ƒ | jr¨| jd	kr¨| jjjd
 dks€|r¨tdƒ d	| _|j| j| j	| jd d S | jsº|  |¡S |jj}|jj}tjj||d d| _td| | jf ƒ |j| j| j	| jd d S )NzConnection/reconnection failedz,%s (_error_handler): canceled so chaining upFTz,%s (_error_handler): reconnecting (as %s)...©r   r   z%s (_error_handler): forbiddenz#%s (_error_handler): not authorizedÚrootr   ú/zAuthentication: Try as root©r   r   r.   )rz   r   Ú_reconnect_errorrt   r5   ru   rv   rw   ri   Ú_reconnect_replyr\   r/   r;   rA   r<   ZIPP_FORBIDDENZIPP_AUTHENTICATION_CANCELEDZIPP_SERVICE_UNAVAILABLEZ	HTTPErrorZHTTP_UNAUTHORIZEDZHTTP_FORBIDDENry   r   rZ   r   rq   r   ÚauthconnÚglobal_authinfocacheÚremove_auth_infors   )	r   r   rR   Z	forbiddenr>   ÚmÚsr   r   r"   r"   r#   r   _  sŠ    

ÿþ

ÿþ
ÿ
ÿþþþ
ÿÿþz_IPPAuthOperation.error_handlerc                 C   sÐ  | j dkrj| jd krt ¡ | _| jr|jj}|jj}tjj	||d}|r|d | jkrf|d | _
d| _~n&|jj}|jj}tjj||d d| _
d| _ | jrºtdƒ d| _| | j
¡ d S d| _|jsÖ| | j
¡ d S | jr"tj| jjddtjjtjjtdƒd	}| td
ƒ¡ | ¡  | ¡  d }	|jr8|j ¡ }	|	d krRtj|jd}ntdƒ|	 }
tj|
|jd}|  d¡ | jd krŽt ¡ | _| ddg¡ | !d¡ | "d¡ | #¡  | $d| j%¡ d| _d S )NFrƒ   r   r	   Tr.   z%Supplying password after reconnectionzNot authorized©rc   ZmodalZdestroy_with_parentZmessage_typeZbuttonsÚtextzThe password may be incorrect.)rc   zAuthentication (%s))Útitlerc   ZusernameÚresponse)&rq   rw   r/   r0   rZ   r   r   r†   r‡   Úlookup_auth_infors   rv   rˆ   r   r-   Úprompt_allowedrr   r   ÚMessageDialogr   rc   ÚMessageTypeÚERRORÚButtonsTypeZCLOSEÚ_Úformat_secondary_textrD   rg   ÚsemanticÚcurrent_operationZ
AuthDialogZ
set_promptZfield_grab_focusZset_keep_aboveÚshow_allÚconnectÚ_on_auth_dialog_response)r   rI   r   rK   rL   r   r   ÚcredsÚdÚopr   r"   r"   r#   r    ²  sv    


ÿ
ÿ
 ü

ÿ



z_IPPAuthOperation.auth_handlerc                 C   s0   d| _ | jj | j| j| j| j| j| j	f¡ d S rF   )
rq   r   r   r*   rz   r{   r|   r}   r   r    r'   r"   r"   r#   Úsubmit_taskó  s    úz_IPPAuthOperation.submit_taskc                 C   sô   |  ¡ \}}|dkr| j}tjj||f| jjj| jjjd || _	| 
¡  |tjjksb|tjjkrœd| _| j d¡ tjj| jjj| jjjd tdƒ d S || jkrÄ|| _| j |¡ tdƒ d S || _|| _d| _| j d¡ td| j ƒ d S )Nr.   rƒ   TzAuth canceledzPassword supplied.zWill try as %s)Zget_auth_inforw   r†   r‡   Zcache_auth_infor   rZ   r   r   Z_dialogZhider   ÚResponseTypeÚCANCELZDELETE_EVENTrt   r-   rˆ   r   rs   ru   )r   ÚdialogrŽ   r   r,   r"   r"   r#   r›   ý  s>    ÿý
ÿÿ
z*_IPPAuthOperation._on_auth_dialog_responsec                 C   s$   t d| j ƒ | jd k	r |  ¡  d S )NzConnected as %s)r   rw   rz   rŸ   ©r   r   rC   r"   r"   r#   r…     s    
z"_IPPAuthOperation._reconnect_replyc                 C   s   t d| j ƒ | jjs$|  |¡ d S d }|jr8|j ¡ }|d krJtdƒ}ntdƒ| }tj	| jj
ddtjjtjj|d}| jd kr”t|ƒtkr”d}n"t|ƒtjkr®|jd }nt|ƒ}| td| ƒ¡ | tjtjjtd	ƒtjj¡ | tjj¡ | d
| j¡ t d| ||f ƒ | ¡  d S )NzFailed to connect as %szCUPS server errorzCUPS server error (%s)Tr‹   z!service-error-service-unavailabler	   z3There was an error during the CUPS operation: '%s'.ZRetryrŽ   z7%s (_reconnect_error): presenting error dialog (%s; %s)) r   rw   r   r   r5   r—   r˜   r•   r   r‘   rc   r’   r“   r”   ZNONErz   r\   r4   r/   r;   rA   r9   r–   Zadd_buttonsZSTOCK_CANCELr    r¡   ÚOKZset_default_responserš   Ú_on_retry_server_error_responseZshow)r   r   rR   rž   Úmsgr   Úmessager"   r"   r#   r„   %  sF    



 üÿ ÿÿz"_IPPAuthOperation._reconnect_errorc                 C   sn   |  ¡  |tjjkrHtd| | jjjf ƒ | jj| jjj| j	| j
d n"td|  ƒ |  t dtdƒ¡¡ d S )Nz/%s: got retry response, reconnecting (as %s)...r€   z%s: got cancel responser   zOperation canceled)rg   r   r    r¤   r   r   rZ   r   ri   r…   r„   r5   r/   r;   r•   )r   r¢   rŽ   r"   r"   r#   r¥   L  s    ÿþz1_IPPAuthOperation._on_retry_server_error_responsec                 C   sT   t d| t|ƒf ƒ | jrDt d| | jf ƒ |  | j|¡ |  ¡  nt d|  ƒ d S )Nz%s (_error): handling %sz%s (_error): calling %sz(%s (_error): no client error handler set)r   r9   r~   r   r   )r   rR   r"   r"   r#   r5   X  s    ÿ
z_IPPAuthOperation._error)NNNN)NN)rT   rU   rV   r   r(   r   r   r    rŸ   r›   r…   r„   r¥   r5   r"   r"   r"   r#   rp   @  s          ÿ
S
A
 'rp   c                
   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚIPPAuthConnectionNTc              
   C   sx   || _ |	| _|| _|
| _d }tjj||d}|rJ|d dks@|rH|d }~t||| ƒ}tj	| ||j
|j||||d d S )Nrƒ   r   r   rX   )rc   r   rx   r—   r†   r‡   r   rp   rW   r   r   r    )r   r   r   r    r   r   r!   rc   rx   r   r—   r   rœ   rž   r"   r"   r#   r   f  s*    ÿ   ýzIPPAuthConnection.__init__c                 C   s   d | _ t | ¡ d S r)   )r—   rW   rg   r'   r"   r"   r#   rg   ~  s    zIPPAuthConnection.destroyc                 O   sr   d } }}d|kr"|d }|d= d|kr8|d }|d= d|krN|d }|d= t ||| | jj|||ƒ}| ¡  d S rn   )rp   rZ   r   rŸ   )r   r@   rA   rB   r   r   r    rž   r"   r"   r#   rj   ‚  s"       ÿz IPPAuthConnection._call_function)
NNNNNNNTTN)rT   rU   rV   r   rg   rj   r"   r"   r"   r#   r¨   e  s                 ý
r¨   Ú__main__Tc                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚUIc                 C   s    t  ¡ }| d| j¡ t j d¡}| d| j¡ t  ¡ }| |ddd¡ | 	|¡ t j d¡| _
| j
 d| j¡ | j
 d¡ | | j
ddd¡ d | _| ¡  d S )Nrg   ZConnectZclickedFr   zGet Devices)r   ZWindowrš   rg   ZButtonZnew_with_labelÚconnect_clickedZVBoxZ
pack_startÚaddÚget_devices_buttonÚget_devicesÚset_sensitiver   r™   )r   ÚwÚbZvboxr"   r"   r#   r   š  s    
zUI.__init__c                 C   s0   z| j  ¡  W n tk
r"   Y nX t ¡  d S r)   )r   rg   ÚAttributeErrorr   Z	main_quit)r   Zwindowr"   r"   r#   rg   ©  s
    z
UI.destroyc                 C   s&   | j r| j  ¡  t| j| jd| _ d S )Nr€   )r   rg   r¨   Ú	connectedÚconnect_failed©r   Zbuttonr"   r"   r#   r«   ±  s
    
ÿzUI.connect_clickedc                 C   s    t dt|ƒ ƒ | j d¡ d S )NzSuccess: %sT)r   r9   r­   r¯   r£   r"   r"   r#   r³   ¸  s    zUI.connectedc                 C   s*   t dt|ƒ ƒ | j d¡ | j ¡  d S )NzExc %sF)r   r9   r­   r¯   r   rg   ©r   r   rR   r"   r"   r#   r´   ¼  s    zUI.connect_failedc                 C   s*   |  d¡ tdƒ | jj| j| jd d S )NFzGetting devicesr€   )r¯   r   r   Z
getDevicesÚget_devices_replyÚget_devices_errorrµ   r"   r"   r#   r®   Á  s
    

ÿzUI.get_devicesc                 C   s6   || j krtdƒ d S tdt|ƒ ƒ | j d¡ d S )NzIgnoring stale replyzGot devices: %sT©r   r   r9   r­   r¯   r£   r"   r"   r#   r·   Ç  s
    
zUI.get_devices_replyc                 C   s6   || j krtdƒ d S tdt|ƒ ƒ | j d¡ d S )NzIgnoring stale errorzError getting devices: %sTr¹   r¶   r"   r"   r#   r¸   Ï  s
    
zUI.get_devices_errorN)rT   rU   rV   r   rg   r«   r³   r´   r®   r·   r¸   r"   r"   r"   r#   rª   ™  s   rª   )r   Zconfigr/   Zgi.repositoryr   r   r   r   r   Zrequirer†   r&   ÚgettextÚinstallZPACKAGEr   r   r   rW   rp   r¨   rT   Zset_debuggingrª   Úmainr"   r"   r"   r#   Ú<module>   s2   
 /c  '1>