U
    9¡_fK  ã                   @   s>  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 e dd¡ d dlmZ e dd¡ d dlm	Z	 d dl
Z
d dlT d dlT d dlZejejejd	 d
d„ Ze d¡ G dd„ de	jƒZG dd„ dƒZeƒ ZG dd„ dƒZedkr:e ¡  d dlmZ edƒ eedd ¡ Zedƒ e  d¡ e!eej"dd ¡ ƒ dS )é    N)ÚGLibÚGdkz3.0)r   ÚGtk)r   )Ú*)ÚdomainÚ	localedirc                 C   s   | S ©N© )Úxr	   r	   ú,/usr/share/system-config-printer/authconn.pyÚ<lambda>#   ó    r   z1.9.60c                   @   sz   e Zd ZedƒedƒedƒdœZddejjejej	j
ejej	jfddfdd„Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
AuthDialogz	Username:z	Password:zDomain:)ÚusernameÚpasswordr   NFc                 C   s   |d krt dƒ}|d kr ddg}tj | ||||¡ || _|  tjj¡ |  d¡ |  	d¡ tj
 dd¡}| d¡ t ¡ }| tjtjj¡ | dd¡ | |ddd¡ tj dd¡}	t ¡ | _|	 | jddd¡ t|ƒ}
t ¡ }| |
¡ | d	¡ | d¡ | d¡ g | _t|
ƒD ]z}|| }tjt | j ||¡ƒd
}| dd¡ |  |d|dd¡ t !¡ }| "|dk¡ |  |d|dd¡ | j #|¡ q| j|
d   $d¡ |	 |ddd¡ | |	ddd¡ | j% |ddd¡ |rtj& 't dƒ¡}| (d¡ |	 |ddd¡ || _)| j% *¡  d S )NÚAuthenticationr   r   é   Fé   g        r   é   )Úlabelg      à?é   TzRemember password)+Ú_r   ÚDialogÚ__init__Úauth_info_requiredÚset_default_responseÚResponseTypeÚOKZset_border_widthZset_resizableZHBoxÚnewZImageZset_from_stockZSTOCK_DIALOG_AUTHENTICATIONZIconSizeZDIALOGÚset_alignmentZ
pack_startZVBoxZLabelÚprompt_labelÚlenZGridZ
insert_rowZinsert_columnZset_row_spacingZset_column_spacingÚfield_entryÚrangeÚ
AUTH_FIELDÚgetZattachZEntryZset_visibilityÚappendZset_activates_defaultÚvboxZCheckButtonZnew_with_labelZ
set_activeÚremember_checkboxÚshow_all)ÚselfÚtitleÚparentÚflagsÚbuttonsr   Zallow_rememberZhboxZimager'   Ú
num_fieldsZgridÚiÚfieldr   ÚentryÚcbr	   r	   r   r   +   s\    


ÿ





zAuthDialog.__init__c                 C   s>   | j  d| d ¡ | j  d¡ | j  dd¡ | j  d¡ d S )Nú"<span weight="bold" size="larger">z</span>Tr   )r    Ú
set_markupZset_use_markupr   Zset_line_wrap©r*   Úpromptr	   r	   r   Ú
set_promptd   s    ÿÿzAuthDialog.set_promptc                 C   s,   t t| jƒƒD ]}| j|  || ¡ qd S r   )r#   r!   r"   Zset_text)r*   Z	auth_infor0   r	   r	   r   Úset_auth_infok   s    zAuthDialog.set_auth_infoc                 C   s   dd„ | j D ƒS )Nc                 S   s   g | ]}|  ¡ ‘qS r	   )Zget_text)Ú.0r
   r	   r	   r   Ú
<listcomp>p   s     z,AuthDialog.get_auth_info.<locals>.<listcomp>)r"   ©r*   r	   r	   r   Úget_auth_infoo   s    zAuthDialog.get_auth_infoc                 C   s(   z| j  ¡ W S  tk
r"   Y dS X d S )NF)r(   Z
get_activeÚAttributeErrorr<   r	   r	   r   Úget_remember_passwordr   s    z AuthDialog.get_remember_passwordc                 C   s   | j  |¡}| j|  ¡  d S r   )r   Úindexr"   Z
grab_focus)r*   r1   r0   r	   r	   r   Úfield_grab_focusx   s    zAuthDialog.field_grab_focus)Ú__name__Ú
__module__Ú__qualname__ÚN_r$   r   ZDialogFlagsZMODALÚSTOCK_CANCELr   ÚCANCELZSTOCK_OKr   r   r8   r9   r=   r?   rA   r	   r	   r	   r   r   &   s$   þ
 ÿû
