diff --git a/STS.html b/STS.html new file mode 100644 index 0000000..c4f0af3 --- /dev/null +++ b/STS.html @@ -0,0 +1,171 @@ + + + + + + + + + + + diff --git a/STS.js b/STS.js new file mode 100644 index 0000000..c13a918 --- /dev/null +++ b/STS.js @@ -0,0 +1,235 @@ + +/** + * Copyright 2021 Daniel Thomas. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +module.exports = function(RED) { + "use strict"; + + function AmazonAPINode(n) { + RED.nodes.createNode(this,n); + this.awsConfig = RED.nodes.getNode(n.aws); + this.region = n.region; + this.operation = n.operation; + this.name = n.name; + this.region = this.awsConfig.region; + this.accessKey = this.awsConfig.accessKey; + this.secretKey = this.awsConfig.secretKey; + + var node = this; + var AWS = require("aws-sdk"); + AWS.config.update({ + accessKeyId: this.accessKey, + secretAccessKey: this.secretKey, + region: this.region + }); + if (!AWS) { + node.warn("Missing AWS credentials"); + return; + } + + if (this.awsConfig.proxyRequired){ + var proxy = require('proxy-agent'); + AWS.config.update({ + httpOptions: { agent: new proxy(this.awsConfig.proxy) } + }); + } + + var awsService = new AWS.STS( { 'region': node.region } ); + + node.on("input", function(msg) { + var aService = msg.AWSConfig?new AWS.STS(msg.AWSConfig) : awsService; + + node.sendMsg = function (err, data, msg) { + if (err) { + node.status({fill:"red",shape:"ring",text:"error"}); + node.error("failed: " + err.toString(), msg); + node.send([null, { err: err }]); + return; + } else { + msg.payload = data; + node.status({}); + } + node.send([msg,null]); + }; + + if (typeof service[node.operation] == "function"){ + node.status({fill:"blue",shape:"dot",text:node.operation}); + service[node.operation](aService,msg,function(err,data){ + node.sendMsg(err, data, msg); + }); + } else { + node.error("failed: Operation node defined - "+node.operation); + } + + }); + var copyArg=function(src,arg,out,outArg,isObject){ + var tmpValue=src[arg]; + outArg = (typeof outArg !== 'undefined') ? outArg : arg; + + if (typeof src[arg] !== 'undefined'){ + if (isObject && typeof src[arg]=="string" && src[arg] != "") { + tmpValue=JSON.parse(src[arg]); + } + out[outArg]=tmpValue; + } + //AWS API takes 'Payload' not 'payload' (see Lambda) + if (arg=="Payload" && typeof tmpValue == 'undefined'){ + out[arg]=src["payload"]; + } + + } + + var service={}; + + + service.AssumeRole=function(svc,msg,cb){ + var params={}; + //copyArgs + + copyArg(n,"RoleArn",params,undefined,false); + copyArg(n,"RoleSessionName",params,undefined,false); + + copyArg(msg,"RoleArn",params,undefined,false); + copyArg(msg,"RoleSessionName",params,undefined,false); + copyArg(msg,"PolicyArns",params,undefined,true); + copyArg(msg,"Policy",params,undefined,false); + copyArg(msg,"DurationSeconds",params,undefined,false); + copyArg(msg,"Tags",params,undefined,true); + copyArg(msg,"TransitiveTagKeys",params,undefined,false); + copyArg(msg,"ExternalId",params,undefined,false); + copyArg(msg,"SerialNumber",params,undefined,false); + copyArg(msg,"TokenCode",params,undefined,false); + copyArg(msg,"SourceIdentity",params,undefined,false); + + + svc.assumeRole(params,cb); + } + + + service.AssumeRoleWithSAML=function(svc,msg,cb){ + var params={}; + //copyArgs + + copyArg(n,"RoleArn",params,undefined,false); + copyArg(n,"PrincipalArn",params,undefined,false); + copyArg(n,"SAMLAssertion",params,undefined,false); + + copyArg(msg,"RoleArn",params,undefined,false); + copyArg(msg,"PrincipalArn",params,undefined,false); + copyArg(msg,"SAMLAssertion",params,undefined,false); + copyArg(msg,"PolicyArns",params,undefined,true); + copyArg(msg,"Policy",params,undefined,false); + copyArg(msg,"DurationSeconds",params,undefined,false); + + + svc.assumeRoleWithSAML(params,cb); + } + + + service.AssumeRoleWithWebIdentity=function(svc,msg,cb){ + var params={}; + //copyArgs + + copyArg(n,"RoleArn",params,undefined,false); + copyArg(n,"RoleSessionName",params,undefined,false); + copyArg(n,"WebIdentityToken",params,undefined,false); + + copyArg(msg,"RoleArn",params,undefined,false); + copyArg(msg,"RoleSessionName",params,undefined,false); + copyArg(msg,"WebIdentityToken",params,undefined,false); + copyArg(msg,"ProviderId",params,undefined,false); + copyArg(msg,"PolicyArns",params,undefined,true); + copyArg(msg,"Policy",params,undefined,false); + copyArg(msg,"DurationSeconds",params,undefined,false); + + + svc.assumeRoleWithWebIdentity(params,cb); + } + + + service.DecodeAuthorizationMessage=function(svc,msg,cb){ + var params={}; + //copyArgs + + copyArg(n,"EncodedMessage",params,undefined,false); + + copyArg(msg,"EncodedMessage",params,undefined,false); + + + svc.decodeAuthorizationMessage(params,cb); + } + + + service.GetAccessKeyInfo=function(svc,msg,cb){ + var params={}; + //copyArgs + + copyArg(n,"AccessKeyId",params,undefined,false); + + copyArg(msg,"AccessKeyId",params,undefined,false); + + + svc.getAccessKeyInfo(params,cb); + } + + + service.GetCallerIdentity=function(svc,msg,cb){ + var params={}; + //copyArgs + + + + + svc.getCallerIdentity(params,cb); + } + + + service.GetFederationToken=function(svc,msg,cb){ + var params={}; + //copyArgs + + copyArg(n,"Name",params,undefined,false); + + copyArg(msg,"Name",params,undefined,false); + copyArg(msg,"Policy",params,undefined,false); + copyArg(msg,"PolicyArns",params,undefined,true); + copyArg(msg,"DurationSeconds",params,undefined,false); + copyArg(msg,"Tags",params,undefined,true); + + + svc.getFederationToken(params,cb); + } + + + service.GetSessionToken=function(svc,msg,cb){ + var params={}; + //copyArgs + + + copyArg(msg,"DurationSeconds",params,undefined,false); + copyArg(msg,"SerialNumber",params,undefined,false); + copyArg(msg,"TokenCode",params,undefined,false); + + + svc.getSessionToken(params,cb); + } + + + + } + RED.nodes.registerType("AWS STS", AmazonAPINode); + +}; diff --git a/package.json b/package.json index 71647f5..f7cf63a 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,43 @@ { - "name": "node-red-contrib-aws", - "version": "0.7.0", - "description": "A collection of Node-RED nodes for AWS. Includes nodes for DynamoDB, EC2, IoT, Kinesis, Lambda, SNS, SQS and S3.", + "_from": "node-red-contrib-aws@0.7.0", + "_id": "node-red-contrib-aws@0.7.0", + "_inBundle": false, + "_integrity": "sha512-CfN8sOSbNwwVPcUn4T/m+rGDZZ7sqZY3WYDY+uMb+PnDWenEz0IhtM+Ki02haTqK1wkDmA2/yJPiCoWhxqatyg==", + "_location": "/node-red-contrib-aws", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "node-red-contrib-aws@0.7.0", + "name": "node-red-contrib-aws", + "escapedName": "node-red-contrib-aws", + "rawSpec": "0.7.0", + "saveSpec": null, + "fetchSpec": "0.7.0" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/node-red-contrib-aws/-/node-red-contrib-aws-0.7.0.tgz", + "_shasum": "f69d562d208108ae054abd4c3af36d24c83c2ab6", + "_spec": "node-red-contrib-aws@0.7.0", + "_where": "/home/pi/.node-red", + "author": { + "name": "daniel-t", + "email": "daniel@networklighthouse.com" + }, + "bugs": { + "url": "https://github.com/daniel-t/node-red-contrib-aws/issues" + }, + "bundleDependencies": false, "dependencies": { "aws-sdk": "2", - "proxy-agent": "3.0.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/daniel-t/node-red-contrib-aws" + "proxy-agent": "^5.0.0" }, - "license": "Apache", + "deprecated": false, + "description": "A collection of Node-RED nodes for AWS. Includes nodes for DynamoDB, EC2, IoT, Kinesis, Lambda, SNS, SQS and S3.", + "homepage": "https://github.com/daniel-t/node-red-contrib-aws#readme", "keywords": [ "node-red", "aws", @@ -20,6 +47,7 @@ "s3", "sqs", "sns", + "sts", "dynamodb", "iot", "es", @@ -31,6 +59,14 @@ "rds", "redshift" ], + "license": "Apache", + "maintainers": [ + { + "name": "daniel-t", + "email": "daniel@networklighthouse.com" + } + ], + "name": "node-red-contrib-aws", "node-red": { "nodes": { "AWS EC2": "EC2.js", @@ -40,6 +76,7 @@ "AWS DynamoDB": "DynamoDB.js", "AWS DynamoDB Converter": "DynamoDBConvert.js", "AWS SNS": "SNS.js", + "AWS STS": "STS.js", "AWS SQS": "SQS.js", "AWS RDS": "RDS.js", "AWS Firehose": "Firehose.js", @@ -56,14 +93,9 @@ "amazon config": "config.js" } }, - "author": { - "name": "daniel-t", - "email": "daniel@networklighthouse.com" + "repository": { + "type": "git", + "url": "git+https://github.com/daniel-t/node-red-contrib-aws.git" }, - "maintainers": [ - { - "name": "daniel-t", - "email": "daniel@networklighthouse.com" - } - ] + "version": "0.7.0" }