Skip to content
This repository was archived by the owner on Feb 13, 2024. It is now read-only.

Commit 5e88801

Browse files
authored
Merge branch 'hyperledger-labs:main' into feature/rule-engine-test
2 parents 0fcb95d + 6a056cc commit 5e88801

File tree

110 files changed

+2491
-1445
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+2491
-1445
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Dockerfile that builds frontend and backend, mainly used by the docker-compose files
22

33
# Vue Build Container
4-
FROM node:16-alpine as VUE
4+
FROM node:16-alpine3.13 as VUE
55
WORKDIR /frontend
66
COPY frontend .
77
RUN npm install && npm run build

backend/business-partner-agent/src/main/java/org/hyperledger/bpa/impl/PartnerManager.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,8 @@ public PartnerAPI getPartnerByConnectionId(@NonNull String id) {
9898
}
9999

100100
public void removePartnerById(@NonNull UUID id) {
101-
repo.findById(id).ifPresent(p -> {
102-
if (p.getConnectionId() != null) {
103-
cm.removeConnection(p.getConnectionId());
104-
}
105-
});
101+
Partner p = repo.findById(id).orElseThrow(EntityNotFoundException::new);
102+
cm.removeConnection(p);
106103
repo.deleteByPartnerId(id);
107104
}
108105

backend/business-partner-agent/src/main/java/org/hyperledger/bpa/impl/aries/connection/ConnectionManager.java

Lines changed: 51 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -343,62 +343,61 @@ private void resolveAndSend(ConnectionRecord record, Partner p) {
343343
}
344344
}
345345

