Files

116 lines
7.7 KiB
JavaScript

module.exports = function(RED) {
var https = require('https');
var http = require('http');
var url = require('url');
var OPERATIONS = {
// Groups
'groups:list': { method:'GET', path:'/ocs/v2.php/cloud/groups', query:['search','limit','offset'] },
'groups:details': { method:'GET', path:'/ocs/v2.php/cloud/groups/details', query:['search','limit','offset'] },
'groups:get': { method:'GET', path:'/ocs/v2.php/cloud/groups/{groupId}' },
'groups:users': { method:'GET', path:'/ocs/v2.php/cloud/groups/{groupId}/users' },
'groups:usersDetails':{ method:'GET', path:'/ocs/v2.php/cloud/groups/{groupId}/users/details', query:['search','limit','offset'] },
// Users
'users:list': { method:'GET', path:'/ocs/v2.php/cloud/users', query:['search','limit','offset'] },
'users:details': { method:'GET', path:'/ocs/v2.php/cloud/users/details', query:['search','limit','offset'] },
'users:disabled': { method:'GET', path:'/ocs/v2.php/cloud/users/disabled', query:['search','limit','offset'] },
'users:create': { method:'POST', path:'/ocs/v2.php/cloud/users', body:['userid','password','displayName','email','quota','language'] },
'users:get': { method:'GET', path:'/ocs/v2.php/cloud/users/{userId}' },
'users:edit': { method:'PUT', path:'/ocs/v2.php/cloud/users/{userId}', body:['key','value'] },
'users:editMulti': { method:'PUT', path:'/ocs/v2.php/cloud/users/{userId}/{collectionName}', body:['key','value'] },
'users:delete': { method:'DELETE', path:'/ocs/v2.php/cloud/users/{userId}' },
'users:enable': { method:'PUT', path:'/ocs/v2.php/cloud/users/{userId}/enable' },
'users:disable': { method:'PUT', path:'/ocs/v2.php/cloud/users/{userId}/disable' },
'users:wipe': { method:'POST', path:'/ocs/v2.php/cloud/users/{userId}/wipe' },
'users:current': { method:'GET', path:'/ocs/v2.php/cloud/user' },
'users:editableFields':{ method:'GET', path:'/ocs/v2.php/cloud/user/fields' },
'users:editableFor': { method:'GET', path:'/ocs/v2.php/cloud/user/fields/{userId}' },
'users:apps': { method:'GET', path:'/ocs/v2.php/cloud/user/apps' },
'users:groups': { method:'GET', path:'/ocs/v2.php/cloud/users/{userId}/groups' },
'users:groupsDetails':{ method:'GET', path:'/ocs/v2.php/cloud/users/{userId}/groups/details' },
'users:subadminDetails':{ method:'GET', path:'/ocs/v2.php/cloud/users/{userId}/subadmins/details' },
'users:addToGroup': { method:'POST', path:'/ocs/v2.php/cloud/users/{userId}/groups', body:['groupid'] },
'users:removeFromGroup':{ method:'DELETE', path:'/ocs/v2.php/cloud/users/{userId}/groups', query:['groupid'] },
'users:welcome': { method:'POST', path:'/ocs/v2.php/cloud/users/{userId}/welcome' },
'users:searchByPhone':{ method:'POST', path:'/ocs/v2.php/cloud/users/search/by-phone', body:['location','search'] },
// App config
'config:setApp': { method:'POST', path:'/ocs/v2.php/apps/provisioning_api/api/v1/config/apps/{app}/{key}', body:['value'] },
// Preferences
'pref:set': { method:'POST', path:'/ocs/v2.php/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', body:['configValue'] },
'pref:delete': { method:'DELETE', path:'/ocs/v2.php/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}' },
'pref:setMultiple': { method:'POST', path:'/ocs/v2.php/apps/provisioning_api/api/v1/config/users/{appId}', body:['configs'] },
'pref:deleteMultiple':{ method:'DELETE', path:'/ocs/v2.php/apps/provisioning_api/api/v1/config/users/{appId}', query:['configKeys[]'] }
};
function ProvisioningNode(config) {
RED.nodes.createNode(this, config);
var node = this;
this.configNode = RED.nodes.getNode(config.nextcloud);
this.operation = config.operation || 'users:list';
this.userId = config.userId; this.groupId = config.groupId;
this.appId = config.appId; this.configKey = config.configKey;
this.collectionName = config.collectionName; this.app = config.app; this.key = config.key;
if (!this.configNode) { node.error("No NC config node"); return; }
node.on('input', function(msg) {
var op = OPERATIONS[msg.operation || node.operation];
if (!op) { node.error("Unknown: "+(msg.operation||node.operation), msg); return; }
var baseUrl = (node.configNode.baseUrl||'').replace(/\/+$/,'');
var uname = node.configNode.credentials.username;
var pw = node.configNode.credentials.password;
var path = op.path
.replace(/\{userId\}/g, msg.userId||node.userId||'')
.replace(/\{groupId\}/g, msg.groupId||node.groupId||'')
.replace(/\{appId\}/g, msg.appId||node.appId||'')
.replace(/\{configKey\}/g, msg.configKey||node.configKey||'')
.replace(/\{collectionName\}/g, msg.collectionName||node.collectionName||'')
.replace(/\{app\}/g, msg.app||node.app||'')
.replace(/\{key\}/g, msg.key||node.key||'');
var qp = [];
if (op.query) op.query.forEach(function(q) {
var v = msg[q]!==undefined ? msg[q] : getF(node,q);
if (v!==undefined&&v!=='') qp.push(encodeURIComponent(q)+'='+encodeURIComponent(v));
});
var fu = baseUrl+path+(qp.length?'?'+qp.join('&'):'');
var pu = url.parse(fu);
var h = {'OCS-APIRequest':'true','Accept':'application/json',
'Authorization':'Basic '+Buffer.from(uname+':'+pw).toString('base64')};
var bo={};
if (op.body) op.body.forEach(function(b){
var v=msg[b]!==undefined?msg[b]:getF(node,b);
if(v!==undefined&&v!=='') bo[b]=v;
});
// Special: groups array for user creation, configs object
if (msg.groups && Array.isArray(msg.groups)) bo.groups = msg.groups;
if (msg.subadmin && Array.isArray(msg.subadmin)) bo.subadmin = msg.subadmin;
if (msg.configs && typeof msg.configs==='object') bo.configs = msg.configs;
var bs=null;
if (Object.keys(bo).length>0) {h['Content-Type']='application/json'; bs=JSON.stringify(bo);}
var o = {hostname:pu.hostname,port:pu.port||(pu.protocol==='https:'?443:80),
path:pu.path,method:op.method,headers:h,rejectUnauthorized:false};
node.log(op.method+' '+fu);
var t = pu.protocol==='https:'?https:http;
var r = t.request(o,function(res){
var b='';res.on('data',function(c){b+=c;});
res.on('end',function(){msg.statusCode=res.statusCode;msg.operation=msg.operation||node.operation;
try{msg.payload=JSON.parse(b);}catch(e){msg.payload=b;}node.send(msg);});
});
r.on('error',function(e){msg.error=e.message;node.error(op.method+' '+fu+' - '+e.message,msg);});
if(bs) r.write(bs);
r.end();
});
}
function getF(node,n){var m={'search':node.bodySearch,'limit':node.bodyLimit,'offset':node.bodyOffset,'userid':node.bodyUserid,
'password':node.bodyPassword,'displayName':node.bodyDisplayName,'email':node.bodyEmail,'quota':node.bodyQuota,
'language':node.bodyLanguage,'key':node.bodyKey,'value':node.bodyValue,'groupid':node.bodyGroupid,
'location':node.bodyLocation,'configValue':node.bodyConfigValue};return m[n];}
RED.nodes.registerType("provisioning", ProvisioningNode);
};