Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

fh-fhc

Package Overview
Dependencies
Maintainers
2
Versions
121
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

fh-fhc - npm Package Compare versions

Comparing version 0.7.12-158 to 0.7.13-166

59

lib/admin-storeitemgroups.js

@@ -9,2 +9,3 @@

+"\nfhc storeitemgroups read <group-guid>"
+"\nfhc storeitemgroups readByName <group-name>"
+"\nfhc storeitemgroups update <group-guid> <group-name> <group-description>"

@@ -41,2 +42,5 @@ +"\nfhc storeitemgroups addusers <group-guid> <user-email>*"

return read(args[1], cb);
}else if (action === 'readByName'){
if (args.length !== 2) return cb("Invalid arguments for 'readByName':" + groups.usage);
return readByName(args[1], cb);
}else if (action === 'update'){

@@ -108,2 +112,55 @@ if (args.length !== 4) return cb("Invalid arguments for 'update':" + groups.usage);

function readByName(name, cb) {
list(function(err, groups){
if(err) return cb(err);
for(var i=0;i<groups.list.length;i++){
var group = groups.list[i];
if(group.name === name){
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitemgroup/read", {"guid": group.guid}, "Error reading group: ", function(err, data){
if(err) return cb(err);
var storeitems = data.storeitems;
var users = data.users;
var retStoreItems = [];
var retUsers = [];
async.parallel([
function(callback){
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/list", {}, "Error listing storeitems: ", function(sierr, sidata){
if(sierr) return callback(sierr);
sidata.list.forEach(function(item){
if(storeitems.indexOf(item.guid) > -1){
retStoreItems.push(item.name);
}
});
callback(undefined, 0);
})
},
function(callback){
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/user/list", {}, "Error listing users: ", function(uerr, udata){
if(uerr) return callback(uerr);
udata.list.forEach(function(item){
if(users.indexOf(item.guid) > -1){
retUsers.push({email: item.fields.email, name:item.fields.name});
}
});
callback(undefined, 0);
})
}
], function(err, results){
if(err) return cb(err);
data.storeitems = retStoreItems;
data.users = retUsers;
return cb(undefined, data);
});
});
} else {
if(i == groups.list.length - 1){
return cb("Can not find group with name " + name);
} else {
continue;
}
}
}
})
}
// update group