9r   c                   @   s2   e Zd Zdd„ Zd
dd„Zddd„Zddd	„ZdS )Ú_AuthInfoCachec                 C   s   t ƒ | _d S r   )ÚdictÚcredsr<   r	   r	   r   r   €   s    z_AuthInfoCache.__init__Nc                 C   s   |d krd}|| j ||f< d S ©Niw  )rJ   )r*   ÚdataÚhostÚportr	   r	   r   Úcache_auth_infoƒ   s    z_AuthInfoCache.cache_auth_infoc                 C   s8   |d krd}z| j ||f W S  tk
r2   Y d S X d S rK   ©rJ   ÚKeyError©r*   rM   rN   r	   r	   r   Úlookup_auth_info‰   s    z_AuthInfoCache.lookup_auth_infoc                 C   s8   |d krd}z| j ||f= W n tk
r2   Y d S X d S rK   rP   rR   r	   r	   r   Úremove_auth_info’   s    z_AuthInfoCache.remove_auth_info)NN)NN)NN)rB   rC   rD   r   rO   rS   rT   r	   r	   r	   r   rH      s   

	rH   c                   @   sª   e Zd Zd*dd„Z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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 )-Ú
ConnectionNTFc                 C   s˜   |d k	rt  |¡ |d k	r$t  |¡ |d k	r6t  |¡ d| _|| _|| _t  ¡ | _t  	¡ | _
t  ¡ | _t  ¡ | _d| _g | _|| _t ¡ | _|  ¡  d S )NÚ T)ÚcupsZ	setServerZsetPortZsetEncryptionÚ_use_passwordÚ_parentÚ_try_as_rootZgetUserÚ	_use_userZ	getServerÚ_serverZgetPortÚ_portZgetEncryptionÚ_encryptionÚ_prompt_allowedÚ_operation_stackÚ_lockÚ	threadingZEventÚ
_gui_eventÚ_connect)r*   r,   Ztry_as_rootÚlockrM   rN   Ú
encryptionr	   r	   r   r   ž   s$    







zConnection.__init__c                 C   s    t d| |f ƒ | j |¡ d S )Nz%s: Operation += %s)Ú
debugprintr`   r&   )r*   Z	operationr	   r	   r   Ú_begin_operationµ   s    zConnection._begin_operationc                 C   s   t d|  ƒ | j ¡  d S )Nz%s: Operation ended)rg   r`   Úpopr<   r	   r	   r   Ú_end_operation¹   s    zConnection._end_operationc                 C   s   | j S r   ©r_   r<   r	   r	   r   Ú_get_prompt_allowed½   s    zConnection._get_prompt_allowedc                 C   s
   || _ d S r   rk   )r*   Zallowedr	   r	   r   Ú_set_prompt_allowedÀ   s    zConnection._set_prompt_allowedc                 C   s
   || _ d S r   )ra   )r*   Zwhetherr	   r	   r   Ú	_set_lockÃ   s    zConnection._set_lockc                 C   sö   t  | j¡ |o2| jd dks(| jdko2t ¡ dk| _| jrDtj}nt j}|| j| j	| j
d| _| jrt| j | j¡ | j| _td| j ƒ t| jjƒ}t| jjƒ}t| jƒD ]D}|d dkr¾q¬t| j|ƒ}t|ƒ||fkrÜq¬t| ||  ||¡ƒ q¬d S )Nr   ú/Z	localhost)rM   rN   rf   zConnected as user %sr   )rW   ÚsetUserr[   r\   ÚosÚgetuidÚ_use_pkÚcupspkrU   r]   r^   Ú_connectionZ
set_parentrY   Ú_userrg   ÚtypeZgetPrintersZ
addPrinterÚdirÚgetattrÚsetattrÚ_make_binding)r*   Úallow_pkZcreate_objectZmethodtype_lambdaZmethodtype_realÚfnameÚfnr	   r	   r   rd   Æ   s4    ÿ
þþzConnection._connectc                 C   s   t | jtjƒS r   )Ú
isinstanceru   rt   rU   r<   r	   r	   r   Ú_using_polkitä   s    zConnection._using_polkitc                    s   ‡ ‡‡fdd„S )Nc                     s   ˆj ˆˆ f| ž|ŽS r   )Ú	_authloop)ÚargsÚkwds©r~   r}   r*   r	   r   r   è   r   z*Connection._make_binding.<locals>.<lambda>r	   )r*   r}   r~   r	   r„   r   r{   ç   s    zConnection._make_bindingc              
   O   s:  d| _ |  ¡ s| dd ¡ | j}d}zn|  ¡ dkr8W q6|| jkrTt| j|ƒ}| j}t | j¡ |j	||Ž}|dkrŠ|i krŠt 
