diff --git a/golang/go.mod b/golang/go.mod index 3da6574..323c748 100644 --- a/golang/go.mod +++ b/golang/go.mod @@ -1,8 +1,8 @@ module github.com/joinself/self-sdk-examples/golang -go 1.24.2 +go 1.25 require ( github.com/go-pdf/fpdf v0.9.0 - github.com/joinself/self-go-sdk v0.60.0-4 + github.com/joinself/self-go-sdk v0.60.0-15 ) diff --git a/golang/go.sum b/golang/go.sum index 157687e..65a6fef 100644 --- a/golang/go.sum +++ b/golang/go.sum @@ -2,10 +2,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= -github.com/joinself/self-go-sdk v0.59.0 h1:OaXpcAskVMTeb/TxOlJqW7KxWLYHPDMYBQ/zDxTxSgg= -github.com/joinself/self-go-sdk v0.59.0/go.mod h1:ttChIied12ij204lRKhQVVgq091q1KWVNuzyQ+v8kyk= -github.com/joinself/self-go-sdk v0.60.0-4 h1:7b3BdlUFGaDPrYKfTbSsY25J4q2NaTUYEwEqIvJE7sM= -github.com/joinself/self-go-sdk v0.60.0-4/go.mod h1:tyq+EqY4oqDdZnD4hgWgWVNGJCDuCjwLozHS8Ic9GDU= +github.com/joinself/self-go-sdk v0.60.0-15 h1:xSALBnUJYadd+AKEm1OMp3D0/0AY9viTceQmN9FP++8= +github.com/joinself/self-go-sdk v0.60.0-15/go.mod h1:TkqSx1iGazOB+1dUbChvHffJpyM589nZk8F2KJEUZfo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/golang/main.go b/golang/main.go index 99daada..ce96b19 100644 --- a/golang/main.go +++ b/golang/main.go @@ -16,6 +16,7 @@ import ( "github.com/joinself/self-go-sdk/credential" "github.com/joinself/self-go-sdk/credential/predicate" "github.com/joinself/self-go-sdk/event" + "github.com/joinself/self-go-sdk/identity" "github.com/joinself/self-go-sdk/keypair/signing" "github.com/joinself/self-go-sdk/message" "github.com/joinself/self-go-sdk/object" @@ -122,6 +123,9 @@ func startSelf() { log.Println("server address:", inboxList[0]) + // Generate or display the application address + generateDocument() + // Generate initial QR code after account is ready log.Println("\nInitial connection QR code:") displayConnectionQR() @@ -157,6 +161,67 @@ func startSelf() { select {} } +// generateDocument creates or displays the application address (identity document) +func generateDocument() { + // Check if we already have an identity + identityList, err := selfAccount.IdentityList() + if err != nil { + log.Fatalf("Failed to get identity list: %v", err) + } + + if len(identityList) > 0 { + log.Printf("Application address: %s", identityList[0]) + return + } + + // Create new signing keys for the identity document + identifierAddress, err := selfAccount.KeychainSigningCreate() + if err != nil { + log.Fatalf("Failed to create identifier key: %v", err) + } + + invocationAddress, err := selfAccount.KeychainSigningCreate() + if err != nil { + log.Fatalf("Failed to create invocation key: %v", err) + } + + assertionAddress, err := selfAccount.KeychainSigningCreate() + if err != nil { + log.Fatalf("Failed to create assertion key: %v", err) + } + + authenticationAddress, err := selfAccount.KeychainSigningCreate() + if err != nil { + log.Fatalf("Failed to create authentication key: %v", err) + } + + messagingAddress := inboxAddress + + // Build the identity operation + operation := identity.NewOperation(). + Identifier(identifierAddress). + Sequence(0). + Timestamp(time.Now()). + GrantEmbedded(assertionAddress, identity.RoleInvocation). + GrantEmbedded(invocationAddress, identity.RoleAssertion). + GrantEmbedded(authenticationAddress, identity.RoleAuthentication). + GrantEmbedded(messagingAddress, identity.RoleMessaging). + SignWith(identifierAddress). + SignWith(invocationAddress). + SignWith(assertionAddress). + SignWith(authenticationAddress). + SignWith(messagingAddress). + Finish() + + // Execute the identity operation + err = selfAccount.IdentityExecute(operation) + if err != nil { + log.Fatalf("Failed to execute identity operation: %v", err) + } + + log.Printf("Application address: %s", identifierAddress) +} + // displayConnectionQR generates and displays a QR code in the terminal func displayConnectionQR() { qrCode, expiresAt, err := generateConnectionQR() @@ -253,10 +318,10 @@ func sendCredentialRequest(selfAccount *account.Account, msg *event.Message, cre predicate.NewTree( predicate.Contains( credential.FieldType, - credential.CredentialTypeLiveness, + credential.CredentialTypeLivenessAndFacialComparison, ).And( predicate.NotEmpty( - credential.FieldSubjectLivenessSourceImageHash, + credential.FieldSubjectLivenessAndFacialComparisonSourceImageHash, ), ), ), @@ -419,7 +484,7 @@ func handleCredentialResponse(msg *event.Message) { continue } if k != "id" && k != "sourceImageHash" && k != "targetImageHash" { - content = content + k + " = " + v.(string) + content = content + fmt.Sprintf("%s = %v\n", k, v) continue } }