Skip to content

Commit

Permalink
Gen and resolve metadata arg refactored and tested (#64)
Browse files Browse the repository at this point in the history
* added meta flag to generate command to allow for equivalent id information during generation

Signed-off-by: 2byrds <[email protected]>

* refactored metadata flag to meta and tested, then commented out integration test

Signed-off-by: 2byrds <[email protected]>

* ci clears keri

Signed-off-by: 2byrds <[email protected]>

* ci update version

Signed-off-by: 2byrds <[email protected]>

---------

Signed-off-by: 2byrds <[email protected]>
  • Loading branch information
2byrds authored Apr 1, 2024
1 parent ff29b7a commit 798ccfa
Show file tree
Hide file tree
Showing 16 changed files with 60 additions and 49 deletions.
5 changes: 4 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ jobs:
- name: Set up Python 3.10
uses: actions/setup-python@v2
with:
python-version: 3.10.13
python-version: 3.12.2
- name: Clear databases
run: |
rm -Rf /usr/local/var/keri/*
- name: Install dependencies
run: |
python -m pip install --upgrade pip
Expand Down
12 changes: 6 additions & 6 deletions src/dkr/app/cli/commands/did/keri/resolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,25 @@
dest="bran", default=None) # passcode => bran
parser.add_argument("--did", "-d", help="DID to resolve (did:keri method)", required=True)
parser.add_argument("--oobi", "-o", help="OOBI to use for resolving the DID", required=False)
parser.add_argument("--metadata", "-m", help="Whether to include metadata (True), or only return the DID document (False)", type=bool, required=False, default=None)
parser.add_argument("--meta", "-m", help="Whether to include metadata (True), or only return the DID document (False)", type=bool, required=False, default=None)


def handler(args):
hby = existing.setupHby(name=args.name, base=args.base, bran=args.bran)
hbyDoer = habbing.HaberyDoer(habery=hby) # setup doer
obl = oobiing.Oobiery(hby=hby)
res = KeriResolver(hby=hby, hbyDoer=hbyDoer, obl=obl, did=args.did, oobi=args.oobi, metadata=args.metadata)
res = KeriResolver(hby=hby, hbyDoer=hbyDoer, obl=obl, did=args.did, oobi=args.oobi, meta=args.meta)
return [res]


class KeriResolver(doing.DoDoer):

def __init__(self, hby, hbyDoer, obl, did, oobi, metadata):
def __init__(self, hby, hbyDoer, obl, did, oobi, meta):

self.hby = hby
self.did = did
self.oobi = oobi
self.metadata = metadata
self.meta = meta

self.toRemove = [hbyDoer] + obl.doers
doers = list(self.toRemove) + [doing.doify(self.resolve)]
Expand All @@ -68,9 +68,9 @@ def resolve(self, tymth, tock=0.0, **opts):
while self.hby.db.roobi.get(keys=(self.oobi,)) is None:
_ = yield tock

didresult = didding.generateDIDDoc(self.hby, did=self.did, aid=aid, oobi=self.oobi, metadata=True)
didresult = didding.generateDIDDoc(self.hby, did=self.did, aid=aid, oobi=self.oobi, meta=True)
dd = didresult[didding.DD_FIELD]
result = didresult if self.metadata else dd
result = didresult if self.meta else dd
data = json.dumps(result, indent=2)

print(data)
Expand Down
14 changes: 11 additions & 3 deletions src/dkr/app/cli/commands/did/webs/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,15 @@
required=False,
default=None,
help="Name of regery to find designated aliases attestation. Default is None.")
parser.add_argument("--meta", "-m", help="Whether to include metadata (True), or only return the DID document (False)", type=bool, required=False, default=False)

def handler(args):
gen = Generator(name=args.name, base=args.base, bran=args.bran, did=args.did, oobi=None, da_reg=args.da_reg)
gen = Generator(name=args.name, base=args.base, bran=args.bran, did=args.did, oobi=None, da_reg=args.da_reg, meta=args.meta)
return [gen]

class Generator(doing.DoDoer):

def __init__(self, name, base, bran, did, oobi, da_reg):
def __init__(self, name, base, bran, did, oobi, da_reg, meta=False):
self.name = name
self.base = base
self.bran = bran
Expand All @@ -55,6 +56,8 @@ def __init__(self, name, base, bran, did, oobi, da_reg):
self.did = did
# self.oobi = oobi
self.da_reg = da_reg
self.meta = meta
print("Generate DID document command", did, "using oobi", oobi, "and metadata", meta, "registry name for creds", da_reg)

self.toRemove = [hbyDoer] + obl.doers
doers = list(self.toRemove) + [doing.doify(self.generate)]
Expand Down Expand Up @@ -105,7 +108,12 @@ def generate(self, tymth, tock=0.0, **opts):
kcf.write(tmsg)

#generate did doc
diddoc = didding.generateDIDDoc(self.hby, did=self.did, aid=aid, oobi=None, reg_name=self.da_reg)
result = didding.generateDIDDoc(self.hby, did=self.did, aid=aid, oobi=None, reg_name=self.da_reg, meta=self.meta)

diddoc = result
if(self.meta):
diddoc = result["didDocument"]
print("Generated metadata for DID document", result["didDocumentMetadata"])

# Create the directory (and any intermediate directories in the given path) if it doesn't already exist
dd_dir_path = f"{aid}"
Expand Down
10 changes: 5 additions & 5 deletions src/dkr/app/cli/commands/did/webs/resolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,24 @@
parser.add_argument('--passcode', help='22 character encryption passcode for keystore (is not saved)',
dest="bran", default=None) # passcode => bran
parser.add_argument("--did", "-d", help="DID to resolve", required=True)
parser.add_argument("--metadata", "-m", help="Whether to include metadata (True), or only return the DID document (False)", type=bool, required=False, default=None)
parser.add_argument("--meta", "-m", help="Whether to include metadata (True), or only return the DID document (False)", type=bool, required=False, default=None)


def handler(args):
hby = existing.setupHby(name=args.name, base=args.base, bran=args.bran)
hbyDoer = habbing.HaberyDoer(habery=hby) # setup doer
obl = oobiing.Oobiery(hby=hby)
res = WebsResolver(hby=hby, hbyDoer=hbyDoer, obl=obl, did=args.did, metadata=args.metadata)
res = WebsResolver(hby=hby, hbyDoer=hbyDoer, obl=obl, did=args.did, meta=args.meta)
return [res]


class WebsResolver(doing.DoDoer):

def __init__(self, hby, hbyDoer, obl, did, metadata):
def __init__(self, hby, hbyDoer, obl, did, meta):

self.hby = hby
self.did = did
self.metadata = metadata
self.meta = meta

self.toRemove = [hbyDoer] + obl.doers
doers = list(self.toRemove) + [doing.doify(self.resolve)]
Expand All @@ -51,6 +51,6 @@ def resolve(self, tymth, tock=0.125, **opts):
self.tock = tock
_ = (yield self.tock)

resolving.resolve(hby=self.hby, did=self.did, metadata=self.metadata)
resolving.resolve(hby=self.hby, did=self.did, meta=self.meta)

self.remove(self.toRemove)
6 changes: 3 additions & 3 deletions src/dkr/core/didding.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ def parseDIDWebs(did):
return domain, port, path, aid


def generateDIDDoc(hby: habbing.Habery, did, aid, oobi=None, metadata=None, reg_name=None):
def generateDIDDoc(hby: habbing.Habery, did, aid, oobi=None, meta=False, reg_name=None):
if (did and aid) and not did.endswith(aid):
raise ValueError(f"{did} does not end with {aid}")
print("Generating DID document for", did, "with aid", aid, "using oobi", oobi, "and metadata", metadata, "registry name for creds", reg_name)
print("Generating DID document for", did, "with aid", aid, "using oobi", oobi, "and metadata", meta, "registry name for creds", reg_name)

hab = None
if aid in hby.habs:
Expand Down Expand Up @@ -178,7 +178,7 @@ def generateDIDDoc(hby: habbing.Habery, did, aid, oobi=None, metadata=None, reg_
alsoKnownAs=aka_ids
)

if metadata is True:
if meta is True:
resolutionResult = dict(
didDocument=diddoc,
didResolutionMetadata=didResolutionMetadata,
Expand Down
18 changes: 8 additions & 10 deletions src/dkr/core/resolving.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def saveCesr(hby: habbing.Habery, kc_res: requests.Response, aid: str = None):
assert aid in hby.kevers, f"KERI CESR parsing failed, KERI AID {aid} not found in habery"

def getComp(hby: habbing.Habery, did: str, aid: str, dd_res: requests.Response, kc_res: requests.Response):
dd = didding.generateDIDDoc(hby, did=did, aid=aid, oobi=None, metadata=True)
dd = didding.generateDIDDoc(hby, did=did, aid=aid, oobi=None, meta=True)
dd[didding.DD_META_FIELD]['didDocUrl'] = dd_res.url
dd[didding.DD_META_FIELD]['keriCesrUrl'] = kc_res.url

Expand All @@ -62,7 +62,7 @@ def getComp(hby: habbing.Habery, did: str, aid: str, dd_res: requests.Response,

return dd, dd_actual

def verify(dd, dd_actual, metadata: bool = False):
def verify(dd, dd_actual, meta: bool = False):
dd_exp = dd
if didding.DD_FIELD in dd_exp:
dd_exp = dd[didding.DD_FIELD]
Expand All @@ -71,7 +71,7 @@ def verify(dd, dd_actual, metadata: bool = False):

result = None
if verified:
result = dd if metadata else dd[didding.DD_FIELD]
result = dd if meta else dd[didding.DD_FIELD]
print(f"DID verified")
else:
didresult = dict()
Expand Down Expand Up @@ -145,11 +145,11 @@ def _compare_dicts(expected, actual, path=""):
if expected != actual:
print(f"Different values for key {path}: {expected} (expected) vs. {actual} (actual)", file=sys.stderr)

def resolve(hby, did, metadata=False, resq: queue.Queue = None):
def resolve(hby, did, meta=False, resq: queue.Queue = None):
aid, dd_res, kc_res = getSrcs(did=did, resq=resq)
saveCesr(hby=hby,kc_res=kc_res, aid=aid)
dd, dd_actual = getComp(hby=hby, did=did, aid=aid, dd_res=dd_res, kc_res=kc_res)
vresult = verify(dd, dd_actual, metadata=metadata)
vresult = verify(dd, dd_actual, meta=meta)
print("Resolution result: ", vresult)
return vresult

Expand Down Expand Up @@ -225,7 +225,7 @@ def __init__(self, hby, hbyDoer, obl):
super(ResolveResource, self).__init__(doers=[])
print(f"Init resolver endpoint")

def on_get(self, req, rep, did):
def on_get(self, req, rep, did, meta=False):
print(f"Request to resolve did: {did}")

if did is None:
Expand All @@ -239,20 +239,18 @@ def on_get(self, req, rep, did):
else:
oobi = None

metadata = False

if did.startswith('did:webs:'):
#res = WebsResolver(hby=self.hby, hbyDoer=self.hbyDoer, obl=self.obl, did=did)
#tymth = None # ???
#data = res.resolve(tymth)
cmd = f"dkr did webs resolve --name dkr --did {did} --metadata {metadata}"
cmd = f"dkr did webs resolve --name dkr --did {did} --meta {meta}"
stream = os.popen(cmd)
data = stream.read()
elif did.startswith('did:keri'):
#res = KeriResolver(hby=self.hby, hbyDoer=self.hbyDoer, obl=self.obl, did=did, oobi=oobi, metadata=False)
#tymth = None # ???
#data = res.resolve(tymth)
cmd = f"dkr did keri resolve --name dkr --did {did} --oobi {oobi} --metadata {metadata}"
cmd = f"dkr did keri resolve --name dkr --did {did} --oobi {oobi} --meta {meta}"
stream = os.popen(cmd)
data = stream.read()
else:
Expand Down
6 changes: 3 additions & 3 deletions tests/dkr/app/cli/commands/did/webs/test_resolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,18 +166,18 @@ def on_get(self, req, resp):
# assert dd[didding.DD_FIELD][didding.VMETH_FIELD] == dd_actual[didding.VMETH_FIELD]

# # no metadata
# vresult = resolving.verify(dd, dd_actual, metadata=False)
# vresult = resolving.verify(dd, dd_actual, meta=False)
# assert vresult[didding.VMETH_FIELD] == dd[didding.DD_FIELD][didding.VMETH_FIELD]

# # metadata
# vresult = resolving.verify(dd, dd_actual, metadata=True)
# vresult = resolving.verify(dd, dd_actual, meta=True)
# assert vresult[didding.DD_FIELD][didding.VMETH_FIELD] == dd[didding.DD_FIELD][didding.VMETH_FIELD]

# # should not verify
# dd_actual_bad = dd_actual
# # remove the last character of the id
# dd_actual_bad[didding.VMETH_FIELD][0]["id"] = dd_actual_bad[didding.VMETH_FIELD][0]["id"][:-1]
# vresult = resolving.verify(dd, dd_actual_bad, metadata=True)
# vresult = resolving.verify(dd, dd_actual_bad, meta=True)
# assert vresult[didding.DID_RES_META_FIELD]['error'] == 'notVerified'

# # TODO test services, alsoKnownAs, etc.
Expand Down
14 changes: 7 additions & 7 deletions tests/dkr/core/test_didding.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ def test_parse_web_did():

def test_gen_did_doc(setup_habs):
hby, hab, wesHby, wesHab = setup_habs
didDoc = didding.generateDIDDoc(hby, did, hab.pre, oobi=None, metadata=False)
didDoc = didding.generateDIDDoc(hby, did, hab.pre, oobi=None, meta=False)
assert (
didDoc["id"]
== f"{did}"
Expand Down Expand Up @@ -204,9 +204,9 @@ def test_gen_did_doc(setup_habs):
}


def test_gen_did_doc_with_metadata(setup_habs):
def test_gen_did_doc_with_meta(setup_habs):
hby, hab, wesHby, wesHab = setup_habs
didDoc = didding.generateDIDDoc(hby, did, hab.pre, oobi=None, metadata=True)
didDoc = didding.generateDIDDoc(hby, did, hab.pre, oobi=None, meta=True)
assert (
didDoc[didding.DD_FIELD]["id"]
== f"{did}"
Expand Down Expand Up @@ -264,14 +264,14 @@ def test_gen_did_doc_no_hab(setup_habs):
did = f"did:web:did-webs-service%3a7676:{aid}"

try:
didDoc = didding.generateDIDDoc(hby, did, aid, oobi=None, metadata=False)
didDoc = didding.generateDIDDoc(hby, did, aid, oobi=None, meta=False)
except KeyError as e:
assert str(e) == f"'{aid}'"

msgs = resolving.loadFile(f"./volume/dkr/pages/{aid}/keri.cesr")
hby.psr.parse(ims=msgs)

didDoc = didding.generateDIDDoc(hby, did, aid, oobi=None, metadata=False)
didDoc = didding.generateDIDDoc(hby, did, aid, oobi=None, meta=False)

expected = resolving.loadJsonFile(f"./volume/dkr/pages/{aid}/did.json")

Expand All @@ -290,7 +290,7 @@ def test_gen_desig_aliases(setup_habs, seeder):
)

didDoc = didding.generateDIDDoc(
hby, did, hab.pre, oobi=None, metadata=True, reg_name=crdntler.rgy.name
hby, did, hab.pre, oobi=None, meta=True, reg_name=crdntler.rgy.name
)
assert (
didDoc[didding.DD_FIELD]["id"]
Expand Down Expand Up @@ -339,7 +339,7 @@ def test_gen_desig_aliases_revoked(setup_habs, seeder):
revoke_cred(hab, crdntler.rgy, crdntler.rgy.registryByName("dAliases"), creds[0])

didDoc = didding.generateDIDDoc(
hby, did, hab.pre, oobi=None, metadata=True
hby, did, hab.pre, oobi=None, meta=True
)
assert (
didDoc[didding.DD_FIELD]["id"]
Expand Down
6 changes: 3 additions & 3 deletions volume/dkr/examples/get_started_docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ echo ""
echo "ATTENTION: In your did-webs-service, start the webs server first, see the GETTING_STARTED.md for those instructions"
read -p "Press enter to resolve did:webs..."

dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe"
dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe" --meta True

echo ""
read -p "Press enter to create designated aliases..."
Expand All @@ -40,11 +40,11 @@ kli vc export --name controller --alias controller --said "$SAID" --chain
echo ""
read -p "Press enter generate did:webs with designated aliases..."

dkr did webs generate --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe"
dkr did webs generate --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe" --meta True

cp -R ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe ../pages/

echo ""
read -p "Press enter to resolve did:webs with designated aliases..."

dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe"
dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe" --meta True
2 changes: 1 addition & 1 deletion volume/dkr/examples/get_started_docker_gen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ kli incept --name controller --alias controller --file /usr/local/var/webs/volum
echo ""
read -p "Press enter to generate did:webs..."

dkr did webs generate --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe"
dkr did webs generate --name controller --did "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe" --meta True

echo ""
read -p "Press enter to copy to pages..."
Expand Down
2 changes: 1 addition & 1 deletion volume/dkr/examples/get_started_docker_resolve.sh
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ fi
DID="did:webs:did-webs-service%3a7676:$AID"

echo "Resolving $AID did:webs $DID... "
source "./get_started_webs_resolve.sh" "${NAME}" "${DID}"
source "./get_started_webs_resolve.sh" "${NAME}" "${DID}" "True"


4 changes: 2 additions & 2 deletions volume/dkr/examples/get_started_docker_wits.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ echo ""
echo "ATTENTION: In your did-webs-service, start the webs server first, see the GETTING_STARTED.md for those instructions"
read -p "Press enter to resolve did:webs..."

dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:$AID"
dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:$AID" --meta True

echo ""
read -p "Press enter to create designated aliases..."
Expand All @@ -52,4 +52,4 @@ cp -R $AID ../pages/
echo ""
read -p "Press enter to resolve did:webs with designated aliases..."

dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:$AID"
dkr did webs resolve --name controller --did "did:webs:did-webs-service%3a7676:$AID" --meta True
2 changes: 1 addition & 1 deletion volume/dkr/examples/get_started_webs_gen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ hostPath=$2
aid=$3

# generate controller did:webs for EKYGGh-FtAphGmSZbsuBs_t4qpsjYJ2ZqvMKluq9OxmP at labs.hyperledger.org
dkr did webs generate --name "${ctrlName}" --did "did:webs:${hostPath}:${aid}"
dkr did webs generate --name "${ctrlName}" --did "did:webs:${hostPath}:${aid}" --meta True
4 changes: 3 additions & 1 deletion volume/dkr/examples/get_started_webs_resolve.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
ctrlName=$1
# did
did=$2
# metadata
meta=$3

# generate controller did:webs for EKYGGh-FtAphGmSZbsuBs_t4qpsjYJ2ZqvMKluq9OxmP at labs.hyperledger.org
dkr did webs resolve --name "${ctrlName}" --did "${did}"
dkr did webs resolve --name "${ctrlName}" --did "${did}" --meta "${meta}"
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"id": "did:web:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "verificationMethod": [{"id": "#DHr0-I-mMN7h6cLMOTRJkkfPuMd0vgQPrOk4Y3edaHjr", "type": "JsonWebKey", "controller": "did:web:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "publicKeyJwk": {"kid": "DHr0-I-mMN7h6cLMOTRJkkfPuMd0vgQPrOk4Y3edaHjr", "kty": "OKP", "crv": "Ed25519", "x": "evT4j6Yw3uHpwsw5NEmSR8-4x3S-BA-s6Thjd51oeOs"}}], "service": [], "alsoKnownAs": []}
{"id": "did:web:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "verificationMethod": [{"id": "#DHr0-I-mMN7h6cLMOTRJkkfPuMd0vgQPrOk4Y3edaHjr", "type": "JsonWebKey", "controller": "did:web:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "publicKeyJwk": {"kid": "DHr0-I-mMN7h6cLMOTRJkkfPuMd0vgQPrOk4Y3edaHjr", "kty": "OKP", "crv": "Ed25519", "x": "evT4j6Yw3uHpwsw5NEmSR8-4x3S-BA-s6Thjd51oeOs"}}], "service": [], "alsoKnownAs": ["did:web:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "did:webs:did-webs-service%3a7676:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "did:web:example.com:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "did:web:foo.com:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe", "did:webs:foo.com:ENro7uf0ePmiK3jdTo2YCdXLqW7z7xoP6qhhBou6gBLe"]}
Loading

0 comments on commit 798ccfa

Please sign in to comment.