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"
}