From aec9fdd08624196245c9cde66597adc1dc24c605 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sun, 10 Mar 2019 00:06:13 +0100 Subject: [PATCH 1/4] makes wsfs_server_config opaque --- example/daemon/main.c | 45 +++++++---------- include/wsfs/adapter/server_config.h | 42 ++++++++++------ lib/wsfs/adapter/server.c | 2 +- lib/wsfs/adapter/server_config.c | 67 ++++++++++++++++++++++++- lib/wsfs/adapter/server_config_intern.h | 35 +++++++++++++ test/test_server.cc | 7 +-- 6 files changed, 150 insertions(+), 48 deletions(-) create mode 100644 lib/wsfs/adapter/server_config_intern.h diff --git a/example/daemon/main.c b/example/daemon/main.c index 0964674..387e231 100644 --- a/example/daemon/main.c +++ b/example/daemon/main.c @@ -12,7 +12,7 @@ struct args { - struct wsfs_server_config config; + struct wsfs_server_config * config; bool show_help; }; @@ -53,6 +53,7 @@ static int parse_arguments(int argc, char * argv[], struct args * args) bool result = EXIT_SUCCESS; bool finished = false; + bool has_mountpoint = false; while ((!finished) && (EXIT_SUCCESS == result)) { int option_index = 0; @@ -68,27 +69,23 @@ static int parse_arguments(int argc, char * argv[], struct args * args) finished = true; break; case 'm': - free(args->config.mount_point); - args->config.mount_point = strdup(optarg); + wsfs_server_config_set_mountpoint(args->config, optarg); + has_mountpoint = true; break; case 'd': - free(args->config.document_root); - args->config.document_root = strdup(optarg); + wsfs_server_config_set_documentroot(args->config, optarg); break; case 'c': - free(args->config.cert_path); - args->config.cert_path = strdup(optarg); + wsfs_server_config_set_certpath(args->config, optarg); break; case 'k': - free(args->config.key_path); - args->config.key_path = strdup(optarg); + wsfs_server_config_set_keypath(args->config, optarg); break; case 'n': - free(args->config.vhost_name); - args->config.vhost_name = strdup(optarg); + wsfs_server_config_set_vhostname(args->config, optarg); break; case 'p': - args->config.port = atoi(optarg); + wsfs_server_config_set_port(args->config, atoi(optarg)); break; default: fprintf(stderr, "error: unknown argument\n"); @@ -99,7 +96,7 @@ static int parse_arguments(int argc, char * argv[], struct args * args) if ((EXIT_SUCCESS == result) && (!args->show_help)) { - if (NULL == args->config.mount_point) + if (!has_mountpoint) { fprintf(stderr, "error: missing mount point\n"); result = EXIT_FAILURE; @@ -123,26 +120,18 @@ static void on_interrupt(int signal_id) int main(int argc, char * argv[]) { - struct args args = - { - .config = - { - .mount_point = NULL, - .document_root = NULL, - .cert_path = NULL, - .key_path = NULL, - .vhost_name = strdup("localhost"), - .port = 8080, - }, - .show_help = 0 - }; + struct args args; + args.config = wsfs_server_config_create(); + wsfs_server_config_set_vhostname(args.config, "localhost"); + wsfs_server_config_set_port(args.config, 8080); + args.show_help = false; int result = parse_arguments(argc, argv, &args); if (!args.show_help) { signal(SIGINT, on_interrupt); - server = wsfs_server_create(&args.config); + server = wsfs_server_create(args.config); if (NULL != server) { wsfs_server_run(server); @@ -159,7 +148,7 @@ int main(int argc, char * argv[]) show_help(); } - wsfs_server_config_cleanup(&args.config); + wsfs_server_config_dispose(args.config); return result; } diff --git a/include/wsfs/adapter/server_config.h b/include/wsfs/adapter/server_config.h index 27c3bbe..b6d9b7e 100644 --- a/include/wsfs/adapter/server_config.h +++ b/include/wsfs/adapter/server_config.h @@ -3,30 +3,42 @@ #include "wsfs/adapter/api.h" -struct wsfs_server_config -{ - char * mount_point; - char * document_root; - char * key_path; - char * cert_path; - char * vhost_name; - int port; -}; +struct wsfs_server_config; #ifdef __cplusplus extern "C" { #endif -extern WSFSA_API void wsfs_server_config_init( +extern WSFSA_API struct wsfs_server_config * wsfs_server_config_create(void); + +extern WSFSA_API void wsfs_server_config_dispose( struct wsfs_server_config * config); -extern WSFSA_API void wsfs_server_config_cleanup( - struct wsfs_server_config * config); -extern WSFSA_API void wsfs_server_config_clone( - struct wsfs_server_config * config, - struct wsfs_server_config * clone); +extern WSFSA_API void wsfs_server_config_set_mountpoint( + struct wsfs_server_config * config, + char const * mount_point); + +extern WSFSA_API void wsfs_server_config_set_documentroot( + struct wsfs_server_config * config, + char const * document_root); + +extern WSFSA_API void wsfs_server_config_set_keypath( + struct wsfs_server_config * config, + char const * key_path); + +extern WSFSA_API void wsfs_server_config_set_certpath( + struct wsfs_server_config * config, + char const * cert_path); + +extern WSFSA_API void wsfs_server_config_set_vhostname( + struct wsfs_server_config * config, + char const * vhost_name); + +extern WSFSA_API void wsfs_server_config_set_port( + struct wsfs_server_config * config, + int port); #ifdef __cplusplus } diff --git a/lib/wsfs/adapter/server.c b/lib/wsfs/adapter/server.c index 2590f0d..31da29d 100644 --- a/lib/wsfs/adapter/server.c +++ b/lib/wsfs/adapter/server.c @@ -4,7 +4,7 @@ #include #include -#include "wsfs/adapter/server_config.h" +#include "wsfs/adapter/server_config_intern.h" #include "wsfs/adapter/server_protocol_intern.h" #define WSFS_DISABLE_LWS_LOG 0 diff --git a/lib/wsfs/adapter/server_config.c b/lib/wsfs/adapter/server_config.c index 8f88a17..13e1f37 100644 --- a/lib/wsfs/adapter/server_config.c +++ b/lib/wsfs/adapter/server_config.c @@ -1,4 +1,4 @@ -#include "wsfs/adapter/server_config.h" +#include "wsfs/adapter/server_config_intern.h" #include #include @@ -43,3 +43,68 @@ void wsfs_server_config_clone( clone->vhost_name = wsfs_server_config_strdup(config->vhost_name); clone->port = config->port; } + +struct wsfs_server_config * wsfs_server_config_create(void) +{ + struct wsfs_server_config * config = malloc(sizeof(struct wsfs_server_config)); + if (NULL != config) + { + wsfs_server_config_init(config); + } + + return config; +} + +void wsfs_server_config_dispose( + struct wsfs_server_config * config) +{ + wsfs_server_config_cleanup(config); + free(config); +} + +void wsfs_server_config_set_mountpoint( + struct wsfs_server_config * config, + char const * mount_point) +{ + free(config->mount_point); + config->mount_point = strdup(mount_point); +} + +void wsfs_server_config_set_documentroot( + struct wsfs_server_config * config, + char const * document_root) +{ + free(config->document_root); + config->document_root = strdup(document_root); +} + +void wsfs_server_config_set_keypath( + struct wsfs_server_config * config, + char const * key_path) +{ + free(config->key_path); + config->key_path = strdup(key_path); +} + +void wsfs_server_config_set_certpath( + struct wsfs_server_config * config, + char const * cert_path) +{ + free(config->cert_path); + config->cert_path = strdup(cert_path); +} + +void wsfs_server_config_set_vhostname( + struct wsfs_server_config * config, + char const * vhost_name) +{ + free(config->vhost_name); + config->vhost_name = strdup(vhost_name); +} + +void wsfs_server_config_set_port( + struct wsfs_server_config * config, + int port) +{ + config->port = port; +} diff --git a/lib/wsfs/adapter/server_config_intern.h b/lib/wsfs/adapter/server_config_intern.h new file mode 100644 index 0000000..941ac8a --- /dev/null +++ b/lib/wsfs/adapter/server_config_intern.h @@ -0,0 +1,35 @@ +#ifndef WSFS_ADAPTER_SERVER_CONFIG_INTERN_H +#define WSFS_ADAPTER_SERVER_CONFIG_INTERN_H + +#include "wsfs/adapter/server_config.h" + +struct wsfs_server_config +{ + char * mount_point; + char * document_root; + char * key_path; + char * cert_path; + char * vhost_name; + int port; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern void wsfs_server_config_init( + struct wsfs_server_config * config); + +extern void wsfs_server_config_cleanup( + struct wsfs_server_config * config); + +extern void wsfs_server_config_clone( + struct wsfs_server_config * config, + struct wsfs_server_config * clone); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/test/test_server.cc b/test/test_server.cc index 965852e..a5625c5 100644 --- a/test/test_server.cc +++ b/test/test_server.cc @@ -13,12 +13,13 @@ TEST(server, create_dispose) { mkdir("test", 0700); - struct wsfs_server_config config = {strdup("test"), nullptr, nullptr, nullptr, nullptr, 0}; - struct wsfs_server * server = wsfs_server_create(&config); + struct wsfs_server_config * config = wsfs_server_config_create(); + wsfs_server_config_set_mountpoint(config, "test"); + struct wsfs_server * server = wsfs_server_create(config); ASSERT_NE(nullptr, server); wsfs_server_dispose(server); - wsfs_server_config_cleanup(&config); + wsfs_server_config_dispose(config); rmdir("test"); } \ No newline at end of file From bbcb974363ab8548351798a18f6502d4f13b332c Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Mon, 11 Mar 2019 23:21:49 +0100 Subject: [PATCH 2/4] feature: try to create mount point, if not present --- lib/wsfs/adapter/server.c | 57 +++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/lib/wsfs/adapter/server.c b/lib/wsfs/adapter/server.c index 31da29d..cb1beec 100644 --- a/lib/wsfs/adapter/server.c +++ b/lib/wsfs/adapter/server.c @@ -4,6 +4,10 @@ #include #include +#include +#include +#include + #include "wsfs/adapter/server_config_intern.h" #include "wsfs/adapter/server_protocol_intern.h" @@ -74,24 +78,49 @@ static struct lws_context * wsfs_server_context_create( } +static bool wsfs_server_check_mountpoint( + struct wsfs_server_config * config) +{ + bool result = false; + + if (NULL != config->mount_point) + { + struct stat info; + int const rc = stat(config->mount_point, &info); + bool const isDir = ((0 == rc) && (S_ISDIR(info.st_mode))); + + if (!isDir) + { + result = (0 == mkdir(config->mount_point, 0755)); + } + } + + return result; +} + struct wsfs_server * wsfs_server_create( struct wsfs_server_config * config) { - struct wsfs_server * server = malloc(sizeof(struct wsfs_server)); - if (NULL != server) - { - if (wsfs_server_protocol_init(&server->protocol, config->mount_point)) + struct wsfs_server * server = NULL; + + if (wsfs_server_check_mountpoint(config)) + { + server = malloc(sizeof(struct wsfs_server)); + if (NULL != server) { - server->shutdown_requested = false; - wsfs_server_config_clone(config, &server->config); - server->context = wsfs_server_context_create(server); - } - else - { - free(server); - server = NULL; - } - } + if (wsfs_server_protocol_init(&server->protocol, config->mount_point)) + { + server->shutdown_requested = false; + wsfs_server_config_clone(config, &server->config); + server->context = wsfs_server_context_create(server); + } + else + { + free(server); + server = NULL; + } + } + } return server; } From eeb67203102bf79eb9ca7b3b50d04d06a3f04319 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Tue, 12 Mar 2019 15:35:56 +0100 Subject: [PATCH 3/4] fixes server start failure due to existing mountpoint --- lib/wsfs/adapter/server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/wsfs/adapter/server.c b/lib/wsfs/adapter/server.c index cb1beec..5f1631b 100644 --- a/lib/wsfs/adapter/server.c +++ b/lib/wsfs/adapter/server.c @@ -87,9 +87,9 @@ static bool wsfs_server_check_mountpoint( { struct stat info; int const rc = stat(config->mount_point, &info); - bool const isDir = ((0 == rc) && (S_ISDIR(info.st_mode))); + result = ((0 == rc) && (S_ISDIR(info.st_mode))); - if (!isDir) + if (!result) { result = (0 == mkdir(config->mount_point, 0755)); } From 60ab76aa8177120002e418e1ca8da3cda98297d8 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sun, 17 Mar 2019 10:26:07 +0100 Subject: [PATCH 4/4] added basic authentication infrastructure --- CMakeLists.txt | 7 +- include/wsfs/adapter/authenticate.h | 15 ++++ include/wsfs/adapter/credentials.h | 25 ++++++ include/wsfs/adapter/server_config.h | 8 ++ include/wsfs_adapter.h | 2 + lib/wsfs/adapter/authenticator.c | 49 ++++++++++++ lib/wsfs/adapter/authenticator.h | 40 ++++++++++ lib/wsfs/adapter/authenticators.c | 101 ++++++++++++++++++++++++ lib/wsfs/adapter/authenticators.h | 38 +++++++++ lib/wsfs/adapter/credentials.c | 40 ++++++++++ lib/wsfs/adapter/credentials_intern.h | 30 +++++++ lib/wsfs/adapter/server_config.c | 16 ++++ lib/wsfs/adapter/server_config_intern.h | 2 + lib/wsfs/provider/operation/getattr.c | 2 +- 14 files changed, 372 insertions(+), 3 deletions(-) create mode 100644 include/wsfs/adapter/authenticate.h create mode 100644 include/wsfs/adapter/credentials.h create mode 100644 lib/wsfs/adapter/authenticator.c create mode 100644 lib/wsfs/adapter/authenticator.h create mode 100644 lib/wsfs/adapter/authenticators.c create mode 100644 lib/wsfs/adapter/authenticators.h create mode 100644 lib/wsfs/adapter/credentials.c create mode 100644 lib/wsfs/adapter/credentials_intern.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c017d3e..184d20e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,11 @@ install(FILES include/wsfs/status.h DESTINATION include/wsfs) set(WSFS_ADAPTER_SOURCES lib/wsfs/adapter/filesystem.c lib/wsfs/adapter/server.c + lib/wsfs/adapter/server_config.c + lib/wsfs/adapter/server_protocol.c + lib/wsfs/adapter/authenticator.c + lib/wsfs/adapter/authenticators.c + lib/wsfs/adapter/credentials.c lib/wsfs/adapter/time/timepoint.c lib/wsfs/adapter/time/timer.c lib/wsfs/adapter/time/timeout_manager.c @@ -65,8 +70,6 @@ set(WSFS_ADAPTER_SOURCES lib/wsfs/adapter/operation/open.c lib/wsfs/adapter/operation/close.c lib/wsfs/adapter/operation/read.c - lib/wsfs/adapter/server_config.c - lib/wsfs/adapter/server_protocol.c lib/wsfs/adapter/jsonrpc/server.c lib/wsfs/adapter/jsonrpc/method.c lib/wsfs/adapter/jsonrpc/request.c diff --git a/include/wsfs/adapter/authenticate.h b/include/wsfs/adapter/authenticate.h new file mode 100644 index 0000000..9e630ee --- /dev/null +++ b/include/wsfs/adapter/authenticate.h @@ -0,0 +1,15 @@ +#ifndef WSFS_ADAPTER_AUTHENTICATE_H +#define WSFS_ADAPTER_AUTHENTICATE_H + +#ifndef __cplusplus +#include +#endif + +struct wsfs_credentials; + +typedef bool wsfs_authenticate_fn( + struct wsfs_credentials * credentials, + void * user_data); + + +#endif diff --git a/include/wsfs/adapter/credentials.h b/include/wsfs/adapter/credentials.h new file mode 100644 index 0000000..747b107 --- /dev/null +++ b/include/wsfs/adapter/credentials.h @@ -0,0 +1,25 @@ +#ifndef WSFS_ADAPTER_CREDENTIALS_H +#define WSFS_ADAPTER_CREDENTIALS_H + +#include "wsfs/adapter/api.h" + +struct wsfs_credentials; + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern WSFSA_API char const * wsfs_credentials_type( + struct wsfs_credentials const * credentials); + +extern WSFSA_API char const * wsfs_credentials_get( + struct wsfs_credentials const * credentials, + char const * key); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/include/wsfs/adapter/server_config.h b/include/wsfs/adapter/server_config.h index b6d9b7e..df4966e 100644 --- a/include/wsfs/adapter/server_config.h +++ b/include/wsfs/adapter/server_config.h @@ -2,6 +2,7 @@ #define WSFS_ADAPTER_SERVER_CONFIG_H #include "wsfs/adapter/api.h" +#include "wsfs/adapter/authenticate.h" struct wsfs_server_config; @@ -40,6 +41,13 @@ extern WSFSA_API void wsfs_server_config_set_port( struct wsfs_server_config * config, int port); +extern WSFSA_API void wsfs_server_add_authenticator( + struct wsfs_server_config * config, + char const * type, + wsfs_authenticate_fn * authenticate, + void * user_data +); + #ifdef __cplusplus } #endif diff --git a/include/wsfs_adapter.h b/include/wsfs_adapter.h index 6a812a3..6900f13 100644 --- a/include/wsfs_adapter.h +++ b/include/wsfs_adapter.h @@ -7,5 +7,7 @@ #include #include #include +#include +#include #endif diff --git a/lib/wsfs/adapter/authenticator.c b/lib/wsfs/adapter/authenticator.c new file mode 100644 index 0000000..04f1c60 --- /dev/null +++ b/lib/wsfs/adapter/authenticator.c @@ -0,0 +1,49 @@ +#include "wsfs/adapter/authenticator.h" + +#include +#include + +#include "wsfs/adapter/credentials_intern.h" + +struct wsfs_authenticator * wsfs_authenticator_create( + char const * type, + wsfs_authenticate_fn * authenticate, + void * user_data) +{ + struct wsfs_authenticator * authenticator = malloc(sizeof(struct wsfs_authenticator)); + if (NULL != authenticator) + { + authenticator->type = strdup(type); + authenticator->authenticate = authenticate; + authenticator->user_data = user_data; + authenticator->next = NULL; + } + + return authenticator; +} + +void wsfs_authenticator_dispose( + struct wsfs_authenticator * authenticator) +{ + free(authenticator->type); + free(authenticator); +} + +bool wsfs_authenticator_autenticate( + struct wsfs_authenticator * authenticator, + struct wsfs_credentials * credentials) +{ + bool result; + + if (0 == strcmp(authenticator->type, credentials->type)) + { + result = authenticator->authenticate(credentials, authenticator->user_data); + } + else + { + result = false; + } + + + return result; +} \ No newline at end of file diff --git a/lib/wsfs/adapter/authenticator.h b/lib/wsfs/adapter/authenticator.h new file mode 100644 index 0000000..585cc24 --- /dev/null +++ b/lib/wsfs/adapter/authenticator.h @@ -0,0 +1,40 @@ +#ifndef WSFS_ADAPTER_AUTHENTICATOR_H +#define WSFS_ADAPTER_AUTHENTICATOR_H + +#ifndef __cplusplus +#include +#endif + +#include "wsfs/adapter/authenticate.h" + +struct wsfs_authenticator +{ + char * type; + wsfs_authenticate_fn * authenticate; + void * user_data; + struct wsfs_authenticator * next; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern struct wsfs_authenticator * wsfs_authenticator_create( + char const * type, + wsfs_authenticate_fn * authenticate, + void * user_data); + +extern void wsfs_authenticator_dispose( + struct wsfs_authenticator * authenticator); + +extern bool wsfs_authenticator_autenticate( + struct wsfs_authenticator * authenticator, + struct wsfs_credentials * credentials); + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/lib/wsfs/adapter/authenticators.c b/lib/wsfs/adapter/authenticators.c new file mode 100644 index 0000000..aa59809 --- /dev/null +++ b/lib/wsfs/adapter/authenticators.c @@ -0,0 +1,101 @@ +#include "wsfs/adapter/authenticators.h" +#include +#include + +#include "wsfs/adapter/authenticator.h" +#include "wsfs/adapter/credentials_intern.h" + +static struct wsfs_authenticator * wsfs_authenticators_find( + struct wsfs_authenticators * authenticators, + char const * type) +{ + struct wsfs_authenticator * result = NULL; + + struct wsfs_authenticator * actual = authenticators->first; + while ((NULL == result) && (NULL != actual)) + { + struct wsfs_authenticator * next = actual->next; + if (0 == strcmp(type, actual->type)) + { + result = actual; + } + + actual = next; + } + + return result; +} + +void wsfs_authenticators_init( + struct wsfs_authenticators * authenticators) +{ + authenticators->first = NULL; +} + +void wsfs_authenticators_cleanup( + struct wsfs_authenticators * authenticators) +{ + struct wsfs_authenticator * actual = authenticators->first; + while (NULL != actual) + { + struct wsfs_authenticator * next = actual->next; + wsfs_authenticator_dispose(actual); + actual = next; + } + + authenticators->first = NULL; +} + +void wsfs_authenticators_clone( + struct wsfs_authenticators * authenticators, + struct wsfs_authenticators * other) +{ + wsfs_authenticators_init(other); + + struct wsfs_authenticator * actual = authenticators->first; + while (NULL != actual) + { + struct wsfs_authenticator * next = actual->next; + wsfs_authenticators_add(other, + actual->type, actual->authenticate, actual->user_data); + actual = next; + } + +} + +void wsfs_authenticators_add( + struct wsfs_authenticators * authenticators, + char const * type, + wsfs_authenticate_fn * authenticate, + void * user_data) +{ + struct wsfs_authenticator * authenticator = wsfs_authenticator_create(type, authenticate, user_data); + authenticator->next = authenticators->first; + authenticators->first = authenticator; +} + +bool wsfs_authenticators_authenticate( + struct wsfs_authenticators * authenticators, + struct wsfs_credentials * credentials) +{ + bool result; + + if (NULL != credentials) + { + struct wsfs_authenticator * authenticator = wsfs_authenticators_find(authenticators, credentials->type); + if (NULL != authenticator) + { + result = wsfs_authenticator_autenticate(authenticator, credentials); + } + else + { + result = false; + } + } + else + { + result = (NULL == authenticators->first); + } + + return result; +} \ No newline at end of file diff --git a/lib/wsfs/adapter/authenticators.h b/lib/wsfs/adapter/authenticators.h new file mode 100644 index 0000000..c7cadf6 --- /dev/null +++ b/lib/wsfs/adapter/authenticators.h @@ -0,0 +1,38 @@ +#ifndef WSFS_ADAPTER_AUTHENTICATORS_H +#define WSFS_ADAPTER_AUTHENTICATORS_H + +#ifndef __cplusplus +#include +#endif + +#include "wsfs/adapter/authenticate.h" + +struct wsfs_authenticator; +struct wsfs_credentials; + +struct wsfs_authenticators +{ + struct wsfs_authenticator * first; +}; + +extern void wsfs_authenticators_init( + struct wsfs_authenticators * authenticators); + +extern void wsfs_authenticators_cleanup( + struct wsfs_authenticators * authenticators); + +extern void wsfs_authenticators_clone( + struct wsfs_authenticators * authenticators, + struct wsfs_authenticators * other); + +extern void wsfs_authenticators_add( + struct wsfs_authenticators * authenticators, + char const * type, + wsfs_authenticate_fn * authenticate, + void * user_data); + +extern bool wsfs_authenticators_authenticate( + struct wsfs_authenticators * authenticators, + struct wsfs_credentials * credentials); + +#endif diff --git a/lib/wsfs/adapter/credentials.c b/lib/wsfs/adapter/credentials.c new file mode 100644 index 0000000..40df93f --- /dev/null +++ b/lib/wsfs/adapter/credentials.c @@ -0,0 +1,40 @@ +#include "wsfs/adapter/credentials_intern.h" +#include + +void wsfs_credentials_init( + struct wsfs_credentials * credentials, + char const * type, + json_t * data) +{ + credentials->type = strdup(type); + credentials->data = data; + json_incref(credentials->data); +} + +void wsfs_credentails_cleanup( + struct wsfs_credentials * credentials) +{ + free(credentials->type); + json_decref(credentials->data); +} + +char const * wsfs_credentials_type( + struct wsfs_credentials const * credentials) +{ + return credentials->type; +} + +char const * wsfs_credentials_get( + struct wsfs_credentials const * credentials, + char const * key) +{ + char const * result = NULL; + + json_t * value_holder = json_object_get(credentials->data, key); + if (json_is_string(value_holder)) + { + result = json_string_value(value_holder); + } + + return result; +} diff --git a/lib/wsfs/adapter/credentials_intern.h b/lib/wsfs/adapter/credentials_intern.h new file mode 100644 index 0000000..d0c6f44 --- /dev/null +++ b/lib/wsfs/adapter/credentials_intern.h @@ -0,0 +1,30 @@ +#ifndef WSFS_ADAPTER_CREDENTIALS_INTERN_H +#define WSFS_ADAPTER_CREDENTIALS_INTERN_H + +#include "wsfs/adapter/credentials.h" +#include + +struct wsfs_credentials +{ + char * type; + json_t * data; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern void wsfs_credentials_init( + struct wsfs_credentials * credentials, + char const * type, + json_t * data); + +extern void wsfs_credentails_cleanup( + struct wsfs_credentials * credentials); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/lib/wsfs/adapter/server_config.c b/lib/wsfs/adapter/server_config.c index 13e1f37..d4602bd 100644 --- a/lib/wsfs/adapter/server_config.c +++ b/lib/wsfs/adapter/server_config.c @@ -18,11 +18,15 @@ void wsfs_server_config_init( struct wsfs_server_config * config) { memset(config, 0, sizeof(struct wsfs_server_config)); + + wsfs_authenticators_init(&config->authenticators); } void wsfs_server_config_cleanup( struct wsfs_server_config * config) { + wsfs_authenticators_cleanup(&config->authenticators); + free(config->mount_point); free(config->document_root); free(config->key_path); @@ -42,6 +46,8 @@ void wsfs_server_config_clone( clone->cert_path = wsfs_server_config_strdup(config->cert_path); clone->vhost_name = wsfs_server_config_strdup(config->vhost_name); clone->port = config->port; + + wsfs_authenticators_clone(&config->authenticators, &clone->authenticators); } struct wsfs_server_config * wsfs_server_config_create(void) @@ -108,3 +114,13 @@ void wsfs_server_config_set_port( { config->port = port; } + +void wsfs_server_add_authenticator( + struct wsfs_server_config * config, + char const * type, + wsfs_authenticate_fn * authenticate, + void * user_data +) +{ + wsfs_authenticators_add(&config->authenticators, type, authenticate, user_data); +} \ No newline at end of file diff --git a/lib/wsfs/adapter/server_config_intern.h b/lib/wsfs/adapter/server_config_intern.h index 941ac8a..2ae0a2f 100644 --- a/lib/wsfs/adapter/server_config_intern.h +++ b/lib/wsfs/adapter/server_config_intern.h @@ -2,6 +2,7 @@ #define WSFS_ADAPTER_SERVER_CONFIG_INTERN_H #include "wsfs/adapter/server_config.h" +#include "wsfs/adapter/authenticators.h" struct wsfs_server_config { @@ -11,6 +12,7 @@ struct wsfs_server_config char * cert_path; char * vhost_name; int port; + struct wsfs_authenticators authenticators; }; #ifdef __cplusplus diff --git a/lib/wsfs/provider/operation/getattr.c b/lib/wsfs/provider/operation/getattr.c index c4be838..90aefa0 100644 --- a/lib/wsfs/provider/operation/getattr.c +++ b/lib/wsfs/provider/operation/getattr.c @@ -32,7 +32,7 @@ void wsfsp_getattr_default( ino_t WSFS_UNUSED_PARAM(inode), void * WSFS_UNUSED_PARAM(user_data)) { - wsfsp_respond_error(request, -1); + wsfsp_respond_error(request, WSFS_BAD_NOENTRY); } void wsfsp_respond_getattr(