tjd¡‚W q6W q$ tj
k
rê } z4|j\}}	| jrÒ|	dkrÒt 
dtdƒ¡‚| js|tjksú|tjksú|tjkr|  |tjk¡ nÎ| js¤|tjkr¤tdƒ t|	ƒ | jr^| j ¡  t d	| j|	¡ | j ¡  n
|  |	¡ | jtjjkrštd
ƒ d}|  j d	8  _ d| _ nd| _‚ n6| jrÄ| j!sÄt 
dtdƒ¡‚td|t"|	ƒf ƒ ‚ W 5 d }~X Y q$ tj#k
r2 } z(|j\}
| js |  |
tj$k¡ n‚ W 5 d }~X Y q$X q$|S )Nr   Z	signatureFZadminGetServerSettingsrV   ZpkcancelzOperation canceledzGot IPP_SERVICE_UNAVAILABLEr   zretrying operation...Tz%s: %s)%Ú_passesr€   ri   ru   Ú_perform_authenticationry   rW   rp   r[   Ú__call__ÚIPPErrorZIPP_NOT_AUTHORIZEDr‚   rs   r   Ú_cancelZIPP_FORBIDDENZIPP_AUTHENTICATION_CANCELEDÚ_failedÚIPP_SERVICE_UNAVAILABLErg   ra   rc   Úclearr   Útimeout_addÚ_ask_retry_server_errorÚwaitÚ_retry_responser   r   r   Ú_has_failedÚ_cannot_authÚreprZ	HTTPErrorZHTTP_FORBIDDEN)r*   r}   r~   r‚   rƒ   ÚcZretryÚresultÚeÚmÚsr	   r	   r   r   ê   sh    


ÿþ

zConnection._authloopc                 C   sÔ   | j rt ¡  ztdƒ| jd  }W n tk
r@   tdƒ}Y nX tj| jddtj	j
tjj|d}| tdƒ| ¡ | tjtjjtdƒtjj¡ | tjj¡ | j r¾| d| j¡ t ¡  n| ¡ | _| ¡  d S )	NzCUPS server error (%s)r   zCUPS server errorT)Útransient_forÚmodalÚdestroy_with_parentÚmessage_typer.   Útextz3There was an error during the CUPS operation: '%s'.ZRetryÚresponse)ra   r   Úthreads_enterr   r`   Ú
IndexErrorr   ÚMessageDialogrY   ÚMessageTypeÚERRORÚButtonsTypeZNONEZformat_secondary_textZadd_buttonsrF   r   rG   r   r   ÚconnectÚ_on_retry_server_error_responseÚthreads_leaveÚrunr   Údestroy)r*   ÚmessageÚmsgÚdr	   r	   r   rŽ   0  s4     ü
ÿ ÿ

z"Connection._ask_retry_server_errorc                 C   s   || _ | ¡  | j ¡  d S r   )r   r©   rc   Úset©r*   Údialogrž   r	   r	   r   r¦   K  s    z*Connection._on_retry_server_error_responsec                 C   s   d| _ || _d S )NT)r‘   Ú
_forbidden)r*   Z	forbiddenr	   r	   r   rŠ   P  s    zConnection._failedc                 C   s*   t dƒ | js| jrdS d| _|| _| jS )NzGot password callbackrV   T)rg   r‰   Ú_auth_calledZ_promptrX   r6   r	   r	   r   Ú_password_callbackT  s    zConnection._password_callbackc                 C   sX  |  j d7  _ tj| j| jd}|d k	rH|d dks:| jrF|\| _| _~td| j  ƒ | j dkrœd| _	d| _
d| _d| _d| _d| _t | j¡ tdƒ dS td| j
 ƒ | j	s¼td	ƒ dS d| _	| j d
krF| jrF| jdkrF| jd dksø| j
rFtdƒ d| _d| _z| jdd W n$ tk
r@   t tjd¡‚Y nX dS | js`tdƒ d| _dS | js€tdƒ d| _d| _dS d| _| jrÂ| jrº| j ¡  t d| j¡ | j ¡  n|  ¡  | jrî| j ¡  t d| j¡ | j ¡  n|  ¡  | jr
tdƒ dS t  | j¡ tdƒ z| jdd W n$ tk
rR   t tjd¡‚Y nX dS )Nr   ©rM   rN   r   ÚrootzAuthentication pass: %dFz%Authentication: password callback setzForbidden: %sz$Authentication: Operation successfulr   ro   zAuthentication: Try as root)r|   z server-error-service-unavailablez%Authentication: prompting not allowedTzAuthentication: giving upZ	cancelledéÿÿÿÿzAuthentication: Reconnect)!r…   Úglobal_authinfocacherS   r\   r]   rZ   r[   rX   rg   r‘   r°   r±   r‰   r’   Ú_dialog_shownrW   ZsetPasswordCBr²   rv   rd   ÚRuntimeErrorrˆ   r‹   r_   ra   rc   rŒ   r   r   Ú_show_not_authorized_dialogr   Ú#_perform_authentication_with_dialogrp   )r*   rJ   r	   r	   r   r†   ]  s’    
ÿþþÿ


ÿ
z"Connection._perform_authenticationc                 C   sš   | j rt ¡  tj| jddtjjtjj	d}| 
tdƒ¡ | dtdƒ d tdƒ ¡ | j r†| d| j¡ | ¡  | ¡  t ¡  n| ¡  | ¡  d S )NT)r™   rš   r›   rœ   r.   zNot authorizedr4   z	</span>

