Esempio n. 1
0
void jx_print_buffer( struct jx *j, buffer_t *b )
{
	if(!j) return;

	switch(j->type) {
		case JX_NULL:
			buffer_putstring(b,"null");
			break;
		case JX_DOUBLE:
			buffer_printf(b,"%lg",j->double_value);
			break;
		case JX_BOOLEAN:
			buffer_printf(b,"%s",j->boolean_value ? "true" : "false");
			break;
		case JX_INTEGER:
			buffer_printf(b,"%lld",(long long)j->integer_value);
			break;
		case JX_SYMBOL:
			buffer_printf(b,"%s",j->symbol_name);
			break;
		case JX_STRING:
			jx_escape_string(j->string_value,b);
			break;
		case JX_ARRAY:
			buffer_putstring(b,"[");
			jx_item_print(j->items,b);
			buffer_putstring(b,"]");
			break;
		case JX_OBJECT:
			buffer_putstring(b,"{");
			jx_pair_print(j->pairs,b);
			buffer_putstring(b,"}");
			break;
	}
}
Esempio n. 2
0
/*
 * @brief reports device list
 * @param sc socket
 * @param channel
 * @param url command url
 * @param dev device handle
 * @param ssid session id
 * @ret -1 error, 0 success
 */
int novacom_hostcmd_devremove(SOCKET sc, uint32_t channel, novacom_command_url_t *url, void *_dev, const char *ssid)
{
	int rc=-1;
	buffer_t *b = buffer_new(100); /* 44 + 44 + 2 */
	device_handle_t dev = (device_handle_t)_dev;
	char *file = NULL;
	char hash[SHA1_HASH_STRSIZE];

	if ( strlen(ssid) != NOVACOM_AUTHSESSION_LEN) {
		LTRACEF("invalid ssid length(%d)\n", strlen(ssid));
		goto done;
	}
	/* buffer */
	if (!b)
		goto done;

	/* expecting at least one parameter */
	if (url->argcount < 1) {
		goto done;
	}

	/* message type(auth.h) */
	rc = buffer_putbyte(b, SSH_MSG_USERAUTH_TOKENREQUEST_RM);
	if (rc)
		goto done;

	/* version info */
	rc = buffer_putbyte(b, 0);
	if (rc)
		goto done;

	/* password info */
	rc = buffer_putstring(b, (const unsigned char *)url->args[0], strlen(url->args[0]));
	if (rc)
		goto done;

	/* token hash info */
	file = novacom_rnduid(dev);
	if (!file)
		goto done;
	rc = tokenstorage_readhash(file, ssid, hash, sizeof(hash));
	if (-1 == rc) {
		LTRACEF("unable to get hashed token\n");
		goto done;
	}

	/* pack it */
	rc = buffer_putstring(b, (unsigned char *)hash, sizeof(hash));
	if (rc)
		goto done;

	rc = novacom_write_channel_async(dev, channel, b->data, b->pos, ASYNC_FLAG_COPY, (novacom_async_callback)&socketcmd_write_callback, (void *)url);

done:
	LTRACEF("rc(%d)\n", rc);
	platform_free(file);
	buffer_free(b);
	return rc;
}
Esempio n. 3
0
static void jx_pair_print( struct jx_pair *pair, buffer_t *b )
{
	if(!pair) return;

	jx_print_buffer(pair->key,b);
	buffer_putstring(b,":");
	jx_print_buffer(pair->value,b);
	if(pair->next) {
		buffer_putstring(b,",");
		jx_pair_print(pair->next,b);
	}
}
Esempio n. 4
0
void jx_comprehension_print(struct jx_comprehension *comp, buffer_t *b) {
	if (!comp) return;

	buffer_putstring(b, " for ");
	buffer_putstring(b, comp->variable);
	buffer_putstring(b, " in ");
	jx_print_buffer(comp->elements, b);
	if (comp->condition) {
		buffer_putstring(b, " if ");
		jx_print_buffer(comp->condition, b);
	}

	jx_comprehension_print(comp->next, b);
}
Esempio n. 5
0
void jx_print_subexpr( struct jx *j, jx_operator_t parent, buffer_t *b )
{
	if(!j) return;

	int do_parens = 0;

	if(j->type==JX_OPERATOR && jx_operator_precedence(parent) < jx_operator_precedence(j->u.oper.type)) {
		do_parens = 1;
	} else {
		do_parens = 0;
	}

	if(do_parens) buffer_putstring(b,"(");
	jx_print_buffer(j,b);
	if(do_parens) buffer_putstring(b,")");
}
Esempio n. 6
0
/*
 * Get a filename in cache for given md5sum.
 */