346-
public void removeConnection(String connectionId) {
347-
log.debug("Removing connection: {}", connectionId);
348-
try {
346+
public void removeConnection(@NonNull Partner partner) {
347+
if (StringUtils.isNotEmpty(partner.getConnectionId())) {
348+
String connectionId = partner.getConnectionId();
349+
log.debug("Removing aca-py connection: {}", connectionId);
349350
try {
350-
ac.connectionsRemove(connectionId);
351-
} catch (IOException | AriesException e) {
352-
log.warn("Could not delete aries connection.", e);
351+
try {
352+
ac.connectionsRemove(connectionId);
353+
} catch (AriesException e) {
354+
log.warn("Could not delete aca-py connection.", e);
355+
}
356+
357+
ac.presentProofRecords(PresentProofRecordsFilter
358+
.builder()
359+
.connectionId(connectionId)
360+
.build()).ifPresent(records -> records.forEach(record -> {
361+
try {
362+
ac.presentProofRecordsRemove(record.getPresentationExchangeId());
363+
} catch (IOException | AriesException e) {
364+
log.error("Could not delete presentation exchange record: {}",
365+
record.getPresentationExchangeId(), e);
366+
}
367+
}));
368+
ac.issueCredentialRecords(IssueCredentialRecordsFilter
369+
.builder()
370+
.connectionId(connectionId)
371+
.build()).ifPresent(records -> records.forEach(record -> {
372+
try {
373+
ac.issueCredentialRecordsRemove(record.getCredentialExchangeId());
374+
} catch (IOException | AriesException e) {
375+
log.error("Could not delete credential exchange record: {}",
376+
record.getCredentialExchangeId(), e);
377+
}
378+
}));
379+
ac.issueCredentialV2Records(V2IssueCredentialRecordsFilter
380+
.builder()
381+
.connectionId(connectionId)
382+
.build()).ifPresent(records -> records.forEach(record -> {
383+
try {
384+
ac.issueCredentialV2RecordsRemove(record.getCredExRecord().getCredExId());
385+
} catch (IOException | AriesException e) {
386+
log.error("Could not delete credential exchange record: {}",
387+
record.getCredExRecord().getCredExId(), e);
388+
}
389+
}));
390+
} catch (IOException e) {
391+
log.error("Could not delete aca-py connection: {}", connectionId, e);
353392
}
393+
}
354394

355-
Optional<Partner> partner = partnerRepo.findByConnectionId(connectionId);
356-
partner.ifPresent(p -> {
357-
holderCredExRepo.setPartnerIdToNull(p.getId());
358-
final List<PartnerProof> proofs = partnerProofRepo.findByPartnerId(p.getId());
359-
if (CollectionUtils.isNotEmpty(proofs)) {
360-
partnerProofRepo.deleteAll(proofs);
361-
}
362-
});
363-
364-
ac.presentProofRecords(PresentProofRecordsFilter
365-
.builder()
366-
.connectionId(connectionId)
367-
.build()).ifPresent(records -> records.forEach(record -> {
368-
try {
369-
ac.presentProofRecordsRemove(record.getPresentationExchangeId());
370-
} catch (IOException | AriesException e) {
371-
log.error("Could not delete presentation exchange record: {}",
372-
record.getPresentationExchangeId(), e);
373-
}
374-
}));
375-
ac.issueCredentialRecords(IssueCredentialRecordsFilter
376-
.builder()
377-
.connectionId(connectionId)
378-
.build()).ifPresent(records -> records.forEach(record -> {
379-
try {
380-
ac.issueCredentialRecordsRemove(record.getCredentialExchangeId());
381-
} catch (IOException | AriesException e) {
382-
log.error("Could not delete credential exchange record: {}",
383-
record.getCredentialExchangeId(), e);
384-
}
385-
}));
386-
ac.issueCredentialV2Records(V2IssueCredentialRecordsFilter
387-
.builder()
388-
.connectionId(connectionId)
389-
.build()).ifPresent(records -> records.forEach(record -> {
390-
try {
391-
ac.issueCredentialV2RecordsRemove(record.getCredExRecord().getCredExId());
392-
} catch (IOException | AriesException e) {
393-
log.error("Could not delete credential exchange record: {}",
394-
record.getCredExRecord().getCredExId(), e);
395-
}
396-
}));
397-
partner.ifPresent(value -> eventPublisher
398-
.publishEventAsync(PartnerRemovedEvent.builder().partner(value).build()));
399-
} catch (IOException e) {
400-
log.error("Could not delete connection: {}", connectionId, e);
395+
holderCredExRepo.setPartnerIdToNull(partner.getId());
396+
final List<PartnerProof> proofs = partnerProofRepo.findByPartnerId(partner.getId());
397+
if (CollectionUtils.isNotEmpty(proofs)) {
398+
partnerProofRepo.deleteAll(proofs);
401399
}
400+
eventPublisher.publishEventAsync(PartnerRemovedEvent.builder().partner(partner).build());
402401
}
403402

404403
public boolean sendMessage(String connectionId, String content) {

backend/business-partner-agent/src/main/java/org/hyperledger/bpa/impl/aries/credential/IssuerManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ public void handleV1CredentialExchange(@NonNull V1CredentialExchange ex) {
323323
public void handleV2CredentialRequest(@NonNull V20CredExRecord ex) {
324324
issuerCredExRepo.findByCredentialExchangeId(ex.getCredentialExchangeId()).ifPresentOrElse(db -> {
325325
try {
326-
if (Boolean.FALSE.equals(acaPyConfig.getAutoRespondCredentialRequest())) {
326+
if (Boolean.FALSE.equals(acaPyConfig.getAutoRespondCredentialRequest()) && !ex.autoIssueEnabled()) {
327327
ac.issueCredentialV2RecordsIssue(ex.getCredentialExchangeId(),
328328
V20CredIssueRequest.builder().build());
329329
}

backend/business-partner-agent/src/main/java/org/hyperledger/bpa/persistence/repository/HolderCredExRepository.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ Number updateRevoked(@Id UUID id, Boolean revoked,
101101

102102
Number updateReferent(@Id UUID id, @Nullable String referent);
103103

104-
@Query("UPDATE bpa_credential_exchange SET partner_id = null WHERE partner_id = :partnerId AND role = 'HOLDER'")
104+
@Query("UPDATE bpa_credential_exchange SET partner_id = null " +
105+
"WHERE partner_id = :partnerId " +
106+
"AND role = 'HOLDER' " +
107+
"AND state IN ('CREDENTIAL_ACKED', 'DONE')")
105108
Number setPartnerIdToNull(UUID partnerId);
106109

107110
// count

backend/business-partner-agent/src/test/java/org/hyperledger/bpa/RunWithAries.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
@Testcontainers
3434
public abstract class RunWithAries extends BaseTest {
3535

36-
private static final String ARIES_VERSION = "bcgovimages/aries-cloudagent:py36-1.16-1_0.7.3";
36+
private static final String ARIES_VERSION = "bcgovimages/aries-cloudagent:py36-1.16-1_0.7.4-rc4";
3737
/** Container local port, the mapped port is random */
3838
private static final Integer ARIES_ADMIN_PORT = 8031;
3939

@@ -56,6 +56,10 @@ public RunWithAries() {
5656
+ " -e http://0.0.0.0"
5757
+ " --log-level info"
5858
+ " --no-ledger"
59+
+ " --wallet-type askar"
60+
+ " --wallet-name testWallet"
61+
+ " --wallet-key testKey"
62+
+ " --auto-provision"
5963
+ " --plugin aries_cloudagent.messaging.jsonld")
6064
.waitingFor(Wait.defaultWaitStrategy())
6165
.withLogConsumer(new Slf4jLogConsumer(log));

backend/business-partner-agent/src/test/java/org/hyperledger/bpa/impl/PartnerManagerTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,15 @@
1919

2020
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
2121
import jakarta.inject.Inject;
22+
import org.hyperledger.aries.api.issue_credential_v1.CredentialExchangeState;
23+
import org.hyperledger.bpa.api.CredentialType;
2224
import org.hyperledger.bpa.controller.api.partner.UpdatePartnerRequest;
25+
import org.hyperledger.bpa.persistence.model.BPACredentialExchange;
26+
import org.hyperledger.bpa.persistence.model.BPASchema;
2327
import org.hyperledger.bpa.persistence.model.Partner;
2428
import org.hyperledger.bpa.persistence.model.Tag;
29+
import org.hyperledger.bpa.persistence.repository.BPASchemaRepository;
30+
import org.hyperledger.bpa.persistence.repository.HolderCredExRepository;
2531
import org.hyperledger.bpa.persistence.repository.PartnerRepository;
2632
import org.hyperledger.bpa.persistence.repository.TagRepository;
2733
import org.junit.jupiter.api.Assertions;
@@ -41,6 +47,12 @@ public class PartnerManagerTest {
4147
@Inject
4248
PartnerRepository partnerRepo;
4349

50+
@Inject
51+
HolderCredExRepository holderRepo;
52+
53+
@Inject
54+
BPASchemaRepository schemaRepo;
55+
4456
@Test
4557
void testAddAndRemovePartnerTag() {
4658
Tag t1 = tagRepo.save(Tag
@@ -98,6 +110,29 @@ void testAddAndRemovePartnerTag() {
98110
Assertions.assertEquals(0, dbTag1.get().getPartners().size());
99111
}
100112

113+
@Test
114+
void testRemovePartner() {
115+
Partner p = partnerRepo.save(buildPartnerWithoutTag().build());
116+
BPASchema schema = schemaRepo.save(BPASchema.builder()
117+
.schemaId("mySchema")
118+
.schemaAttributeName("test")
119+
.type(CredentialType.JSON_LD)
120+
.build());
121+
BPACredentialExchange credEx = holderRepo.save(BPACredentialExchange
122+
.builder()
123+
.partner(p)
124+
.schema(schema)
125+
.credentialExchangeId("1")
126+
.threadId("2")
127+
.state(CredentialExchangeState.CREDENTIAL_ACKED)
128+
.build());
129+
partnerManager.removePartnerById(p.getId());
130+
131+
Assertions.assertTrue(partnerRepo.findById(p.getId()).isEmpty());
132+
Assertions.assertTrue(holderRepo.findById(credEx.getId()).isEmpty());
133+
Assertions.assertEquals(0, holderRepo.count());
134+
}
135+
101136
private void checkTagOnPartner(UUID partnerId, String... tagName) {
102137
Optional<Partner> dbP = partnerRepo.findById(partnerId);
103138
Assertions.assertTrue(dbP.isPresent());

backend/business-partner-agent/src/test/java/org/hyperledger/bpa/persistence/repository/HolderCredExRepositoryTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,27 @@ void testUpdateCredentialOffer() {
166166
assertEquals("value1", exchange.getCredentialOffer().getIndy().getAttributes().get(0).getValue());
167167
}
168168

169+
@Test
170+
void testSetPartnerIdToNull() {
171+
Partner p = createRandomPartner();
172+
Partner p2 = createRandomPartner();
173+
holderCredExRepo.save(createDummyCredEx(p));
174+
BPACredentialExchange done = createDummyCredEx(p).setState(CredentialExchangeState.DONE);
175+
holderCredExRepo.save(done);
176+
holderCredExRepo.save(createDummyCredEx(p).setState(CredentialExchangeState.CREDENTIAL_RECEIVED));
177+
holderCredExRepo.save(createDummyCredEx(p).setState(CredentialExchangeState.PROBLEM));
178+
179+
Assertions.assertEquals(4, holderCredExRepo.count());
180+
181+
holderCredExRepo.setPartnerIdToNull(p.getId());
182+
partnerRepo.deleteByPartnerId(p.getId());
183+
184+
Assertions.assertEquals(2, holderCredExRepo.count());
185+
Assertions.assertNull(holderCredExRepo.findById(done.getId()).orElseThrow().getPartner());
186+
187+
partnerRepo.deleteByPartnerId(p2.getId());
188+
}
189+
169190
private static BPACredentialExchange createDummyCredEx(Partner partner) {
170191
return BPACredentialExchange
171192
.builder()

frontend/backend-types.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ export interface paths {
278278
get: operations["getMatchingCredentials"];
279279
};
280280
"/api/proof-exchanges/{id}/matching-credentials-ld": {
281-
get: operations["getMatchingDifCredentials"];
281+
get: operations["getMatchingLDCredentials"];
282282
};
283283
"/api/proof-exchanges/{id}/prove": {
284284
/** Manual proof exchange flow. Answer ProofRequest with matching attributes */
@@ -702,27 +702,30 @@ export interface components {
702702
trace: boolean;
703703
updatedAt: string;
704704
};
705+
// @ts-ignore
705706
IssueCredentialRequest: (
706707
| components["schemas"]["IssueCredentialRequest.IssueIndyCredentialRequest"]
707708
| components["schemas"]["IssueCredentialRequest.IssueLDCredentialRequest"]
708709
) & {
709710
/** Format: uuid */
710711
partnerId: string;
711712
/** @description credential exchange type */
712-
type?: components["schemas"]["CredentialType"] & unknown;
713+
type?: unknown;
713714
/**
714715
* @description credential body key value pairs
715716
* @example {}
716717
*/
717718
document?: { [key: string]: unknown }[];
718719
};
719-
"IssueCredentialRequest.IssueIndyCredentialRequest": {
720+
// @ts-ignore
721+
"IssueCredentialRequest.IssueIndyCredentialRequest": components["schemas"]["IssueCredentialRequest"] & {
720722
/** Format: uuid */
721723
credDefId: string;
722724
/** @description credential exchange api version */
723-
exchangeVersion?: components["schemas"]["ExchangeVersion"] & unknown;
725+
exchangeVersion?: unknown;
724726
};
725-
"IssueCredentialRequest.IssueLDCredentialRequest": {
727+
// @ts-ignore
728+
"IssueCredentialRequest.IssueLDCredentialRequest": components["schemas"]["IssueCredentialRequest"] & {
726729
/** Format: uuid */
727730
schemaId: string;
728731
};
@@ -1061,7 +1064,7 @@ export interface components {
10611064
};
10621065
PresentationRequestVersion: {
10631066
/** @description presentation exchange api version */
1064-
exchangeVersion?: components["schemas"]["ExchangeVersion"] & unknown;
1067+
exchangeVersion?: unknown;
10651068
};
10661069
ProofTemplate: {
10671070
id: string | null;
@@ -2483,14 +2486,14 @@ export interface operations {
24832486
};
24842487
};
24852488
};
2486-
getMatchingDifCredentials: {
2489+
getMatchingLDCredentials: {
24872490
parameters: {
24882491
path: {
24892492
id: string;
24902493
};
24912494
};
24922495
responses: {
2493-
/** getMatchingDifCredentials 200 response */
2496+
/** getMatchingLDCredentials 200 response */
24942497
200: {
24952498
content: {
24962499
"application/json": components["schemas"]["PresentationRequestCredentialsLD"];

frontend/package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)