Skip to content

Commit 5cf12f9

Browse files
authored
Merge pull request #416 from chughts/iamfix
IAM fix
2 parents 60ea8bc + 3793cac commit 5cf12f9

File tree

11 files changed

+393
-61
lines changed

11 files changed

+393
-61
lines changed

README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@ Node-RED Watson Nodes for IBM Cloud
88
<a href="https://cla-assistant.io/watson-developer-cloud/node-red-node-watson"><img src="https://cla-assistant.io/readme/badge/watson-developer-cloud/node-red-node-watson" alt="CLA assistant" /></a>
99

1010
### New in version 0.7.0
11-
- Assistant, Discovery, Natural Language Understanding, Personality Insights,
11+
- In this release STT in Stream mode with IAM Keys does not work.
12+
- Assistant, Discovery, Language Identify, Language Translator,
13+
Natural Language Understanding, Personality Insights,
1214
Speech to Text, Text to Speech, Tone Analyzer nodes updated
13-
to allow for use of iam key for authentication.
15+
to allow for use of IAM key for authentication.
1416
- Migrated STT node off deprecated methods.
1517
- Fix to Tone Analyzer Node to preserve credentials on config reopen.
1618
- Fix to Tone Analyzer to allow json objects and arrays as payload.
1719
- Fix to STT where auto-connect was not being preserved when reopening configuration.
1820
- Bump to 2018-03-05 version date for Discovery service.
21+
- Move to V3 of Language Translator
1922
- Migrated Discovery Nodes off deprecated methods.
2023
- Remove Deprecated Retrieve and Rank Nodes
2124

package.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"temp": "^0.8.3",
1111
"qs": "6.x",
1212
"image-type": "^2.0.2",
13-
"watson-developer-cloud": "^3.4.5",
13+
"watson-developer-cloud": "^3.5.0",
1414
"kuromoji": "^0.1.1",
1515
"word-count": "^0.2.2",
1616
"is-docx": "^0.0.3",
@@ -40,9 +40,9 @@
4040
"watson-discovery-v1": "services/discovery/v1.js",
4141
"watson-discovery-v1-document-loader": "services/discovery/v1-document-loader.js",
4242
"watson-discovery-v1-query-builder": "services/discovery/v1-query-builder.js",
43-
"watson-language-translator-v2": "services/language_translator/v2.js",
44-
"watson-language-translator-identify-v2": "services/language_translator_identify/v2.js",
45-
"watson-language-translator-util-v2": "services/language_translator_util/v2.js",
43+
"watson-language-translator-v3": "services/language_translator/v3.js",
44+
"watson-language-translator-identify-v3": "services/language_translator_identify/v3.js",
45+
"watson-language-translator-util-v3": "services/language_translator_util/v3.js",
4646
"watson-natural-language-classifier-v1": "services/natural_language_classifier/v1.js",
4747
"watson-natural-language-understanding-v1": "services/natural_language_understanding/v1.js",
4848
"watson-personality-insights-v3": "services/personality_insights/v3.js",

services/language_translator/v2.html services/language_translator/v3.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
<label for="node-input-password"><i class="fa fa-key"></i> Password</label>
3939
<input type="password" id="node-input-password" placeholder="Password"/>
4040
</div>
41+
<div class="form-row credentials" style="display: none;">
42+
<label for="node-input-apikey"><i class="fa fa-key"></i> API Key</label>
43+
<input type="password" id="node-input-apikey" placeholder="API Key"></input>
44+
</div>
4145

4246
<div class="form-row credentials">
4347
<label>&nbsp;</label>
@@ -237,6 +241,7 @@
237241
'ru': 'Russian',
238242
'tr': 'Turkish',
239243
'zh': 'Chinese',
244+
'zh-TW' : 'Taiwanese',
240245
'zht': 'Traditional Chinese'
241246
};
242247