const char *filecache_getfilename(TARGET *t, MD5SUM sum, const char* extension)
{
	BUFFER buff;
	size_t pos;
	const char *cachedir;
	const char* result;

	cachedir = filecache_getpath(t);
	/* if no cachedir, no cachefiles */
	if (cachedir==NULL) {
		return NULL;
	}

	/* put the cachedir in front of buffer */
	buffer_init(&buff);
	buffer_addstring(&buff, cachedir, strlen(cachedir));
	buffer_addchar(&buff, '/');

	pos = buffer_pos(&buff);
	buffer_addstring(&buff, "000/", 4);

	/* add use md5 as filename */
	buffer_addstring(&buff, md5tostring(sum), 32);
	if (extension)
		buffer_addstring(&buff, extension, strlen(extension));
	buffer_addchar(&buff, 0);

	buffer_setpos(&buff, pos);
	buffer_putstring(&buff, buffer_ptr(&buff) + pos + 4, 3);

	result = newstr(buffer_ptr(&buff));
	buffer_free(&buff);
	return result;
}
Esempio n. 7
0
char *string_replace_percents( const char *str, const char *replace )
{
	/* Common case: do nothing if no percents. */
	if(!strchr(str,'%')) return xxstrdup(str);

	buffer_t buffer;
	buffer_init(&buffer);

	const char *s;
	for(s=str;*s;s++) {
		if(*s=='%' && *(s+1)=='%' ) {
			if( *(s+2)=='%' && *(s+3)=='%') {
				buffer_putlstring(&buffer,"%%",2);
				s+=3;
			} else {
				buffer_putstring(&buffer,replace);
				s++;
			}
		} else {
			buffer_putlstring(&buffer,s,1);
		}
	}

	char *result;
	buffer_dup(&buffer,&result);
	buffer_free(&buffer);

	return result;
}
Esempio n. 8
0
/*
 * @brief handles device login
 * @param sc socket
 * @param channel
 * @param url command url
 * @param dev device handle
 * @param ssid session id
 * @param method 0 - password, 1 token
 * @ret -1 error, 0 success
 */
static int novacom_hostcmd_login(SOCKET sc, uint32_t channel, novacom_command_url_t *url, void *_dev, const char *ssid, int method)
{
	int rc=-1;
	buffer_t *b = buffer_new(100);
	device_handle_t dev = (device_handle_t)_dev;

	/* buffer */
	if (!b)
		goto done;

	/* expecting at least one parameter */
	if (url->argcount < 1) {
		goto done;
	}

	/* message type(auth.h) */
	rc = buffer_putbyte(b, SSH_MSG_USERAUTH_REQUEST);
	if (rc)
		goto done;

	/* version info */
	rc = buffer_putbyte(b, 0);
	if (rc)
		goto done;

	/* method info: 0 password, 1 token */
	if (method)
		rc = buffer_putstring(b, (const unsigned char *)AUTH_METHOD_TOKEN, AUTH_METHOD_TOKEN_LEN);
	else
		rc = buffer_putstring(b, (const unsigned char *)AUTH_METHOD_PASSWORD, AUTH_METHOD_PASSWORD_LEN);
	if (rc)
		goto done;

	/* hash info */
	rc = buffer_putstring(b, (const unsigned char *)url->args[0], strlen(url->args[0]));
	if (rc)
		goto done;

	LTRACEF("channel %d, hash %s\n", channel, url->args[0]);
	rc = novacom_write_channel_async(dev, channel, b->data, b->pos, ASYNC_FLAG_COPY, (novacom_async_callback)&socketcmd_write_callback, (void *)url);

done:
	buffer_free(b);
	return rc;
}
Esempio n. 9
0
void jx_escape_string( const char *s, buffer_t *b )
{
	if(!s) return;

	buffer_putstring(b,"\"");
	while(*s) {
		switch(*s) {
			case '\"':
				buffer_putstring(b,"\\\"");
				break;
			case '\'':
				buffer_putstring(b,"\\\'");
				break;
			case '\\':
				buffer_putstring(b,"\\\\");
				break;
			case '\b':
				buffer_putstring(b,"\\b");
				break;
			case '\f':
				buffer_putstring(b,"\\f");
				break;
			case '\n':
				buffer_putstring(b,"\\n");
				break;
			case '\r':
				buffer_putstring(b,"\\r");
				break;
			case '\t':
				buffer_putstring(b,"\\t");
				break;
			default:
				if(isprint(*s)) {
					buffer_printf(b,"%c",*s);
				} else {
					buffer_printf(b,"\\u%04x",(int)*s);
				}
				break;
		}
		s++;
	}
	buffer_putstring(b,"\"");
}
Esempio n. 10
0
static void jx_item_print( struct jx_item *item, buffer_t *b )
{
	if(!item) return;

	jx_print_buffer(item->value,b);
	if(item->next) {
		buffer_putstring(b,",");
		jx_item_print(item->next,b);
	}
}
Esempio n. 11
0
static int find (buffer_t *B, const size_t base, buffer_t *path, const char *pattern, int recursive)
{
	int rc = 0;
	DIR *D = opendir(buffer_tostring(path));
	if (D) {
		struct dirent *entry;
		size_t current = buffer_pos(path);
		while ((entry = readdir(D))) {
			struct stat buf;

			if (buffer_putstring(path, entry->d_name) == -1) goto failure;
			/* N.B. We don't use FNM_PATHNAME, so `*.c' matches `foo/bar.c' */
			if (fnmatch(pattern, buffer_tostring(path)+base, 0) == 0) {
				if (buffer_printf(B, "%s%c", buffer_tostring(path), 0) == -1) goto failure; /* NUL padded */
				rc += 1;
			}
			if (recursive && strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..") && stat(buffer_tostring(path), &buf) == 0 && S_ISDIR(buf.st_mode)) {
				if (buffer_putliteral(path, "/") == -1) goto failure;
				int found = find(B, base, path, pattern, recursive);
				if (found == -1)
					goto failure;
				else if (found > 0)
					rc += found;
			}
			buffer_rewind(path, current);
		}
	} /* else skip */
	goto out;
failure:
	rc = -1;
	goto out;
out:
	if (D)
		closedir(D);
	return rc;
}
Esempio n. 12
0
/*
 * @brief reports device list
 * @param sc socket
 * @param channel
 * @param url command url
 * @param dev device handle
 * @param ssid session id
 * @ret -1 error, 0 success
 */