@@ -154,3 +211,3 @@ function update(id, name, desc, cb) {

if (argv.length === 2) {
var cmds = ["list", "read", "create", "update", "delete", "addapps", "removeapps", "addusers", "removeusers"];
var cmds = ["list", "read", "readByName" "create", "update", "delete", "addapps", "removeapps", "addusers", "removeusers"];
if (opts.partialWord !== "l") cmds.push("list");

@@ -157,0 +214,0 @@ return cb(undefined, cmds);

58

lib/admin-storeitems.js
module.exports = storeitems;
storeitems.usage = "\nfhc admin-storeitems list"
+"\nfhc admin-storeitems create <name> <description> <authToken> [<restrictToGroups>]"
+"\nfhc admin-storeitems create <name> [description=<description>] [authToken=<authToken>] [restrictToGroups=<restrictToGroups>]"
+"\nfhc admin-storeitems delete <storeitem guid>"

@@ -15,3 +15,4 @@ +"\nfhc admin-storeitems read <storeitem guid>"

+"\nfhc admin-storeitems addgroups <storeitem guid> <group_guid>*"
+"\nfhc admin-storeitems removegroups <storeitem guid> <group_guid>*";
+"\nfhc admin-storeitems removegroups <storeitem guid> <group_guid>*" +
"\nfhc admin-storeitems binaryversions <storeiten guid> ";

@@ -39,3 +40,3 @@ var log = require("./utils/log");

case "create":
if(args.length < 4) return cb(storeitems.usage);
if(args.length < 2) return cb(storeitems.usage);
args.splice(0,1);

@@ -79,2 +80,5 @@ return create(args, cb);

return removegroups(id, args, cb);
case "binaryversions":
if(args.length < 2 )return cb(storeitems.usage);
return binaryversions(args[1], cb);
default :

@@ -88,2 +92,16 @@ return cb(storeitems.usage);

function binaryversions(guid, cb){
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/read", {"guid":guid}, "Error reading item: ", function(err, data){
if(err) return cb(err);
ret = {"name":data.name};
ret.versions = [];
data.binaries.forEach(function (item){
item.versions.forEach(function(it){
ret.versions.push(it);
});
});
return cb(undefined, ret);
});
}
function groupRestrict(guid, restrictToGroups, cb){

@@ -133,12 +151,14 @@ common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/grouprestrict", {"guid":guid,"restrictToGroups":restrictToGroups}, "Error set restrict-to-groups flag on item: ", function(err, data){

function create(params, cb){
var name = params[0];
var desc = params[1];
var authToken = params[2];
var payload = {
"name":name,
"description":desc,
"authToken":authToken,
"restrictToGroups":(params[3] === true || params[3] === "true")
};
function create(args, cb){
var name = args.shift();
var payload = {};
args.forEach(function(arg){
var pair = arg.split("=");
payload[pair[0]] = parseVal(pair[0],pair[1]);
})
payload['name']= name;
if(payload['restrictToGroups'] !== true) {
payload['restrictToGroups']= false;
}
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/create", payload, "Error creating item: ", function(err, data){

@@ -205,3 +225,13 @@ if(err) return cb(err);

}
function parseVal(name, val){
if(val === "true"){
return true;
}
if(val === "false"){
return false;
}
return val;
}
// bash completion

@@ -213,3 +243,3 @@ storeitems.completion = function (opts, cb) {

if (argv.length === 2) {
var cmds = ["read", "create", "update" , "list" , "delete" , "uploadicon", "uploadbinary", "addpolicy" , "removepolicy" , "listpolicies", "addgroups" , "removegroups"];
var cmds = ["read", "create", "update" , "list" , "delete" , "uploadicon", "uploadbinary", "addpolicy" , "removepolicy" , "listpolicies", "addgroups" , "removegroups", "binaryversions"];
if (opts.partialWord !== "l") cmds.push("list");

@@ -216,0 +246,0 @@ return cb(undefined, cmds);

@@ -1,2 +0,1 @@

module.exports = request;

@@ -7,3 +6,2 @@ request.GET = GET;

request.POST = POST;
request.upload = upload;
request.uploadFile = uploadFile;

@@ -15,11 +13,8 @@ request.getFeedHenryUrl = getFeedHenryUrl;

var fhc = require("../fhc");
var http;
var https;
var requestjs = require("request");
var url = require("url");
var util = require('util');
var async = require("async");
var log = require("./log");
var ini = require("./ini");
var fs = require("fs");
var proxyify = require("./proxyify");
var os = require("os");

@@ -59,12 +54,3 @@ var keys = require("../keys");

// TODO - tidy..
if (!where.match(/^https?:\/\//)) {
log.silly(where, "raw, before any munging");
if (where.charAt(0) !== "/") where = "/" + where;
log.silly([fhurl, where], "url resolving");
where = url.resolve(fhurl, where);
log.silly(where, "url resolved");
} else {
log.silly(where, "no need to resolve");
}
where = resolveUrl(where, fhurl);

@@ -81,51 +67,14 @@ var remote = url.parse(where)

var headers = { "accept" : "application/json" };
var cookie = fhc.config.get("cookie");
if (cookie != undefined) {
headers.cookie = "feedhenry=" + cookie + ";";
log.silly(headers.cookie, "cookie");
}
log.silly(fhc.config.get('nocache'), "nocache");
if (fhc.config.get('nocache')) {
headers['X-FeedHenry-CacheOff'] = "script_super";
}
try {
var explainLvl = parseInt(fhc.config.get('explain'), 10);
log.silly(explainLvl, "explain level");
if (explainLvl > 0) {
headers['X-FeedHenry-Explain'] = 'active' + ((explainLvl > 1) ? ' stacktrace' : '');
}
} catch (e) {
log.error('explain config value should be a Number: ' + e);
}
var platform = '<node 0.4>';
var release = '<node 0.4>';
try{
platform = os.platform();
release = os.release();
} catch (x) {
// ignored, this will fail on node 0.4.x
}
headers['User-Agent'] = "FHC/" + fhc.version + ' ' + platform + '/' + release;
var headers = getHeaders();
var apiKey = keys.getUserApiKey();
if(null != apiKey && (typeof apiKey !== "undefined")){
headers['X-FH-AUTH-USER'] = apiKey;
}
if (what) {
if (what instanceof File) {
log.verbose(what.name, "uploading");
headers["content-type"] = "application/octet-stream";
} else {
delete what._etag;
log.silly(what,"writing json");
if (typeof(what) === 'string') {
what = new Buffer(what);
}else {
what = new Buffer(JSON.stringify(what));
}
headers["content-type"] = "application/json";
log.verbose(what, "what...");
delete what._etag;
log.silly(what,"writing json");
if (typeof(what) === 'string') {
what = new Buffer(what);
}else {
what = new Buffer(JSON.stringify(what));
}
headers["content-type"] = "application/json";
headers["content-length"] = what.length;

@@ -142,153 +91,80 @@ } else {

var opts = { method: method
log.silly(headers, "headers");
//if (what) log.verbose(what.toString(), "body");
var opts = { uri : where
, method: method
, body: what
, headers: headers
, path: (remote.pathname||"/")
+ (remote.search||"")
+ (remote.hash||"")
, host: remote.hostname
, secure: remote.protocol
&& remote.protocol.toLowerCase() === "https:"
, port: remote.port
, proxy: getProxy(remote)
, followRedirect : !nofollow
};
if (!opts.port) opts.port = opts.secure ? 443 : 80;
if (opts.port !== (opts.secure ? 443 : 80)) {
opts.headers.host = opts.headers.host || opts.host;
opts.headers.host += ":" + opts.port;
}
var startTime = Date.now();
requestjs(opts, function (error, response, body) {
var data = body;
opts = proxyify(fhc.config.get("proxy"), remote, opts);
if (!opts) return cb(new Error("Bad proxy config: "+fhc.config.get("proxy")));
if( error ) {
log.er(cb, "response error from "+where);
cb();
}
if (opts.secure) https = https || require("https");
else http = http || require("http");
log.silly(headers, "headers");
__stats__.duration = Date.now() - startTime;
__stats__.status = response.statusCode;
__stats__.body = data;
var startTime = Date.now();
var req = (opts.secure ? https : http).request(opts, function (response) {
log.verbose("url: " + where + " response code: " + response.statusCode, "response statusCode");
// if (response.statusCode !== 200) return cb(new Error(
// "Status code " + response.statusCode + " from PUT "+where))
var data = "";
response.on("error", log.er(cb, "response error from "+where));
response.on("data", function (chunk) {
log.silly(chunk+"", "chunk");
data += chunk;
});
global.newloctimeout = global.newloctimeout || 0;
response.on("end", function () {
__stats__.duration = Date.now() - startTime;
__stats__.status = response.statusCode;
__stats__.body = data;
log.verbose("url: " + where + " response duration: " + util.inspect(__stats__.duration), "response duration");
log.verbose("url: " + where + " response data: " + util.inspect(data), "response data");
if (!nofollow
&& (response.statusCode === 301 || response.statusCode === 302)) {
// relative redirects SHOULD be disallowed, but alas...
var newLoc = response.headers.location;
newLoc = newLoc && url.resolve(where, newLoc);
log.silly(newLoc, "redirect");
if (!newLoc) return cb(new Error(
response.statusCode + " status code with no location"));
//FIXME: wtf? why does this timeout make it work?
return setTimeout(function () {
log.silly(newLoc, "redirect fer reals");
requestFunc(method, newLoc, what, etag, log.er(cb, "Failed to fetch "+newLoc));
}, 1000*(global.newloctimeout ++));
}
var parsed;
if (response.statusCode !== 304) {
//console.log("HEADERS: " + util.inspect(response.headers['content-type']));
//console.log("DATA: " + data);
log.silly(response.headers, "response headers");
var contentType = response.headers ? response.headers['content-type'] : '';
if (contentType && (contentType.indexOf('application/json') != -1 || contentType.indexOf('text/json') != -1 || contentType.indexOf('text/plain') != -1)) {
try {
parsed = JSON.parse(data);
if (response.headers.etag) {
// NOTE: not showing etags any longer in returned json (see 4712)
// parsed._etag = response.headers.etag;
}
} catch (ex) {
ex.message += "\n" + data;
log.debug(data, "bad json");
log.error("error parsing json", "FeedHenry");
return cb(ex, null, data, response);
}
}else {
parsed = data;
var parsed;
if (response.statusCode !== 304) {
//console.log("HEADERS: " + util.inspect(response.headers['content-type']));
//console.log("DATA: " + data);
log.silly(response.headers, "response headers");
var contentType = response.headers ? response.headers['content-type'] : '';
if (contentType && (contentType.indexOf('application/json') != -1 || contentType.indexOf('text/json') != -1 || contentType.indexOf('text/plain') != -1)) {
try {
parsed = JSON.parse(data);
if (response.headers.etag) {
// NOTE: not showing etags any longer in returned json (see 4712)
// parsed._etag = response.headers.etag;
}
} catch (ex) {
ex.message += "\n" + data;
log.verbose(data, "bad json");
log.error("error parsing json", "FeedHenry");
return cb(ex, null, data, response);
}
}else {
parsed = data;
}
var er = undefined;
}
var er = undefined;
if (parsed && parsed.error) {
var w = url.parse(where).pathname.substr(1)
, name = w.split("/")[0];
if (parsed.error === "not_found") {
er = new Error("404 Not Found: "+name);
} else {
er = parsed.error + " " + (parsed.reason || "");
}
} else if (method !== "HEAD" && method !== "GET") {
// invalidate cache
// This is irrelevant for commands that do etag caching, but
// ls and view also have a timed cache, so this keeps the user
// from thinking that it didn't work when it did.
// Note that failure is an acceptable option here, since the
// only result will be a stale cache for some helper commands.
var path = require("path")
, p = url.parse(where).pathname.split("/")
, _ = "/"
, caches = p.map(function (part) {
return _ = path.join(_, part);
}).map(function (cache) {
return path.join(fhc.cache, cache, ".cache.json");
});
// TODO asyncMap(caches, rm, function () {});
if (parsed && parsed.error) {
var w = url.parse(where).pathname.substr(1)
, name = w.split("/")[0];
if (parsed.error === "not_found") {
er = new Error("404 Not Found: "+name);
} else {
er = parsed.error + " " + (parsed.reason || "");
}
return cb(er, parsed, data, response);
});
}).on("error", cb);
} else if (method !== "HEAD" && method !== "GET") {
// invalidate cache
// This is irrelevant for commands that do etag caching, but
// ls and view also have a timed cache, so this keeps the user
// from thinking that it didn't work when it did.
// Note that failure is an acceptable option here, since the
// only result will be a stale cache for some helper commands.
var path = require("path")
, p = url.parse(where).pathname.split("/")
, _ = "/"
, caches = p.map(function (part) {
return _ = path.join(_, part);
}).map(function (cache) {
return path.join(fhc.cache, cache, ".cache.json");
});
// TODO asyncMap(caches, rm, function () {});
}
return cb(er, parsed, data, response);
})
if (what instanceof File) {
var size = Math.min(what.length, 1024*1024*1024)
, remaining = what.length;
log.silly(what.length, "bytes")
;(function W () {
var b = new Buffer(size);
try {
var bytesRead = fs.readSync(what.fd, b, 0, b.length, null);
} catch (er) {
return log.er(cb, "Failure to read file")(er);
}
remaining -= bytesRead;
if (bytesRead) {
log(bytesRead, "read");
log(remaining, "remain");
return (
req.write(bytesRead === b.length ? b : b.slice(0, bytesRead))
) ? W()
: req.on("drain", function DRAIN () {
log.silly(remaining, "drain");
req.removeListener("drain", DRAIN);
W();
});
}
if (!remaining) {
req.end();
log.silly(what.name, "written to uploading stream");
log.silly("Not done yet! If it hangs/quits now, it didn't work.", "upload");
return;
}
// wtf!? No bytes read, but also bytes remaining.
return cb(new Error("Some kind of weirdness reading the file"));
})();
return
} else if (typeof what === "string" || Buffer.isBuffer(what)) {
// just a json blob
req.write(what);
}
req.end();
}

@@ -327,15 +203,2 @@

function upload (url, where, filename, etag, nofollow, cb) {
if (typeof nofollow === "function") cb = nofollow, nofollow = false;
if (typeof etag === "function") cb = etag, etag = null;
new File(filename, function (er, f) {
if (er) return log.er(cb, "Couldn't open "+filename)(er);
PUT(url, where, f, etag, nofollow, function (er) {
log.info("done with upload", "upload");
cb(er);
});
});
}
function uploadFile(url, filepath, fields, contentType, cb){

@@ -398,3 +261,3 @@ var boundary = Math.random();

'Content-Length' : length,
'Cookie' : "feedhenry=" + fhc.config.get("cookie") + ";"
'Cookie' : "feedhenry=" + fhc.config.get("cookie") + ";"
}

@@ -427,2 +290,82 @@ };

// NOTE: the request upload doesn't work on all FH clusters
function REQUEST_uploadFile(fhurl, filepath, fields, contentType, cb){
var boundary = Math.random();
var post_data = [];
var path = require('path');
var filename = path.basename(filepath);
var fullUrl = resolveUrl(fhurl);
var remote = url.parse(fullUrl);
var headers = getHeaders();
var opts = {
url : fullUrl
, headers : headers
, proxy : getProxy(remote)
};
log.verbose(opts, "uploadFile - opts");
var r = requestjs.post(opts);
// Get a handle on a form for Multi Part Form Upload
var form = r.form();
// Add all passed fields to the form
for(var key in fields){
// Dirty hack to get around the limitations of CombinedStream.isStreamLike()...
// i.e. uit thinks booleans are streams!
var value = fields[key] + "";
log.verbose('Adding form field ' + key + " with value " + value);
form.append(key, value);
}
// Add the file to the form
form.append('file', fs.createReadStream(filepath));
// Get the content length of the form once it is finished adding all fields.
form.getLength(function(err, length) {
if(err) cb(err);
log.verbose(length, "form.getLength()");
headers["content-length"] = length;
// Set the headers on the request object
r.setHeaders(headers);
});
r.on("error", function (er) {
log.er(er);
cb(er);
})
r.on('response', function(response){
log.silly('received response');
response.setEncoding('utf8');
var data = '';
response.on('data', function(chunk){
data = data + chunk;
});
response.on('end', function(){
log.silly(data, "DATA");
data = JSON.parse(data);
return cb(undefined, data);
});
response.on('error', function(err) {
return cb(err);
});
});
return r;
}
function File (name, cb) {

@@ -447,3 +390,3 @@ var f = this;

var r = fhc.config.get("feedhenry");
log.silly(r, "feedhenry url");
log.verbose(r, "feedhenry url");
if (!r) {

@@ -466,1 +409,63 @@ return new Error("Must define feedhenry URL before accessing FeedHenry.");

}
function resolveUrl(where, fhurl) {
log.verbose(where, "resolveUrl - IN");
if (!where.match(/^https?:\/\//)) {
if (where.charAt(0) !== "/") where = "/" + where;
fhurl = fhurl || getFeedHenryUrl();
where = url.resolve(fhurl, where);
}
log.verbose(where, "resolveUrl - OUT");
return where;
}
function getHeaders() {
var headers = { "accept" : "application/json" };
var cookie = fhc.config.get("cookie");
if (cookie != undefined) {
headers.cookie = "feedhenry=" + cookie + ";";
log.silly(headers.cookie, "cookie");
}
log.silly(fhc.config.get('nocache'), "nocache");
if (fhc.config.get('nocache')) {
headers['X-FeedHenry-CacheOff'] = "script_super";
}
try {
var explainLvl = parseInt(fhc.config.get('explain'), 10);
log.silly(explainLvl, "explain level");
if (explainLvl > 0) {
headers['X-FeedHenry-Explain'] = 'active' + ((explainLvl > 1) ? ' stacktrace' : '');
}
} catch (e) {
log.error('explain config value should be a Number: ' + e);
}
var platform = '<node 0.4>';
var release = '<node 0.4>';
try{
platform = os.platform();
release = os.release();
} catch (x) {
// ignored, this will fail on node 0.4.x
}
headers['User-Agent'] = "FHC/" + fhc.version + ' ' + platform + '/' + release;
var apiKey = keys.getUserApiKey();
if(null != apiKey && (typeof apiKey !== "undefined")){
headers['X-FH-AUTH-USER'] = apiKey;
}
log.verbose(headers, "getHeaders");
return headers;
}
function getProxy(url) {
var proxy
if (url.protocol !== "https:" || !(proxy = fhc.config.get("https-proxy"))) {
proxy = fhc.config.get("proxy")
}
log.silly(proxy, "getProxy");
return proxy;
}

@@ -5,3 +5,3 @@ {

"keywords" : [ "cli", "feedhenry" ],
"version": "0.7.12-158",
"version": "0.7.13-166",
"preferGlobal" : true,

@@ -25,3 +25,3 @@ "homepage" : "http://git.io/fh-fhc",

"async" : "*",
"request" : "*",
"request" : "~2.11",
"vmcjs" : "*",

@@ -28,0 +28,0 @@ "cli-table" : "git://github.com/LearnBoost/cli-table.git#703ab71"

@@ -1,1 +0,1 @@

0.7.12-158
0.7.13-166

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc