Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ version: "3"

vars:
# renovate: datasource=github-releases depName=agntcy/dir versioning=semver
DIR_CHART_VERSION: '{{ .DIR_CHART_VERSION | default "v1.7.1" }}'
DIR_CHART_VERSION: '{{ .DIR_CHART_VERSION | default "v1.8.0" }}'
# renovate: datasource=github-releases depName=agntcy/dir versioning=semver
DIR_IMAGE_TAG: '{{ .DIR_IMAGE_TAG | default "v1.7.1" }}'
DIR_IMAGE_TAG: '{{ .DIR_IMAGE_TAG | default "v1.8.0" }}'
# renovate: datasource=github-releases depName=agntcy/dir versioning=semver
DIRCTL_IMAGE_TAG: '{{ .DIRCTL_IMAGE_TAG | default "v1.7.1" }}'
DIRCTL_IMAGE_TAG: '{{ .DIRCTL_IMAGE_TAG | default "v1.8.0" }}'

# renovate: datasource=github-releases depName=renovatebot/renovate versioning=semver
RENOVATE_VERSION: "44.141.0"
Expand Down Expand Up @@ -243,7 +243,6 @@ tasks:
--set apiserver.service.nodePort="{{.API_NODEPORT}}" \
--set apiserver.service.metricsNodePort="{{.METRICS_NODEPORT}}" \
{{ if .DIRECTORY_SERVER_PUBLICATION_SCHEDULER_INTERVAL }}--set apiserver.config.publication.scheduler_interval="{{ .DIRECTORY_SERVER_PUBLICATION_SCHEDULER_INTERVAL }}"{{ end }} \
{{ if .DIRECTORY_SERVER_NAMING_TTL }}--set apiserver.config.naming.ttl="{{ .DIRECTORY_SERVER_NAMING_TTL }}"{{ end }} \
--set apiserver.config.routing.refresh_interval="1s" \
--set-json 'apiserver.config.routing.bootstrap_peers=[]' \
--set apiserver.secrets.ociAuth.username="${HTPASSWD_USERNAME}" \
Expand Down
16 changes: 8 additions & 8 deletions dir-sdk-python/agntcy/dir_sdk/client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from agntcy.dir_sdk.client.auth.token_cache import CachedToken, TokenCache
from agntcy.dir_sdk.client.config import Config
from agntcy.dir_sdk.client.services.events import EventService
from agntcy.dir_sdk.client.services.naming import NamingService
from agntcy.dir_sdk.client.services.identity import IdentityService
from agntcy.dir_sdk.client.services.publication import PublicationService
from agntcy.dir_sdk.client.services.routing import RoutingService
from agntcy.dir_sdk.client.services.search import SearchService
Expand All @@ -34,7 +34,7 @@
from agntcy.dir_sdk.models import (
core_v1,
events_v1,
naming_v1,
identity_v1,
routing_v1,
search_v1,
sign_v1,
Expand Down Expand Up @@ -75,7 +75,7 @@ def __init__(self, config: Config | None = None) -> None:
self.sign_client = sign_v1.SignServiceStub(channel)
self.sync_client = store_v1.SyncServiceStub(channel)
self.event_client = events_v1.EventServiceStub(channel)
self.naming_client = naming_v1.NamingServiceStub(channel)
self.identity_client = identity_v1.IdentityServiceStub(channel)

# Service-layer adapters grouped by technical area.
self.store_service = StoreService(self.store_client, logger)
Expand All @@ -85,7 +85,7 @@ def __init__(self, config: Config | None = None) -> None:
self.sign_service = SignService(self.config, self.sign_client, logger)
self.sync_service = SyncService(self.sync_client, logger)
self.event_service = EventService(self.event_client, logger)
self.naming_service = NamingService(self.naming_client, logger)
self.identity_service = IdentityService(self.identity_client, logger)

def has_cached_oauth_token(self) -> bool:
return self.oauth_session.has_access_token()
Expand Down Expand Up @@ -254,17 +254,17 @@ def resolve(
name: str,
version: str | None = None,
metadata: Sequence[tuple[str, str]] | None = None,
) -> naming_v1.ResolveResponse:
return self.naming_service.resolve(name, version=version, metadata=metadata)
) -> identity_v1.ResolveResponse:
return self.identity_service.resolve(name, version=version, metadata=metadata)

def get_verification_info(
self,
cid: str | None = None,
name: str | None = None,
version: str | None = None,
metadata: Sequence[tuple[str, str]] | None = None,
) -> naming_v1.GetVerificationInfoResponse:
return self.naming_service.get_verification_info(
) -> identity_v1.GetVerificationInfoResponse:
return self.identity_service.get_verification_info(
cid=cid,
name=name,
version=version,
Expand Down
4 changes: 2 additions & 2 deletions dir-sdk-python/agntcy/dir_sdk/client/services/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"""Service-layer wrappers around generated gRPC stubs."""

from agntcy.dir_sdk.client.services.events import EventService
from agntcy.dir_sdk.client.services.naming import NamingService
from agntcy.dir_sdk.client.services.identity import IdentityService
from agntcy.dir_sdk.client.services.publication import PublicationService
from agntcy.dir_sdk.client.services.routing import RoutingService
from agntcy.dir_sdk.client.services.search import SearchService
Expand All @@ -14,7 +14,7 @@

__all__ = [
"EventService",
"NamingService",
"IdentityService",
"PublicationService",
"RoutingService",
"SearchService",
Expand Down
88 changes: 88 additions & 0 deletions dir-sdk-python/agntcy/dir_sdk/client/services/identity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Copyright AGNTCY Contributors (https://github.com/agntcy)
# SPDX-License-Identifier: Apache-2.0

"""Identity service wrappers."""

from __future__ import annotations

import logging
from collections.abc import Sequence

from agntcy.dir_sdk.client.services.base import RpcServiceBase
from agntcy.dir_sdk.models import identity_v1

# The reported method for a record resolved through a verified owner claim.
_OWNER_CLAIM_METHOD = "owner-claim"


class IdentityService(RpcServiceBase):
def __init__(
self, identity_client: identity_v1.IdentityServiceStub, logger: logging.Logger
) -> None:
super().__init__(logger)
self._identity_client = identity_client

def resolve(
self,
name: str,
version: str | None = None,
metadata: Sequence[tuple[str, str]] | None = None,
) -> identity_v1.ResolveResponse:
def call() -> identity_v1.ResolveResponse:
req = identity_v1.ResolveRequest(name=name)
if version:
req.version = version
return self._identity_client.Resolve(req, metadata=metadata)

return self._invoke("resolve", "Failed to resolve name", call)

def get_verification_info(
self,
cid: str | None = None,
name: str | None = None,
version: str | None = None,
metadata: Sequence[tuple[str, str]] | None = None,
) -> identity_v1.GetVerificationInfoResponse:
def call() -> identity_v1.GetVerificationInfoResponse:
req = identity_v1.GetIdentityStatusRequest()
if cid:
req.cid = cid
if name:
req.name = name
if version:
req.version = version
status = self._identity_client.GetIdentityStatus(req, metadata=metadata)
return _verification_info(status)

return self._invoke(
"get_verification_info",
"Failed to get verification info",
call,
)


def _verification_info(
status: identity_v1.GetIdentityStatusResponse,
) -> identity_v1.GetVerificationInfoResponse:
"""Projects the ownership claim result onto the legacy result shape."""
owner = status.owner
if not status.HasField("owner"):
return identity_v1.GetVerificationInfoResponse(
error_message="no verification found"
)

if owner.status != identity_v1.CLAIM_VERIFICATION_STATUS_VERIFIED:
return identity_v1.GetVerificationInfoResponse(
error_message=owner.error or "verification failed"
)

return identity_v1.GetVerificationInfoResponse(
verified=True,
verification=identity_v1.Verification(
domain=identity_v1.DomainVerification(
domain=owner.subject,
method=_OWNER_CLAIM_METHOD,
verified_at=owner.verified_at,
)
),
)
57 changes: 0 additions & 57 deletions dir-sdk-python/agntcy/dir_sdk/client/services/naming.py

This file was deleted.

2 changes: 1 addition & 1 deletion dir-sdk-python/agntcy/dir_sdk/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from . import core_v1 as core_v1
from . import events_v1 as events_v1
from . import naming_v1 as naming_v1
from . import identity_v1 as identity_v1
from . import routing_v1 as routing_v1
from . import search_v1 as search_v1
from . import sign_v1 as sign_v1
Expand Down
38 changes: 38 additions & 0 deletions dir-sdk-python/agntcy/dir_sdk/models/identity_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Copyright AGNTCY Contributors (https://github.com/agntcy)
# SPDX-License-Identifier: Apache-2.0

from __future__ import annotations

from dataclasses import dataclass

from agntcy.dir.identity.v1.claim_pb2 import *
from agntcy.dir.identity.v1.identity_service_pb2 import *
from agntcy.dir.identity.v1.identity_service_pb2_grpc import *
from google.protobuf.timestamp_pb2 import Timestamp


@dataclass
class DomainVerification:
"""Describes the verified owner of a record's name."""

domain: str
method: str
verified_at: Timestamp | None = None


@dataclass
class Verification:
"""Holds the details of a verified name."""

domain: DomainVerification | None = None


@dataclass
class GetVerificationInfoResponse:
"""The result of a name ownership lookup, projected from the record's
ownership claim (identity.v1).
"""

verified: bool = False
verification: Verification | None = None
error_message: str = ""
6 changes: 0 additions & 6 deletions dir-sdk-python/agntcy/dir_sdk/models/naming_v1.py

This file was deleted.

20 changes: 9 additions & 11 deletions examples/uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ description = "Directory SDK"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"agntcy-dir-grpc-python==1.83.1.3.20260922140046+fd75d73eab52", # v1.7.1
"agntcy-dir-protocolbuffers-python==36.1.0.1.20260922140046+fd75d73eab52", # v1.7.1
"agntcy-dir-protocolbuffers-pyi==36.2.0.1.20260922140046+fd75d73eab52", # v1.7.1
"agntcy-dir-grpc-python==1.83.1.3.20261015113725+c24aeb0a65d8", # v1.8.0
"agntcy-dir-protocolbuffers-python==36.1.0.1.20261015113725+c24aeb0a65d8", # v1.8.0
"authlib>=1.6.9",
"httpx>=0.28.1",
"grpcio>=1.78.0",
Expand Down
Loading
Loading