@@ -307,8 +312,9 @@
307312
tor.checkModels = function () {
308313
var u = $('#node-input-username').val();
309314
var p = $('#node-input-password').val();
315+
var k = $('#node-input-apikey').val();
310316
var e = $('#node-input-service-endpoint').val();
311-
var creds = {un: u, pwd: p};
317+
var creds = {un: u, pwd: p, key: k};
312318

313319
if ($('#node-input-neural').prop('checked')) {
314320
creds.n = 'Y';
@@ -335,8 +341,9 @@
335341
tor.getCredentials = function () {
336342
var u = $('#node-input-username').val();
337343
var p = $('#node-input-password').val();
344+
var k = $('#node-input-apikey').val();
338345

339-
if (u && u.length && p) {
346+
if ( (k && k.length) || (u && u.length && p) ) {
340347
if (!tor.models) {
341348
tor.checkModels();
342349
if (tor.models) {$('#node-input-action').parent().show(); }
@@ -366,7 +373,10 @@
366373
$('select#node-input-destlang').empty();
367374

368375
available_destlang.forEach(function (val) {
369-
var lang = val.split('-')[1];
376+
// can now have languages like zh-TW, so simple split on -
377+
// no longer works.
378+
// var lang = val.split('-')[1];
379+
let lang = val.replace(tor.srclang_selected + '-', '');
370380

371381
var selectedText = '';
372382
if (tor.destlang_selected === lang) {
@@ -559,6 +569,7 @@
559569
var output_lang = tor.domain_type.map(function (a) {
560570
return a.target;
561571
});
572+
562573
input_lang_unique = input_lang.filter(tor.checkUnique);
563574
output_lang_unique = output_lang.filter(tor.checkUnique);
564575

@@ -599,6 +610,12 @@
599610
tor.checkActionSelected();
600611
}
601612
});
613+
$('#node-input-apikey').change(function(val){
614+
tor.getCredentials();
615+
if (tor.have_credentials) {
616+
tor.checkActionSelected();
617+
}
618+
});
602619

603620
$('#node-input-action').change(function(val){
604621
tor.action = $('#node-input-action').val();
@@ -727,6 +744,7 @@
727744
srclang: {value: 'en'},
728745
destlang: {value: 'fr'},
729746
password: {value: ''},
747+
apikey: {value: ''},
730748
custom: {value: ''},
731749
domainhidden: {value: ''},
732750
srclanghidden: {value: ''},

services/language_translator/v2.js services/language_translator/v3.js

+32-17
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ module.exports = function (RED) {
2424
// the edited ones are not being taken.
2525
const SERVICE_IDENTIFIER = 'language-translator';
2626
var pkg = require('../../package.json'),
27-
LanguageTranslatorV2 = require('watson-developer-cloud/language-translator/v2'),
27+
LanguageTranslatorV3 = require('watson-developer-cloud/language-translator/v3'),
2828
//cfenv = require('cfenv'),
2929
payloadutils = require('../../utilities/payload-utils'),
3030
serviceutils = require('../../utilities/service-utils'),
@@ -34,6 +34,8 @@ module.exports = function (RED) {
3434
password = null,
3535
sUsername = null,
3636
sPassword = null,
37+
apikey = null,
38+
sApikey = null,
3739
//service = cfenv.getAppEnv().getServiceCreds(/language translator/i),
3840
service = serviceutils.getServiceCreds(SERVICE_IDENTIFIER),
3941
endpoint = '',
@@ -43,8 +45,9 @@ module.exports = function (RED) {
4345
temp.track();
4446

4547
if (service) {
46-
sUsername = service.username;
47-
sPassword = service.password;
48+
sUsername = service.username ? service.username : '';
49+
sPassword = service.password ? service.password : '';
50+
sApikey = service.apikey ? service.apikey : '';
4851
sEndpoint = service.url;
4952
}
5053

@@ -64,22 +67,27 @@ module.exports = function (RED) {
6467
var lt = null,
6568
neural = req.query.n ? true : false,
6669
serviceSettings = {
67-
username: sUsername ? sUsername : req.query.un,
68-
password: sPassword ? sPassword : req.query.pwd,
69-
version: 'v2',
70+
version: '2018-05-01',
7071
url: endpoint,
7172
headers: {
7273
'User-Agent': pkg.name + '-' + pkg.version
7374
}
7475
};
7576

77+
if (sApikey || req.query.key) {
78+
serviceSettings.iam_apikey = sApikey ? sApikey : req.query.key;
79+
} else {
80+
serviceSettings.username = sUsername ? sUsername : req.query.un;
81+
serviceSettings.password = sPassword ? sPassword : req.query.pwd;
82+
}
83+
7684
if (neural) {
7785
serviceSettings.headers['X-Watson-Technology-Preview'] = '2017-07-01';
7886
}
7987

80-
lt = new LanguageTranslatorV2(serviceSettings);
88+
lt = new LanguageTranslatorV3(serviceSettings);
8189

82-
lt.getModels({}, function (err, models) {
90+
lt.listModels({}, function (err, models) {
8391
if (err) {
8492
res.json(err);
8593
}
@@ -105,8 +113,8 @@ module.exports = function (RED) {
105113
var node = this;
106114

107115

108-
function initialCheck(u, p) {
109-
if (!u || !p) {
116+
function initialCheck(u, p, k) {
117+
if (!k && (!u || !p)) {
110118
return Promise.reject('Missing Watson Language Translator service credentials');
111119
}
112120
return Promise.resolve();
@@ -188,7 +196,7 @@ module.exports = function (RED) {
188196
}
189197

190198
model_id = srclang + '-' + destlang;
191-
if (domain !== 'news') {
199+
if (domain !== 'news' && domain !== 'general') {
192200
model_id += ('-' + domain);
193201
}
194202
return Promise.resolve(model_id);
@@ -374,14 +382,19 @@ module.exports = function (RED) {
374382
var p = null,
375383
language_translator = null,
376384
serviceSettings = {
377-
username: username,
378-
password: password,
379-
version: 'v2',
385+
version: '2018-05-01',
380386
headers: {
381387
'User-Agent': pkg.name + '-' + pkg.version
382388
}
383389
};
384390

391+
if (apikey) {
392+
serviceSettings.iam_apikey = apikey;
393+
} else {
394+
serviceSettings.username = username;
395+
serviceSettings.password = password;
396+
}
397+
385398
if (endpoint) {
386399
serviceSettings.url = endpoint;
387400
}
@@ -390,7 +403,7 @@ module.exports = function (RED) {
390403
serviceSettings.headers['X-Watson-Technology-Preview'] = '2017-07-01';
391404
}
392405

393-
language_translator = new LanguageTranslatorV2(serviceSettings);
406+
language_translator = new LanguageTranslatorV3(serviceSettings);
394407

395408
// We have credentials, and know the mode. Further required fields checks
396409
// are specific to the requested action.
@@ -434,6 +447,7 @@ module.exports = function (RED) {
434447
// Credentials are needed for each of the modes.
435448
username = sUsername || this.credentials.username;
436449
password = sPassword || this.credentials.password || config.password;
450+
apikey = sApikey || this.credentials.apikey || config.apikey;
437451

438452
endpoint = sEndpoint;
439453
if ((!config['default-endpoint']) && config['service-endpoint']) {
@@ -442,7 +456,7 @@ module.exports = function (RED) {
442456

443457
node.status({});
444458

445-
initialCheck(username, password)
459+
initialCheck(username, password, apikey)
446460
.then(function(){
447461
return payloadCheck(msg);
448462
})
@@ -472,7 +486,8 @@ module.exports = function (RED) {
472486
RED.nodes.registerType('watson-translator', SMTNode, {
473487
credentials: {
474488
username: {type:'text'},
475-
password: {type:'password'}
489+
password: {type:'password'},
490+
apikey: {type:'password'}
476491
}
477492
});
478493
};

services/language_translator_identify/v2.html services/language_translator_identify/v3.html

+7-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
<label for="node-input-password"><i class="fa fa-key"></i> Password</label>
3434
<input type="password" id="node-input-password" placeholder="Password">
3535
</div>
36+
<div class="form-row credentials" style="display: none;">
37+
<label for="node-input-apikey"><i class="fa fa-key"></i> API Key</label>
38+
<input type="password" id="node-input-apikey" placeholder="API Key"></input>
39+
</div>
3640

3741
<div class="form-row credentials">
3842
<label>&nbsp;</label>
@@ -46,7 +50,7 @@
4650
</script>
4751

4852
<script type="text/x-red" data-help-name="watson-language-translator-identify">
49-
<p>Packaged in with release 0.5.14 of node-red-node-watson</p>
53+
<p>Packaged in with release 0.7.0 of node-red-node-watson</p>
5054
<p>The Watson Language Translator service can be used to identify languages used in a text input. <p>
5155
<p>Node input : </p>
5256
<ul>
@@ -97,7 +101,8 @@
97101
},
98102
credentials: {
99103
username: {type:'text'},
100-
password: {type:'password'}
104+
password: {type:'password'},
105+
apikey: {type: 'password'}
101106
},
102107
color: 'rgb(84,149,230)',
103108
inputs: 1,

services/language_translator_identify/v2.js services/language_translator_identify/v3.js

+21-11
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,28 @@
1717
module.exports = function (RED) {
1818
const SERVICE_IDENTIFIER = 'language-translator';
1919
var pkg = require('../../package.json'),
20-
LanguageTranslatorV2 = require('watson-developer-cloud/language-translator/v2'),
20+
LanguageTranslatorV3 = require('watson-developer-cloud/language-translator/v3'),
2121
payloadutils = require('../../utilities/payload-utils'),
2222
serviceutils = require('../../utilities/service-utils'),
2323
service = serviceutils.getServiceCreds(SERVICE_IDENTIFIER),
2424
username = null,
2525
password = null,
2626
sUsername = null,
2727
sPassword = null,
28+
apikey = null,
29+
sApikey = null,
2830
endpoint = '', sEndpoint = '';
2931
//endpointUrl = 'https://gateway.watsonplatform.net/language-translator/api';
3032

3133
if (service) {
32-
sUsername = service.username;
33-
sPassword = service.password;
34+
sUsername = service.username ? service.username : '';
35+
sPassword = service.password ? service.password : '';
36+
sApikey = service.apikey ? service.apikey : '';
3437
sEndpoint = service.url;
3538
}
3639

37-
function initialCheck(u, p) {
38-
if (!u || !p) {
40+
function initialCheck(u, p, k) {
41+
if (!k && (!u || !p)) {
3942
return Promise.reject('Missing Watson Language Translator service credentials');
4043
}
4144
return Promise.resolve();
@@ -52,19 +55,24 @@ module.exports = function (RED) {
5255
var p = new Promise(function resolver(resolve, reject){
5356
var language_translator = null,
5457
serviceSettings = {
55-
username: username,
56-
password: password,
57-
version: 'v2',
58+
version: '2018-05-01',
5859
headers: {
5960
'User-Agent': pkg.name + '-' + pkg.version
6061
}
6162
};
6263

64+
if (apikey) {
65+
serviceSettings.iam_apikey = apikey;
66+
} else {
67+
serviceSettings.username = username;
68+
serviceSettings.password = password;
69+
}
70+
6371
if (endpoint) {
6472
serviceSettings.url = endpoint;
6573
}
6674

67-
language_translator = new LanguageTranslatorV2(serviceSettings);
75+
language_translator = new LanguageTranslatorV3(serviceSettings);
6876

6977
language_translator.identify({text: msg.payload}, function (err, response) {
7078
if (err) {
@@ -91,14 +99,15 @@ module.exports = function (RED) {
9199
this.on('input', function (msg) {
92100
username = sUsername || this.credentials.username;
93101
password = sPassword || this.credentials.password;
102+
apikey = sApikey || this.credentials.apikey;
94103

95104
endpoint = sEndpoint;
96105
if ((!config['default-endpoint']) && config['service-endpoint']) {
97106
endpoint = config['service-endpoint'];
98107
}
99108

100109
node.status({});
101-
initialCheck(username, password)
110+
initialCheck(username, password, apikey)
102111
.then(function(){
103112
return payloadCheck(msg);
104113
})
@@ -118,7 +127,8 @@ module.exports = function (RED) {
118127
RED.nodes.registerType('watson-language-translator-identify', Node, {
119128
credentials: {
120129
username: {type:'text'},
121-
password: {type:'password'}
130+
password: {type:'password'},
131+
apikey: {type:'password'}
122132
}
123133
});
124134
};

0 commit comments

Comments
 (0)