diff --git a/index.js b/index.js new file mode 100644 index 0000000..7ea178b --- /dev/null +++ b/index.js @@ -0,0 +1,40 @@ +const AWS = require('aws-sdk'); + +const defaultOptions = { + accessKeyId: null + , secretAccessKey: null + , bucketName: null + , bucketRegion: null + , directory: '' +} + +const s3 = new AWS.S3({ apiVersion: '2006-03-01' }); + +module.exports.create = (createOptions) => { + const options = Object.assign({}, defaultOptions, createOptions); + + AWS.config.update({ + region: options.bucketRegion + , credentials: new AWS.Credentials({ + accessKeyId: options.accessKeyId + , secretAccessKey: options.secretAccessKey + }) + }); + + const handlers = { + + set: (opts) => { + return require('./lib/set').set(opts, options, s3); + }, + + get: (opts) => { + return require('./lib/get').get(opts, options, s3); + }, + + remove: (opts) => { + return require('./lib/remove').remove(opts, options, s3); + } + }; + + return handlers; +}; \ No newline at end of file diff --git a/lib/get.js b/lib/get.js new file mode 100644 index 0000000..1d713d4 --- /dev/null +++ b/lib/get.js @@ -0,0 +1,12 @@ +module.exports.get = (opts, options, s3) => { + let challengeKey = options.directory + opts.challenge.token; + return s3.getObject({ Key: challengeKey, Bucket: options.bucketName }).promise().then(function (data) { + console.log('Successfully retrieved challenge.' + data.Body.toString()); + return { + keyAuthorization: data.Body.toString() + } + }).catch(function (err) { + console.error(err.message); + return null; + }); +} \ No newline at end of file diff --git a/lib/remove.js b/lib/remove.js new file mode 100644 index 0000000..57a820c --- /dev/null +++ b/lib/remove.js @@ -0,0 +1,10 @@ +module.exports.remove = (opts, options, s3) => { + challengeKey = options.directory + opts.challenge.token; + return s3.deleteObject({ Key: challengeKey, Bucket: options.bucketName }).promise().then(function (data) { + console.log('Successfully deleted challenge.'); + return data; + }).catch(function (err) { + console.error('There was an error deleting your challenge: ', err.message); + throw err; + }); +} \ No newline at end of file diff --git a/lib/set.js b/lib/set.js new file mode 100644 index 0000000..fdebe2a --- /dev/null +++ b/lib/set.js @@ -0,0 +1,14 @@ +const path = require('path'); + +module.exports.set = (opts, options, s3) => { + var challengeKey = path.join(options.directory, opts.challenge.token); + console.log(challengeKey); + + return s3.putObject({ Key: challengeKey, Body: opts.challenge.keyAuthorization, Bucket: options.bucketName }).promise().then(function (data) { + console.log('Successfully created challenge.'); + return null; + }).catch(function (err) { + console.error('There was an error creating your challenge: ' + err.message); + throw err; + }); +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 74b64a1..165ee47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,6 +46,12 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "greenlock-challenge-test": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/greenlock-challenge-test/-/greenlock-challenge-test-3.0.2.tgz", + "integrity": "sha512-0C4R6ETUrmBKxjsV9r8HsL+5DRpfoNR4LaGngNsznXr6MyZQBPEojpGECObkalRHN4qkLkq8qP7eusXyXXOj0Q==", + "dev": true + }, "ieee754": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", diff --git a/package.json b/package.json index 53af398..8f9fff5 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ }, "homepage": "https://github.com/cderche/greenlock-challenge-s3#readme", "devDependencies": { - "dotenv": "^8.0.0" + "dotenv": "^8.0.0", + "greenlock-challenge-test": "^3.0.2" }, "dependencies": { "aws-sdk": "^2.451.0" diff --git a/test.js b/test.js new file mode 100644 index 0000000..92b014f --- /dev/null +++ b/test.js @@ -0,0 +1,29 @@ +console.log('Testing the challenge.'); + +require('dotenv').config(); + +let accessKeyId = process.env.AWS_ACCESS_KEY_ID +secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY +regionName = process.env.AWS_BUCKET_REGION +bucketName = process.env.AWS_BUCKET_NAME + +let tester = require('greenlock-challenge-test'); + +let challenger = require('./index').create({ + accessKeyId: accessKeyId + , secretAccessKey: secretAccessKey + , regionName: regionName + , bucketName: bucketName + , directory: '' + , debug: true +}); + +let domain = 'example.com'; + +// All of these tests can pass locally, standalone without any ACME integration. +tester.test('http-01', domain, challenger).then(() => { + console.info("Test completed successfully."); +}).catch((err) => { + console.error(err.message); + throw err; +}); \ No newline at end of file