static int novacom_hostcmd_devadd(SOCKET sc, uint32_t channel, novacom_command_url_t *url, void *_dev, const char *ssid)
{
	int rc=-1;
	buffer_t *b = buffer_new(100);
	device_handle_t dev = (device_handle_t)_dev;

	/* buffer */
	if (!b)
		goto done;

	/* expecting at least one parameter */
	if (url->argcount < 1) {
		goto done;
	}

	/* message type(auth.h) */
	rc = buffer_putbyte(b, SSH_MSG_USERAUTH_TOKENREQUEST_ADD);
	if (rc)
		goto done;

	/* version info */
	rc = buffer_putbyte(b, 0);
	if (rc)
		goto done;

	/* password info */
	rc = buffer_putstring(b, (const unsigned char *)url->args[0], strlen(url->args[0]));
	if (rc)
		goto done;

	rc = novacom_write_channel_async(dev, channel, b->data, b->pos, ASYNC_FLAG_COPY, (novacom_async_callback)&socketcmd_write_callback, (void *)url);

done:
	buffer_free(b);
	return rc;
}
Esempio n. 13
0
void jx_print_buffer( struct jx *j, buffer_t *b )
{
	if(!j) return;

	switch(j->type) {
		case JX_NULL:
			buffer_putstring(b,"null");
			break;
		case JX_DOUBLE:
			buffer_printf(b,"%g",j->u.double_value);
			break;
		case JX_BOOLEAN:
			buffer_printf(b,"%s",j->u.boolean_value ? "true" : "false");
			break;
		case JX_INTEGER:
			buffer_printf(b,"%lld",(long long)j->u.integer_value);
			break;
		case JX_SYMBOL:
			buffer_printf(b,"%s",j->u.symbol_name);
			break;
		case JX_STRING:
			jx_escape_string(j->u.string_value,b);
			break;
		case JX_ARRAY:
			buffer_putstring(b,"[");
			jx_item_print(j->u.items,b);
			buffer_putstring(b,"]");
			break;
		case JX_OBJECT:
			buffer_putstring(b,"{");
			jx_pair_print(j->u.pairs,b);
			buffer_putstring(b,"}");
			break;
		case JX_OPERATOR:
			jx_print_subexpr(j->u.oper.left,j->u.oper.type,b);
			buffer_putstring(b,jx_operator_string(j->u.oper.type));
			jx_print_subexpr(j->u.oper.right,j->u.oper.type,b);
			if(j->u.oper.type==JX_OP_LOOKUP) buffer_putstring(b,"]");
			break;
		case JX_FUNCTION:
			buffer_putstring(b, jx_function_name_to_string(j->u.func.function));
			buffer_putstring(b, "(");
			jx_print_args(j->u.func.arguments, b);
			buffer_putstring(b, ")");
			break;
		case JX_ERROR:
			buffer_putstring(b,"Error");
			jx_print_buffer(j->u.err, b);
			break;
	}
}