aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorFulup Ar Foll <fulup@iot.bzh>2015-12-12 03:10:34 +0100
committerFulup Ar Foll <fulup@iot.bzh>2015-12-12 03:10:34 +0100
commite7c246a1b0d30b8156c7033061a61ecb5d2bdfc8 (patch)
treeeedbde29dfd073934c6b985d6cb213621708cd51 /include
parent335eeec7aaf944d66cac87b5bb3f64f8fc7e385e (diff)
Added Session Management
Diffstat (limited to 'include')
-rw-r--r--include/local-def.h91
-rw-r--r--include/proto-def.h16
2 files changed, 74 insertions, 33 deletions
diff --git a/include/local-def.h b/include/local-def.h
index d8010c1c..df66a09e 100644
--- a/include/local-def.h
+++ b/include/local-def.h
@@ -39,6 +39,8 @@
#include <magic.h>
#include <setjmp.h>
#include <signal.h>
+#include <uuid/uuid.h>
+
@@ -49,7 +51,14 @@
// Note: because of a bug in libmagic MAGIC_DB NULL should not be used for default
#define MAGIC_DB "/usr/share/misc/magic.mgc"
#define OPA_INDEX "index.html"
-#define MAX_ALIAS 10 // max number of aliases
+#define MAX_ALIAS 10 // max number of aliases
+#define COOKIE_NAME "AJB_session"
+
+
+#define DEFLT_CNTX_TIMEOUT 3600 // default Client Connection Timeout
+#define DEFLT_API_TIMEOUT 0 // default Plugin API Timeout [0=NoLimit for Debug Only]
+#define DEFLT_API_TIMEOUT 0 // default Plugin API Timeout
+#define DEFLT_CACHE_TIMEOUT 100000 // default Static File Chache [Client Side Cache 100000~=1day]
typedef int BOOL;
#ifndef FALSE
@@ -63,6 +72,8 @@ typedef int BOOL;
#define STATIC static
#define FAILED -1
+extern int verbose; // this is the only global variable
+
// prebuild json error are constructed in config.c
typedef enum { AFB_FALSE, AFB_TRUE, AFB_FATAL, AFB_FAIL, AFB_WARNING, AFB_EMPTY, AFB_SUCCESS, AFB_DONE} AFB_error;
@@ -72,9 +83,11 @@ extern char *ERROR_LABEL[];
#define BANNER "<html><head><title>Application Framework Binder</title></head><body>Application Framework </body></html>"
#define JSON_CONTENT "application/json"
#define MAX_POST_SIZE 4096 // maximum size for POST data
+#define CTX_NBCLIENTS 10 // allow a default of 10 authenticated clients
// use to check anonymous data when using dynamic loadable lib
typedef enum {AFB_PLUGIN=1234, AFB_REQUEST=5678} AFB_type;
+typedef json_object* (*AFB_apiCB)();
// Error code are requested through function to manage json usage count
typedef struct {
@@ -101,24 +114,13 @@ typedef struct {
size_t len;
} AFB_aliasdir;
-
-// some usefull static object initialized when entering listen loop.
-extern int verbose;
-// MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "value");
-typedef struct {
- const char *url;
- char *plugin;
- char *api;
- char *post;
- json_object *jresp;
- struct MHD_Connection *connection;
- sigjmp_buf checkPluginCall; // context save for timeout set/longjmp
-} AFB_request;
-
+// Command line structure hold cli --command + help text
typedef struct {
- char *msg;
- size_t len;
-} AFB_redirect_msg;
+ int val; // command number within application
+ int has_arg; // command number within application
+ char *name; // command as used in --xxxx cli
+ char *help; // help text
+} AFB_options;
// main config structure
typedef struct {
@@ -134,36 +136,64 @@ typedef struct {
char *pidfile; // where to store pid when running background
char *sessiondir; // where to store mixer session files
char *configfile; // where to store configuration on gateway exit
- uid_t setuid;
+ char *setuid;
int cacheTimeout;
int apiTimeout;
+ int cntxTimeout; // Client Session Context timeout
AFB_aliasdir *aliasdir; // alias mapping for icons,apps,...
} AFB_config;
-// Command line structure hold cli --command + help text
-typedef struct {
- int val; // command number within application
- int has_arg; // command number within application
- char *name; // command as used in --xxxx cli
- char *help; // help text
-} AFB_options;
+
typedef struct {
int len; // command number within application
json_object *jtype;
} AFB_privateApi;
-typedef json_object* (*AFB_apiCB)();
+
+typedef struct {
+ char *msg;
+ size_t len;
+} AFB_redirect_msg;
// API definition
typedef struct {
char *name;
AFB_apiCB callback;
char *info;
- void * handle;
AFB_privateApi *private;
} AFB_restapi;
+
+// User Client Session Context
+typedef struct {
+ int cid; // index 0 if global
+ char uuid[37]; // long term authentication of remote client
+ char token[37]; // short term authentication of remote client
+ time_t timeStamp; // last time token was refresh
+ int restfull; // client does not use cookie
+ void *handle; // application specific context
+ AFB_apiCB freeHandleCB; // callback to free application handle [null for standard free]
+} AFB_clientCtx;
+
+
+// MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "value");
+typedef struct {
+ const char *url;
+ char *plugin;
+ char *api;
+ char *post;
+ int loa;
+ json_object *jresp;
+ AFB_clientCtx *client; // needed because libmicrohttp cannot create an empty response
+ int restfull; // request is resfull [uuid token provided]
+ int errcode; // http error code
+ sigjmp_buf checkPluginCall; // context save for timeout set/longjmp
+ AFB_config *config; // plugin may need access to config
+ struct MHD_Connection *connection;
+} AFB_request;
+
+
// Plugin definition
typedef struct {
AFB_type type;
@@ -172,8 +202,12 @@ typedef struct {
size_t prefixlen;
json_object *jtype;
AFB_restapi *apis;
+ void *handle;
+ int ctxCount;
+ AFB_clientCtx *ctxGlobal;
} AFB_plugin;
+
typedef struct {
AFB_config *config; // pointer to current config
// List of commands to execute
@@ -192,4 +226,5 @@ typedef struct {
} AFB_session;
+
#include "proto-def.h"
diff --git a/include/proto-def.h b/include/proto-def.h
index f5b9f79c..25834524 100644
--- a/include/proto-def.h
+++ b/include/proto-def.h
@@ -22,7 +22,7 @@
// Rest-api
-PUBLIC json_object* apiPingTest(AFB_session *session, AFB_request *request, void* handle);
+PUBLIC json_object* apiPingTest(AFB_request *request);
PUBLIC const char* getQueryValue (AFB_request * request, char *name);
PUBLIC int getQueryAll(AFB_request * request, char *query, size_t len);
@@ -32,10 +32,10 @@ PUBLIC int doRestApi(struct MHD_Connection *connection, AFB_session *session, co
void initPlugins (AFB_session *session);
-typedef AFB_plugin* (*AFB_pluginCB)(AFB_session *session);
-PUBLIC AFB_plugin* afsvRegister (AFB_session *session);
-PUBLIC AFB_plugin* dbusRegister (AFB_session *session);
-PUBLIC AFB_plugin* alsaRegister (AFB_session *session);
+typedef AFB_plugin* (*AFB_pluginCB)();
+PUBLIC AFB_plugin* afsvRegister ();
+PUBLIC AFB_plugin* dbusRegister ();
+PUBLIC AFB_plugin* alsaRegister ();
PUBLIC AFB_plugin* radioRegister (AFB_session *session);
@@ -45,6 +45,12 @@ PUBLIC AFB_error sessionCheckdir (AFB_session *session);
PUBLIC json_object *sessionList (AFB_session *session, AFB_request *request);
PUBLIC json_object *sessionToDisk (AFB_session *session, AFB_request *request, char *name,json_object *jsonSession);
PUBLIC json_object *sessionFromDisk (AFB_session *session, AFB_request *request, char *name);
+PUBLIC char* ctxTokenRefresh (AFB_request *request);
+PUBLIC char* ctxTokenCreate (AFB_request *request);
+PUBLIC AFB_error ctxTokenCheck (AFB_request *request);
+PUBLIC int ctxTokenReset (AFB_request *request);
+PUBLIC int ctxClientGet (AFB_request *request);
+
// Httpd server