zThe password may be incorrect.rž   )ra   r   rŸ   r   r¡   rY   r¢   r£   r¤   ZCLOSEZ	set_titler   r5   r¥   Ú"_on_not_authorized_dialog_responser)   Úshow_nowr§   r¨   r©   )r*   r¬   r	   r	   r   r¹   Ã  s.     ýÿÿþ
z&Connection._show_not_authorized_dialogc                 C   s   | j  ¡  | ¡  d S r   )rc   r­   r©   r®   r	   r	   r   r»   ×  s    
z-Connection._on_not_authorized_dialog_responsec                 C   sä   | j rt ¡  t| jƒdkr`ztdƒ| jd  }W n tk
rN   tdƒ}Y nX t|| jd}nt| jd}| 	d¡ | 
ddg¡ | d¡ | d¡ | ¡  | ¡  d| _| j rÌ| d	| j¡ t ¡  n| ¡ }|  ||¡ d S )
Nr   zAuthentication (%s)r   )r+   r,   )r,   rV   r   Trž   )ra   r   rŸ   r!   r`   r   r    r   rY   r8   r9   rA   Zset_keep_abover)   r¼   r·   r¥   Ú_on_authentication_responser§   r¨   )r*   r+   r¬   rž   r	   r	   r   rº   Û  s.    ÿ



z.Connection._perform_authentication_with_dialogc                 C   sr   |  ¡ \}| _|dkr|| _tj| j| jf| j| jd | ¡  |tj	j
ksX|tj	jkr^d| _| jrn| j ¡  d S )NrV   r³   T)r=   rX   r[   r¶   rO   r\   r]   r©   r   r   rG   ZDELETE_EVENTr‰   ra   rc   r­   )r*   r¯   rž   Úuserr	   r	   r   r½   ù  s     ÿý
ÿz&Connection._on_authentication_response)NTFNNN)T)F)rB   rC   rD   r   rh   rj   rl   rm   rn   rd   r€   r{   r   rŽ   r¦   rŠ   r²   r†   r¹   r»   rº   r½   r	   r	   r	   r   rU      s.         ÿ

F
	frU   Ú__main__)ÚTimedOperationTr   )r‚   Z	Connected)z/admin/conf/cupsd.confz/dev/stdout)#rb   ZconfigrW   rt   ZgiZgi.repositoryr   Zrequire_versionr   r   rq   ZerrordialogsÚdebugÚgettextÚinstallZPACKAGEr   rE   Zrequirer   r   rH   r¶   rU   rB   Zthreads_initZtimedopsrÀ   Zset_debuggingr¨   r”   rg   rn   ÚprintZgetFiler	   r	   r	   r   Ú<module>   s@   
Y  o

ÿ