diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c9ce71..8070641 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Nothing -## [1.2.2] ### Added - Replacement of an existing file - Local resolver for did:ethr @@ -18,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Testing for file deletion ### Fixed - Incorrect check for others who recorded same image +### Changed +- Dockerfile uses a builder image ### Changed in DB or environment - New SQL migration (for the new file deletion feature) diff --git a/Dockerfile b/Dockerfile index 0c6efcb..8ffdbda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,7 @@ RUN apk add git RUN git clone https://gitea.anomalistdesign.com/log-trade/image-api.git WORKDIR image-api RUN git checkout $IMAGE_API_VERSION +# dev dependencies like TypeScript are needed to build RUN pnpm install RUN pnpm build RUN pnpm install --prod diff --git a/README.md b/README.md index 95a037b..b729f75 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ make -C test -j ```shell # run this first command in a directory where `npm install did-jwt` has been run CODE='OWNER_DID="did:ethr:0x0000694B58C2cC69658993A90D3840C560f2F51F"; OWNER_PRIVATE_KEY_HEX="2b6472c026ec2aa2c4235c994a63868fc9212d18b58f6cbfe861b52e71330f5b"; didJwt = require("did-jwt"); didJwt.createJWT({ exp: Math.floor(Date.now() / 1000) + 60, iat: Math.floor(Date.now() / 1000), iss: OWNER_DID }, { issuer: OWNER_DID, signer: didJwt.SimpleSigner(OWNER_PRIVATE_KEY_HEX) }).then(console.log)' +JWT=`node -e "$CODE"`; curl -X GET -H "Authorization: Bearer $JWT" http://localhost:3001/image-limits JWT=`node -e "$CODE"`; curl -X POST -H "Authorization: Bearer $JWT" -F "image=@./test.png" http://localhost:3001/image JWT=`node -e "$CODE"`; curl -X DELETE -H "Authorization: Bearer $JWT" http://localhost:3001/image/https%3A%2F%2Fgifts-image-test.s3.amazonaws.com%2F4599145c3a8792a678f458747f2d8512c680e8680bf5563c35b06cd770051ed2.png ``` diff --git a/src/server.ts b/src/server.ts index ca795ab..6a39781 100644 --- a/src/server.ts +++ b/src/server.ts @@ -65,8 +65,8 @@ app.get('/image-limits', async (req, res) => { nextWeekBeginDateTime: limitsResult.nextWeekBeginDateTime }); } catch (e) { - console.error('Error getting image limits:', e, ' ... with this string: ' + e); - return res.status(500).send({ success: false, message: 'Got this error retrieving limits: ' + e }); + console.error('Error getting image limits:', e, ' ... with this string: ' + JSON.stringify(e)); + return res.status(500).send({ success: false, message: 'Got this error retrieving limits: ' + JSON.stringify(e) }); } }); diff --git a/src/vc/did-eth-local-resolver.js b/src/vc/did-eth-local-resolver.js deleted file mode 100644 index 3921705..0000000 --- a/src/vc/did-eth-local-resolver.js +++ /dev/null @@ -1,47 +0,0 @@ -const { DIDResolutionResult } = require('did-resolver'); -/** - * This did:ethr resolver instructs the did-jwt machinery to use the - * EcdsaSecp256k1RecoveryMethod2020Uses verification method which adds the recovery bit to the - * signature to recover the DID's public key from a signature. - * - * This effectively hard codes the did:ethr DID resolver to use the address as the public key. - * @param did : string - * @returns {Promise} - * - * Similar code resides in endorser-ch - */ -const didEthLocalResolver = async(did) => { - const didRegex = /^did:ethr:(0x[0-9a-fA-F]{40})$/; - const match = did.match(didRegex); - - if (match) { - const address = match[1]; // Extract eth address: 0x... - const publicKeyHex = address; // Use the address directly as a public key placeholder - - return { - didDocumentMetadata: {}, - didResolutionMetadata: { - contentType: "application/did+ld+json" - }, - didDocument: { - '@context': [ - 'https://www.w3.org/ns/did/v1', - "https://w3id.org/security/suites/secp256k1recovery-2020/v2" - ], - id: did, - verificationMethod: [{ - id: `${did}#controller`, - type: 'EcdsaSecp256k1RecoveryMethod2020', - controller: did, - blockchainAccountId: "eip155:1:" + publicKeyHex, - }], - authentication: [`${did}#controller`], - assertionMethod: [`${did}#controller`], - }, - }; - } - - throw new Error(`Unsupported DID format: ${did}`); -}; - -module.exports = { didEthLocalResolver }; diff --git a/src/vc/did-eth-local-resolver.ts b/src/vc/did-eth-local-resolver.ts index eb3686b..93b52b3 100644 --- a/src/vc/did-eth-local-resolver.ts +++ b/src/vc/did-eth-local-resolver.ts @@ -1,5 +1,46 @@ import {DIDResolutionResult} from "did-resolver"; -declare module './did-eth-local-resolver.js' { - export function didEthLocalResolver(jwt: string): Promise; -} +/** + * This did:ethr resolver instructs the did-jwt machinery to use the + * EcdsaSecp256k1RecoveryMethod2020Uses verification method which adds the recovery bit to the + * signature to recover the DID's public key from a signature. + * + * This effectively hard codes the did:ethr DID resolver to use the address as the public key. + * @param did : string + * @returns {Promise} + * + * Similar code resides in endorser-ch + */ +export const didEthLocalResolver = async(did: string): Promise => { + const didRegex = /^did:ethr:(0x[0-9a-fA-F]{40})$/; + const match = did.match(didRegex); + + if (match) { + const address = match[1]; // Extract eth address: 0x... + const publicKeyHex = address; // Use the address directly as a public key placeholder + + return { + didDocumentMetadata: {}, + didResolutionMetadata: { + contentType: "application/did+ld+json" + }, + didDocument: { + '@context': [ + 'https://www.w3.org/ns/did/v1', + "https://w3id.org/security/suites/secp256k1recovery-2020/v2" + ], + id: did, + verificationMethod: [{ + id: `${did}#controller`, + type: 'EcdsaSecp256k1RecoveryMethod2020', + controller: did, + blockchainAccountId: "eip155:1:" + publicKeyHex, + }], + authentication: [`${did}#controller`], + assertionMethod: [`${did}#controller`], + }, + }; + } + + throw new Error(`Unsupported DID format: ${did}`); +};