
!dV                 @   sT   d  Z  d d l Z d d l Z d d l m Z m Z m Z Gd d   d e  Z	 d S)a  Store and retrieve wheel signing / verifying keys.

Given a scope (a package name, + meaning "all packages", or - meaning 
"no packages"), return a list of verifying keys that are trusted for that 
scope.

Given a package name, return a list of (scope, key) suggested keys to sign
that package (only the verifying keys; the private signing key is stored
elsewhere).

Keys here are represented as urlsafe_b64encoded strings with no padding.

Tentative command line interface:

# list trusts
wheel trust
# trust a particular key for all
wheel trust + key
# trust key for beaglevote
wheel trust beaglevote key
# stop trusting a key for all
wheel untrust + key

# generate a key pair
wheel keygen

# import a signing key from a file
wheel import keyfile

# export a signing key
wheel export key
    N)nativeload_config_pathssave_config_pathc               @   s   e  Z d  Z d Z 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 S)	WheelKeys   z
wheel.jsonc             C   s   i g  d 6g  d 6|  _  d  S)Nsigners	verifiers)data)self r   6/tmp/pip-build-0jahl3lb/wheel/wheel/signatures/keys.py__init__*   s    zWheelKeys.__init__c             C   s  x t  d  D] } t j j t |  |  j  } t j j |  r t | d   } t j	 |  |  _
 x- d D]% } | |  j
 k rn g  |  j
 | <qn qn Wd |  j
 k r |  j |  j
 d <n; |  j
 d |  j k r t d j |  j
 d |  j    n  Wd  QXPq q W|  S)Nwheelrr   r   Zschemaz(Bad wheel.json version {0}, expected {1})zsignersz	verifiers)r   ospathjoinr   CONFIG_NAMEexistsopenjsonloadr	   SCHEMA
ValueErrorformat)r
   r   confinfilexr   r   r   r   -   s     "zWheelKeys.loadc             C   s_   t  d  } t j j t |  |  j  } t | d    } t j |  j	 | d d Wd  QX|  S)Nr   zw+indent   )
r   r   r   r   r   r   r   r   dumpr	   )r
   r   r   outr   r   r   save@   s
    zWheelKeys.savec             C   s&   |  j  d j i | d 6| d 6 |  S)z0Start trusting a particular key for given scope.r   scopevk)r	   append)r
   r#   r$   r   r   r   trustH   s    "zWheelKeys.trustc             C   s&   |  j  d j i | d 6| d 6 |  S)z/Stop trusting a particular key for given scope.r   r#   r$   )r	   remove)r
   r#   r$   r   r   r   untrustM   s    "zWheelKeys.untrustNc                sD     f d d   |  j  d D } | j d d d    | j   | S)z;Return list of [(scope, trusted key), ...] for given scope.c                s:   g  |  ]0 } | d    d f k r | d  | d f  q S)r#   +r$   r   ).0r   )r#   r   r   
<listcomp>T   s   	 z%WheelKeys.trusted.<locals>.<listcomp>r   keyc             S   s   |  d S)Nr   r   )r   r   r   r   <lambda>U   s    z#WheelKeys.trusted.<locals>.<lambda>)r	   sortreverse)r
   r#   r&   r   )r#   r   trustedR   s     
zWheelKeys.trustedc                sD     f d d   |  j  d D } | j d d d    | j   | S)zReturn list of signing key(s).c                s:   g  |  ]0 } | d    d f k r | d  | d f  q S)r#   r)   r$   r   )r*   r   )r#   r   r   r+   [   s   	 z%WheelKeys.signers.<locals>.<listcomp>r   r,   c             S   s   |  d S)Nr   r   )r   r   r   r   r-   \   s    z#WheelKeys.signers.<locals>.<lambda>)r	   r.   r/   )r
   r#   signr   )r#   r   r   Y   s     
zWheelKeys.signersc             C   s&   |  j  d j i | d 6| d 6 d S)z>Remember verifying key vk as being valid for signing in scope.r   r#   r$   N)r	   r%   )r
   r#   r$   r   r   r   
add_signer`   s    zWheelKeys.add_signer)__name__
__module____qualname__r   r   r   r   r"   r&   r(   r0   r   r2   r   r   r   r   r   &   s   r   )
__doc__r   os.pathr   Z
wheel.utilr   r   r   objectr   r   r   r   r   <module>    s   