diff --git a/MAINTAINERS.md b/MAINTAINERS.md
new file mode 100644
index 000000000..fa0eb296c
--- /dev/null
+++ b/MAINTAINERS.md
@@ -0,0 +1,8 @@
+## Maintainers
+
+### Active Maintainers
+| name | Github | Discord |
+|--------------------|----------------------------------------------------|----------------|
+| Philipp Etschel | [@etschelp](https://github.com/etschelp) | etschelp#7436 |
+| Tim Schlagenhaufer | [@schlagtim](https://github.com/schlagtim) | schlagtim#1600 |
+| Driton Goxhufi | [@DritonGoxhufi](https://github.com/DritonGoxhufi) | Driton#1353 |
\ No newline at end of file
diff --git a/README.md b/README.md
index e8a248aed..39289cee5 100644
--- a/README.md
+++ b/README.md
@@ -30,55 +30,56 @@ The Business Partner Agent is built on top of the Hyperledger Self-Sovereign Ide
## Features in Detail
-| Role/Feature | Flow | Protocol Version |
-|------------------|----------------------------------------------------------------------------------------------------------------|-----------------------------------|
-| Issuer | | |
-| | auto: issue credential | indy: v1, v2
w3c: v2 |
-| | manual: send credential offer to holder | indy: v1, v2
w3c: v2 |
-| | manual: receive credential proposal from holder | indy: v1, v2
w3c: v2 |
-| | manual: decline credential proposal from holder and provide reason | indy: v1, v2
w3c: v2 |
-| | send credential offer as invitation attachment | indy: v2 |
-| | revoke issued credential (requires tails server) | indy: v1, v2
w3c: n/a |
-| | send revocation notification | indy: v1, v2
w3c: n/a |
-| Holder | | |
-| | auto: receive credential | indy: v1, v2
w3c: v2 |
-| | manual: send credential proposal to issuer (based on document) | indy: v1, v2
w3c: v2 |
-| | manual: receive credential offer from issuer | indy: v1, v2
w3c: v2 |
-| | manual: decline credential offer from issuer | indy: v1, v2
w3c: v2 |
-| | scheduled revocation check on all received credentials | indy: v1, v2
w3c: n/a |
-| | receive revocation notification | indy: v1, v2
w3c: n/a |
-| Prover | | |
-| | auto: send presentation to verifier | indy: v1, v2
w3c: v2 |
-| | auto: answer presentation request | indy: v1, v2
w3c: v2 |
-| | manual: accept/decline presentation request and provide reason | indy: v1, v2
w3c: v2 |
-| Verifier | | |
-| | auto: request presentation from prover based on proof template | indy: v1, v2
w3c: v2 |
-| | auto: receive and verify presentation from prover | indy: v1, v2
w3c: v2 |
-| Proof-Template | | |
-| | prepared presentation request templates for indy and w3c presentation exchanges | |
-| | query by: schema attributes. restrict by: attribute value, predicates (<, >, <=, >=), schema, and issuer did | indy |
-| | query by: schema attributes. restrict by: attribute value, schema, and issuer did | w3c |
-| Connection | | |
-| | connect by did:sov, did:web (if endpoint is aca-py) | did-exchange |
-| | receive invitation by URL | connection-protocol, OOB |
-| | create invitation (barcode or URL) | connection-protocol, OOB |
-| | auto: accept incoming connection | did-exchange, connection-protocol |
-| | manual: accept incoming connection | did-exchange, connection-protocol |
-| | optional: scheduled trust ping to check connection status | n/a |
-| | tag a connection, e.g. as trusted issuer | n/a |
-| Ledger | | |
-| | send schema to the ledger (requires endorser role) | n/a |
-| | create a credential definition on the ledger (requires endorser role) | n/a |
-| Basic Message | | |
-| | send and receive basic messages via chat window | n/a |
-| Tasks/Activities | | |
-| | list of tasks that need attention, and list of past activities | n/a |
-| TAA | | |
-| | if ledger is configured with a TAA, show it and give option to accept | n/a |
-| Read Only Ledger | | |
-| | if mode is set to web only | n/a |
-| Public Profile | | |
-| | web accessible (self signed) imprint based on (indy/w3c) credentials or documents | n/a |
+| Role/Feature | Flow | Protocol Version |
+|------------------|--------------------------------------------------------------------------------------------------------------|-----------------------------------|
+| Issuer | | |
+| | auto: issue credential | indy: v1, v2
w3c: v2 |
+| | manual: send credential offer to holder | indy: v1, v2
w3c: v2 |
+| | manual: receive credential proposal from holder | indy: v1, v2
w3c: v2 |
+| | manual: decline credential proposal from holder and provide reason | indy: v1, v2
w3c: v2 |
+| | send credential offer as invitation attachment | indy: v1, v2 |
+| | revoke issued credential (requires tails server) | indy: v1, v2
w3c: n/a |
+| | send revocation notification | indy: v1, v2
w3c: n/a |
+| Holder | | |
+| | auto: receive credential | indy: v1, v2
w3c: v2 |
+| | manual: send credential proposal to issuer (based on document) | indy: v1, v2
w3c: v2 |
+| | manual: receive credential offer from issuer | indy: v1, v2
w3c: v2 |
+| | manual: decline credential offer from issuer | indy: v1, v2
w3c: v2 |
+| | scheduled revocation check on all received credentials | indy: v1, v2
w3c: n/a |
+| | receive revocation notification | indy: v1, v2
w3c: n/a |
+| Prover | | |
+| | auto: send presentation to verifier | indy: v1, v2
w3c: v2 |
+| | auto: answer presentation request | indy: v1, v2
w3c: v2 |
+| | manual: accept/decline presentation request and provide reason | indy: v1, v2
w3c: v2 |
+| Verifier | | |
+| | auto: request presentation from prover based on proof template | indy: v1, v2
w3c: v2 |
+| | auto: receive and verify presentation from prover | indy: v1, v2
w3c: v2 |
+| | send presentation request as invitation attachment (backend only) | indy: v1, v2
w3c: v2 |
+| Proof-Template | | |
+| | prepared presentation request templates for indy and w3c presentation exchanges | |
+| | query by: schema attributes. restrict by: attribute value, predicates (<, >, <=, >=), schema, and issuer did | indy |
+| | query by: schema attributes. restrict by: attribute value, schema, and issuer did | w3c |
+| Connection | | |
+| | connect by did:sov, did:web (if endpoint is aca-py) | did-exchange |
+| | receive invitation by URL | connection-protocol, OOB |
+| | create invitation (barcode or URL) | connection-protocol, OOB |
+| | auto: accept incoming connection | did-exchange, connection-protocol |
+| | manual: accept incoming connection | did-exchange, connection-protocol |
+| | optional: scheduled trust ping to check connection status | n/a |
+| | tag a connection, e.g. as trusted issuer | n/a |
+| Ledger | | |
+| | send schema to the ledger (requires endorser role) | n/a |
+| | create a credential definition on the ledger (requires endorser role) | n/a |
+| Basic Message | | |
+| | send and receive basic messages via chat window | n/a |
+| Tasks/Activities | | |
+| | list of tasks that need attention, and list of past activities | n/a |
+| TAA | | |
+| | if ledger is configured with a TAA, show it and give option to accept | n/a |
+| Read Only Ledger | | |
+| | if mode is set to web only | n/a |
+| Public Profile | | |
+| | web accessible (self signed) imprint based on (indy/w3c) credentials or documents | n/a |
## Upcoming Features
diff --git a/backend/business-partner-agent/pom.xml b/backend/business-partner-agent/pom.xml
index d22de3ecf..d52b86ebe 100644
--- a/backend/business-partner-agent/pom.xml
+++ b/backend/business-partner-agent/pom.xml
@@ -112,7 +112,7 @@
org.apache.tomcat
tomcat-annotations-api
- 10.1.0-M16
+ 10.1.0-M17
@@ -133,7 +133,7 @@
network.idu.acapy
aries-client-python
- 0.7.26
+ 0.7.27
org.hyperledger.business-partner-agent
@@ -452,7 +452,7 @@
org.apache.maven.plugins
maven-resources-plugin
- 3.2.0
+ 3.3.0
copy-frontend-resources
diff --git a/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/AdminController.java b/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/AdminController.java
index 1857721a0..d4cf3e1d1 100644
--- a/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/AdminController.java
+++ b/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/AdminController.java
@@ -287,6 +287,8 @@ public HttpResponse registerEndpoints(@Body TAADigestRequest tAADigest) {
}
/**
+ * Returns true if a TAA needs to be accepted before writing to the ledger
+ *
* @return true if endpoint registration is required
*/
@Get("/endpoints/registrationRequired")
diff --git a/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/InvitationController.java b/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/InvitationController.java
index 9a6df5416..a4564d381 100644
--- a/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/InvitationController.java
+++ b/backend/business-partner-agent/src/main/java/org/hyperledger/bpa/controller/InvitationController.java
@@ -18,15 +18,16 @@
package org.hyperledger.bpa.controller;
import io.micronaut.http.HttpResponse;
+import io.micronaut.http.HttpStatus;
import io.micronaut.http.MutableHttpResponse;
-import io.micronaut.http.annotation.Body;
-import io.micronaut.http.annotation.Controller;
-import io.micronaut.http.annotation.Post;
+import io.micronaut.http.annotation.*;
import io.micronaut.scheduling.TaskExecutors;
import io.micronaut.scheduling.annotation.ExecuteOn;
import io.micronaut.security.annotation.Secured;
import io.micronaut.security.rules.SecurityRule;
import io.micronaut.validation.Validated;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Inject;
import lombok.extern.slf4j.Slf4j;
@@ -35,18 +36,26 @@
import org.hyperledger.bpa.controller.api.invitation.CheckInvitationRequest;
import org.hyperledger.bpa.controller.api.partner.CreatePartnerInvitationRequest;
import org.hyperledger.bpa.impl.aries.connection.ConnectionManager;
+import org.hyperledger.bpa.impl.oob.OOBCredentialOffer;
+
+import java.util.UUID;
@Slf4j
-@Controller("/api/invitations")
+@Controller(InvitationController.INVITATION_CONTROLLER_BASE_URL)
@Tag(name = "Invitation Management")
@Validated
@Secured(SecurityRule.IS_AUTHENTICATED)
@ExecuteOn(TaskExecutors.IO)
public class InvitationController {
+ public static final String INVITATION_CONTROLLER_BASE_URL = "/api/invitations";
+
@Inject
ConnectionManager cm;
+ @Inject
+ OOBCredentialOffer offerManager;
+
/**
* Check invitation (receive)
*
@@ -82,4 +91,21 @@ public HttpResponse requestConnectionInvitation(
return HttpResponse.ok(cm.createConnectionInvitation(req));
}
+ /**
+ * Handle OOB credential/presentation exchange with attachment step 2 - redirect
+ * with encoded attachment
+ *
+ * @param id {@link UUID}
+ * @return Redirect with encoded credential-offer/presentation-request
+ * attachment in the location header
+ */
+ @Secured(SecurityRule.IS_ANONYMOUS)
+ @Hidden
+ @ApiResponse(responseCode = "301", description = "Redirect with encoded credential offer in the location header")
+ @Get("/oob-attachment/{id}")
+ public HttpResponse