2 Copyright (c) 2014, McAfee, Inc.
6 Redistribution and use in source and binary forms, with or without modification,
7 are permitted provided that the following conditions are met:
9 Redistributions of source code must retain the above copyright notice, this list
10 of conditions and the following disclaimer.
12 Redistributions in binary form must reproduce the above copyright notice, this
13 list of conditions and the following disclaimer in the documentation and/or other
14 materials provided with the distribution.
16 Neither the name of McAfee, Inc. nor the names of its contributors may be used
17 to endorse or promote products derived from this software without specific prior
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
24 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
28 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
29 OF THE POSSIBILITY OF SUCH DAMAGE.
33 * \file TWPSerDaemon.c
34 * \brief TWP Service Daemon source file.
36 * This file implements the TWP Service Daemon functions used by Security framework.
45 #include "IpcForkDaemon.h"
47 #include "TWPSerDaemon.h"
49 #define RISK_LEVEL_LEN 2
50 #define RETURN_STATUS_STR_LEN 4
53 TWPSerGetVersion(void *pData, int req_argc, char **req_argv, char ***rep_argv, int *rep_argc,
54 CALLBACKFUNC callback, TSC_METHOD_HANDLE *handle)
56 // Opens TWP Framework library.
60 Init.api_version = TWPAPI_VERSION;
61 Init.memallocfunc = (TWPFnMemAlloc) malloc;
62 Init.memfreefunc = free;
63 hLib = TWPInitLibrary(&Init);
71 if (hLib == INVALID_TWPLIB_HANDLE)
73 iRes = TWP_INVALID_HANDLE;
77 // Get the Version Information of TWP Framework.
79 iRes = TWPGetVersion(hLib, &VerInfo);
81 // Check if TWPGetVersion call returned TWP_SUCCESS.
82 if (iRes != TWP_SUCCESS)
84 DERR("%s", "TWPGetVersion did not return TWP_SUCCESS\n");
88 DINFO("TWPGetVersion returns = %s %s\n", VerInfo.szFrameworkVer, VerInfo.szPluginVer);
90 char *szRepArgv1 = strdup(VerInfo.szFrameworkVer);
91 char *szRepArgv2 = strdup(VerInfo.szPluginVer);
92 char *szRepArgv3 = strdup(TWP_DAEMON_VERSION);
94 if (szRepArgv1 == NULL || szRepArgv2 == NULL || szRepArgv3 == NULL)
96 DERR("%s", "strdup fails to allocate mem for version info");
106 *rep_argv = (char **) malloc(sizeof(char*) * (*rep_argc));
108 if (*rep_argv == NULL)
110 DERR("%s", "malloc returns Error for reply pointer array\n");
120 (*rep_argv)[1] = szRepArgv1;
121 (*rep_argv)[2] = szRepArgv2;
122 (*rep_argv)[3] = szRepArgv3;
126 // Compose the return value.
127 // Convert iRes to String.
128 szRes = (char *) malloc(sizeof(char) * RETURN_STATUS_STR_LEN);
131 DERR("%s", "malloc returns error\n");
134 snprintf(szRes, RETURN_STATUS_STR_LEN, "%d", iRes);
138 *rep_argv = (char **) malloc (sizeof(char*) * 1);
139 if (*rep_argv == NULL)
143 //Assign result code.
144 (*rep_argv)[0] = szRes;
146 TWPUninitLibrary(hLib);
150 if (*rep_argv != NULL)
152 free((*rep_argv)[1]);
153 free((*rep_argv)[2]);
154 free((*rep_argv)[3]);
161 TWPUninitLibrary(hLib);
167 TWPSerGetURLReputation(void *pData, int req_argc, char **req_argv, char ***rep_argv, int *rep_argc,
168 CALLBACKFUNC callback, TSC_METHOD_HANDLE *handle)
170 // open TWP framework library
174 Init.api_version = TWPAPI_VERSION;
175 Init.memallocfunc = (TWPFnMemAlloc) malloc;
176 Init.memfreefunc = free;
177 hLib = TWPInitLibrary(&Init);
185 if (hLib == INVALID_TWPLIB_HANDLE)
187 iRes = TWP_INVALID_HANDLE;
193 unsigned int uBlkUrlLen;
194 char *pBlkUrl = NULL;
196 // Check for Risk Level of URL.
197 iRes = TWPCheckURL(hLib, req_argv[0], &pBlkUrl, &uBlkUrlLen, &iRiskLevel);
199 // Check if TWPCheckURL call returned TWP_SUCCESS.
200 if (iRes != TWP_SUCCESS)
202 DERR("%s : %s\n", "TWPCheckURL returned Error", req_argv[0]);
206 DINFO("TWPCheckURL returns risk level = %d\n", iRiskLevel);
208 // convert RiskLevel integer to string
210 szRiskLevel = (char *) malloc(sizeof(char) * RISK_LEVEL_LEN);
211 if (szRiskLevel == NULL)
213 DINFO("%s", "malloc returns error\n");
217 snprintf(szRiskLevel, RISK_LEVEL_LEN, "%d", iRiskLevel);
220 *rep_argv = (char **) malloc(sizeof(char*) * (*rep_argc));
221 if (*rep_argv == NULL)
223 DINFO("%s", "realloc returns Error for reply pointer array\n");
231 (*rep_argv)[1] = szRiskLevel;
233 // Assign redirect url if RiskLevel is greater than or equal to TWP_Medium
234 if (iRiskLevel >= TWP_Medium)
237 *rep_argv = (char **) realloc(*rep_argv, sizeof(char*) * (*rep_argc));
238 if (*rep_argv == NULL)
240 DINFO("%s", "realloc returns Error for reply pointer array\n");
246 (*rep_argv)[2] = pBlkUrl;
251 // Compose the return value.
252 // Convert iRes to String.
253 szRes = (char *) malloc(sizeof(char) * RETURN_STATUS_STR_LEN);
256 DERR("%s", "malloc returns error\n");
259 snprintf(szRes, RETURN_STATUS_STR_LEN, "%d", iRes);
263 *rep_argv = (char **) malloc (sizeof(char*) * 1);
264 if (*rep_argv == NULL)
268 (*rep_argv)[0] = szRes;
270 TWPUninitLibrary(hLib);
274 if (*rep_argv != NULL)
276 free((*rep_argv)[1]);
277 free((*rep_argv)[2]);
284 TWPUninitLibrary(hLib);
289 main(int argc, char **argv)
295 TSC_SERVER_HANDLE hServer;
297 if ((hServer = IpcServerOpen(TSC_DBUS_SERVER_WP_CHANNEL)) != NULL)
299 DINFO("%s", "successfully opened server \n");
301 // Register methods for get url reputation
302 IpcServerMethod method_1;
303 snprintf(method_1.szMethod, sizeof(method_1.szMethod), "%s", "TWPSerGetURLReputation");
304 method_1.method = (METHODFUNC) TWPSerGetURLReputation;
305 method_1.pData = NULL;
307 if (IpcServerAddMethod(hServer, &method_1) != 0)
309 DERR("%s", "unable to add method TWPSerGetURLReputation\n");
313 // Register methods for getversion
314 IpcServerMethod method_2;
315 snprintf(method_2.szMethod, sizeof(method_2.szMethod), "%s", "TWPSerGetVersion");
316 method_2.method = (METHODFUNC) TWPSerGetVersion;
317 method_2.pData = NULL;
319 if (IpcServerAddMethod(hServer, &method_2) != 0)
321 DERR("%s", "unable to add method TWPSerGetVersion\n");
325 // Daemon waits here for request from clients.
326 IpcServerMainLoop(hServer);
328 IpcServerClose(&hServer);
332 DFATAL("%s", "unable to open server connection \n");
339 IpcServerClose(&hServer);
342 DFATAL("%s", "Unable to start the Daemon \n");