def replace_service_key(old_kid, kid, jwk, metadata, expiration_date): try: with db_transaction(): key = db_for_update( ServiceKey.select().where(ServiceKey.kid == old_kid)).get() key.metadata.update(metadata) ServiceKey.create( name=key.name, kid=kid, service=key.service, jwk=jwk, metadata=key.metadata, expiration_date=expiration_date, rotation_duration=key.rotation_duration, approval=key.approval, ) key.delete_instance() except ServiceKey.DoesNotExist: raise ServiceKeyDoesNotExist _notify_superusers(key) delete_all_notifications_by_path_prefix( "/service_key_approval/{0}".format(old_kid)) _gc_expired(key.service)
def delete_service_key(kid): try: key = ServiceKey.get(kid=kid) ServiceKey.delete().where(ServiceKey.kid == kid).execute() except ServiceKey.DoesNotExist: raise ServiceKeyDoesNotExist delete_all_notifications_by_path_prefix('/service_key_approval/{0}'.format(kid)) _gc_expired(key.service) return key
def _list_service_keys_query(kid=None, service=None, approved_only=True, alive_only=True, approval_type=None): query = ServiceKey.select().join(ServiceKeyApproval, JOIN.LEFT_OUTER) if approved_only: query = query.where(~(ServiceKey.approval >> None)) if alive_only: query = query.where((ServiceKey.expiration_date > datetime.utcnow()) | (ServiceKey.expiration_date >> None)) if approval_type is not None: query = query.where(ServiceKeyApproval.approval_type == approval_type) if service is not None: query = query.where(ServiceKey.service == service) query = query.where(~(_expired_keys_clause(service)) | ~(_stale_unapproved_keys_clause(service))) if kid is not None: query = query.where(ServiceKey.kid == kid) query = query.where(~(_stale_expired_keys_clause()) | (ServiceKey.expiration_date >> None)) return query
def create_service_key(name, kid, service, jwk, metadata, expiration_date, rotation_duration=None): _verify_service_name(service) _gc_expired(service) key = ServiceKey.create(name=name, kid=kid, service=service, jwk=jwk, metadata=metadata, expiration_date=expiration_date, rotation_duration=rotation_duration) _notify_superusers(key) return key
def update_service_key(kid, name=None, metadata=None): try: with db_transaction(): key = db_for_update(ServiceKey.select().where(ServiceKey.kid == kid)).get() if name is not None: key.name = name if metadata is not None: key.metadata.update(metadata) key.save() except ServiceKey.DoesNotExist: raise ServiceKeyDoesNotExist
def approve_service_key(kid, approval_type, approver=None, notes=''): try: with db_transaction(): key = db_for_update(ServiceKey.select().where(ServiceKey.kid == kid)).get() if key.approval is not None: raise ServiceKeyAlreadyApproved approval = ServiceKeyApproval.create(approver=approver, approval_type=approval_type, notes=notes) key.approval = approval key.save() except ServiceKey.DoesNotExist: raise ServiceKeyDoesNotExist delete_all_notifications_by_path_prefix('/service_key_approval/{0}'.format(kid)) return key
def _gc_expired(service): ServiceKey.delete().where( _stale_expired_keys_service_clause(service) | _stale_unapproved_keys_clause(service)).execute()