mirror of
https://github.com/outbackdingo/parodus.git
synced 2026-01-27 18:20:04 +00:00
Compare commits
97 Commits
nopoll_par
...
1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afbb5c5fa0 | ||
|
|
0003bc4a25 | ||
|
|
b83392f519 | ||
|
|
50a8cd7911 | ||
|
|
5c388d1db7 | ||
|
|
aa596dd3c2 | ||
|
|
7829ec3de6 | ||
|
|
f214d119a3 | ||
|
|
99393a233d | ||
|
|
8b8c3f0950 | ||
|
|
a461a7da10 | ||
|
|
61ee6aca96 | ||
|
|
774ec17e4e | ||
|
|
1fdf4a46ef | ||
|
|
b8a48a400d | ||
|
|
acdb5c9937 | ||
|
|
76505cd414 | ||
|
|
d270f480e9 | ||
|
|
7fb0ed583c | ||
|
|
73a64224cd | ||
|
|
fe70242243 | ||
|
|
d111826d92 | ||
|
|
818b84257c | ||
|
|
b1078b53d6 | ||
|
|
54849bba00 | ||
|
|
f9b6ae840d | ||
|
|
831df10422 | ||
|
|
c63867a936 | ||
|
|
0b90f0fe3b | ||
|
|
429abeb6a5 | ||
|
|
0acefa0c37 | ||
|
|
36fc6a7e51 | ||
|
|
66c6ec779d | ||
|
|
e888235850 | ||
|
|
678d6c5f2d | ||
|
|
80f82521bd | ||
|
|
a73373e055 | ||
|
|
a9f11e85c6 | ||
|
|
72ec4daf74 | ||
|
|
278c1199cd | ||
|
|
75c446b220 | ||
|
|
e78174f314 | ||
|
|
3ee3ec356d | ||
|
|
e09ae35682 | ||
|
|
9fbe242ec7 | ||
|
|
275f5595ce | ||
|
|
a9b4b44504 | ||
|
|
dbc7b99b31 | ||
|
|
b68ba089cd | ||
|
|
6a921bd396 | ||
|
|
b02c30256c | ||
|
|
9a09357fc3 | ||
|
|
19208e2d0f | ||
|
|
aacbcf5360 | ||
|
|
63b9b50534 | ||
|
|
7e5aefd10a | ||
|
|
912638d59b | ||
|
|
883814ba42 | ||
|
|
718beac0bd | ||
|
|
88c4315a68 | ||
|
|
d4bf5dc099 | ||
|
|
3e91b55197 | ||
|
|
48d94661a3 | ||
|
|
0da33e5ec3 | ||
|
|
f67f385584 | ||
|
|
c55a480830 | ||
|
|
976810432e | ||
|
|
451517ca2b | ||
|
|
c96fd044de | ||
|
|
0e2bc12736 | ||
|
|
6dbf2d479b | ||
|
|
f8a0179753 | ||
|
|
05fad15ac5 | ||
|
|
6f96cf6529 | ||
|
|
5ab7f7a697 | ||
|
|
0807c5623f | ||
|
|
5eebbb8f49 | ||
|
|
d19a6f0022 | ||
|
|
6aeb6a42b1 | ||
|
|
7e5ec0d670 | ||
|
|
58c3fe35db | ||
|
|
056659c19e | ||
|
|
ee0d1dd6c0 | ||
|
|
e2296b497c | ||
|
|
3b2b14056c | ||
|
|
5c17a9fc73 | ||
|
|
d8e78ff982 | ||
|
|
1ecc3ad516 | ||
|
|
dd6fc7551a | ||
|
|
40e7963d29 | ||
|
|
866eb6b128 | ||
|
|
f927aba40c | ||
|
|
a55d28d85d | ||
|
|
b222bf7a7b | ||
|
|
699fabc6df | ||
|
|
8007039712 | ||
|
|
e11a52fb57 |
@@ -21,12 +21,12 @@ before_install:
|
||||
|
||||
install:
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -y -qq libcunit1 libcunit1-dev uuid-dev valgrind
|
||||
- sudo apt-get install -y -qq check libcunit1 libcunit1-dev uuid-dev valgrind
|
||||
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -DINTEGRATION_TESTING:BOOL=false -DDISABLE_VALGRIND:BOOL=true
|
||||
- cmake .. -DINTEGRATION_TESTING:BOOL=false -DDISABLE_VALGRIND:BOOL=true -DENABLE_SESHAT:BOOL=true -DENABLE_CJWT:BOOL=true
|
||||
- make
|
||||
- make test
|
||||
|
||||
|
||||
@@ -36,8 +36,19 @@ include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/wrp-c
|
||||
${INCLUDE_DIR}/libparodus
|
||||
${INCLUDE_DIR}/cimplog
|
||||
${INCLUDE_DIR}/libseshat
|
||||
)
|
||||
${INCLUDE_DIR}/cjwt
|
||||
)
|
||||
|
||||
# Get git commit hash
|
||||
#-------------------------------------------------------------------------------
|
||||
execute_process(
|
||||
COMMAND git describe --tags --always
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_COMMIT_TAG
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
add_definitions("-DGIT_COMMIT_TAG=\"${GIT_COMMIT_TAG}\"")
|
||||
|
||||
# Compile options/flags
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -60,7 +71,7 @@ ExternalProject_Add(trower-base64
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/trower-base64
|
||||
GIT_REPOSITORY https://github.com/Comcast/trower-base64.git
|
||||
GIT_TAG "master"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libtrower-base64 STATIC SHARED IMPORTED)
|
||||
add_dependencies(libtrower-base64 trower-base64)
|
||||
@@ -72,14 +83,7 @@ ExternalProject_Add(nopoll
|
||||
PREFIX ${PREFIX_DIR}/nopoll
|
||||
GIT_REPOSITORY https://github.com/Comcast/nopoll.git
|
||||
GIT_TAG "nopoll_yocto"
|
||||
PATCH_COMMAND ""
|
||||
COMMAND touch NEWS README AUTHORS ChangeLog
|
||||
COMMAND libtoolize --force
|
||||
COMMAND aclocal
|
||||
COMMAND autoheader --warnings=error
|
||||
COMMAND automake --add-missing -Werror
|
||||
COMMAND autoconf --force --warnings=error
|
||||
CONFIGURE_COMMAND COMMAND <SOURCE_DIR>/configure --prefix=${PREFIX}
|
||||
CONFIGURE_COMMAND COMMAND <SOURCE_DIR>/autogen.sh --prefix=${PREFIX}
|
||||
--includedir=${INCLUDE_DIR}
|
||||
--libdir=${LIBRARY_DIR}
|
||||
${CUSTOM_HOST}
|
||||
@@ -108,7 +112,7 @@ ExternalProject_Add(cJSON
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cJSON
|
||||
GIT_REPOSITORY https://github.com/DaveGamble/cJSON.git
|
||||
GIT_TAG "aafb64a1c549b7b927e339df6d35b1d5059dc235"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcJSON STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcJSON cJSON)
|
||||
@@ -175,6 +179,7 @@ ExternalProject_Add(libparodus
|
||||
add_library(liblibparodus STATIC SHARED IMPORTED)
|
||||
add_dependencies(liblibparodus libparodus)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
# libseshat external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(libseshat
|
||||
@@ -190,6 +195,40 @@ ExternalProject_Add(libseshat
|
||||
)
|
||||
add_library(liblibseshat STATIC SHARED IMPORTED)
|
||||
add_dependencies(liblibseshat libseshat)
|
||||
include_directories(${INCLUDE_DIR}/libseshat)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_SESHAT ")
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
# libcjwt external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(cjwt
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cjwt
|
||||
GIT_REPOSITORY https://github.com/Comcast/cjwt.git
|
||||
GIT_TAG "master"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcjwt STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcjwt cjwt)
|
||||
|
||||
if (UCLIBC)
|
||||
# libucresolv external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(ucresolv
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/ucresolv
|
||||
GIT_REPOSITORY https://github.com/Comcast/libucresolv.git
|
||||
GIT_TAG "master"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
)
|
||||
add_library(libucresolv STATIC SHARED IMPORTED)
|
||||
add_dependencies(libucresolv ucresolv)
|
||||
include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/ucresolv
|
||||
)
|
||||
|
||||
endif (UCLIBC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_CJWT ")
|
||||
endif (ENABLE_CJWT)
|
||||
|
||||
if (BUILD_TESTING)
|
||||
# cmocka external dependency
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
If you would like to contribute code to this project you can do so
|
||||
through GitHub by forking the repository and sending a pull request.
|
||||
Contribution Guidelines
|
||||
=======================
|
||||
|
||||
Before Comcast accepts your code into the project you must sign the
|
||||
Comcast Contributor License Agreement ('CLA.pdf').
|
||||
We love to see contributions to the project and have tried to make it easy to do so. If you would like to contribute code to this project you can do so through GitHub by forking the repository and sending a pull request.
|
||||
|
||||
Before Comcast merges your code into the project you must sign the [Comcast Contributor License Agreement (CLA)](https://gist.github.com/ComcastOSS/a7b8933dd8e368535378cda25c92d19a).
|
||||
|
||||
If you haven't previously signed a Comcast CLA, you'll automatically be asked to when you open a pull request. Alternatively, we can e-mail you a PDF that you can sign and scan back to us. Please send us an e-mail or create a new GitHub issue to request a PDF version of the CLA.
|
||||
|
||||
For more details about contributing to GitHub projects see
|
||||
http://gun.io/blog/how-to-github-fork-branch-and-pull-request/
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
If you contribute anything that changes the behavior of the
|
||||
application, document it in the [README](https://github.com/Comcast/parodus/blob/master/README.md) or [wiki](https://github.com/Comcast/parodus/wiki)! This includes new features, additional variants of behavior and breaking changes.
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
Tests are written using golang's standard testing tools, and are run prior to the PR being accepted.
|
||||
|
||||
Pull Requests
|
||||
-------------
|
||||
|
||||
* should be narrowly focused with no more than 3 or 4 logical commits
|
||||
* when possible, address no more than one issue
|
||||
* should be reviewable in the GitHub code review tool
|
||||
* should be linked to any issues it relates to (i.e. issue number after (#) in commit messages or pull request message)
|
||||
* should conform to idiomatic golang code formatting
|
||||
|
||||
16
NOTICE
Normal file
16
NOTICE
Normal file
@@ -0,0 +1,16 @@
|
||||
parodus
|
||||
Copyright 2017 Comcast Cable Communications Management, LLC
|
||||
|
||||
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.
|
||||
|
||||
This product includes software developed at Comcast (http://www.comcast.com/).
|
||||
1495
patches/nopoll.patch
1495
patches/nopoll.patch
File diff suppressed because it is too large
Load Diff
@@ -11,8 +11,22 @@
|
||||
# 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.
|
||||
set(SOURCES main.c mutex.c networking.c nopoll_helpers.c nopoll_handlers.c ParodusInternal.c
|
||||
string_helpers.c time.c config.c conn_interface.c connection.c spin_thread.c client_list.c service_alive.c upstream.c downstream.c thread_tasks.c partners_check.c)
|
||||
set(SOURCES main.c mutex.c networking.c nopoll_helpers.c nopoll_handlers.c
|
||||
ParodusInternal.c string_helpers.c time.c config.c conn_interface.c
|
||||
connection.c spin_thread.c client_list.c service_alive.c
|
||||
upstream.c downstream.c thread_tasks.c partners_check.c)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} token.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
|
||||
add_executable(parodus ${SOURCES})
|
||||
|
||||
@@ -22,7 +36,6 @@ target_link_libraries (parodus
|
||||
-lmsgpackc
|
||||
-ltrower-base64
|
||||
-lnopoll
|
||||
-llibseshat
|
||||
-luuid
|
||||
-lm
|
||||
-lcimplog
|
||||
@@ -33,4 +46,13 @@ target_link_libraries (parodus
|
||||
-lpthread
|
||||
-lrt
|
||||
)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
target_link_libraries (parodus -llibseshat)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
target_link_libraries (parodus -lresolv -lcjwt)
|
||||
endif (ENABLE_CJWT)
|
||||
|
||||
install (TARGETS parodus DESTINATION bin)
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file ParodusInternal.c
|
||||
*
|
||||
* @description This file is used to manage internal functions of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file ParodusInternal.h
|
||||
*
|
||||
* @description This file is used to manage internal functions of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
#ifndef _PARODUSINTERNAL_H_
|
||||
#define _PARODUSINTERNAL_H_
|
||||
@@ -56,6 +71,12 @@ typedef struct ParodusMsg__
|
||||
struct ParodusMsg__ *next;
|
||||
} ParodusMsg;
|
||||
|
||||
// Used in token.c to get jwt from dns server
|
||||
typedef struct {
|
||||
const char *rr_ptr;
|
||||
int rr_len;
|
||||
} rr_rec_t;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file client_list.h
|
||||
*
|
||||
* @description This file is used to manage registered clients
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
@@ -69,9 +84,8 @@ int addToList( wrp_msg_t **msg)
|
||||
ParodusPrint("(*msg)->u.reg.service_name is %s\n", (*msg)->u.reg.service_name);
|
||||
ParodusPrint("(*msg)->u.reg.url is %s\n", (*msg)->u.reg.url);
|
||||
|
||||
strncpy(new_node->service_name, (*msg)->u.reg.service_name, strlen((*msg)->u.reg.service_name)+1);
|
||||
strncpy(new_node->url, (*msg)->u.reg.url, strlen((*msg)->u.reg.url)+1);
|
||||
|
||||
parStrncpy(new_node->service_name, (*msg)->u.reg.service_name, sizeof(new_node->service_name));
|
||||
parStrncpy(new_node->url, (*msg)->u.reg.url, sizeof(new_node->url));
|
||||
new_node->next=NULL;
|
||||
|
||||
if (g_head == NULL) //adding first client
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file client_list.h
|
||||
*
|
||||
* @description This file is used to manage registered clients
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
#ifndef _CLIENTLIST_H_
|
||||
#define _CLIENTLIST_H_
|
||||
|
||||
316
src/config.c
316
src/config.c
@@ -1,14 +1,32 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file config.h
|
||||
*
|
||||
* @description This file contains configuration details of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include "config.h"
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
#define MAX_BUF_SIZE 128
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -26,35 +44,150 @@ ParodusCfg *get_parodus_cfg(void)
|
||||
|
||||
void set_parodus_cfg(ParodusCfg *cfg)
|
||||
{
|
||||
parodusCfg = *cfg;
|
||||
memcpy(&parodusCfg, cfg, sizeof(ParodusCfg));
|
||||
}
|
||||
|
||||
// the algorithm mask indicates which algorithms are allowed
|
||||
#if 0
|
||||
unsigned int get_algo_mask (const char *algo_str)
|
||||
{
|
||||
unsigned int mask = 0;
|
||||
char *tok;
|
||||
int alg_val;
|
||||
#define BUFLEN 128
|
||||
char algo_buf[BUFLEN];
|
||||
|
||||
strncpy (algo_buf, algo_str, BUFLEN-1);
|
||||
algo_buf[BUFLEN-1] = 0;
|
||||
|
||||
tok = strtok(algo_buf, ":");
|
||||
while(tok!=NULL)
|
||||
{
|
||||
alg_val = cjwt_alg_str_to_enum (tok);
|
||||
if ((alg_val < 0) || (alg_val >= num_algorithms)) {
|
||||
ParodusError("Invalid jwt algorithm %s\n", tok);
|
||||
abort ();
|
||||
}
|
||||
mask |= (1<<alg_val);
|
||||
tok = strtok(NULL,":");
|
||||
}
|
||||
return mask;
|
||||
#undef BUFLEN
|
||||
}
|
||||
#endif
|
||||
|
||||
static int open_input_file (const char *fname)
|
||||
{
|
||||
int fd = open(fname, O_RDONLY);
|
||||
if (fd<0)
|
||||
{
|
||||
ParodusError ("File %s open error\n", fname);
|
||||
abort ();
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
void read_key_from_file (const char *fname, char *buf, size_t buflen)
|
||||
{
|
||||
ssize_t nbytes;
|
||||
int fd = open_input_file(fname);
|
||||
nbytes = read(fd, buf, buflen);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
ParodusError ("Read file %s error\n", fname);
|
||||
close(fd);
|
||||
abort ();
|
||||
}
|
||||
close(fd);
|
||||
ParodusInfo ("%d bytes read\n", nbytes);
|
||||
}
|
||||
|
||||
void get_webpa_token(char *token, char *name, size_t len, char *serNum, char *mac)
|
||||
{
|
||||
FILE* out = NULL, *file = NULL;
|
||||
char command[MAX_BUF_SIZE] = {'\0'};
|
||||
if(strlen(name)>0)
|
||||
{
|
||||
file = fopen(name, "r");
|
||||
if(file)
|
||||
{
|
||||
snprintf(command,sizeof(command),"%s %s %s",name,serNum,mac);
|
||||
out = popen(command, "r");
|
||||
if(out)
|
||||
{
|
||||
fgets(token, len, out);
|
||||
pclose(out);
|
||||
}
|
||||
fclose(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError ("File %s open error\n", name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// strips ':' characters
|
||||
// verifies that there exactly 12 characters
|
||||
static int parse_mac_address (char *target, const char *arg)
|
||||
{
|
||||
int count = 0;
|
||||
int i;
|
||||
char c;
|
||||
|
||||
for (i=0; (c=arg[i]) != 0; i++) {
|
||||
if (c !=':')
|
||||
count++;
|
||||
}
|
||||
if (count != 12)
|
||||
return -1; // bad mac address
|
||||
for (i=0; (c=arg[i]) != 0; i++) {
|
||||
if (c != ':')
|
||||
*(target++) = c;
|
||||
}
|
||||
*target = 0; // terminating null
|
||||
return 0;
|
||||
}
|
||||
|
||||
void parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
{
|
||||
static const struct option long_options[] = {
|
||||
{"hw-model", required_argument, 0, 'm'},
|
||||
{"hw-serial-number", required_argument, 0, 's'},
|
||||
{"hw-manufacturer", required_argument, 0, 'f'},
|
||||
{"hw-mac", required_argument, 0, 'd'},
|
||||
{"hw-last-reboot-reason", required_argument, 0, 'r'},
|
||||
{"fw-name", required_argument, 0, 'n'},
|
||||
{"boot-time", required_argument, 0, 'b'},
|
||||
{"webpa-url", required_argument, 0, 'u'},
|
||||
{"webpa-ping-timeout", required_argument, 0, 't'},
|
||||
{"webpa-backoff-max", required_argument, 0, 'o'},
|
||||
{"webpa-interface-used", required_argument, 0, 'i'},
|
||||
{"parodus-local-url", required_argument, 0, 'l'},
|
||||
{"partner-id", required_argument, 0, 'p'},
|
||||
#ifdef ENABLE_SESHAT
|
||||
{"seshat-url", required_argument, 0, 'e'},
|
||||
#endif
|
||||
#ifdef ENABLE_CJWT
|
||||
{"dns-id", required_argument, 0, 'D'},
|
||||
{"jwt-algo", required_argument, 0, 'a'},
|
||||
{"jwt-key", required_argument, 0, 'k'},
|
||||
#endif
|
||||
{"ssl-cert-path", required_argument, 0, 'c'},
|
||||
{"force-ipv4", no_argument, 0, '4'},
|
||||
{"force-ipv6", no_argument, 0, '6'},
|
||||
{"webpa-token", required_argument, 0, 'T'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
int c;
|
||||
|
||||
while (1)
|
||||
{
|
||||
static struct option long_options[] = {
|
||||
{"hw-model", required_argument, 0, 'm'},
|
||||
{"hw-serial-number", required_argument, 0, 's'},
|
||||
{"hw-manufacturer", required_argument, 0, 'f'},
|
||||
{"hw-mac", required_argument, 0, 'd'},
|
||||
{"hw-last-reboot-reason", required_argument, 0, 'r'},
|
||||
{"fw-name", required_argument, 0, 'n'},
|
||||
{"boot-time", required_argument, 0, 'b'},
|
||||
{"webpa-url", required_argument, 0, 'u'},
|
||||
{"webpa-ping-timeout", required_argument, 0, 't'},
|
||||
{"webpa-backoff-max", required_argument, 0, 'o'},
|
||||
{"webpa-inteface-used", required_argument, 0, 'i'},
|
||||
{"parodus-local-url", required_argument, 0, 'l'},
|
||||
{"partner-id", required_argument, 0, 'p'},
|
||||
{"seshat-url", required_argument, 0, 'e'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
/* getopt_long stores the option index here. */
|
||||
int option_index = 0;
|
||||
c = getopt_long (argc, argv, "m:s:f:d:r:n:b:u:t:o:i:l:p:e:",long_options, &option_index);
|
||||
c = getopt_long (argc, argv, "m:s:f:d:r:n:b:u:t:o:i:l:p:e:D:a:k:c:4:6",
|
||||
long_options, &option_index);
|
||||
|
||||
/* Detect the end of the options. */
|
||||
if (c == -1)
|
||||
@@ -78,15 +211,19 @@ void parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
parStrncpy(cfg->hw_mac, optarg,sizeof(cfg->hw_mac));
|
||||
ParodusInfo("hw_mac is %s\n",cfg->hw_mac);
|
||||
if (parse_mac_address (cfg->hw_mac, optarg) == 0) {
|
||||
ParodusInfo ("hw_mac is %s\n",cfg->hw_mac);
|
||||
} else {
|
||||
ParodusError ("Bad mac address %s\n", optarg);
|
||||
abort ();
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef ENABLE_SESHAT
|
||||
case 'e':
|
||||
parStrncpy(cfg->seshat_url, optarg,sizeof(cfg->seshat_url));
|
||||
ParodusInfo("seshat_url is %s\n",cfg->seshat_url);
|
||||
break;
|
||||
|
||||
#endif
|
||||
case 'r':
|
||||
parStrncpy(cfg->hw_last_reboot_reason, optarg,sizeof(cfg->hw_last_reboot_reason));
|
||||
ParodusInfo("hw_last_reboot_reason is %s\n",cfg->hw_last_reboot_reason);
|
||||
@@ -126,12 +263,55 @@ void parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
parStrncpy(cfg->local_url, optarg,sizeof(cfg->local_url));
|
||||
ParodusInfo("parodus local_url is %s\n",cfg->local_url);
|
||||
break;
|
||||
|
||||
#ifdef ENABLE_CJWT
|
||||
case 'D':
|
||||
// like 'fabric' or 'test'
|
||||
// this parameter is used, along with the hw_mac parameter
|
||||
// to create the dns txt record id
|
||||
parStrncpy(cfg->dns_id, optarg,sizeof(cfg->dns_id));
|
||||
ParodusInfo("parodus dns_id is %s\n",cfg->dns_id);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
parStrncpy(cfg->jwt_algo, optarg, sizeof(cfg->jwt_algo));
|
||||
ParodusInfo("jwt_algo is %s\n",cfg->jwt_algo);
|
||||
break;
|
||||
case 'k':
|
||||
// if the key argument has a '.' character in it, then it is
|
||||
// assumed to be a file, and the file is read in.
|
||||
if (strchr (optarg, '.') == NULL) {
|
||||
parStrncpy(cfg->jwt_key, optarg,sizeof(cfg->jwt_key));
|
||||
} else {
|
||||
read_key_from_file (optarg, cfg->jwt_key, sizeof(cfg->jwt_key));
|
||||
}
|
||||
ParodusInfo("jwt_key is %s\n",cfg->jwt_key);
|
||||
break;
|
||||
#endif
|
||||
case 'p':
|
||||
parStrncpy(cfg->partner_id, optarg,sizeof(cfg->partner_id));
|
||||
ParodusInfo("partner_id is %s\n",cfg->partner_id);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
parStrncpy(cfg->cert_path, optarg,sizeof(cfg->cert_path));
|
||||
ParodusInfo("cert_path is %s\n",cfg->cert_path);
|
||||
break;
|
||||
|
||||
case '4':
|
||||
ParodusInfo("Force IPv4\n");
|
||||
cfg->flags |= FLAGS_IPV4_ONLY;
|
||||
break;
|
||||
|
||||
case '6':
|
||||
ParodusInfo("Force IPv6\n");
|
||||
cfg->flags |= FLAGS_IPV6_ONLY;
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
get_webpa_token(cfg->webpa_token,optarg,sizeof(cfg->webpa_token),cfg->hw_serial_number,cfg->hw_mac);
|
||||
ParodusInfo("webpa_token is %s\n",cfg->webpa_token);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
/* getopt_long already printed an error message. */
|
||||
break;
|
||||
@@ -167,7 +347,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
|
||||
if(strlen (pConfig->hw_model) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_model, pConfig->hw_model,strlen(pConfig->hw_model)+1);
|
||||
parStrncpy(cfg->hw_model, pConfig->hw_model, sizeof(cfg->hw_model));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -175,7 +355,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if( strlen(pConfig->hw_serial_number) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_serial_number, pConfig->hw_serial_number,strlen(pConfig->hw_serial_number)+1);
|
||||
parStrncpy(cfg->hw_serial_number, pConfig->hw_serial_number, sizeof(cfg->hw_serial_number));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -183,7 +363,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if(strlen(pConfig->hw_manufacturer) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_manufacturer, pConfig->hw_manufacturer,strlen(pConfig->hw_manufacturer)+1);
|
||||
parStrncpy(cfg->hw_manufacturer, pConfig->hw_manufacturer,sizeof(cfg->hw_manufacturer));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -191,7 +371,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if(strlen(pConfig->hw_mac) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_mac, pConfig->hw_mac,strlen(pConfig->hw_mac)+1);
|
||||
parStrncpy(cfg->hw_mac, pConfig->hw_mac,sizeof(cfg->hw_mac));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -199,7 +379,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if(strlen (pConfig->hw_last_reboot_reason) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_last_reboot_reason, pConfig->hw_last_reboot_reason,strlen(pConfig->hw_last_reboot_reason)+1);
|
||||
parStrncpy(cfg->hw_last_reboot_reason, pConfig->hw_last_reboot_reason,sizeof(cfg->hw_last_reboot_reason));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -207,7 +387,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if(strlen(pConfig->fw_name) !=0)
|
||||
{
|
||||
strncpy(cfg->fw_name, pConfig->fw_name,strlen(pConfig->fw_name)+1);
|
||||
parStrncpy(cfg->fw_name, pConfig->fw_name,sizeof(cfg->fw_name));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -215,7 +395,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if( strlen(pConfig->webpa_url) !=0)
|
||||
{
|
||||
strncpy(cfg->webpa_url, pConfig->webpa_url,strlen(pConfig->webpa_url)+1);
|
||||
parStrncpy(cfg->webpa_url, pConfig->webpa_url,sizeof(cfg->webpa_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -223,7 +403,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if(strlen(pConfig->webpa_interface_used )!=0)
|
||||
{
|
||||
strncpy(cfg->webpa_interface_used, pConfig->webpa_interface_used,strlen(pConfig->webpa_interface_used)+1);
|
||||
parStrncpy(cfg->webpa_interface_used, pConfig->webpa_interface_used,sizeof(cfg->webpa_interface_used));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -231,41 +411,91 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if( strlen(pConfig->local_url) !=0)
|
||||
{
|
||||
strncpy(cfg->local_url, pConfig->local_url,strlen(pConfig->local_url)+1);
|
||||
parStrncpy(cfg->local_url, pConfig->local_url,sizeof(cfg->local_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("parodus local_url is NULL. adding default url\n");
|
||||
strncpy(cfg->local_url, PARODUS_UPSTREAM, strlen(PARODUS_UPSTREAM)+1);
|
||||
parStrncpy(cfg->local_url, PARODUS_UPSTREAM, sizeof(cfg->local_url));
|
||||
|
||||
}
|
||||
|
||||
if( strlen(pConfig->partner_id) !=0)
|
||||
{
|
||||
strncpy(cfg->partner_id, pConfig->partner_id,strlen(pConfig->partner_id)+1);
|
||||
parStrncpy(cfg->partner_id, pConfig->partner_id,sizeof(cfg->partner_id));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("partner_id is NULL. read from tmp file\n");
|
||||
}
|
||||
|
||||
#ifdef ENABLE_SESHAT
|
||||
if( strlen(pConfig->seshat_url) !=0)
|
||||
{
|
||||
strncpy(cfg->seshat_url, pConfig->seshat_url,strlen(pConfig->seshat_url)+1);
|
||||
parStrncpy(cfg->seshat_url, pConfig->seshat_url,sizeof(cfg->seshat_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("seshat_url is NULL. Read from tmp file\n");
|
||||
}
|
||||
#endif
|
||||
#ifdef ENABLE_CJWT
|
||||
if( strlen(pConfig->dns_id) !=0)
|
||||
{
|
||||
parStrncpy(cfg->dns_id, pConfig->dns_id,sizeof(cfg->dns_id));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("parodus dns-id is NULL. adding default\n");
|
||||
parStrncpy(cfg->dns_id, DNS_ID,sizeof(cfg->dns_id));
|
||||
}
|
||||
|
||||
if(strlen(pConfig->jwt_key )!=0)
|
||||
{
|
||||
parStrncpy(cfg->jwt_key, pConfig->jwt_key,sizeof(cfg->jwt_key));
|
||||
}
|
||||
else
|
||||
{
|
||||
parStrncpy(cfg->jwt_key, "\0", sizeof(cfg->jwt_key));
|
||||
ParodusPrint("jwt_key is NULL. set to empty\n");
|
||||
}
|
||||
|
||||
if(strlen(pConfig->jwt_algo )!=0)
|
||||
{
|
||||
parStrncpy(cfg->jwt_algo, pConfig->jwt_algo,sizeof(cfg->jwt_algo));
|
||||
}
|
||||
else
|
||||
{
|
||||
parStrncpy(cfg->jwt_algo, "\0", sizeof(cfg->jwt_algo));
|
||||
ParodusPrint("jwt_algo is NULL. set to empty\n");
|
||||
}
|
||||
#endif
|
||||
if(strlen(pConfig->cert_path )!=0)
|
||||
{
|
||||
parStrncpy(cfg->cert_path, pConfig->cert_path,sizeof(cfg->cert_path));
|
||||
}
|
||||
else
|
||||
{
|
||||
parStrncpy(cfg->cert_path, "\0", sizeof(cfg->cert_path));
|
||||
ParodusPrint("cert_path is NULL. set to empty\n");
|
||||
}
|
||||
|
||||
if( strlen(pConfig->webpa_token) !=0)
|
||||
{
|
||||
parStrncpy(cfg->webpa_token, pConfig->webpa_token,sizeof(cfg->webpa_token));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("webpa_token is NULL. read from tmp file\n");
|
||||
}
|
||||
|
||||
cfg->boot_time = pConfig->boot_time;
|
||||
cfg->secureFlag = 1;
|
||||
cfg->flags |= FLAGS_SECURE;
|
||||
cfg->webpa_ping_timeout = pConfig->webpa_ping_timeout;
|
||||
cfg->webpa_backoff_max = pConfig->webpa_backoff_max;
|
||||
strncpy(cfg->webpa_path_url, WEBPA_PATH_URL, strlen(WEBPA_PATH_URL)+1);
|
||||
strncpy(cfg->webpa_protocol, WEBPA_PROTOCOL_VALUE, strlen(WEBPA_PROTOCOL_VALUE)+1);
|
||||
strncpy(cfg->webpa_uuid, "1234567-345456546", strlen("1234567-345456546")+1);
|
||||
parStrncpy(cfg->webpa_path_url, WEBPA_PATH_URL,sizeof(cfg->webpa_path_url));
|
||||
snprintf(cfg->webpa_protocol, sizeof(cfg->webpa_protocol), "%s-%s", PROTOCOL_VALUE, GIT_COMMIT_TAG);
|
||||
ParodusInfo("cfg->webpa_protocol is %s\n", cfg->webpa_protocol);
|
||||
parStrncpy(cfg->webpa_uuid, "1234567-345456546",sizeof(cfg->webpa_uuid));
|
||||
ParodusPrint("cfg->webpa_uuid is :%s\n", cfg->webpa_uuid);
|
||||
|
||||
}
|
||||
|
||||
74
src/config.h
74
src/config.h
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file config.h
|
||||
*
|
||||
* @description This file contains configuration details of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_H_
|
||||
@@ -18,25 +33,29 @@ extern "C" {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/* WRP CRUD Model Macros */
|
||||
#define HW_MODELNAME "hw-model"
|
||||
#define HW_SERIALNUMBER "hw-serial-number"
|
||||
#define HW_MANUFACTURER "hw-manufacturer"
|
||||
#define HW_DEVICEMAC "hw-mac"
|
||||
#define HW_LAST_REBOOT_REASON "hw-last-reboot-reason"
|
||||
#define FIRMWARE_NAME "fw-name"
|
||||
#define BOOT_TIME "boot-time"
|
||||
#define LAST_RECONNECT_REASON "webpa-last-reconnect-reason"
|
||||
#define WEBPA_PROTOCOL "webpa-protocol"
|
||||
#define WEBPA_INTERFACE "webpa-inteface-used"
|
||||
#define WEBPA_UUID "webpa-uuid"
|
||||
#define WEBPA_URL "webpa-url"
|
||||
#define WEBPA_PING_TIMEOUT "webpa-ping-timeout"
|
||||
#define WEBPA_BACKOFF_MAX "webpa-backoff-max"
|
||||
#define PARTNER_ID "partner-id"
|
||||
#define HW_MODELNAME "hw-model"
|
||||
#define HW_SERIALNUMBER "hw-serial-number"
|
||||
#define HW_MANUFACTURER "hw-manufacturer"
|
||||
#define HW_DEVICEMAC "hw-mac"
|
||||
#define HW_LAST_REBOOT_REASON "hw-last-reboot-reason"
|
||||
#define FIRMWARE_NAME "fw-name"
|
||||
#define BOOT_TIME "boot-time"
|
||||
#define LAST_RECONNECT_REASON "webpa-last-reconnect-reason"
|
||||
#define WEBPA_PROTOCOL "webpa-protocol"
|
||||
#define WEBPA_INTERFACE "webpa-inteface-used"
|
||||
#define WEBPA_UUID "webpa-uuid"
|
||||
#define WEBPA_URL "webpa-url"
|
||||
#define WEBPA_PING_TIMEOUT "webpa-ping-timeout"
|
||||
#define WEBPA_BACKOFF_MAX "webpa-backoff-max"
|
||||
#define PARTNER_ID "partner-id"
|
||||
|
||||
#define WEBPA_PROTOCOL_VALUE "WebPA-1.6"
|
||||
#define WEBPA_PATH_URL "/api/v2/device"
|
||||
#define PARODUS_UPSTREAM "tcp://127.0.0.1:6666"
|
||||
#define PROTOCOL_VALUE "PARODUS-2.0"
|
||||
#define WEBPA_PATH_URL "/api/v2/device"
|
||||
|
||||
#ifdef ENABLE_CJWT
|
||||
# define DNS_ID "fabric"
|
||||
#endif
|
||||
#define PARODUS_UPSTREAM "tcp://127.0.0.1:6666"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
@@ -56,14 +75,27 @@ typedef struct
|
||||
char webpa_path_url[124];
|
||||
unsigned int webpa_backoff_max;
|
||||
char webpa_interface_used[16];
|
||||
char webpa_protocol[16];
|
||||
char webpa_protocol[32];
|
||||
char webpa_uuid[64];
|
||||
unsigned int secureFlag;
|
||||
unsigned int flags;
|
||||
char local_url[124];
|
||||
char partner_id[64];
|
||||
#ifdef ENABLE_SESHAT
|
||||
char seshat_url[128];
|
||||
#endif
|
||||
#ifdef ENABLE_CJWT
|
||||
char dns_id[64];
|
||||
char jwt_algo[32]; // bit mask set for each allowed algorithm
|
||||
char jwt_key[4096]; // may be read in from a pem file
|
||||
#endif
|
||||
char cert_path[64];
|
||||
char webpa_token[4096];
|
||||
} ParodusCfg;
|
||||
|
||||
#define FLAGS_SECURE (1 << 0)
|
||||
#define FLAGS_IPV6_ONLY (1 << 1)
|
||||
#define FLAGS_IPV4_ONLY (1 << 2)
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file conn_interface.c
|
||||
*
|
||||
* @description This decribes interface to create WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "connection.h"
|
||||
@@ -17,14 +32,13 @@
|
||||
#include "mutex.h"
|
||||
#include "spin_thread.h"
|
||||
#include "service_alive.h"
|
||||
#include <libseshat.h>
|
||||
#include "seshat_interface.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
#define HEARTBEAT_RETRY_SEC 30 /* Heartbeat (ping/pong) timeout in seconds */
|
||||
#define SESHAT_SERVICE_NAME "Parodus"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
@@ -39,8 +53,6 @@ pthread_mutex_t close_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
static bool __registerWithSeshat(void);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -130,44 +142,3 @@ void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
nopoll_cleanup_library();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**
|
||||
* @brief Helper function to register with seshat.
|
||||
*
|
||||
* @note return whether successfully registered.
|
||||
*
|
||||
* @return true when registered, false otherwise.
|
||||
*/
|
||||
static bool __registerWithSeshat()
|
||||
{
|
||||
char *seshat_url = get_parodus_cfg()->seshat_url;
|
||||
char *parodus_url = get_parodus_cfg()->local_url;
|
||||
char *discover_url = NULL;
|
||||
bool rv = false;
|
||||
|
||||
if( 0 == init_lib_seshat(seshat_url) ) {
|
||||
ParodusInfo("seshatlib initialized! (url %s)\n", seshat_url);
|
||||
|
||||
if( 0 == seshat_register(SESHAT_SERVICE_NAME, parodus_url) ) {
|
||||
ParodusInfo("seshatlib registered! (url %s)\n", parodus_url);
|
||||
|
||||
discover_url = seshat_discover(SESHAT_SERVICE_NAME);
|
||||
if( (NULL != discover_url) && (0 == strcmp(parodus_url, discover_url)) ) {
|
||||
ParodusInfo("seshatlib discovered url = %s\n", discover_url);
|
||||
rv = true;
|
||||
} else {
|
||||
ParodusError("seshatlib registration error (url %s)!", discover_url);
|
||||
}
|
||||
free(discover_url);
|
||||
} else {
|
||||
ParodusError("seshatlib not registered! (url %s)\n", parodus_url);
|
||||
}
|
||||
} else {
|
||||
ParodusPrint("seshatlib not initialized! (url %s)\n", seshat_url);
|
||||
}
|
||||
|
||||
shutdown_seshat_lib();
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,25 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file conn_interface.h
|
||||
*
|
||||
* @description This header defines interface to create WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _CONN_INTERFACE_H_
|
||||
#define _CONN_INTERFACE_H_
|
||||
|
||||
|
||||
165
src/connection.c
165
src/connection.c
@@ -1,13 +1,29 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file connection.c
|
||||
*
|
||||
* @description This decribes functions required to manage WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "connection.h"
|
||||
#include "time.h"
|
||||
#include "token.h"
|
||||
#include "config.h"
|
||||
#include "nopoll_helpers.h"
|
||||
#include "mutex.h"
|
||||
@@ -17,8 +33,7 @@
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
#define HTTP_CUSTOM_HEADER_COUNT 4
|
||||
|
||||
#define HTTP_CUSTOM_HEADER_COUNT 5
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -26,13 +41,12 @@
|
||||
char deviceMAC[32]={'\0'};
|
||||
static char *reconnect_reason = "webpa_process_starts";
|
||||
static noPollConn *g_conn = NULL;
|
||||
static noPollConnOpts * createConnOpts ();
|
||||
static noPollConn * nopoll_tls_common_conn (noPollCtx * ctx,char * serverAddr,char *serverPort);
|
||||
static noPollConnOpts * createConnOpts (char * extra_headers);
|
||||
static noPollConn * nopoll_tls_common_conn (noPollCtx * ctx,char * serverAddr,char *serverPort,char * extra_headers);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
noPollConn *get_global_conn(void)
|
||||
{
|
||||
return g_conn;
|
||||
@@ -59,20 +73,36 @@ void set_global_reconnect_reason(char *reason)
|
||||
*/
|
||||
int createNopollConnection(noPollCtx *ctx)
|
||||
{
|
||||
bool initial_retry = false;
|
||||
int backoffRetryTime = 0;
|
||||
bool initial_retry = false;
|
||||
int backoffRetryTime = 0;
|
||||
int max_retry_sleep;
|
||||
char port[8];
|
||||
char server_Address[256];
|
||||
char redirectURL[128]={'\0'};
|
||||
int allow_insecure;
|
||||
char *temp_ptr;
|
||||
int connErr=0;
|
||||
struct timespec connErr_start,connErr_end,*connErr_startPtr,*connErr_endPtr;
|
||||
connErr_startPtr = &connErr_start;
|
||||
connErr_endPtr = &connErr_end;
|
||||
//Retry Backoff count shall start at c=2 & calculate 2^c - 1.
|
||||
int c=2;
|
||||
int c=2;
|
||||
char *conveyHeader = NULL;
|
||||
char device_id[32]={'\0'};
|
||||
char user_agent[512]={'\0'};
|
||||
char * extra_headers = NULL;
|
||||
|
||||
if(ctx == NULL) {
|
||||
return nopoll_false;
|
||||
}
|
||||
|
||||
//query dns and validate JWT
|
||||
allow_insecure = allow_insecure_conn();
|
||||
ParodusPrint("allow: %d\n", allow_insecure);
|
||||
if (allow_insecure < 0) {
|
||||
return nopoll_false;
|
||||
}
|
||||
|
||||
ParodusPrint("BootTime In sec: %d\n", get_parodus_cfg()->boot_time);
|
||||
ParodusInfo("Received reboot_reason as:%s\n", get_parodus_cfg()->hw_last_reboot_reason);
|
||||
ParodusInfo("Received reconnect_reason as:%s\n", reconnect_reason);
|
||||
@@ -83,6 +113,23 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
max_retry_sleep = (int) pow(2, get_parodus_cfg()->webpa_backoff_max) -1;
|
||||
ParodusPrint("max_retry_sleep is %d\n", max_retry_sleep );
|
||||
|
||||
snprintf(user_agent, sizeof(user_agent),"%s (%s; %s/%s;)",
|
||||
((0 != strlen(get_parodus_cfg()->webpa_protocol)) ? get_parodus_cfg()->webpa_protocol : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->fw_name)) ? get_parodus_cfg()->fw_name : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_model)) ? get_parodus_cfg()->hw_model : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_manufacturer)) ? get_parodus_cfg()->hw_manufacturer : "unknown"));
|
||||
|
||||
ParodusInfo("User-Agent: %s\n",user_agent);
|
||||
conveyHeader = getWebpaConveyHeader();
|
||||
parStrncpy(deviceMAC, get_parodus_cfg()->hw_mac,sizeof(deviceMAC));
|
||||
snprintf(device_id, sizeof(device_id), "mac:%s", deviceMAC);
|
||||
ParodusInfo("Device_id %s\n",device_id);
|
||||
|
||||
extra_headers = nopoll_strdup_printf("\r\nX-WebPA-Device-Name: %s"
|
||||
"\r\nX-WebPA-Device-Protocols: wrp-0.11,getset-0.1"
|
||||
"\r\nX-WebPA-Token: %s"
|
||||
"\r\nUser-Agent: %s" "\r\nX-WebPA-Convey: %s",device_id,((0 != strlen(get_parodus_cfg()->webpa_token)) ? get_parodus_cfg()->webpa_token : ""),user_agent,(strlen(conveyHeader) > 0)? conveyHeader :"");
|
||||
|
||||
do
|
||||
{
|
||||
//calculate backoffRetryTime and to perform exponential increment during retry
|
||||
@@ -91,18 +138,18 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
backoffRetryTime = (int) pow(2, c) -1;
|
||||
}
|
||||
ParodusPrint("New backoffRetryTime value calculated as %d seconds\n", backoffRetryTime);
|
||||
|
||||
noPollConn *connection;
|
||||
if(get_parodus_cfg()->secureFlag)
|
||||
if((FLAGS_SECURE == (FLAGS_SECURE & get_parodus_cfg()->flags)) || (!allow_insecure))
|
||||
{
|
||||
ParodusPrint("secure true\n");
|
||||
connection = nopoll_tls_common_conn(ctx,server_Address, port);
|
||||
connection = nopoll_tls_common_conn(ctx,server_Address, port, extra_headers);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("secure false\n");
|
||||
connection = nopoll_conn_new(ctx, server_Address, port, NULL,
|
||||
get_parodus_cfg()->webpa_path_url, NULL, NULL);// WEBPA-787
|
||||
noPollConnOpts * opts;
|
||||
opts = createConnOpts(extra_headers);
|
||||
connection = nopoll_conn_new_opts (ctx, opts,server_Address,port,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);// WEBPA-787
|
||||
}
|
||||
set_global_conn(connection);
|
||||
|
||||
@@ -170,6 +217,32 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
/* If the connect error is due to DNS resolving to 10.0.0.1 then start timer.
|
||||
* Timeout after 15 minutes if the error repeats continuously and kill itself.
|
||||
*/
|
||||
if((checkHostIp(server_Address) == -2))
|
||||
{
|
||||
if(connErr == 0)
|
||||
{
|
||||
getCurrentTime(connErr_startPtr);
|
||||
connErr = 1;
|
||||
ParodusInfo("First connect error occurred, initialized the connect error timer\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
getCurrentTime(connErr_endPtr);
|
||||
ParodusPrint("checking timeout difference:%ld\n", timeValDiff(connErr_startPtr, connErr_endPtr));
|
||||
if(timeValDiff(connErr_startPtr, connErr_endPtr) >= (15*60*1000))
|
||||
{
|
||||
ParodusError("WebPA unable to connect due to DNS resolving to 10.0.0.1 for over 15 minutes; crashing service.\n");
|
||||
reconnect_reason = "Dns_Res_webpa_reconnect";
|
||||
LastReasonStatus = true;
|
||||
|
||||
kill(getpid(),SIGTERM);
|
||||
}
|
||||
}
|
||||
}
|
||||
initial_retry = true;
|
||||
ParodusInfo("Waiting with backoffRetryTime %d seconds\n", backoffRetryTime);
|
||||
sleep(backoffRetryTime);
|
||||
@@ -180,7 +253,7 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
|
||||
}while(initial_retry);
|
||||
|
||||
if(get_parodus_cfg()->secureFlag)
|
||||
if( FLAGS_SECURE == (FLAGS_SECURE & get_parodus_cfg()->flags) )
|
||||
{
|
||||
ParodusInfo("Connected to server over SSL\n");
|
||||
}
|
||||
@@ -197,6 +270,7 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
ParodusPrint("createNopollConnection(): close_mut unlock\n");
|
||||
heartBeatTimer = 0;
|
||||
// Reset connErr flag on successful connection
|
||||
connErr = 0;
|
||||
reconnect_reason = "webpa_process_starts";
|
||||
LastReasonStatus =false;
|
||||
ParodusPrint("LastReasonStatus reset after successful connection\n");
|
||||
@@ -204,50 +278,49 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
|
||||
return nopoll_true;
|
||||
}
|
||||
static noPollConn * nopoll_tls_common_conn (noPollCtx * ctx,char * serverAddr,char *serverPort)
|
||||
static noPollConn * nopoll_tls_common_conn (noPollCtx * ctx,char * serverAddr,char *serverPort,char * extra_headers)
|
||||
{
|
||||
unsigned int flags = 0;
|
||||
noPollConnOpts * opts;
|
||||
noPollConn *connection = NULL;
|
||||
opts = createConnOpts();
|
||||
ParodusInfo("Try connecting with Ipv6 mode\n");
|
||||
connection = nopoll_conn_tls_new6 (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
if(connection == NULL)
|
||||
{
|
||||
ParodusInfo("Ipv6 connection failed. Try connecting with Ipv4 mode \n");
|
||||
opts = createConnOpts();
|
||||
opts = createConnOpts(extra_headers);
|
||||
|
||||
flags = get_parodus_cfg()->flags;
|
||||
|
||||
if( FLAGS_IPV4_ONLY == (FLAGS_IPV4_ONLY & flags) ) {
|
||||
ParodusInfo("Connecting in Ipv4 mode\n");
|
||||
connection = nopoll_conn_tls_new (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
} else if( FLAGS_IPV6_ONLY == (FLAGS_IPV6_ONLY & flags) ) {
|
||||
ParodusInfo("Connecting in Ipv6 mode\n");
|
||||
connection = nopoll_conn_tls_new6 (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
} else {
|
||||
ParodusInfo("Try connecting with Ipv6 mode\n");
|
||||
connection = nopoll_conn_tls_new6 (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
if(connection == NULL)
|
||||
{
|
||||
ParodusInfo("Ipv6 connection failed. Try connecting with Ipv4 mode \n");
|
||||
opts = createConnOpts(extra_headers);
|
||||
connection = nopoll_conn_tls_new (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
}
|
||||
}
|
||||
return connection;
|
||||
}
|
||||
|
||||
static noPollConnOpts * createConnOpts ()
|
||||
static noPollConnOpts * createConnOpts (char * extra_headers)
|
||||
{
|
||||
noPollConnOpts * opts;
|
||||
char device_id[32]={'\0'};
|
||||
char * extra_headers, *conveyHeader = NULL;
|
||||
char user_agent[512]={'\0'};
|
||||
|
||||
opts = nopoll_conn_opts_new ();
|
||||
nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false);
|
||||
nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_TLSV1_2);
|
||||
if( FLAGS_SECURE == (FLAGS_SECURE & get_parodus_cfg()->flags) )
|
||||
{
|
||||
if(strlen(get_parodus_cfg()->cert_path) > 0)
|
||||
{
|
||||
nopoll_conn_opts_set_ssl_certs(opts, NULL, NULL, NULL, get_parodus_cfg()->cert_path);
|
||||
}
|
||||
nopoll_conn_opts_ssl_peer_verify (opts, nopoll_true);
|
||||
nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_TLSV1_2);
|
||||
}
|
||||
nopoll_conn_opts_set_interface (opts,get_parodus_cfg()->webpa_interface_used);
|
||||
snprintf(user_agent, sizeof(user_agent),"%s (%s; %s/%s;)",
|
||||
((0 != strlen(get_parodus_cfg()->webpa_protocol)) ? get_parodus_cfg()->webpa_protocol : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->fw_name)) ? get_parodus_cfg()->fw_name : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_model)) ? get_parodus_cfg()->hw_model : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_manufacturer)) ? get_parodus_cfg()->hw_manufacturer : "unknown"));
|
||||
|
||||
ParodusInfo("User-Agent: %s\n",user_agent);
|
||||
conveyHeader = getWebpaConveyHeader();
|
||||
|
||||
parStrncpy(deviceMAC, get_parodus_cfg()->hw_mac,sizeof(deviceMAC));
|
||||
snprintf(device_id, sizeof(device_id), "mac:%s", deviceMAC);
|
||||
ParodusInfo("Device_id %s\n",device_id);
|
||||
|
||||
extra_headers = nopoll_strdup_printf("\r\nX-WebPA-Device-Name: %s"
|
||||
"\r\nX-WebPA-Device-Protocols: wrp-0.11,getset-0.1"
|
||||
"\r\nUser-Agent: %s" "\r\nX-WebPA-Convey: %s",device_id,user_agent,(strlen(conveyHeader) > 0)? conveyHeader :"");
|
||||
|
||||
nopoll_conn_opts_set_extra_headers (opts,extra_headers);
|
||||
return opts;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file connection.h
|
||||
*
|
||||
* @description This header defines functions required to manage WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _CONNECTION_H_
|
||||
|
||||
201
src/downstream.c
201
src/downstream.c
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file downstream.c
|
||||
*
|
||||
* @description This describes functions required to manage downstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "downstream.h"
|
||||
@@ -42,7 +57,7 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
|
||||
recivedMsg = (const char *) msg;
|
||||
|
||||
ParodusInfo("Received msg from server:%s\n", recivedMsg);
|
||||
ParodusInfo("Received msg from server\n");
|
||||
if(recivedMsg!=NULL)
|
||||
{
|
||||
/*** Decoding downstream recivedMsg to check destination ***/
|
||||
@@ -54,97 +69,135 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
msgType = message->msg_type;
|
||||
ParodusInfo("msgType received:%d\n", msgType);
|
||||
|
||||
if(message->msg_type == WRP_MSG_TYPE__AUTH)
|
||||
switch( message->msg_type )
|
||||
{
|
||||
ParodusInfo("Authorization Status received with Status code :%d\n", message->u.auth.status);
|
||||
}
|
||||
|
||||
if(message->msg_type == WRP_MSG_TYPE__REQ)
|
||||
{
|
||||
ParodusPrint("numOfClients registered is %d\n", get_numOfClients());
|
||||
int ret = validate_partner_id(message, NULL);
|
||||
if(ret < 0)
|
||||
case WRP_MSG_TYPE__AUTH:
|
||||
{
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 430);
|
||||
cJSON_AddStringToObject(response, "message", "Invalid partner_id");
|
||||
ParodusInfo("Authorization Status received with Status code :%d\n", message->u.auth.status);
|
||||
break;
|
||||
}
|
||||
|
||||
if((message->u.req.dest !=NULL) && (ret >= 0))
|
||||
case WRP_MSG_TYPE__EVENT:
|
||||
case WRP_MSG_TYPE__REQ:
|
||||
case WRP_MSG_TYPE__CREATE:
|
||||
case WRP_MSG_TYPE__UPDATE:
|
||||
case WRP_MSG_TYPE__RETREIVE:
|
||||
case WRP_MSG_TYPE__DELETE:
|
||||
{
|
||||
destVal = message->u.req.dest;
|
||||
strtok(destVal , "/");
|
||||
parStrncpy(dest,strtok(NULL , "/"), sizeof(dest));
|
||||
ParodusInfo("Received downstream dest as :%s\n", dest);
|
||||
temp = get_global_node();
|
||||
//Checking for individual clients & Sending to each client
|
||||
|
||||
while (NULL != temp)
|
||||
ParodusPrint("numOfClients registered is %d\n", get_numOfClients());
|
||||
int ret = validate_partner_id(message, NULL);
|
||||
if(ret < 0)
|
||||
{
|
||||
ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name);
|
||||
// Sending message to registered clients
|
||||
if( strcmp(dest, temp->service_name) == 0)
|
||||
{
|
||||
ParodusPrint("sending to nanomsg client %s\n", dest);
|
||||
bytes = nn_send(temp->sock, recivedMsg, msgSize, 0);
|
||||
ParodusInfo("sent downstream message '%s' to reg_client '%s'\n",recivedMsg,temp->url);
|
||||
ParodusPrint("downstream bytes sent:%d\n", bytes);
|
||||
destFlag =1;
|
||||
break;
|
||||
}
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
|
||||
//if any unknown dest received sending error response to server
|
||||
if(destFlag ==0)
|
||||
{
|
||||
ParodusError("Unknown dest:%s\n", dest);
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 531);
|
||||
cJSON_AddStringToObject(response, "message", "Service Unavailable");
|
||||
}
|
||||
}
|
||||
cJSON_AddNumberToObject(response, "statusCode", 430);
|
||||
cJSON_AddStringToObject(response, "message", "Invalid partner_id");
|
||||
}
|
||||
|
||||
if(destFlag == 0 || ret < 0)
|
||||
{
|
||||
resp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t));
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
resp_msg ->msg_type = msgType;
|
||||
resp_msg ->u.req.source = message->u.req.dest;
|
||||
resp_msg ->u.req.dest = message->u.req.source;
|
||||
resp_msg ->u.req.transaction_uuid=message->u.req.transaction_uuid;
|
||||
|
||||
if(response != NULL)
|
||||
destVal = ((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest :
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest));
|
||||
if( (destVal != NULL) && (ret >= 0) )
|
||||
{
|
||||
str = cJSON_PrintUnformatted(response);
|
||||
ParodusInfo("Payload Response: %s\n", str);
|
||||
strtok(destVal , "/");
|
||||
parStrncpy(dest,strtok(NULL , "/"), sizeof(dest));
|
||||
ParodusInfo("Received downstream dest as :%s and transaction_uuid :%s\n", dest,
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.transaction_uuid :
|
||||
((WRP_MSG_TYPE__EVENT == msgType) ? "NA" : message->u.crud.transaction_uuid)));
|
||||
temp = get_global_node();
|
||||
//Checking for individual clients & Sending to each client
|
||||
|
||||
resp_msg ->u.req.payload = (void *)str;
|
||||
resp_msg ->u.req.payload_size = strlen(str);
|
||||
|
||||
ParodusPrint("msgpack encode\n");
|
||||
resp_size = wrp_struct_to( resp_msg, WRP_BYTES, &resp_bytes );
|
||||
if(resp_size > 0)
|
||||
while (NULL != temp)
|
||||
{
|
||||
size = (size_t) resp_size;
|
||||
sendUpstreamMsgToServer(&resp_bytes, size);
|
||||
ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name);
|
||||
// Sending message to registered clients
|
||||
if( strcmp(dest, temp->service_name) == 0)
|
||||
{
|
||||
ParodusPrint("sending to nanomsg client %s\n", dest);
|
||||
bytes = nn_send(temp->sock, recivedMsg, msgSize, 0);
|
||||
ParodusInfo("sent downstream message to reg_client '%s'\n",temp->url);
|
||||
ParodusPrint("downstream bytes sent:%d\n", bytes);
|
||||
destFlag =1;
|
||||
break;
|
||||
}
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
|
||||
//if any unknown dest received sending error response to server
|
||||
if(destFlag ==0)
|
||||
{
|
||||
ParodusError("Unknown dest:%s\n", dest);
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 531);
|
||||
cJSON_AddStringToObject(response, "message", "Service Unavailable");
|
||||
}
|
||||
free(str);
|
||||
cJSON_Delete(response);
|
||||
free(resp_bytes);
|
||||
resp_bytes = NULL;
|
||||
}
|
||||
free(resp_msg);
|
||||
|
||||
if( (WRP_MSG_TYPE__EVENT != msgType) &&
|
||||
((destFlag == 0) || (ret < 0)) )
|
||||
{
|
||||
resp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t));
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
resp_msg ->msg_type = msgType;
|
||||
if( WRP_MSG_TYPE__REQ == msgType )
|
||||
{
|
||||
resp_msg ->u.req.source = message->u.req.dest;
|
||||
resp_msg ->u.req.dest = message->u.req.source;
|
||||
resp_msg ->u.req.transaction_uuid=message->u.req.transaction_uuid;
|
||||
}
|
||||
else
|
||||
{
|
||||
resp_msg ->u.crud.source = message->u.crud.dest;
|
||||
resp_msg ->u.crud.dest = message->u.crud.source;
|
||||
resp_msg ->u.crud.transaction_uuid = message->u.crud.transaction_uuid;
|
||||
resp_msg ->u.crud.path = message->u.crud.path;
|
||||
}
|
||||
|
||||
if(response != NULL)
|
||||
{
|
||||
str = cJSON_PrintUnformatted(response);
|
||||
ParodusInfo("Payload Response: %s\n", str);
|
||||
|
||||
if( WRP_MSG_TYPE__REQ == msgType )
|
||||
{
|
||||
resp_msg ->u.req.payload = (void *)str;
|
||||
resp_msg ->u.req.payload_size = strlen(str);
|
||||
}
|
||||
else
|
||||
{
|
||||
resp_msg ->u.crud.payload = (void *)str;
|
||||
resp_msg ->u.crud.payload_size = strlen(str);
|
||||
}
|
||||
|
||||
ParodusPrint("msgpack encode\n");
|
||||
resp_size = wrp_struct_to( resp_msg, WRP_BYTES, &resp_bytes );
|
||||
if(resp_size > 0)
|
||||
{
|
||||
size = (size_t) resp_size;
|
||||
sendUpstreamMsgToServer(&resp_bytes, size);
|
||||
}
|
||||
free(str);
|
||||
cJSON_Delete(response);
|
||||
free(resp_bytes);
|
||||
resp_bytes = NULL;
|
||||
}
|
||||
free(resp_msg);
|
||||
ParodusPrint("free for downstream decoded msg\n");
|
||||
wrp_free_struct(message);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WRP_MSG_TYPE__SVC_REGISTRATION:
|
||||
case WRP_MSG_TYPE__SVC_ALIVE:
|
||||
case WRP_MSG_TYPE__UNKNOWN:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError( "Failure in msgpack decoding for receivdMsg: rv is %d\n", rv );
|
||||
}
|
||||
ParodusPrint("free for downstream decoded msg\n");
|
||||
wrp_free_struct(message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file downstream.h
|
||||
*
|
||||
* @description This header defines functions required to manage downstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _DOWNSTREAM_H_
|
||||
|
||||
24
src/main.c
24
src/main.c
@@ -20,7 +20,11 @@
|
||||
#include "config.h"
|
||||
#include "conn_interface.h"
|
||||
#include "parodus_log.h"
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
#include "breakpad_wrapper.h"
|
||||
#else
|
||||
#include "signal.h"
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -40,13 +44,18 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig);
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( int argc, char **argv)
|
||||
{
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
breakpad_ExceptionHandler();
|
||||
#else
|
||||
signal(SIGTERM, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGUSR1, sig_handler);
|
||||
@@ -59,14 +68,17 @@ int main( int argc, char **argv)
|
||||
signal(SIGQUIT, sig_handler);
|
||||
signal(SIGHUP, sig_handler);
|
||||
signal(SIGALRM, sig_handler);
|
||||
|
||||
ParodusCfg parodusCfg;
|
||||
memset(&parodusCfg,0,sizeof(parodusCfg));
|
||||
#endif
|
||||
ParodusCfg *cfg;
|
||||
|
||||
/* TODO not ideal, but it fixes a more major problem for now. */
|
||||
cfg = get_parodus_cfg();
|
||||
memset(cfg,0,sizeof(ParodusCfg));
|
||||
|
||||
ParodusInfo("********** Starting component: Parodus **********\n ");
|
||||
parseCommandLine(argc,argv,&parodusCfg);
|
||||
parseCommandLine(argc,argv,cfg);
|
||||
|
||||
createSocketConnection(&parodusCfg,NULL);
|
||||
createSocketConnection(cfg,NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -79,6 +91,7 @@ const char *rdk_logger_module_fetch(void)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig)
|
||||
{
|
||||
|
||||
@@ -119,3 +132,4 @@ static void sig_handler(int sig)
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_handlers.c
|
||||
*
|
||||
* @description This describes nopoll handler functions.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_handlers.h
|
||||
*
|
||||
* @description This header defines nopoll handler functions.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _NOPOLL_HANDLERS_H_
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_helpers.c
|
||||
*
|
||||
* @description This file is used to manage incomming and outgoing messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_handlers.h
|
||||
*
|
||||
* @description This header defines functions to manage incomming and outgoing messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _NOPOLL_HELPERS_H_
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file parodus_log.h
|
||||
*
|
||||
* @description This header defines parodus log levels
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file partners_check.c
|
||||
*
|
||||
* @description This describes functions to validate partner_id.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
@@ -61,7 +76,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]);
|
||||
}
|
||||
(*partnerIds)->partner_ids[count] = (char *) malloc(sizeof(char) * 64);
|
||||
strcpy((*partnerIds)->partner_ids[count], partnerId);
|
||||
parStrncpy((*partnerIds)->partner_ids[count], partnerId, 64);
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",count,(*partnerIds)->partner_ids[count]);
|
||||
}
|
||||
}
|
||||
@@ -71,7 +86,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t));
|
||||
(*partnerIds)->count = 1;
|
||||
(*partnerIds)->partner_ids[0] = (char *) malloc(sizeof(char) * 64);
|
||||
strcpy((*partnerIds)->partner_ids[0], partnerId);
|
||||
parStrncpy((*partnerIds)->partner_ids[0], partnerId, 64);
|
||||
ParodusPrint("(*partnerIds)->partner_ids[0] : %s\n",(*partnerIds)->partner_ids[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file partners_check.h
|
||||
*
|
||||
* @description This describes functions to validate partner_id.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _PARTNERS_CHECK_H_
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file service_alive.c
|
||||
*
|
||||
* @description This file is used to manage keep alive section
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file service_alive.h
|
||||
*
|
||||
* @description This file is used to manage keep alive section
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _SERVICE_ALIVE_H_
|
||||
|
||||
81
src/seshat_interface.c
Normal file
81
src/seshat_interface.c
Normal file
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file seshat_interface.c
|
||||
*
|
||||
* @description This decribes interface to register seshat service.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "seshat_interface.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include "config.h"
|
||||
#include <libseshat.h>
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define SESHAT_SERVICE_NAME "Parodus"
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
bool __registerWithSeshat()
|
||||
{
|
||||
char *seshat_url = get_parodus_cfg()->seshat_url;
|
||||
char *parodus_url = get_parodus_cfg()->local_url;
|
||||
char *discover_url = NULL;
|
||||
bool rv = false;
|
||||
|
||||
if( 0 == init_lib_seshat(seshat_url) ) {
|
||||
ParodusInfo("seshatlib initialized! (url %s)\n", seshat_url);
|
||||
|
||||
if( 0 == seshat_register(SESHAT_SERVICE_NAME, parodus_url) ) {
|
||||
ParodusInfo("seshatlib registered! (url %s)\n", parodus_url);
|
||||
|
||||
discover_url = seshat_discover(SESHAT_SERVICE_NAME);
|
||||
if( (NULL != discover_url) && (0 == strcmp(parodus_url, discover_url)) ) {
|
||||
ParodusInfo("seshatlib discovered url = %s\n", discover_url);
|
||||
rv = true;
|
||||
} else {
|
||||
ParodusError("seshatlib registration error (url %s)!", discover_url);
|
||||
}
|
||||
free(discover_url);
|
||||
} else {
|
||||
ParodusError("seshatlib not registered! (url %s)\n", parodus_url);
|
||||
}
|
||||
} else {
|
||||
ParodusPrint("seshatlib not initialized! (url %s)\n", seshat_url);
|
||||
}
|
||||
|
||||
shutdown_seshat_lib();
|
||||
return rv;
|
||||
}
|
||||
54
src/seshat_interface.h
Normal file
54
src/seshat_interface.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file seshat_interface.h
|
||||
*
|
||||
* @description This header defines interface to register seshat service.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _SESHAT_INTERFACE_H_
|
||||
#define _SESHAT_INTERFACE_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Helper function to register with seshat.
|
||||
*
|
||||
* @note return whether successfully registered.
|
||||
*
|
||||
* @return true when registered, false otherwise.
|
||||
*/
|
||||
bool __registerWithSeshat();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
53
src/seshat_interface_stub.c
Normal file
53
src/seshat_interface_stub.c
Normal file
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file seshat_interface_stub.c
|
||||
*
|
||||
* @description This decribes interface to register seshat service
|
||||
*
|
||||
*/
|
||||
|
||||
#include "seshat_interface.h"
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
bool __registerWithSeshat()
|
||||
{
|
||||
ParodusInfo("libseshat disabled, Hence proceeding without registration\n");
|
||||
return true;
|
||||
}
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file spin_thread.c
|
||||
*
|
||||
* @description This file is used to define thread function
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file spin_thread.h
|
||||
*
|
||||
* @description This file is used to define thread function
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _SPIN_THREAD_H_
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file thread_tasks.h
|
||||
*
|
||||
* @description This header defines thread functions.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _THREAD_TASKS_H_
|
||||
|
||||
542
src/token.c
Normal file
542
src/token.c
Normal file
@@ -0,0 +1,542 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file token.c
|
||||
*
|
||||
* @description This file contains operations for using jwt token.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#ifdef __UCLIBC__
|
||||
#include <ucresolv/ucresolv.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#include <resolv.h>
|
||||
//#include <res_update.h>
|
||||
#include <netdb.h>
|
||||
#include <strings.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <cjwt/cjwt.h>
|
||||
#include "token.h"
|
||||
#include "config.h"
|
||||
#include "parodus_log.h"
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
#define JWT_MAXBUF 8192
|
||||
|
||||
#ifdef NS_MAXMSG
|
||||
#if NS_MAXMSG > JWT_MAXBUF
|
||||
#define NS_MAXBUF JWT_MAXBUF
|
||||
#else
|
||||
#define NS_MAXBUF NS_MAXMSG
|
||||
#endif
|
||||
#else
|
||||
#define NS_MAXBUF JWT_MAXBUF
|
||||
#endif
|
||||
|
||||
#define TXT_REC_ID_MAXSIZE 128
|
||||
|
||||
#define MAX_RR_RECS 10
|
||||
#define SEQ_TABLE_SIZE (MAX_RR_RECS + 1)
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define ENDPOINT_NAME "endpoint"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
static void show_times (time_t exp_time, time_t cur_time)
|
||||
{
|
||||
char exp_buf[30];
|
||||
char cur_buf[30];
|
||||
ctime_r (&exp_time, exp_buf);
|
||||
exp_buf[strlen(exp_buf)-1] = 0;
|
||||
ctime_r (&cur_time, cur_buf);
|
||||
cur_buf[strlen(cur_buf)-1] = 0;
|
||||
ParodusInfo ("Exp: %d %s, Current: %d %s\n",
|
||||
(int)exp_time, exp_buf+4, (int)cur_time, cur_buf+4);
|
||||
}
|
||||
|
||||
// returns 1 if insecure, 0 if secure, < 0 if error
|
||||
int analyze_jwt (const cjwt_t *jwt)
|
||||
{
|
||||
cJSON *claims = jwt->private_claims;
|
||||
cJSON *endpoint = NULL;
|
||||
time_t exp_time, cur_time;
|
||||
int http_match;
|
||||
|
||||
if (!claims) {
|
||||
ParodusError ("Private claims not found in jwt\n");
|
||||
return TOKEN_ERR_INVALID_JWT_CONTENT;
|
||||
}
|
||||
|
||||
endpoint = cJSON_GetObjectItem(claims, ENDPOINT_NAME);
|
||||
if (!endpoint) {
|
||||
ParodusError ("Endpoint claim not found in jwt\n");
|
||||
return TOKEN_ERR_INVALID_JWT_CONTENT;
|
||||
}
|
||||
|
||||
http_match = strncmp(endpoint->valuestring,"http:",5);
|
||||
ParodusInfo ("is_http strncmp: %d\n", http_match);
|
||||
exp_time = jwt->exp.tv_sec;
|
||||
if (0 == exp_time) {
|
||||
ParodusError ("exp not found in JWT payload\n");
|
||||
} else {
|
||||
cur_time = time(NULL);
|
||||
show_times (exp_time, cur_time);
|
||||
if (exp_time < cur_time) {
|
||||
ParodusError ("JWT has expired\n");
|
||||
return TOKEN_ERR_JWT_EXPIRED;
|
||||
}
|
||||
}
|
||||
|
||||
return (http_match == 0);
|
||||
}
|
||||
|
||||
const char *get_tok (const char *src, int delim, char *result, int resultsize)
|
||||
{
|
||||
int i;
|
||||
char c;
|
||||
int endx = resultsize-1;
|
||||
|
||||
memset (result, 0, resultsize);
|
||||
for (i=0; (c=src[i]) != 0; i++) {
|
||||
if (c == delim)
|
||||
break;
|
||||
if (i < endx)
|
||||
result[i] = c;
|
||||
}
|
||||
if (c == 0)
|
||||
return NULL;
|
||||
return src + i + 1;
|
||||
}
|
||||
|
||||
// the algorithm mask indicates which algorithms are allowed
|
||||
unsigned int get_algo_mask (const char *algo_str)
|
||||
{
|
||||
unsigned int mask = 0;
|
||||
#define BUFLEN 16
|
||||
char tok[BUFLEN];
|
||||
int alg_val;
|
||||
|
||||
while(NULL != algo_str)
|
||||
{
|
||||
algo_str = get_tok (algo_str, ':', tok, BUFLEN);
|
||||
alg_val = cjwt_alg_str_to_enum (tok);
|
||||
if ((alg_val < 0) || (alg_val >= num_algorithms))
|
||||
{
|
||||
ParodusError("Invalid jwt algorithm %s\n", tok);
|
||||
abort ();
|
||||
}
|
||||
mask |= (1<<alg_val);
|
||||
}
|
||||
return mask;
|
||||
#undef BUFLEN
|
||||
}
|
||||
|
||||
bool validate_algo(const cjwt_t *jwt)
|
||||
{
|
||||
// return true if jwt->header.alg is included in the set
|
||||
// of allowed algorithms specified by cfg->jwt_algo
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
int alg = jwt->header.alg;
|
||||
int alg_mask;
|
||||
|
||||
if ((alg < 0) || (alg >= num_algorithms))
|
||||
return false;
|
||||
alg_mask = 1<<alg;
|
||||
if ((alg_mask & get_algo_mask(cfg->jwt_algo)) == 0) {
|
||||
ParodusError ("Algorithm %d not allowed (mask %d)\n", alg, alg_mask);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
int nquery(const char* dns_txt_record_id,u_char *nsbuf)
|
||||
{
|
||||
|
||||
int len;
|
||||
struct __res_state statp;
|
||||
|
||||
/* Initialize resolver */
|
||||
memset (&statp, 0, sizeof(__res_state));
|
||||
statp.options |= RES_DEBUG;
|
||||
if (res_ninit(&statp) < 0) {
|
||||
ParodusError ("res_ninit error: can't initialize statp.\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
ParodusInfo ("Domain : %s\n", dns_txt_record_id);
|
||||
memset (nsbuf, 0, NS_MAXBUF);
|
||||
len = res_nquery(&statp, dns_txt_record_id, ns_c_any, ns_t_txt, nsbuf, NS_MAXBUF);
|
||||
if (len < 0) {
|
||||
if (0 != statp.res_h_errno) {
|
||||
const char *msg = hstrerror (statp.res_h_errno);
|
||||
ParodusError ("Error in res_nquery: %s\n", msg);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
res_nclose (&statp);
|
||||
if (len >= NS_MAXBUF) {
|
||||
ParodusError ("res_nquery error: ns buffer too small.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return len;
|
||||
|
||||
}
|
||||
|
||||
bool valid_b64_char (char c)
|
||||
{
|
||||
if ((c>='A') && (c<='Z'))
|
||||
return true;
|
||||
if ((c>='a') && (c<='z'))
|
||||
return true;
|
||||
if ((c>='0') && (c<='9'))
|
||||
return true;
|
||||
if ((c=='/') || (c=='+') || (c=='-') || (c=='_'))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_digit (char c)
|
||||
{
|
||||
return (bool) ((c>='0') && (c<='9'));
|
||||
}
|
||||
|
||||
// strip quotes and newlines from rr rec
|
||||
const char *strip_rr_data (const char *rr_ptr, int *rrlen)
|
||||
{
|
||||
int len;
|
||||
const char *optr = rr_ptr;
|
||||
char c;
|
||||
|
||||
len = strlen (optr);
|
||||
if (len > 0) {
|
||||
c = optr[0];
|
||||
if (!is_digit(c)) {
|
||||
optr++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
if (len > 0) {
|
||||
if (!valid_b64_char (optr[len-1]))
|
||||
len--;
|
||||
}
|
||||
if (len > 0) {
|
||||
if (!valid_b64_char (optr[len-1]))
|
||||
len--;
|
||||
}
|
||||
*rrlen = len;
|
||||
return optr;
|
||||
}
|
||||
|
||||
// return offset to seq number in record
|
||||
// return -1 if not found, -2 if invalid fmt
|
||||
int find_seq_num (const char *rr_ptr, int rrlen)
|
||||
{
|
||||
char c;
|
||||
int i;
|
||||
int digit_ct = 0;
|
||||
|
||||
for (i=0; i<rrlen; i++)
|
||||
{
|
||||
c = rr_ptr[i];
|
||||
if (c == ':') {
|
||||
if (digit_ct >= 2)
|
||||
return i - 2;
|
||||
else
|
||||
return -2;
|
||||
}
|
||||
if (is_digit (c))
|
||||
digit_ct++;
|
||||
else
|
||||
digit_ct = 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// get seq num in rr rec
|
||||
// return -1 if not formatted correctly
|
||||
int get_rr_seq_num (const char *rr_ptr, int rrlen)
|
||||
{
|
||||
char c;
|
||||
int lo, hi;
|
||||
if (rrlen < 3)
|
||||
return -1;
|
||||
if (rr_ptr[2] != ':')
|
||||
return -1;
|
||||
c = rr_ptr[0];
|
||||
if (is_digit (c))
|
||||
hi = c - '0';
|
||||
else
|
||||
return -1;
|
||||
c = rr_ptr[1];
|
||||
if (is_digit (c))
|
||||
lo = c - '0';
|
||||
else
|
||||
return -1;
|
||||
return (10*hi) + lo;
|
||||
}
|
||||
|
||||
// scan rr recs and build seq table using seq numbers in the recs
|
||||
// return num_txt_recs
|
||||
int get_rr_seq_table (ns_msg *msg_handle, int num_rr_recs, rr_rec_t *seq_table)
|
||||
{
|
||||
ns_rr rr;
|
||||
const char *rr_ptr;
|
||||
int seq_pos;
|
||||
int rrlen;
|
||||
int i, ret, seq_num;
|
||||
int num_txt_recs = 0;
|
||||
|
||||
if (num_rr_recs > MAX_RR_RECS) {
|
||||
ParodusError ("num rr recs (%d) to big, > %d\n", num_rr_recs, MAX_RR_RECS);
|
||||
return -1;
|
||||
}
|
||||
// clear seq table
|
||||
for (i=0; i<SEQ_TABLE_SIZE; i++)
|
||||
{
|
||||
seq_table[i].rr_ptr = NULL;
|
||||
seq_table[i].rr_len = 0;
|
||||
}
|
||||
|
||||
// extract and concatenate all the records in rr
|
||||
for (i=0; i<num_rr_recs; i++) {
|
||||
ret = ns_parserr(msg_handle, ns_s_an, i, &rr);
|
||||
if (ret != 0) {
|
||||
ParodusError ("query_dns: ns_parserr failed: %s\n", strerror (errno));
|
||||
return ret;
|
||||
}
|
||||
if (ns_rr_type(rr) != ns_t_txt)
|
||||
continue;
|
||||
++num_txt_recs;
|
||||
rr_ptr = (const char *)ns_rr_rdata(rr);
|
||||
ParodusPrint ("Found rr rec type %d: %s\n", ns_t_txt, rr_ptr);
|
||||
rr_ptr = strip_rr_data (rr_ptr, &rrlen);
|
||||
seq_pos = find_seq_num (rr_ptr, rrlen);
|
||||
if (seq_pos == -2) {
|
||||
ParodusError ("Invalid seq number in rr record %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
if (seq_pos < 0) {
|
||||
seq_num = 0;
|
||||
} else {
|
||||
rr_ptr += seq_pos;
|
||||
rrlen -= seq_pos;
|
||||
seq_num = get_rr_seq_num (rr_ptr, rrlen);
|
||||
}
|
||||
ParodusPrint ("Found seq num %d in rr rec %d\n", seq_num, i);
|
||||
|
||||
if (seq_num < 0) {
|
||||
ParodusError ("Seq number not found in rr record %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
if (seq_num > num_rr_recs) {
|
||||
ParodusError ("Invalid seq number (too big) in rr record %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
if (NULL != seq_table[seq_num].rr_ptr) {
|
||||
ParodusError ("Duplicate rr record number %d\n", seq_num);
|
||||
return -1;
|
||||
}
|
||||
if (seq_num != 0) {
|
||||
rr_ptr += 3; // skip the seq number
|
||||
rrlen -= 3;
|
||||
}
|
||||
seq_table[seq_num].rr_ptr = rr_ptr;
|
||||
seq_table[seq_num].rr_len = rrlen;
|
||||
}
|
||||
|
||||
if (NULL != seq_table[0].rr_ptr) {
|
||||
// sequence-less record should not be used when there
|
||||
// are multiple records
|
||||
if (num_txt_recs > 1) {
|
||||
ParodusError ("Seq number not found in rr record\n");
|
||||
return -1;
|
||||
}
|
||||
// when there is only one record, use the sequence-less record
|
||||
seq_table[1].rr_ptr = seq_table[0].rr_ptr;
|
||||
seq_table[1].rr_len = seq_table[0].rr_len;
|
||||
}
|
||||
|
||||
// check if we got them all
|
||||
for (i=1; i<num_txt_recs; i++) {
|
||||
if (NULL == seq_table[i].rr_ptr) {
|
||||
ParodusError ("Missing rr record number %d\n", i+1);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return num_txt_recs;
|
||||
}
|
||||
|
||||
int assemble_jwt_from_dns (ns_msg *msg_handle, int num_rr_recs, char *jwt_ans)
|
||||
{
|
||||
// slot 0 in the seq table is for the sequence-less record that
|
||||
// you get when there is only one record.
|
||||
rr_rec_t seq_table[SEQ_TABLE_SIZE];
|
||||
int i;
|
||||
int num_txt_recs = get_rr_seq_table (msg_handle, num_rr_recs, seq_table);
|
||||
|
||||
if (num_txt_recs < 0)
|
||||
return num_txt_recs;
|
||||
ParodusPrint ("Found %d TXT records\n", num_txt_recs);
|
||||
jwt_ans[0] = 0;
|
||||
for (i=1; i<=num_txt_recs; i++)
|
||||
strncat (jwt_ans, seq_table[i].rr_ptr, seq_table[i].rr_len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int query_dns(const char* dns_txt_record_id,char *jwt_ans)
|
||||
{
|
||||
u_char *nsbuf;
|
||||
ns_msg msg_handle;
|
||||
int ret;
|
||||
int l = -1;
|
||||
|
||||
if( !dns_txt_record_id || !jwt_ans )
|
||||
return l;
|
||||
|
||||
nsbuf = malloc (NS_MAXBUF);
|
||||
if (NULL == nsbuf) {
|
||||
ParodusError ("Unable to allocate nsbuf in query_dns\n");
|
||||
return TOKEN_ERR_MEMORY_FAIL;
|
||||
}
|
||||
l = nquery(dns_txt_record_id,nsbuf);
|
||||
if (l < 0) {
|
||||
free (nsbuf);
|
||||
return l;
|
||||
}
|
||||
|
||||
ParodusInfo ("initparse\n");
|
||||
ret = ns_initparse(nsbuf, l, &msg_handle);
|
||||
if (ret != 0) {
|
||||
ParodusError ("ns_initparse failed\n");
|
||||
free (nsbuf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
l = ns_msg_count(msg_handle, ns_s_an);
|
||||
ParodusInfo ("query_dns: ns_msg_count : %d\n",l);
|
||||
jwt_ans[0] = 0;
|
||||
|
||||
ret = assemble_jwt_from_dns (&msg_handle, l, jwt_ans);
|
||||
free (nsbuf);
|
||||
if (ret == 0)
|
||||
ParodusInfo ("query_dns JWT: %s\n", jwt_ans);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void get_dns_txt_record_id (char *buf)
|
||||
{
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
buf[0] = 0;
|
||||
|
||||
sprintf (buf, "%s.%s.webpa.comcast.net", cfg->hw_mac, cfg->dns_id);
|
||||
ParodusInfo("dns_txt_record_id %s\n", buf);
|
||||
}
|
||||
|
||||
int allow_insecure_conn(void)
|
||||
{
|
||||
int insecure=0, ret = -1;
|
||||
char *jwt_token, *key;
|
||||
cjwt_t *jwt = NULL;
|
||||
char dns_txt_record_id[TXT_REC_ID_MAXSIZE];
|
||||
|
||||
jwt_token = malloc (NS_MAXBUF);
|
||||
if (NULL == jwt_token) {
|
||||
ParodusError ("Unable to allocate jwt_token in allow_insecure_conn\n");
|
||||
insecure = TOKEN_ERR_MEMORY_FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
get_dns_txt_record_id (dns_txt_record_id);
|
||||
|
||||
//Querying dns for jwt token
|
||||
ret = query_dns(dns_txt_record_id, jwt_token);
|
||||
if(ret){
|
||||
if (ret == TOKEN_ERR_MEMORY_FAIL) {
|
||||
insecure = ret;
|
||||
} else {
|
||||
insecure = TOKEN_ERR_QUERY_DNS_FAIL;
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
|
||||
//Decoding the jwt token
|
||||
key = get_parodus_cfg()->jwt_key;
|
||||
ret = cjwt_decode( jwt_token, 0, &jwt, ( const uint8_t * )key,strlen(key) );
|
||||
|
||||
if(ret) {
|
||||
if (ret == ENOMEM) {
|
||||
ParodusError ("Memory allocation failed in JWT decode\n");
|
||||
} else {
|
||||
ParodusError ("CJWT decode error\n");
|
||||
}
|
||||
insecure = TOKEN_ERR_JWT_DECODE_FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
ParodusPrint("Decoded CJWT successfully\n");
|
||||
|
||||
//validate algo from --jwt_algo
|
||||
if( validate_algo(jwt) ) {
|
||||
insecure = analyze_jwt (jwt);
|
||||
} else {
|
||||
insecure = TOKEN_ERR_ALGO_NOT_ALLOWED;
|
||||
}
|
||||
|
||||
cjwt_destroy(&jwt);
|
||||
|
||||
end:
|
||||
if (NULL != jwt_token)
|
||||
free (jwt_token);
|
||||
ParodusPrint ("Allow Insecure %d\n", insecure);
|
||||
return insecure;
|
||||
}
|
||||
52
src/token.h
Normal file
52
src/token.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file token.h
|
||||
*
|
||||
* @description This file contains apis and error codes for using jwt token.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _TOKEN_H_
|
||||
#define _TOKEN_H_
|
||||
|
||||
/**
|
||||
* @brief token error rtn codes
|
||||
*
|
||||
*/
|
||||
typedef enum {
|
||||
TOKEN_ERR_MEMORY_FAIL = -999,
|
||||
TOKEN_ERR_QUERY_DNS_FAIL = -101,
|
||||
TOKEN_ERR_JWT_DECODE_FAIL = -102,
|
||||
TOKEN_ERR_ALGO_NOT_ALLOWED = -103,
|
||||
TOKEN_ERR_INVALID_JWT_CONTENT = -104,
|
||||
TOKEN_ERR_JWT_EXPIRED = -105
|
||||
|
||||
} token_error_t;
|
||||
|
||||
|
||||
/**
|
||||
* query the dns server, obtain a jwt, determine if insecure
|
||||
* connections can be allowed.
|
||||
*
|
||||
* @return 1 if insecure connection is allowed, 0 if not,
|
||||
* or one of the error codes given above.
|
||||
*/
|
||||
int allow_insecure_conn(void);
|
||||
|
||||
|
||||
#endif
|
||||
52
src/token_stub.c
Normal file
52
src/token_stub.c
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file token_stub.c
|
||||
*
|
||||
* @description This file contains operations for using jwt token.
|
||||
*
|
||||
*/
|
||||
#include "token.h"
|
||||
#include "parodus_log.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int allow_insecure_conn(void)
|
||||
{
|
||||
ParodusInfo("CJWT is disabled, Hence proceeding without validation\n");
|
||||
return 1;
|
||||
}
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file upstream.c
|
||||
*
|
||||
* @description This describes functions required to manage upstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
@@ -106,7 +121,7 @@ void *handle_upstream()
|
||||
buf = NULL;
|
||||
ParodusInfo("nanomsg server gone into the listening mode...\n");
|
||||
bytes = nn_recv (sock, &buf, NN_MSG, 0);
|
||||
ParodusInfo ("Upstream message received from nanomsg client: \"%s\"\n", (char*)buf);
|
||||
ParodusInfo ("Upstream message received from nanomsg client\n");
|
||||
message = (UpStreamMsg *)malloc(sizeof(UpStreamMsg));
|
||||
|
||||
if(message)
|
||||
@@ -196,7 +211,7 @@ void *processUpstreamMessage()
|
||||
if(strcmp(temp->service_name, msg->u.reg.service_name)==0)
|
||||
{
|
||||
ParodusInfo("match found, client is already registered\n");
|
||||
strncpy(temp->url,msg->u.reg.url, strlen(msg->u.reg.url)+1);
|
||||
parStrncpy(temp->url,msg->u.reg.url, sizeof(temp->url));
|
||||
if(nn_shutdown(temp->sock, 0) < 0)
|
||||
{
|
||||
ParodusError ("Failed to shutdown\n");
|
||||
@@ -252,7 +267,7 @@ void *processUpstreamMessage()
|
||||
}
|
||||
else if(msgType == WRP_MSG_TYPE__EVENT)
|
||||
{
|
||||
ParodusInfo(" Received upstream event data\n");
|
||||
ParodusInfo(" Received upstream event data: dest '%s'\n", msg->u.event.dest);
|
||||
partners_t *partnersList = NULL;
|
||||
|
||||
int ret = validate_partner_id(msg, &partnersList);
|
||||
@@ -286,7 +301,7 @@ void *processUpstreamMessage()
|
||||
else
|
||||
{
|
||||
//Sending to server for msgTypes 3, 5, 6, 7, 8.
|
||||
ParodusInfo(" Received upstream data with MsgType: %d\n", msgType);
|
||||
ParodusInfo(" Received upstream data with MsgType: %d dest: '%s' transaction_uuid: %s\n", msgType, msg->u.req.dest, msg->u.req.transaction_uuid );
|
||||
//Appending metadata with packed msg received from client
|
||||
if(metaPackSize > 0)
|
||||
{
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file upstream.h
|
||||
*
|
||||
* @description This header defines functions required to manage upstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _UPSTREAM_H_
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2016 Comcast Cable Communications Management, LLC
|
||||
# Copyright 2016 Comcast Cable Communications Management, LLCD
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -17,7 +17,15 @@ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST ")
|
||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -W -g -fprofile-arcs -ftest-coverage -O0")
|
||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -O0")
|
||||
set (PARODUS_COMMON_SRC ../src/string_helpers.c ../src/mutex.c ../src/time.c ../src/config.c ../src/spin_thread.c)
|
||||
set (PARODUS_COMMON_LIBS gcov -lcunit -lcimplog -llibseshat -lwrp-c -luuid -lpthread -lm -lmsgpackc -lcjson -ltrower-base64 -lnopoll -lnanomsg -Wl,--no-as-needed -lrt)
|
||||
set (PARODUS_COMMON_LIBS gcov -lcunit -lcimplog -lwrp-c -luuid -lpthread -lmsgpackc -lnopoll -lnanomsg -Wl,--no-as-needed -lcjson -ltrower-base64 -lssl -lcrypto -lrt -lm)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set (PARODUS_COMMON_LIBS -llibseshat ${PARODUS_COMMON_LIBS})
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lcjwt -lresolv)
|
||||
endif (ENABLE_CJWT)
|
||||
|
||||
if(NOT DISABLE_VALGRIND)
|
||||
set (MEMORY_CHECK valgrind --leak-check=full --show-reachable=yes -v)
|
||||
@@ -49,13 +57,12 @@ target_link_libraries (test_nopoll_helpers -Wl,--no-as-needed -lrt -lcmocka -lci
|
||||
#-------------------------------------------------------------------------------
|
||||
# libpd_test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_executable (libpd_test libpd_test.c)
|
||||
add_executable (libpd_test libpd_test.c ../src/string_helpers.c)
|
||||
|
||||
target_link_libraries (libpd_test
|
||||
cunit
|
||||
-llibparodus
|
||||
-lwrp-c
|
||||
-llibseshat
|
||||
-luuid
|
||||
-lmsgpackc
|
||||
-ltrower-base64
|
||||
@@ -64,7 +71,9 @@ target_link_libraries (libpd_test
|
||||
-lm
|
||||
-lpthread
|
||||
-lrt)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
target_link_libraries (libpd_test -llibseshat)
|
||||
endif (ENABLE_SESHAT)
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_time
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -104,42 +113,88 @@ target_link_libraries (test_nopoll_handlers -lnopoll -lcunit -lcimplog -Wl,--no-
|
||||
# test_connection
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_connection COMMAND ${MEMORY_CHECK} ./test_connection)
|
||||
add_executable(test_connection test_connection.c ../src/connection.c ${PARODUS_COMMON_SRC})
|
||||
target_link_libraries (test_connection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
#add_executable(test_connection test_connection.c ../src/connection.c ${PARODUS_COMMON_SRC})
|
||||
#target_link_libraries (test_connection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
set(SOURCES test_connection.c ../src/connection.c ${PARODUS_COMMON_SRC})
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} ../src/token.c)
|
||||
else ()
|
||||
set(SOURCES ${SOURCES} ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_connection ${SOURCES})
|
||||
target_link_libraries (test_connection ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_connection - function createNopollConnection
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_createConnection COMMAND ${MEMORY_CHECK} ./test_createConnection)
|
||||
#add_executable(test_createConnection test_createConnection.c ../src/connection.c ../src/string_helpers.c ../src/config.c)
|
||||
#target_link_libraries (test_createConnection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
add_executable(test_createConnection test_createConnection.c ../src/connection.c ../src/string_helpers.c ../src/config.c)
|
||||
target_link_libraries (test_createConnection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
target_link_libraries (test_createConnection ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} -lcmocka )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_client_list
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_client_list COMMAND ${MEMORY_CHECK} ./test_client_list)
|
||||
add_executable(test_client_list test_client_list.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/downstream.c ../src/connection.c ../src/nopoll_handlers.c ../src/ParodusInternal.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
target_link_libraries (test_client_list ${PARODUS_COMMON_LIBS})
|
||||
#add_executable(test_client_list test_client_list.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/downstream.c ../src/connection.c ../src/nopoll_handlers.c ../src/ParodusInternal.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
#target_link_libraries (test_client_list ${PARODUS_COMMON_LIBS})
|
||||
set(SOURCES test_client_list.c ../src/client_list.c
|
||||
../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c
|
||||
../src/downstream.c ../src/connection.c ../src/nopoll_handlers.c
|
||||
../src/ParodusInternal.c ../src/thread_tasks.c ../src/conn_interface.c
|
||||
../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} ../src/token.c)
|
||||
else ()
|
||||
set(SOURCES ${SOURCES} ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_client_list ${SOURCES})
|
||||
target_link_libraries (test_client_list ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_service_alive
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_service_alive COMMAND ${MEMORY_CHECK} ./test_service_alive)
|
||||
add_executable(test_service_alive test_service_alive.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/downstream.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS})
|
||||
#add_executable(test_service_alive test_service_alive.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/downstream.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
#target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS})
|
||||
set(SOURCES test_service_alive.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/downstream.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} ../src/token.c)
|
||||
else ()
|
||||
set(SOURCES ${SOURCES} ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_service_alive ${SOURCES})
|
||||
target_link_libraries (test_service_alive ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_config
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_config COMMAND ${MEMORY_CHECK} ./test_config)
|
||||
add_executable(test_config test_config.c ../src/config.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_config -lcmocka -lm -Wl,--no-as-needed -lrt -lcimplog)
|
||||
target_link_libraries (test_config -lcmocka
|
||||
-Wl,--no-as-needed -lcimplog
|
||||
-lcjson -ltrower-base64 -lssl -lcrypto -lrt -lm
|
||||
)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_upstream
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_upstream COMMAND ${MEMORY_CHECK} ./test_upstream)
|
||||
add_executable(test_upstream test_upstream.c ../src/upstream.c)
|
||||
add_executable(test_upstream test_upstream.c ../src/upstream.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_upstream -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -149,6 +204,13 @@ add_test(NAME test_downstream COMMAND ${MEMORY_CHECK} ./test_downstream)
|
||||
add_executable(test_downstream test_downstream.c ../src/downstream.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_downstream -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_downstream_more
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_downstream_more COMMAND ${MEMORY_CHECK} ./test_downstream_more)
|
||||
add_executable(test_downstream_more test_downstream_more.c ../src/downstream.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_downstream_more -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_thread_tasks
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -160,7 +222,13 @@ target_link_libraries (test_thread_tasks -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
# test_conn_interface
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_conn_interface COMMAND ${MEMORY_CHECK} ./test_conn_interface)
|
||||
add_executable(test_conn_interface test_conn_interface.c ../src/conn_interface.c ../src/config.c ../src/string_helpers.c ../src/mutex.c)
|
||||
set(SOURCES test_conn_interface.c ../src/conn_interface.c ../src/config.c ../src/string_helpers.c ../src/mutex.c)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(test_conn_interface ${SOURCES})
|
||||
target_link_libraries (test_conn_interface -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -174,27 +242,60 @@ target_link_libraries (test_ParodusInternal -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
# test_partners_check
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_partners_check COMMAND ${MEMORY_CHECK} ./test_partners_check)
|
||||
add_executable(test_partners_check test_partners_check.c ../src/partners_check.c)
|
||||
target_link_libraries (test_partners_check -lcmocka -lwrp-c -llibseshat ${PARODUS_COMMON_LIBS})
|
||||
add_executable(test_partners_check test_partners_check.c ../src/partners_check.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_partners_check -lcmocka ${PARODUS_COMMON_LIBS} -lwrp-c)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_token - token.c tests
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_token COMMAND ${MEMORY_CHECK} ./test_token)
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES test_token.c ../src/token.c ../src/string_helpers.c ../src/config.c)
|
||||
else()
|
||||
set(SOURCES test_token_stub.c ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_token ${SOURCES} )
|
||||
target_link_libraries (test_token ${PARODUS_COMMON_LIBS} ${PARODUS_JWT_LIBS} -lcmocka )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_seshat_interface - registerWithSeshat
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_seshat_interface COMMAND ${MEMORY_CHECK} ./test_seshat_interface)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES test_seshat_interface.c ../src/seshat_interface.c ../src/string_helpers.c)
|
||||
else()
|
||||
set(SOURCES test_seshat_interface_stub.c ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(test_seshat_interface ${SOURCES})
|
||||
target_link_libraries (test_seshat_interface -lcmocka ${PARODUS_COMMON_LIBS} -lwrp-c)
|
||||
|
||||
if (INTEGRATION_TESTING)
|
||||
#-------------------------------------------------------------------------------
|
||||
# simple_connection test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME simple_connection COMMAND ${MEMORY_CHECK} ./simple_connection)
|
||||
add_executable(simple_connection simple_connection.c ${PARODUS_COMMON_SRC}
|
||||
../src/upstream.c
|
||||
../src/conn_interface.c
|
||||
../src/thread_tasks.c
|
||||
../src/downstream.c
|
||||
../src/networking.c
|
||||
../src/nopoll_helpers.c
|
||||
../src/nopoll_handlers.c
|
||||
../src/connection.c
|
||||
../src/ParodusInternal.c
|
||||
../src/client_list.c
|
||||
../src/partners_check.c
|
||||
../src/service_alive.c)
|
||||
target_link_libraries (simple_connection ${PARODUS_COMMON_LIBS})
|
||||
set(SOURCES simple_connection.c ${PARODUS_COMMON_SRC} ../src/upstream.c ../src/conn_interface.c
|
||||
../src/thread_tasks.c ../src/downstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/connection.c ../src/ParodusInternal.c ../src/client_list.c ../src/partners_check.c ../src/service_alive.c)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(simple_connection ${SOURCES})
|
||||
target_link_libraries (simple_connection ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# simple test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME simple COMMAND ${MEMORY_CHECK} ./simple)
|
||||
set(SOURCES simple.c ../src/upstream.c ../src/conn_interface.c ../src/downstream.c ../src/thread_tasks.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/string_helpers.c ../src/mutex.c ../src/time.c
|
||||
../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/spin_thread.c ../src/client_list.c ../src/partners_check.c ../src/service_alive.c)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(simple ${SOURCES})
|
||||
|
||||
target_link_libraries (simple ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} gcov -lnopoll -lnanomsg )
|
||||
endif (INTEGRATION_TESTING)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <libparodus.h>
|
||||
#include <pthread.h>
|
||||
#include "../src/ParodusInternal.h"
|
||||
|
||||
#define SEND_EVENT_MSGS 1
|
||||
|
||||
@@ -127,7 +128,7 @@ char *new_str (const char *str)
|
||||
char *buf = malloc (strlen(str) + 1);
|
||||
if (NULL == buf)
|
||||
return NULL;
|
||||
strcpy (buf, str);
|
||||
parStrncpy(buf, str, (strlen(str)+1));
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
3
tests/parodus_cmd.sh
Executable file
3
tests/parodus_cmd.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
./parodus --hw-model=TG1682 --hw-serial-number=Fer23u948590 --hw-manufacturer=ARRISGroup,Inc. --hw-mac=aabbccddeeff --hw-last-reboot-reason=unknown --fw-name=TG1682_DEV_master_2016000000sdy --boot-time=123589 --webpa-ping-time=180 --webpa-backoff-max=0 --webpa-inteface-used=p7p1 --webpa-url=fabric-beta.webpa.comcast.net --jwt-algo=none:RS256 --jwt-key=../../tests/webpa-rs256.pem --dns-id=test
|
||||
|
||||
|
||||
@@ -66,17 +66,17 @@ void test_set_parodus_cfg()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/api/v2/device");
|
||||
strcpy(cfg.webpa_url , "fabric-cd.webpa.comcast.net");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/api/v2/device", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "fabric-cd.webpa.comcast.net", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
cfg.secureFlag = 1;
|
||||
cfg.boot_time = 423457;
|
||||
cfg.webpa_ping_timeout = 30;
|
||||
|
||||
@@ -39,7 +39,7 @@ bool LastReasonStatus;
|
||||
nopoll_bool nopoll_base64_encode(const char *content,int length,char *output, int *output_size)
|
||||
{
|
||||
UNUSED(content); UNUSED(length); UNUSED(output_size);
|
||||
strcpy(output, "AWYFUJHUDUDKJDDRDKUIIKORE\nSFJLIRRSHLOUTDESTDJJITTESLOIUHJGDRS\nGIUY&%WSJ");
|
||||
parStrncpy(output, "AWYFUJHUDUDKJDDRDKUIIKORE\nSFJLIRRSHLOUTDESTDJJITTESLOIUHJGDRS\nGIUY&%WSJ", (size_t) *output_size);
|
||||
function_called();
|
||||
return (nopoll_bool)(intptr_t)mock();
|
||||
}
|
||||
@@ -56,19 +56,19 @@ char *get_global_reconnect_reason()
|
||||
void test_getWebpaConveyHeader()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/api/v2/device");
|
||||
strcpy(cfg.webpa_url , "localhost");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
cfg.secureFlag = 1;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/api/v2/device", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "localhost", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
cfg.flags = FLAGS_SECURE;
|
||||
cfg.boot_time = 423457;
|
||||
cfg.webpa_ping_timeout = 30;
|
||||
cfg.webpa_backoff_max = 255;
|
||||
|
||||
@@ -87,13 +87,23 @@ static void *client_rcv_task()
|
||||
int byte =0;
|
||||
int rv1=0;
|
||||
int t=25000;
|
||||
int rc = -1;
|
||||
int bind;
|
||||
wrp_msg_t *msg1;
|
||||
|
||||
int sock1 = nn_socket (AF_SP, NN_PULL);
|
||||
nn_bind(sock1, TEST_CLIENT1_URL);
|
||||
bind = nn_bind(sock1, TEST_CLIENT1_URL);
|
||||
if(bind < 0)
|
||||
{
|
||||
ParodusError("Unable to bind socket (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
void *buf = NULL;
|
||||
nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
rc = nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
ParodusPrint("Client 1 waiting for acknowledgement \n");
|
||||
byte = nn_recv(sock1, &buf, NN_MSG, 0);
|
||||
@@ -119,13 +129,23 @@ static void *client2_rcv_task()
|
||||
int byte =0;
|
||||
int rv1=0;
|
||||
int t=25000;
|
||||
int rc = -1;
|
||||
int bind;
|
||||
wrp_msg_t *msg1;
|
||||
|
||||
int sock1 = nn_socket (AF_SP, NN_PULL);
|
||||
nn_bind(sock1, TEST_CLIENT2_URL);
|
||||
bind = nn_bind(sock1, TEST_CLIENT2_URL);
|
||||
if(bind < 0)
|
||||
{
|
||||
ParodusError("Unable to bind socket (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
void *buf = NULL;
|
||||
nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
rc = nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
ParodusPrint("Client 2 waiting for acknowledgement \n");
|
||||
byte = nn_recv(sock1, &buf, NN_MSG, 0);
|
||||
|
||||
@@ -25,35 +25,47 @@
|
||||
#include <CUnit/Basic.h>
|
||||
|
||||
#include "../src/config.h"
|
||||
|
||||
#define K_argc 15
|
||||
#include "../src/ParodusInternal.h"
|
||||
#define K_argc 18
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void create_token_script(char *fname)
|
||||
{
|
||||
char command[128] = {'\0'};
|
||||
FILE *fp = fopen(fname, "w");
|
||||
assert_non_null(fp);
|
||||
fprintf(fp, "%s", "printf secure-token-$1-$2");
|
||||
fclose(fp);
|
||||
sprintf(command, "chmod +x %s",fname);
|
||||
system(command);
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void test_setParodusConfig()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/v1");
|
||||
strcpy(cfg.webpa_url , "localhost");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
strcpy(cfg.partner_id , "comcast");
|
||||
strcpy(cfg.seshat_url, "ipc://tmp/seshat_service.url");
|
||||
cfg.secureFlag = 1;
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/v1", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "localhost", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
parStrncpy(cfg.partner_id , "comcast", sizeof(cfg.partner_id));
|
||||
#ifdef ENABLE_SESHAT
|
||||
parStrncpy(cfg.seshat_url, "ipc://tmp/seshat_service.url", sizeof(cfg.seshat_url));
|
||||
#endif
|
||||
cfg.flags = FLAGS_SECURE;
|
||||
cfg.boot_time = 423457;
|
||||
cfg.webpa_ping_timeout = 30;
|
||||
cfg.webpa_backoff_max = 255;
|
||||
@@ -73,10 +85,10 @@ void test_setParodusConfig()
|
||||
assert_string_equal(cfg.webpa_protocol, temp->webpa_protocol);
|
||||
assert_string_equal(cfg.webpa_uuid, temp->webpa_uuid);
|
||||
assert_string_equal(cfg.partner_id, temp->partner_id);
|
||||
#ifdef ENABLE_SESHAT
|
||||
assert_string_equal(cfg.seshat_url, temp->seshat_url);
|
||||
|
||||
|
||||
assert_int_equal((int) cfg.secureFlag, (int) temp->secureFlag);
|
||||
#endif
|
||||
assert_int_equal((int) cfg.flags, (int) temp->flags);
|
||||
assert_int_equal((int) cfg.boot_time, (int) temp->boot_time);
|
||||
assert_int_equal((int) cfg.webpa_ping_timeout, (int) temp->webpa_ping_timeout);
|
||||
assert_int_equal((int) cfg.webpa_backoff_max, (int) temp->webpa_backoff_max);
|
||||
@@ -87,7 +99,7 @@ void test_getParodusConfig()
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682133");
|
||||
parStrncpy(cfg.hw_model, "TG1682133",sizeof(cfg.hw_model));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
ParodusCfg *temp = get_parodus_cfg();
|
||||
@@ -98,8 +110,12 @@ void test_getParodusConfig()
|
||||
void test_parseCommandLine()
|
||||
{
|
||||
int argc =K_argc;
|
||||
#ifndef ENABLE_SESHAT
|
||||
argc = argc - 1;
|
||||
#endif
|
||||
char * command[argc+1];
|
||||
int i = 0;
|
||||
char expectedToken[128] = {'\0'};
|
||||
|
||||
command[i++] = "parodus";
|
||||
command[i++] = "--hw-model=TG1682";
|
||||
@@ -109,18 +125,23 @@ void test_parseCommandLine()
|
||||
command[i++] = "--hw-last-reboot-reason=unknown";
|
||||
command[i++] = "--fw-name=TG1682_DEV_master_2016000000sdy";
|
||||
command[i++] = "--webpa-ping-time=180";
|
||||
command[i++] = "--webpa-inteface-used=br0";
|
||||
command[i++] = "--webpa-interface-used=br0";
|
||||
command[i++] = "--webpa-url=localhost";
|
||||
command[i++] = "--webpa-backoff-max=0";
|
||||
command[i++] = "--boot-time=1234";
|
||||
command[i++] = "--parodus-local-url=tcp://127.0.0.1:6666";
|
||||
command[i++] = "--partner-id=cox";
|
||||
#ifdef ENABLE_SESHAT
|
||||
command[i++] = "--seshat-url=ipc://127.0.0.1:7777";
|
||||
#endif
|
||||
command[i++] = "--force-ipv4";
|
||||
command[i++] = "--force-ipv6";
|
||||
command[i++] = "--webpa-token=/tmp/token.sh";
|
||||
command[i] = '\0';
|
||||
|
||||
ParodusCfg parodusCfg;
|
||||
memset(&parodusCfg,0,sizeof(parodusCfg));
|
||||
|
||||
create_token_script("/tmp/token.sh");
|
||||
parseCommandLine(argc,command,&parodusCfg);
|
||||
|
||||
assert_string_equal( parodusCfg.hw_model, "TG1682");
|
||||
@@ -136,7 +157,12 @@ void test_parseCommandLine()
|
||||
assert_int_equal( (int) parodusCfg.boot_time,1234);
|
||||
assert_string_equal( parodusCfg.local_url,"tcp://127.0.0.1:6666");
|
||||
assert_string_equal( parodusCfg.partner_id,"cox");
|
||||
#ifdef ENABLE_SESHAT
|
||||
assert_string_equal( parodusCfg.seshat_url, "ipc://127.0.0.1:7777");
|
||||
#endif
|
||||
assert_int_equal( (int) parodusCfg.flags, FLAGS_IPV6_ONLY|FLAGS_IPV4_ONLY);
|
||||
sprintf(expectedToken,"secure-token-%s-%s",parodusCfg.hw_serial_number,parodusCfg.hw_mac);
|
||||
assert_string_equal( parodusCfg.webpa_token,expectedToken);
|
||||
|
||||
}
|
||||
|
||||
@@ -148,6 +174,9 @@ void test_parseCommandLineNull()
|
||||
void err_parseCommandLine()
|
||||
{
|
||||
int argc =K_argc;
|
||||
#ifndef ENABLE_SESHAT
|
||||
argc = argc - 1;
|
||||
#endif
|
||||
char * command[20]={'\0'};
|
||||
|
||||
command[0] = "parodus";
|
||||
@@ -167,19 +196,21 @@ void test_loadParodusCfg()
|
||||
ParodusCfg tmpcfg;
|
||||
ParodusCfg *Cfg;
|
||||
Cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
char protocol[32] = {'\0'};
|
||||
|
||||
strcpy(Cfg->hw_model, "TG1682");
|
||||
strcpy(Cfg->hw_serial_number, "Fer23u948590");
|
||||
strcpy(Cfg->hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(Cfg->hw_mac , "123567892366");
|
||||
strcpy(Cfg->hw_last_reboot_reason , "unknown");
|
||||
strcpy(Cfg->fw_name , "2.364s2");
|
||||
strcpy(Cfg->webpa_path_url , "/v1");
|
||||
strcpy(Cfg->webpa_url , "localhost");
|
||||
strcpy(Cfg->webpa_interface_used , "eth0");
|
||||
strcpy(Cfg->webpa_protocol , "WebPA-1.6");
|
||||
strcpy(Cfg->local_url , "tcp://10.0.0.1:6000");
|
||||
strcpy(Cfg->partner_id , "shaw");
|
||||
parStrncpy(Cfg->hw_model, "TG1682", sizeof(Cfg->hw_model));
|
||||
parStrncpy(Cfg->hw_serial_number, "Fer23u948590", sizeof(Cfg->hw_serial_number));
|
||||
parStrncpy(Cfg->hw_manufacturer , "ARRISGroup,Inc.", sizeof(Cfg->hw_manufacturer));
|
||||
parStrncpy(Cfg->hw_mac , "123567892366", sizeof(Cfg->hw_mac));
|
||||
parStrncpy(Cfg->hw_last_reboot_reason , "unknown", sizeof(Cfg->hw_last_reboot_reason));
|
||||
parStrncpy(Cfg->fw_name , "2.364s2", sizeof(Cfg->fw_name));
|
||||
parStrncpy(Cfg->webpa_path_url , "/v1", sizeof(Cfg->webpa_path_url));
|
||||
parStrncpy(Cfg->webpa_url , "localhost", sizeof(Cfg->webpa_url));
|
||||
parStrncpy(Cfg->webpa_interface_used , "eth0", sizeof(Cfg->webpa_interface_used));
|
||||
snprintf(protocol, sizeof(protocol), "%s-%s", PROTOCOL_VALUE, GIT_COMMIT_TAG);
|
||||
parStrncpy(Cfg->webpa_protocol , protocol, sizeof(Cfg->webpa_protocol));
|
||||
parStrncpy(Cfg->local_url , "tcp://10.0.0.1:6000", sizeof(Cfg->local_url));
|
||||
parStrncpy(Cfg->partner_id , "shaw", sizeof(Cfg->partner_id));
|
||||
|
||||
memset(&tmpcfg,0,sizeof(ParodusCfg));
|
||||
loadParodusCfg(Cfg,&tmpcfg);
|
||||
@@ -190,6 +221,7 @@ void test_loadParodusCfg()
|
||||
assert_string_equal( tmpcfg.hw_mac, "123567892366");
|
||||
assert_string_equal( tmpcfg.local_url, "tcp://10.0.0.1:6000");
|
||||
assert_string_equal( tmpcfg.partner_id, "shaw");
|
||||
assert_string_equal( tmpcfg.webpa_protocol, protocol);
|
||||
free(Cfg);
|
||||
}
|
||||
|
||||
@@ -206,9 +238,8 @@ void test_loadParodusCfgNull()
|
||||
assert_string_equal(temp.hw_model, "");
|
||||
assert_string_equal(temp.hw_serial_number, "");
|
||||
assert_string_equal(temp.hw_manufacturer, "");
|
||||
assert_int_equal( (int) temp.secureFlag,1);
|
||||
assert_int_equal( (int) temp.flags,FLAGS_SECURE);
|
||||
assert_string_equal( temp.webpa_path_url, WEBPA_PATH_URL);
|
||||
assert_string_equal( temp.webpa_protocol, WEBPA_PROTOCOL_VALUE);
|
||||
assert_string_equal( temp.webpa_uuid,"1234567-345456546");
|
||||
assert_string_equal( temp.local_url, PARODUS_UPSTREAM);
|
||||
|
||||
@@ -221,6 +252,28 @@ void err_loadParodusCfg()
|
||||
loadParodusCfg(NULL,&cfg);
|
||||
}
|
||||
|
||||
void test_parodusGitVersion()
|
||||
{
|
||||
FILE *fp;
|
||||
char version[32] = {'\0'};
|
||||
char *command = "git describe --tags --always";
|
||||
int n;
|
||||
size_t len;
|
||||
fp = popen(command,"r");
|
||||
while(fgets(version, 32, fp) !=NULL)
|
||||
{
|
||||
len = strlen(version);
|
||||
if (len > 0 && version[len-1] == '\n')
|
||||
{
|
||||
version[--len] = '\0';
|
||||
}
|
||||
}
|
||||
pclose(fp);
|
||||
|
||||
n = strcmp( version, GIT_COMMIT_TAG);
|
||||
assert_int_equal(n, 0);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -236,6 +289,7 @@ int main(void)
|
||||
cmocka_unit_test(test_parseCommandLine),
|
||||
cmocka_unit_test(test_parseCommandLineNull),
|
||||
cmocka_unit_test(err_parseCommandLine),
|
||||
cmocka_unit_test(test_parodusGitVersion)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
UpStreamMsg *UpStreamMsgQ;
|
||||
ParodusMsg *ParodusMsgQ;
|
||||
extern bool close_retry;
|
||||
extern pthread_mutex_t close_mut;
|
||||
extern volatile unsigned int heartBeatTimer;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
@@ -160,7 +161,9 @@ void test_createSocketConnection()
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -195,7 +198,9 @@ void test_createSocketConnection1()
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0, sizeof(ParodusCfg));
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -229,20 +234,22 @@ void test_createSocketConnection2()
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/v1");
|
||||
strcpy(cfg.webpa_url , "localhost");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/v1", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "localhost", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
cfg.webpa_ping_timeout = 1;
|
||||
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -279,7 +286,9 @@ void test_createSocketConnection2()
|
||||
|
||||
void err_createSocketConnection()
|
||||
{
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
heartBeatTimer = 0;
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "../src/connection.h"
|
||||
#include "../src/config.h"
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -40,6 +41,17 @@ pthread_mutex_t close_mut;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
noPollConn * nopoll_conn_new_opts (noPollCtx * ctx, noPollConnOpts * opts, const char * host_ip, const char * host_port, const char * host_name,const char * get_url,const char * protocols, const char * origin)
|
||||
{
|
||||
UNUSED(host_port); UNUSED(host_name); UNUSED(get_url); UNUSED(protocols);
|
||||
UNUSED(origin); UNUSED(opts);
|
||||
|
||||
function_called();
|
||||
check_expected((intptr_t)ctx);
|
||||
check_expected((intptr_t)host_ip);
|
||||
return (noPollConn *) (intptr_t)mock();
|
||||
}
|
||||
|
||||
noPollConn * nopoll_conn_tls_new (noPollCtx * ctx, noPollConnOpts * options, const char * host_ip, const char * host_port, const char * host_name, const char * get_url, const char * protocols, const char * origin)
|
||||
{
|
||||
UNUSED(options); UNUSED(host_port); UNUSED(host_name); UNUSED(get_url); UNUSED(protocols);
|
||||
@@ -51,16 +63,18 @@ noPollConn * nopoll_conn_tls_new (noPollCtx * ctx, noPollConnOpts * options, co
|
||||
return (noPollConn *) (intptr_t)mock();
|
||||
}
|
||||
|
||||
noPollConn * nopoll_conn_new (noPollCtx * ctx, const char * host_ip, const char * host_port, const char * host_name, const char * get_url, const char * protocols, const char * origin)
|
||||
noPollConn * nopoll_conn_tls_new6 (noPollCtx * ctx, noPollConnOpts * options, const char * host_ip, const char * host_port, const char * host_name, const char * get_url, const char * protocols, const char * origin)
|
||||
{
|
||||
UNUSED(host_port); UNUSED(host_name); UNUSED(get_url); UNUSED(protocols); UNUSED(origin);
|
||||
UNUSED(options); UNUSED(host_port); UNUSED(host_name); UNUSED(get_url); UNUSED(protocols);
|
||||
UNUSED(origin);
|
||||
|
||||
function_called();
|
||||
check_expected((intptr_t)ctx);
|
||||
check_expected((intptr_t)host_ip);
|
||||
return (noPollConn *)(intptr_t)mock();
|
||||
return (noPollConn *) (intptr_t)mock();
|
||||
}
|
||||
|
||||
|
||||
nopoll_bool nopoll_conn_is_ok (noPollConn * conn)
|
||||
{
|
||||
UNUSED(conn);
|
||||
@@ -76,6 +90,12 @@ nopoll_bool nopoll_conn_wait_until_connection_ready (noPollConn * conn, int time
|
||||
return (nopoll_bool) mock();
|
||||
}
|
||||
|
||||
int allow_insecure_conn (void)
|
||||
{
|
||||
function_called ();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
char* getWebpaConveyHeader()
|
||||
{
|
||||
function_called();
|
||||
@@ -150,6 +170,7 @@ void setMessageHandlers()
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
void test_createSecureConnection()
|
||||
{
|
||||
noPollConn *gNPConn;
|
||||
@@ -157,22 +178,36 @@ void test_createSecureConnection()
|
||||
ParodusCfg *cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
memset(cfg, 0, sizeof(ParodusCfg));
|
||||
|
||||
cfg->secureFlag = 1;
|
||||
strcpy(cfg->webpa_url , "localhost");
|
||||
cfg->flags = FLAGS_SECURE;
|
||||
parStrncpy(cfg->webpa_url , "localhost", sizeof(cfg->webpa_url));
|
||||
set_parodus_cfg(cfg);
|
||||
|
||||
|
||||
assert_non_null(ctx);
|
||||
|
||||
will_return (allow_insecure_conn, 0);
|
||||
expect_function_call (allow_insecure_conn);
|
||||
|
||||
will_return(getWebpaConveyHeader, (intptr_t)"WebPA-1.6 (TG1682)");
|
||||
expect_function_call(getWebpaConveyHeader);
|
||||
expect_value(nopoll_conn_tls_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
|
||||
expect_value(nopoll_conn_tls_new6, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new6, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new6, NULL);
|
||||
expect_function_call(nopoll_conn_tls_new6);
|
||||
|
||||
expect_value(nopoll_conn_tls_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_tls_new);
|
||||
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
will_return(nopoll_conn_wait_until_connection_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_wait_until_connection_ready);
|
||||
|
||||
expect_function_call(setMessageHandlers);
|
||||
|
||||
int ret = createNopollConnection(ctx);
|
||||
assert_int_equal(ret, nopoll_true);
|
||||
free(cfg);
|
||||
@@ -187,21 +222,31 @@ void test_createConnection()
|
||||
memset(cfg, 0, sizeof(ParodusCfg));
|
||||
assert_non_null(cfg);
|
||||
|
||||
cfg->secureFlag = 0;
|
||||
strcpy(cfg->webpa_url , "localhost");
|
||||
cfg->flags = 0;
|
||||
parStrncpy(cfg->webpa_url , "localhost", sizeof(cfg->webpa_url));
|
||||
set_parodus_cfg(cfg);
|
||||
assert_non_null(ctx);
|
||||
|
||||
will_return (allow_insecure_conn, 1);
|
||||
expect_function_call (allow_insecure_conn);
|
||||
|
||||
will_return(getWebpaConveyHeader, (intptr_t)"WebPA-1.6 (TG1682)");
|
||||
expect_function_call(getWebpaConveyHeader);
|
||||
expect_value(nopoll_conn_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new);
|
||||
|
||||
|
||||
expect_value(nopoll_conn_new_opts, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new_opts, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new_opts, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new_opts);
|
||||
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
will_return(nopoll_conn_wait_until_connection_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_wait_until_connection_ready);
|
||||
|
||||
expect_function_call(setMessageHandlers);
|
||||
|
||||
int ret = createNopollConnection(ctx);
|
||||
assert_int_equal(ret, nopoll_true);
|
||||
free(cfg);
|
||||
@@ -215,45 +260,77 @@ void test_createConnectionConnNull()
|
||||
ParodusCfg *cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
memset(cfg, 0, sizeof(ParodusCfg));
|
||||
|
||||
cfg->secureFlag = 1;
|
||||
cfg->flags = FLAGS_SECURE;
|
||||
cfg->webpa_backoff_max = 2;
|
||||
strcpy(cfg->webpa_url , "localhost");
|
||||
parStrncpy(cfg->webpa_url , "localhost",sizeof(cfg->webpa_url));
|
||||
set_parodus_cfg(cfg);
|
||||
|
||||
assert_non_null(ctx);
|
||||
|
||||
will_return (allow_insecure_conn, 0);
|
||||
expect_function_call (allow_insecure_conn);
|
||||
|
||||
will_return(getWebpaConveyHeader, (intptr_t)"");
|
||||
expect_function_call(getWebpaConveyHeader);
|
||||
|
||||
expect_value(nopoll_conn_tls_new6, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new6, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new6, NULL);
|
||||
expect_function_call(nopoll_conn_tls_new6);
|
||||
|
||||
expect_value(nopoll_conn_tls_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new, (intptr_t)NULL);
|
||||
expect_function_call(nopoll_conn_tls_new);
|
||||
|
||||
will_return(checkHostIp, -2);
|
||||
expect_function_call(checkHostIp);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
expect_value(nopoll_conn_tls_new6, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new6, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new6, NULL);
|
||||
expect_function_call(nopoll_conn_tls_new6);
|
||||
|
||||
|
||||
expect_value(nopoll_conn_tls_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new,(intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new, (intptr_t)NULL);
|
||||
expect_function_call(nopoll_conn_tls_new);
|
||||
|
||||
will_return(checkHostIp, -2);
|
||||
expect_function_call(checkHostIp);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
will_return(timeValDiff, 15*60*1000);
|
||||
expect_function_call(timeValDiff);
|
||||
|
||||
will_return(timeValDiff, 15*60*1000);
|
||||
expect_function_call(timeValDiff);
|
||||
|
||||
will_return(kill, 1);
|
||||
expect_function_call(kill);
|
||||
|
||||
expect_value(nopoll_conn_tls_new6, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new6, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new6, NULL);
|
||||
expect_function_call(nopoll_conn_tls_new6);
|
||||
|
||||
expect_value(nopoll_conn_tls_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_tls_new, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_tls_new, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_tls_new);
|
||||
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
will_return(nopoll_conn_wait_until_connection_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_wait_until_connection_ready);
|
||||
|
||||
expect_function_call(setMessageHandlers);
|
||||
|
||||
createNopollConnection(ctx);
|
||||
free(cfg);
|
||||
nopoll_ctx_unref (ctx);
|
||||
@@ -267,66 +344,91 @@ void test_createConnectionConnNotOk()
|
||||
memset(cfg, 0, sizeof(ParodusCfg));
|
||||
assert_non_null(cfg);
|
||||
|
||||
cfg->secureFlag = 0;
|
||||
strcpy(cfg->webpa_url , "localhost");
|
||||
cfg->flags = 0;
|
||||
parStrncpy(cfg->webpa_url , "localhost", sizeof(cfg->webpa_url));
|
||||
set_parodus_cfg(cfg);
|
||||
assert_non_null(ctx);
|
||||
|
||||
will_return (allow_insecure_conn, 1);
|
||||
expect_function_call (allow_insecure_conn);
|
||||
|
||||
will_return(getWebpaConveyHeader, (intptr_t)"WebPA-1.6 (TG1682)");
|
||||
expect_function_call(getWebpaConveyHeader);
|
||||
expect_value(nopoll_conn_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new);
|
||||
|
||||
expect_value(nopoll_conn_new_opts, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new_opts, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new_opts, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new_opts);
|
||||
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_function_call(nopoll_conn_close);
|
||||
|
||||
will_return(nopoll_conn_ref_count, 1);
|
||||
expect_function_call(nopoll_conn_ref_count);
|
||||
|
||||
expect_function_call(nopoll_conn_unref);
|
||||
|
||||
expect_value(nopoll_conn_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new);
|
||||
|
||||
expect_value(nopoll_conn_new_opts, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new_opts, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new_opts, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new_opts);
|
||||
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
will_return(nopoll_conn_wait_until_connection_ready, nopoll_false);
|
||||
expect_function_call(nopoll_conn_wait_until_connection_ready);
|
||||
|
||||
will_return(strncmp, 12);
|
||||
expect_function_call(strncmp);
|
||||
|
||||
expect_function_call(nopoll_conn_close);
|
||||
|
||||
will_return(nopoll_conn_ref_count, 0);
|
||||
expect_function_call(nopoll_conn_ref_count);
|
||||
|
||||
expect_value(nopoll_conn_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new);
|
||||
expect_value(nopoll_conn_new_opts, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new_opts, (intptr_t)host_ip, "localhost");
|
||||
will_return(nopoll_conn_new_opts, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new_opts);
|
||||
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
will_return(nopoll_conn_wait_until_connection_ready, nopoll_false);
|
||||
expect_function_call(nopoll_conn_wait_until_connection_ready);
|
||||
|
||||
will_return(strncmp, 0);
|
||||
expect_function_call(strncmp);
|
||||
|
||||
will_return(strtok, (intptr_t)"");
|
||||
will_return(strtok, (intptr_t)"");
|
||||
will_return(strtok, (intptr_t)"p.10.0.0.12");
|
||||
will_return(strtok, (intptr_t)"8080");
|
||||
expect_function_calls(strtok, 4);
|
||||
|
||||
expect_function_call(nopoll_conn_close);
|
||||
|
||||
will_return(nopoll_conn_ref_count, 1);
|
||||
expect_function_call(nopoll_conn_ref_count);
|
||||
|
||||
expect_function_call(nopoll_conn_unref);
|
||||
|
||||
expect_value(nopoll_conn_new, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new, (intptr_t)host_ip, "10.0.0.12");
|
||||
will_return(nopoll_conn_new, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new);
|
||||
expect_value(nopoll_conn_new_opts, (intptr_t)ctx, (intptr_t)ctx);
|
||||
expect_string(nopoll_conn_new_opts, (intptr_t)host_ip, "10.0.0.12");
|
||||
will_return(nopoll_conn_new_opts, (intptr_t)&gNPConn);
|
||||
expect_function_call(nopoll_conn_new_opts);
|
||||
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
will_return(nopoll_conn_wait_until_connection_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_wait_until_connection_ready);
|
||||
|
||||
expect_function_call(setMessageHandlers);
|
||||
|
||||
int ret = createNopollConnection(ctx);
|
||||
assert_int_equal(ret, nopoll_true);
|
||||
free(cfg);
|
||||
|
||||
@@ -65,8 +65,8 @@ ssize_t wrp_to_struct( const void *bytes, const size_t length,
|
||||
(*msg)->u.req.partner_ids = (partners_t *) malloc(sizeof(partners_t));
|
||||
(*msg)->u.req.partner_ids->count = 1;
|
||||
(*msg)->u.req.partner_ids->partner_ids[0] = (char *) malloc(sizeof(char) *64);
|
||||
strcpy((*msg)->u.req.dest,"mac:1122334455/iot");
|
||||
strcpy((*msg)->u.req.partner_ids->partner_ids[0],"comcast");
|
||||
parStrncpy((*msg)->u.req.dest,"mac:1122334455/iot", 100);
|
||||
parStrncpy((*msg)->u.req.partner_ids->partner_ids[0],"comcast", 64);
|
||||
return (ssize_t) mock();
|
||||
}
|
||||
|
||||
@@ -93,8 +93,8 @@ void test_listenerOnMessage()
|
||||
expect_function_calls(wrp_to_struct, 1);
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
|
||||
will_return(get_numOfClients, 1);
|
||||
expect_function_call(get_numOfClients);
|
||||
@@ -116,19 +116,19 @@ void test_listenerOnMessageMultipleClients()
|
||||
|
||||
reg_list_item_t *head2 = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head2, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head2->service_name, "iot");
|
||||
strcpy(head2->url, "tcp://10.0.0.1:6622");
|
||||
parStrncpy(head2->service_name, "iot", sizeof(head2->service_name));
|
||||
parStrncpy(head2->url, "tcp://10.0.0.1:6622", sizeof(head2->url));
|
||||
|
||||
reg_list_item_t *head1 = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head1, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head1->service_name, "lmlite");
|
||||
strcpy(head1->url, "tcp://10.0.0.1:6611");
|
||||
parStrncpy(head1->service_name, "lmlite", sizeof(head1->service_name));
|
||||
parStrncpy(head1->url, "tcp://10.0.0.1:6611", sizeof(head1->url));
|
||||
head1->next = head2;
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "config");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "config", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
head->next = head1;
|
||||
|
||||
will_return(get_numOfClients, 3);
|
||||
|
||||
314
tests/test_downstream_more.c
Normal file
314
tests/test_downstream_more.c
Normal file
@@ -0,0 +1,314 @@
|
||||
/**
|
||||
* Copyright 2017 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <wrp-c.h>
|
||||
|
||||
#include <CUnit/Basic.h>
|
||||
|
||||
#include "../src/downstream.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
wrp_msg_t s;
|
||||
wrp_msg_t r;
|
||||
} test_t;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static test_t tests[] = {
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__CREATE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server1",
|
||||
.s.u.crud.dest = "fake-client1/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = "Some binary",
|
||||
.s.u.crud.payload_size = 11,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__CREATE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client1",
|
||||
.r.u.crud.dest = "fake-server1",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__RETREIVE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server2",
|
||||
.s.u.crud.dest = "fake-client2/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = NULL,
|
||||
.s.u.crud.payload_size = 0,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__RETREIVE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client2",
|
||||
.r.u.crud.dest = "fake-server2",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__UPDATE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server3",
|
||||
.s.u.crud.dest = "fake-client3/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = NULL,
|
||||
.s.u.crud.payload_size = 0,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__UPDATE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client3",
|
||||
.r.u.crud.dest = "fake-server3",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__DELETE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server4",
|
||||
.s.u.crud.dest = "fake-client4/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = NULL,
|
||||
.s.u.crud.payload_size = 0,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__DELETE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client4",
|
||||
.r.u.crud.dest = "fake-server4",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__EVENT,
|
||||
.s.u.event.source = "fake-server5",
|
||||
.s.u.event.dest = "fake-client5/iot",
|
||||
.s.u.event.partner_ids = NULL,
|
||||
.s.u.event.headers = NULL,
|
||||
.s.u.event.metadata = NULL,
|
||||
.s.u.event.payload = NULL,
|
||||
.s.u.event.payload_size = 0,
|
||||
|
||||
.r = {0},
|
||||
},
|
||||
};
|
||||
|
||||
static uint8_t i;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
{
|
||||
(void) msg; (void) partnerIds;
|
||||
return 1;
|
||||
}
|
||||
|
||||
ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_format fmt,
|
||||
wrp_msg_t **msg )
|
||||
{
|
||||
(void) bytes; (void) length; (void) fmt;
|
||||
*msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
(*msg)->msg_type = tests[i].s.msg_type;
|
||||
if( WRP_MSG_TYPE__EVENT == tests[i].s.msg_type ) {
|
||||
(*msg)->u.event.source = strdup(tests[i].s.u.event.source);
|
||||
(*msg)->u.event.dest = strdup(tests[i].s.u.event.dest);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*msg)->u.crud.source = strdup(tests[i].s.u.crud.source);
|
||||
(*msg)->u.crud.dest = strdup(tests[i].s.u.crud.dest);
|
||||
(*msg)->u.crud.transaction_uuid = strdup(tests[i].s.u.crud.transaction_uuid);
|
||||
(*msg)->u.crud.path = strdup(tests[i].s.u.crud.path);
|
||||
}
|
||||
return (ssize_t) sizeof(tests[i].s);
|
||||
}
|
||||
|
||||
ssize_t wrp_struct_to( const wrp_msg_t *msg, const enum wrp_format fmt, void **bytes )
|
||||
{
|
||||
(void) fmt; (void) bytes;
|
||||
CU_ASSERT(WRP_MSG_TYPE__EVENT != msg->msg_type);
|
||||
CU_ASSERT(tests[i].r.msg_type == msg->msg_type);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.transaction_uuid, msg->u.crud.transaction_uuid);
|
||||
printf("tests[%d].r.u.crud.source = %s, msg->u.crud.source = %s\n", i, tests[i].r.u.crud.source, msg->u.crud.source);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.source, msg->u.crud.source);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.dest, msg->u.crud.dest);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.path, msg->u.crud.path);
|
||||
CU_ASSERT(tests[i].r.u.crud.payload_size == msg->u.crud.payload_size);
|
||||
CU_ASSERT(0 == memcmp(tests[i].r.u.crud.payload, msg->u.crud.payload, msg->u.crud.payload_size));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
(void) resp_bytes; (void) resp_size;
|
||||
}
|
||||
|
||||
int get_numOfClients()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
reg_list_item_t *get_global_node(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void wrp_free_struct( wrp_msg_t *msg )
|
||||
{
|
||||
if( WRP_MSG_TYPE__EVENT == tests[i].s.msg_type ) {
|
||||
if( NULL != msg->u.event.source) {
|
||||
free(msg->u.event.source);
|
||||
}
|
||||
if( NULL != msg->u.event.dest) {
|
||||
free(msg->u.event.dest);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( NULL != msg->u.crud.source) {
|
||||
free(msg->u.crud.source);
|
||||
}
|
||||
if( NULL != msg->u.crud.dest) {
|
||||
free(msg->u.crud.dest);
|
||||
}
|
||||
if( NULL != msg->u.crud.transaction_uuid) {
|
||||
free(msg->u.crud.transaction_uuid);
|
||||
}
|
||||
if( NULL != msg->u.crud.path) {
|
||||
free(msg->u.crud.path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_listenerOnMessage()
|
||||
{
|
||||
size_t t_size = sizeof(tests)/sizeof(test_t);
|
||||
void *msg = malloc(1);
|
||||
|
||||
for( i = 0; i < t_size; i++ ) {
|
||||
listenerOnMessage(msg, 0);
|
||||
}
|
||||
free(msg);
|
||||
}
|
||||
|
||||
void add_suites( CU_pSuite *suite )
|
||||
{
|
||||
printf("--------Start of Test Cases Execution ---------\n");
|
||||
*suite = CU_add_suite( "tests", NULL, NULL );
|
||||
CU_add_test( *suite, "Test 1", test_listenerOnMessage );
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( void )
|
||||
{
|
||||
unsigned rv = 1;
|
||||
CU_pSuite suite = NULL;
|
||||
|
||||
if( CUE_SUCCESS == CU_initialize_registry() ) {
|
||||
add_suites( &suite );
|
||||
|
||||
if( NULL != suite ) {
|
||||
CU_basic_set_mode( CU_BRM_VERBOSE );
|
||||
CU_basic_run_tests();
|
||||
printf( "\n" );
|
||||
CU_basic_show_failures( CU_get_failure_list() );
|
||||
printf( "\n\n" );
|
||||
rv = CU_get_number_of_tests_failed();
|
||||
}
|
||||
|
||||
CU_cleanup_registry();
|
||||
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -54,9 +54,7 @@ void* a(void *in)
|
||||
|
||||
lockMutex(data->mutex);
|
||||
data->number++;
|
||||
sleep(1);
|
||||
data->number++;
|
||||
sleep(1);
|
||||
data->number++;
|
||||
unlockMutex(data->mutex);
|
||||
|
||||
@@ -69,9 +67,7 @@ void* b(void *in)
|
||||
|
||||
lockMutex(data->mutex);
|
||||
data->number+=10;
|
||||
sleep(1);
|
||||
data->number+=10;
|
||||
sleep(1);
|
||||
data->number+=10;
|
||||
unlockMutex(data->mutex);
|
||||
|
||||
@@ -108,6 +104,8 @@ void err_mutex()
|
||||
|
||||
will_return(pthread_mutex_init, -1);
|
||||
mutex = createMutex();
|
||||
destroyMutex(mutex);
|
||||
|
||||
}
|
||||
|
||||
void err_mutexNull()
|
||||
|
||||
@@ -51,7 +51,7 @@ void test_validate_partner_id_for_req()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -68,7 +68,7 @@ void test_validate_partner_id_for_req_listNULL()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -103,7 +103,7 @@ void err_validate_partner_id_for_req()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -122,14 +122,15 @@ void test_validate_partner_id_for_event()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
|
||||
partners_t *list = NULL;
|
||||
int ret = validate_partner_id(msg, &list);
|
||||
assert_int_equal(ret, 1);
|
||||
assert_int_equal(ret, 1);
|
||||
free(list);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
@@ -141,7 +142,7 @@ void test_validate_partner_id_for_event_listNULL()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -180,7 +181,7 @@ void test_validate_partner_id_for_event_withoutId()
|
||||
partners_t *partner_ids = (partners_t *) malloc(sizeof(partners_t));
|
||||
partner_ids->count = 1;
|
||||
partner_ids->partner_ids[0] = (char *) malloc(sizeof(char)*64);
|
||||
strcpy(partner_ids->partner_ids[0], "shaw");
|
||||
parStrncpy(partner_ids->partner_ids[0], "shaw", 64);
|
||||
|
||||
wrp_msg_t *msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
memset(msg, 0, sizeof(wrp_msg_t));
|
||||
@@ -189,7 +190,7 @@ void test_validate_partner_id_for_event_withoutId()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
|
||||
@@ -77,13 +77,23 @@ static void *client_rcv_task()
|
||||
int byte =0;
|
||||
int rv1=0;
|
||||
int t=25000;
|
||||
int rc = -1;
|
||||
int bind;
|
||||
wrp_msg_t *msg1;
|
||||
|
||||
sock1 = nn_socket (AF_SP, NN_PULL);
|
||||
nn_bind(sock1, TEST_SERVICE_URL);
|
||||
bind = nn_bind(sock1, TEST_SERVICE_URL);
|
||||
if(bind < 0)
|
||||
{
|
||||
ParodusError("Unable to bind socket (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
void *buf = NULL;
|
||||
nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
rc = nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
ParodusPrint("Client 1 waiting for acknowledgement \n");
|
||||
byte = nn_recv(sock1, &buf, NN_MSG, 0);
|
||||
|
||||
202
tests/test_seshat_interface.c
Normal file
202
tests/test_seshat_interface.c
Normal file
@@ -0,0 +1,202 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
#include <nopoll.h>
|
||||
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/seshat_interface.h"
|
||||
#include "../src/config.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define URL "url"
|
||||
#define LRU "lru"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
ParodusCfg g_config;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
ParodusCfg *get_parodus_cfg(void)
|
||||
{
|
||||
return &g_config;
|
||||
}
|
||||
|
||||
void loadParodusCfg(ParodusCfg *config, ParodusCfg *cfg)
|
||||
{
|
||||
UNUSED(config); UNUSED(cfg);
|
||||
}
|
||||
|
||||
void parseCommandLine(int argc,char **argv, ParodusCfg *cfg)
|
||||
{
|
||||
UNUSED(argc); UNUSED(argv); UNUSED(cfg);
|
||||
}
|
||||
|
||||
void set_parodus_cfg(ParodusCfg *cfg)
|
||||
{
|
||||
UNUSED(cfg);
|
||||
}
|
||||
|
||||
int init_lib_seshat (const char *url)
|
||||
{
|
||||
UNUSED(url);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int shutdown_seshat_lib (void)
|
||||
{
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int seshat_register(const char *service, const char *url)
|
||||
{
|
||||
UNUSED(service); UNUSED(url);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
char* seshat_discover(const char *service)
|
||||
{
|
||||
UNUSED(service);
|
||||
function_called();
|
||||
return (char *) mock();
|
||||
}
|
||||
|
||||
int allow_insecure_conn(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_all_pass()
|
||||
{
|
||||
parStrncpy(g_config.local_url, URL, sizeof(g_config.local_url));
|
||||
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, 0);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
char *d_url = malloc(sizeof(g_config.local_url));
|
||||
parStrncpy(d_url, g_config.local_url, sizeof(g_config.local_url));
|
||||
will_return(seshat_discover, d_url);
|
||||
expect_function_call(seshat_discover);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_true(__registerWithSeshat());
|
||||
memset(&g_config, '\0', sizeof(g_config));
|
||||
}
|
||||
|
||||
void test_init_fail()
|
||||
{
|
||||
will_return(init_lib_seshat, -1);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
void test_register_fail()
|
||||
{
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, -1);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
void test_discover_fail()
|
||||
{
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, 0);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
will_return(seshat_discover, 0);
|
||||
expect_function_call(seshat_discover);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
void test_discover_pass_but_lru_expected_fail()
|
||||
{
|
||||
parStrncpy(g_config.local_url, URL, sizeof(g_config.local_url));
|
||||
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, 0);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
char *d_url = malloc(sizeof(g_config.local_url));
|
||||
parStrncpy(d_url, LRU, sizeof(g_config.local_url));
|
||||
will_return(seshat_discover, d_url);
|
||||
expect_function_call(seshat_discover);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_all_pass),
|
||||
cmocka_unit_test(test_init_fail),
|
||||
cmocka_unit_test(test_register_fail),
|
||||
cmocka_unit_test(test_discover_fail),
|
||||
cmocka_unit_test(test_discover_pass_but_lru_expected_fail),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
61
tests/test_seshat_interface_stub.c
Normal file
61
tests/test_seshat_interface_stub.c
Normal file
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "../src/seshat_interface.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_registration()
|
||||
{
|
||||
assert_true(__registerWithSeshat());
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_registration),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
678
tests/test_token.c
Normal file
678
tests/test_token.c
Normal file
@@ -0,0 +1,678 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <CUnit/Basic.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <resolv.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
#include <cjwt/cjwt.h>
|
||||
|
||||
#include "../src/token.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/connection.h"
|
||||
#include "../src/config.h"
|
||||
|
||||
const char *header = "{ \"alg\": \"RS256\", \"typ\": \"JWT\"}";
|
||||
|
||||
time_t exp_time_good = 2147483647; // 1/18/2038
|
||||
time_t exp_time_bad = 1463955372; // 5/22/2016
|
||||
|
||||
|
||||
const char *payload_good = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"," \
|
||||
"\"endpoint\": \"https://fabric.webpa.comcast.net:8080/\"}";
|
||||
|
||||
const char *payload_insec = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"," \
|
||||
"\"endpoint\": \"http://fabric.webpa.comcast.net:8080/\"}";
|
||||
|
||||
// missing endpoint
|
||||
const char *payload_no_end = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"}";
|
||||
|
||||
const char *txt_record_id = "aabbccddeeff.test.webpa.comcast.net";
|
||||
|
||||
#define MAX_RR_RECS 10
|
||||
|
||||
const char *dns_recs_test =
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_extra =
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\n" // non-txt record type
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
;
|
||||
|
||||
char *rr_recs_test[] = {
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm",
|
||||
"X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-",
|
||||
"ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA"
|
||||
};
|
||||
|
||||
char *dns_jwt_test =
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm"
|
||||
"X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-"
|
||||
"ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA"
|
||||
;
|
||||
|
||||
|
||||
const char *dns_recs_fabric =
|
||||
"\"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJlbmRwb2ludCI6Imh0dHBzOi8vZmFicmljLndlYnBhLmNvbWNhc3QubmV0OjgwODAvIn0.24cvUmCGYqqXuSsgC7nNnle2JH-uy6Jwp5BKXADhXpc\""
|
||||
;
|
||||
|
||||
char *rr_recs_fabric[] = {
|
||||
"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJlbmRwb2ludCI6Imh0dHBzOi8vZmFicmljLndlYnBhLmNvbWNhc3QubmV0OjgwODAvIn0.24cvUmCGYqqXuSsgC7nNnle2JH-uy6Jwp5BKXADhXpc"
|
||||
};
|
||||
|
||||
const char *dns_recs_err1 = // missing seq
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err2 = // invalid seq
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"0:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err3 = // invalid seq too high
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"99:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err4 = // duplicate seq number
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err5 = // missing rec 1
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\n" // non-txt record type
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
;
|
||||
|
||||
cjwt_t jwt1; // secure, payload good
|
||||
cjwt_t jwt2; // secure, payload good, but expired
|
||||
cjwt_t jwt3; // insecure
|
||||
cjwt_t jwt4; // missing endpoint
|
||||
|
||||
// internal functions in token.c to be tested
|
||||
extern int analyze_jwt (const cjwt_t *jwt);
|
||||
extern bool validate_algo(const cjwt_t *jwt);
|
||||
extern int nquery(const char* dns_txt_record_id,u_char *nsbuf);
|
||||
extern bool valid_b64_char (char c);
|
||||
extern const char *strip_rr_data (const char *rr_ptr, int *rrlen);
|
||||
extern int find_seq_num (const char *rr_ptr, int rrlen);
|
||||
extern int get_rr_seq_num (const char *rr_ptr, int rrlen);
|
||||
extern int get_rr_seq_table (ns_msg *msg_handle, int num_rr_recs, rr_rec_t *seq_table);
|
||||
extern int assemble_jwt_from_dns (ns_msg *msg_handle, int num_rr_recs, char *jwt_ans);
|
||||
extern int query_dns(const char* dns_txt_record_id,char *jwt_ans);
|
||||
extern void read_key_from_file (const char *fname, char *buf, size_t buflen);
|
||||
extern const char *get_tok (const char *src, int delim, char *result, int resultsize);
|
||||
extern unsigned int get_algo_mask (const char *algo_str);
|
||||
|
||||
int setup_test_jwts (void)
|
||||
{
|
||||
memset (&jwt1, 0, sizeof(cjwt_t));
|
||||
jwt1.exp.tv_sec = exp_time_good;
|
||||
jwt1.private_claims = cJSON_Parse ((char *) payload_good);
|
||||
if (NULL == jwt1.private_claims) {
|
||||
printf ("Invalid json struct payload_good\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset (&jwt2, 0, sizeof(cjwt_t));
|
||||
jwt2.exp.tv_sec = exp_time_bad;
|
||||
jwt2.private_claims = cJSON_Parse ((char *) payload_good);
|
||||
if (NULL == jwt2.private_claims) {
|
||||
printf ("Invalid json struct payload_good\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset (&jwt3, 0, sizeof(cjwt_t));
|
||||
jwt3.exp.tv_sec = exp_time_good;
|
||||
jwt3.private_claims = cJSON_Parse ((char *) payload_insec);
|
||||
if (NULL == jwt3.private_claims) {
|
||||
printf ("Invalid json struct payload_insec\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset (&jwt4, 0, sizeof(cjwt_t));
|
||||
jwt4.exp.tv_sec = exp_time_good;
|
||||
jwt4.private_claims = cJSON_Parse ((char *) payload_no_end);
|
||||
if (NULL == jwt4.private_claims) {
|
||||
printf ("Invalid json struct payload_good\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_dns_text (const char *dns_rec_id, u_char *nsbuf, int bufsize)
|
||||
{
|
||||
const char *rec = NULL;
|
||||
|
||||
if (strstr (dns_rec_id, ".test.") != NULL)
|
||||
rec = dns_recs_test;
|
||||
else if (strstr (dns_rec_id, ".extra.") != NULL)
|
||||
rec = dns_recs_extra;
|
||||
else if (strstr (dns_rec_id, ".fabric.") != NULL)
|
||||
rec = dns_recs_fabric;
|
||||
else if (strstr (dns_rec_id, ".err1.") != NULL)
|
||||
rec = dns_recs_err1;
|
||||
else if (strstr (dns_rec_id, ".err2.") != NULL)
|
||||
rec = dns_recs_err2;
|
||||
else if (strstr (dns_rec_id, ".err3.") != NULL)
|
||||
rec = dns_recs_err3;
|
||||
else if (strstr (dns_rec_id, ".err4.") != NULL)
|
||||
rec = dns_recs_err4;
|
||||
else if (strstr (dns_rec_id, ".err5.") != NULL)
|
||||
rec = dns_recs_err5;
|
||||
else
|
||||
return -1;
|
||||
strncpy ((char *) nsbuf, rec, bufsize);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int ns_initparse(const u_char *nsbuf, int l, ns_msg *msg_handle)
|
||||
{
|
||||
UNUSED(l);
|
||||
char *buf = (char*) nsbuf;
|
||||
char *next;
|
||||
int i, count = 0;
|
||||
|
||||
msg_handle->_msg_ptr = nsbuf;
|
||||
while (true)
|
||||
{
|
||||
if (buf[0] == 0)
|
||||
break;
|
||||
count++;
|
||||
next = strchr (buf, '\n');
|
||||
if (NULL == next)
|
||||
break;
|
||||
*next = 0;
|
||||
buf = ++next;
|
||||
}
|
||||
for (i=0; i<ns_s_max; i++) {
|
||||
if (i == ns_s_an)
|
||||
msg_handle->_counts[i] = count;
|
||||
else
|
||||
msg_handle->_counts[i] = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ns_parserr(ns_msg *msg_handle, ns_sect sect, int rec, ns_rr *rr)
|
||||
{
|
||||
UNUSED(sect);
|
||||
int i, l;
|
||||
char *ptr = (char *) msg_handle->_msg_ptr;
|
||||
|
||||
if (rec >= msg_handle->_counts[ns_s_an]) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i=0; i < rec; i++) {
|
||||
l = strlen (ptr);
|
||||
ptr += (l+1);
|
||||
}
|
||||
|
||||
if (strlen (ptr) == 0) {
|
||||
rr->type = ns_t_key;
|
||||
} else {
|
||||
rr->type = ns_t_txt;
|
||||
}
|
||||
rr->rdata = (u_char *) ptr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int __res_ninit (res_state statp)
|
||||
{
|
||||
UNUSED(statp);
|
||||
function_called ();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int __res_nquery (res_state statp, const char * txt_record,
|
||||
int class, int type_, u_char * buf, int bufsize)
|
||||
{
|
||||
UNUSED(statp); UNUSED(class); UNUSED(type_);
|
||||
int ret = get_dns_text (txt_record, buf, bufsize);
|
||||
if (ret == 0)
|
||||
return strlen ( (char*) buf);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
void __res_nclose (res_state statp)
|
||||
{
|
||||
UNUSED (statp);
|
||||
function_called ();
|
||||
}
|
||||
|
||||
void test_analyze_jwt ()
|
||||
{
|
||||
int ret = setup_test_jwts ();
|
||||
assert_int_equal (ret, 0);
|
||||
ret = analyze_jwt (&jwt1);
|
||||
assert_int_equal (ret, 0);
|
||||
ret = analyze_jwt (&jwt2);
|
||||
assert_int_equal (ret, TOKEN_ERR_JWT_EXPIRED);
|
||||
ret = analyze_jwt (&jwt3);
|
||||
assert_int_equal (ret, 1);
|
||||
ret = analyze_jwt (&jwt4);
|
||||
assert_int_equal (ret, TOKEN_ERR_INVALID_JWT_CONTENT);
|
||||
|
||||
}
|
||||
|
||||
void test_validate_algo ()
|
||||
{
|
||||
bool ret;
|
||||
ParodusCfg cfg;
|
||||
parStrncpy (cfg.jwt_algo, "none:RS256", sizeof(cfg.jwt_algo));
|
||||
set_parodus_cfg (&cfg);
|
||||
jwt1.header.alg = alg_rs256;
|
||||
ret = validate_algo (&jwt1);
|
||||
assert_int_equal (ret, 1);
|
||||
jwt1.header.alg = alg_rs512;
|
||||
ret = validate_algo (&jwt1);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
void test_nquery ()
|
||||
{
|
||||
int len;
|
||||
u_char nsbuf[8192];
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
len = nquery (txt_record_id, nsbuf);
|
||||
assert_int_equal (len, strlen(dns_recs_test));
|
||||
|
||||
will_return (__res_ninit, -1);
|
||||
expect_function_call (__res_ninit);
|
||||
|
||||
len = nquery (txt_record_id, nsbuf);
|
||||
assert_int_equal (len, -1);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
|
||||
len = nquery (".nosuch.", nsbuf);
|
||||
assert_int_equal (len, -1);
|
||||
|
||||
}
|
||||
|
||||
void test_valid_b64_char()
|
||||
{
|
||||
assert_int_equal (valid_b64_char ('A'), 1);
|
||||
assert_int_equal (valid_b64_char ('@'), 0);
|
||||
}
|
||||
|
||||
void test_strip_rrdata ()
|
||||
{
|
||||
const char *s1 = "\"01:this-is-the-test-string-\"\n";
|
||||
const char *s2 = "\"01:this-is-the-test-string-\n";
|
||||
const char *ss1 = "01:this-is-the-test-string-";
|
||||
int s1len = strlen (ss1);
|
||||
const char *result;
|
||||
int rlen;
|
||||
|
||||
result = strip_rr_data (s1, &rlen);
|
||||
assert_int_equal (rlen, s1len);
|
||||
if (rlen == s1len) {
|
||||
assert_int_equal (strncmp (result, ss1, rlen), 0);
|
||||
}
|
||||
|
||||
result = strip_rr_data (s2, &rlen);
|
||||
assert_int_equal (rlen, s1len);
|
||||
if (rlen == s1len) {
|
||||
assert_int_equal (strncmp (result, ss1, rlen), 0);
|
||||
}
|
||||
}
|
||||
|
||||
void test_find_seq_num ()
|
||||
{
|
||||
int pos;
|
||||
const char *s1 = "01:this-is-it";
|
||||
const char *s2 = "1:this-is-it";
|
||||
const char *s3 = ":this-is-it";
|
||||
const char *s4 = ".01:this-is-it";
|
||||
const char *s5 = "..01:this-is-it";
|
||||
const char *s6 = "99999";
|
||||
const char *s7 = "xxxxx";
|
||||
|
||||
pos = find_seq_num (s1, strlen(s1));
|
||||
assert_int_equal (pos, 0);
|
||||
|
||||
pos = find_seq_num (s2, strlen(s2));
|
||||
assert_int_equal (pos, -2);
|
||||
|
||||
pos = find_seq_num (s3, strlen(s3));
|
||||
assert_int_equal (pos, -2);
|
||||
|
||||
pos = find_seq_num (s4, strlen(s4));
|
||||
assert_int_equal (pos, 1);
|
||||
|
||||
pos = find_seq_num (s5, strlen(s5));
|
||||
assert_int_equal (pos, 2);
|
||||
|
||||
pos = find_seq_num (s6, strlen(s6));
|
||||
assert_int_equal (pos, -1);
|
||||
|
||||
pos = find_seq_num (s7, strlen(s7));
|
||||
assert_int_equal (pos, -1);
|
||||
}
|
||||
|
||||
void test_get_rr_seq_num ()
|
||||
{
|
||||
int result;
|
||||
const char *s1 = "01:this-is-it";
|
||||
const char *s2 = "1:this-is-it";
|
||||
const char *s3 = ":this-is-it";
|
||||
const char *s4 = "11:this-is-it";
|
||||
|
||||
result = get_rr_seq_num (s1, strlen(s1));
|
||||
assert_int_equal (result, 1);
|
||||
|
||||
result = get_rr_seq_num (s2, strlen(s2));
|
||||
assert_int_equal (result, -1);
|
||||
|
||||
result = get_rr_seq_num (s3, strlen(s3));
|
||||
assert_int_equal (result, -1);
|
||||
|
||||
result = get_rr_seq_num (s4, strlen(s4));
|
||||
assert_int_equal (result, 11);
|
||||
}
|
||||
|
||||
void test_get_rr_seq_table()
|
||||
{
|
||||
#define SEQ_TABLE_SIZE (MAX_RR_RECS + 1)
|
||||
u_char nsbuf[4096];
|
||||
ns_msg msg_handle;
|
||||
int i, num_txt_recs, ret;
|
||||
rr_rec_t seq_table[SEQ_TABLE_SIZE];
|
||||
|
||||
memset (&msg_handle, 0, sizeof(ns_msg));
|
||||
|
||||
ret = get_dns_text (".test.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, 3);
|
||||
assert_ptr_equal (seq_table[0].rr_ptr, NULL);
|
||||
for (i=0; i<3; i++) {
|
||||
int len = strlen (rr_recs_test[i]);
|
||||
assert_int_equal (len, seq_table[i+1].rr_len);
|
||||
ret = strncmp (seq_table[i+1].rr_ptr, rr_recs_test[i], len);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
ret = get_dns_text (".fabric.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 1);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 1, seq_table);
|
||||
assert_int_equal (num_txt_recs, 1);
|
||||
assert_ptr_not_equal (seq_table[0].rr_ptr, NULL);
|
||||
if (NULL != seq_table[0].rr_ptr) {
|
||||
int len = strlen (rr_recs_fabric[0]);
|
||||
assert_int_equal (len, seq_table[0].rr_len);
|
||||
ret = strncmp (seq_table[0].rr_ptr, rr_recs_fabric[0], len);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
ret = get_dns_text (".extra.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 4);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 4, seq_table);
|
||||
assert_int_equal (num_txt_recs, 3);
|
||||
assert_ptr_equal (seq_table[0].rr_ptr, NULL);
|
||||
for (i=0; i<3; i++) {
|
||||
int len = strlen (rr_recs_test[i]);
|
||||
assert_int_equal (len, seq_table[i+1].rr_len);
|
||||
ret = strncmp (seq_table[i+1].rr_ptr, rr_recs_test[i], len);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
ret = get_dns_text (".err1.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err2.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err3.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err4.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 4);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 4, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err5.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
}
|
||||
|
||||
void test_assemble_jwt_from_dns ()
|
||||
{
|
||||
ns_msg msg_handle;
|
||||
u_char nsbuf[4096];
|
||||
char jwt_token[8192];
|
||||
int ret;
|
||||
|
||||
memset (&msg_handle, 0, sizeof(ns_msg));
|
||||
|
||||
ret = get_dns_text (".test.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
ret = assemble_jwt_from_dns (&msg_handle, 3, jwt_token);
|
||||
assert_int_equal (ret, 0);
|
||||
|
||||
ret = strcmp (dns_jwt_test, jwt_token);
|
||||
assert_int_equal (ret, 0);
|
||||
|
||||
ret = get_dns_text (".err5.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
ret = assemble_jwt_from_dns (&msg_handle, 3, jwt_token);
|
||||
assert_int_equal (ret, -1);
|
||||
|
||||
}
|
||||
|
||||
void test_query_dns ()
|
||||
{
|
||||
int ret;
|
||||
char jwt_buf[8192];
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
ret = query_dns (txt_record_id, jwt_buf);
|
||||
assert_int_equal (ret, 0);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
//expect_function_call (__res_nclose);
|
||||
|
||||
ret = query_dns (".nosuch.", jwt_buf);
|
||||
assert_int_equal (ret, -1);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
ret = query_dns (".err5.", jwt_buf);
|
||||
assert_int_equal (ret, -1);
|
||||
}
|
||||
|
||||
void test_allow_insecure_conn ()
|
||||
{
|
||||
int insecure;
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "test", sizeof(cfg->dns_id));
|
||||
parStrncpy (cfg->jwt_algo, "none:RS256", sizeof(cfg->jwt_algo));
|
||||
|
||||
read_key_from_file ("../../tests/webpa-rs256.pem", cfg->jwt_key, 4096);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn ();
|
||||
assert_int_equal (insecure, 0);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "err5", sizeof(cfg->dns_id));
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn ();
|
||||
assert_int_equal (insecure, TOKEN_ERR_QUERY_DNS_FAIL);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "test", sizeof(cfg->dns_id));
|
||||
parStrncpy (cfg->jwt_algo, "none:RS256", sizeof(cfg->jwt_algo));
|
||||
parStrncpy (cfg->jwt_key, "xxxxxxxxxx", sizeof(cfg->jwt_key));
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn ();
|
||||
assert_int_equal (insecure, TOKEN_ERR_JWT_DECODE_FAIL);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "test", sizeof(cfg->dns_id));
|
||||
parStrncpy (cfg->jwt_algo, "none:RS512", sizeof(cfg->jwt_algo));
|
||||
read_key_from_file ("../../tests/webpa-rs256.pem", cfg->jwt_key, 4096);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn ();
|
||||
assert_int_equal (insecure, TOKEN_ERR_ALGO_NOT_ALLOWED);
|
||||
|
||||
}
|
||||
|
||||
void test_get_tok()
|
||||
{
|
||||
const char *str0 = "";
|
||||
const char *str1 = "none";
|
||||
const char *str2 = "none:rs256";
|
||||
char result[20];
|
||||
const char *next;
|
||||
|
||||
next = get_tok (str0, ':', result, 20);
|
||||
assert_ptr_equal (next, NULL);
|
||||
assert_int_equal ((int) result[0], 0);
|
||||
|
||||
next = get_tok (str1, ':', result, 20);
|
||||
assert_string_equal (result, "none");
|
||||
assert_ptr_equal (next, NULL);
|
||||
|
||||
next = get_tok (str2, ':', result, 20);
|
||||
assert_string_equal (result, "none");
|
||||
next = get_tok (next, ':', result, 20);
|
||||
assert_string_equal (result, "rs256");
|
||||
assert_ptr_equal (next, NULL);
|
||||
}
|
||||
|
||||
void test_get_algo_mask ()
|
||||
{
|
||||
unsigned mask;
|
||||
|
||||
mask = get_algo_mask ("none");
|
||||
assert_int_equal ((int) mask, 1);
|
||||
|
||||
mask = get_algo_mask ("none:rs256");
|
||||
assert_int_equal ((int) mask, 1025);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_analyze_jwt),
|
||||
cmocka_unit_test(test_validate_algo),
|
||||
cmocka_unit_test(test_nquery),
|
||||
cmocka_unit_test(test_valid_b64_char),
|
||||
cmocka_unit_test(test_strip_rrdata),
|
||||
cmocka_unit_test(test_find_seq_num),
|
||||
cmocka_unit_test(test_get_rr_seq_num),
|
||||
cmocka_unit_test(test_get_rr_seq_table),
|
||||
cmocka_unit_test(test_assemble_jwt_from_dns),
|
||||
cmocka_unit_test(test_query_dns),
|
||||
cmocka_unit_test(test_allow_insecure_conn),
|
||||
cmocka_unit_test(test_get_tok),
|
||||
cmocka_unit_test(test_get_algo_mask),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
52
tests/test_token_stub.c
Normal file
52
tests/test_token_stub.c
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <CUnit/Basic.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "../src/token.h"
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void test_allow_insecure_conn ()
|
||||
{
|
||||
int insecure;
|
||||
insecure = allow_insecure_conn ();
|
||||
assert_int_equal (insecure, 1);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_allow_insecure_conn),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ size_t appendEncodedData( void **appendData, void *encodedBuffer, size_t encoded
|
||||
(void) encodedBuffer; (void) encodedSize; (void) metadataPack; (void) metadataSize;
|
||||
function_called();
|
||||
char *data = (char *) malloc (sizeof(char) * 100);
|
||||
strcpy(data, "AAAAAAAAYYYYIGkYTUYFJH");
|
||||
parStrncpy(data, "AAAAAAAAYYYYIGkYTUYFJH", 100);
|
||||
*appendData = data;
|
||||
return (size_t)mock();
|
||||
}
|
||||
@@ -340,8 +340,8 @@ void test_processUpstreamMessageRegMsg()
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
@@ -400,8 +400,8 @@ void test_processUpstreamMessageRegMsgNoClients()
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
@@ -496,11 +496,11 @@ void err_processUpstreamMessageRegMsg()
|
||||
UpStreamMsgQ->next->next = NULL;
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
head->next = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
strcpy(head->next->service_name, "iot");
|
||||
strcpy(head->next->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->next->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->next->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
head->next->next = NULL;
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
|
||||
9
tests/webpa-rs256.pem
Normal file
9
tests/webpa-rs256.pem
Normal file
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkZeQUMqDkMu/dQgTcycJ
|
||||
/rrgqfKQkoYFTMO7GnK87/OWiftHmtDJYPgktlcHheOPfkGln5ay1WJSitmtWNaH
|
||||
+RvBFK/ZsXpIuGm7R6wdSc7e6g9fTaSAfNX/+a8VxHUo58AinXxcq4LnHbuaGjEz
|
||||
jw77TLuZGyUuHiany8O8tc+DbnYKvRquScsccI6z/QwZKFtXUjJZ91hJ97zC8o7N
|
||||
Ae7n/Jg+Bs0uz9c1/bf/Jqbu6OidFbCr2FN42UupuAZ8DiPp2fWD5Q9qmp1ADk+V
|
||||
+TeZPxTCq/WB4dzSCd5v/FvFmO8tH6Ptkltij4pke7Dsi80TVRlcMDXAWxSFXOQV
|
||||
qwIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
Reference in New Issue
Block a user