mirror of
https://github.com/falk-werner/webfuse
synced 2025-06-13 12:54:15 +00:00
added basic authentication infrastructure
This commit is contained in:
parent
19e0834b0e
commit
78111e9055
@ -56,6 +56,11 @@ install(FILES include/wsfs/status.h DESTINATION include/wsfs)
|
|||||||
set(WSFS_ADAPTER_SOURCES
|
set(WSFS_ADAPTER_SOURCES
|
||||||
lib/wsfs/adapter/filesystem.c
|
lib/wsfs/adapter/filesystem.c
|
||||||
lib/wsfs/adapter/server.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/timepoint.c
|
||||||
lib/wsfs/adapter/time/timer.c
|
lib/wsfs/adapter/time/timer.c
|
||||||
lib/wsfs/adapter/time/timeout_manager.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/open.c
|
||||||
lib/wsfs/adapter/operation/close.c
|
lib/wsfs/adapter/operation/close.c
|
||||||
lib/wsfs/adapter/operation/read.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/server.c
|
||||||
lib/wsfs/adapter/jsonrpc/method.c
|
lib/wsfs/adapter/jsonrpc/method.c
|
||||||
lib/wsfs/adapter/jsonrpc/request.c
|
lib/wsfs/adapter/jsonrpc/request.c
|
||||||
|
15
include/wsfs/adapter/authenticate.h
Normal file
15
include/wsfs/adapter/authenticate.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef WSFS_ADAPTER_AUTHENTICATE_H
|
||||||
|
#define WSFS_ADAPTER_AUTHENTICATE_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#include <stdbool.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct wsfs_credentials;
|
||||||
|
|
||||||
|
typedef bool wsfs_authenticate_fn(
|
||||||
|
struct wsfs_credentials * credentials,
|
||||||
|
void * user_data);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
25
include/wsfs/adapter/credentials.h
Normal file
25
include/wsfs/adapter/credentials.h
Normal file
@ -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
|
@ -2,6 +2,7 @@
|
|||||||
#define WSFS_ADAPTER_SERVER_CONFIG_H
|
#define WSFS_ADAPTER_SERVER_CONFIG_H
|
||||||
|
|
||||||
#include "wsfs/adapter/api.h"
|
#include "wsfs/adapter/api.h"
|
||||||
|
#include "wsfs/adapter/authenticate.h"
|
||||||
|
|
||||||
struct wsfs_server_config;
|
struct wsfs_server_config;
|
||||||
|
|
||||||
@ -40,6 +41,13 @@ extern WSFSA_API void wsfs_server_config_set_port(
|
|||||||
struct wsfs_server_config * config,
|
struct wsfs_server_config * config,
|
||||||
int port);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -7,5 +7,7 @@
|
|||||||
#include <wsfs/adapter/server.h>
|
#include <wsfs/adapter/server.h>
|
||||||
#include <wsfs/adapter/server_config.h>
|
#include <wsfs/adapter/server_config.h>
|
||||||
#include <wsfs/adapter/server_protocol.h>
|
#include <wsfs/adapter/server_protocol.h>
|
||||||
|
#include <wsfs/adapter/authenticate.h>
|
||||||
|
#include <wsfs/adapter/credentials.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
49
lib/wsfs/adapter/authenticator.c
Normal file
49
lib/wsfs/adapter/authenticator.c
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
#include "wsfs/adapter/authenticator.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
40
lib/wsfs/adapter/authenticator.h
Normal file
40
lib/wsfs/adapter/authenticator.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#ifndef WSFS_ADAPTER_AUTHENTICATOR_H
|
||||||
|
#define WSFS_ADAPTER_AUTHENTICATOR_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#include <stdbool.h>
|
||||||
|
#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
|
101
lib/wsfs/adapter/authenticators.c
Normal file
101
lib/wsfs/adapter/authenticators.c
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
#include "wsfs/adapter/authenticators.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
38
lib/wsfs/adapter/authenticators.h
Normal file
38
lib/wsfs/adapter/authenticators.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef WSFS_ADAPTER_AUTHENTICATORS_H
|
||||||
|
#define WSFS_ADAPTER_AUTHENTICATORS_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#include <stdbool.h>
|
||||||
|
#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
|
40
lib/wsfs/adapter/credentials.c
Normal file
40
lib/wsfs/adapter/credentials.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include "wsfs/adapter/credentials_intern.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
30
lib/wsfs/adapter/credentials_intern.h
Normal file
30
lib/wsfs/adapter/credentials_intern.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef WSFS_ADAPTER_CREDENTIALS_INTERN_H
|
||||||
|
#define WSFS_ADAPTER_CREDENTIALS_INTERN_H
|
||||||
|
|
||||||
|
#include "wsfs/adapter/credentials.h"
|
||||||
|
#include <jansson.h>
|
||||||
|
|
||||||
|
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
|
@ -18,11 +18,15 @@ void wsfs_server_config_init(
|
|||||||
struct wsfs_server_config * config)
|
struct wsfs_server_config * config)
|
||||||
{
|
{
|
||||||
memset(config, 0, sizeof(struct wsfs_server_config));
|
memset(config, 0, sizeof(struct wsfs_server_config));
|
||||||
|
|
||||||
|
wsfs_authenticators_init(&config->authenticators);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wsfs_server_config_cleanup(
|
void wsfs_server_config_cleanup(
|
||||||
struct wsfs_server_config * config)
|
struct wsfs_server_config * config)
|
||||||
{
|
{
|
||||||
|
wsfs_authenticators_cleanup(&config->authenticators);
|
||||||
|
|
||||||
free(config->mount_point);
|
free(config->mount_point);
|
||||||
free(config->document_root);
|
free(config->document_root);
|
||||||
free(config->key_path);
|
free(config->key_path);
|
||||||
@ -42,6 +46,8 @@ void wsfs_server_config_clone(
|
|||||||
clone->cert_path = wsfs_server_config_strdup(config->cert_path);
|
clone->cert_path = wsfs_server_config_strdup(config->cert_path);
|
||||||
clone->vhost_name = wsfs_server_config_strdup(config->vhost_name);
|
clone->vhost_name = wsfs_server_config_strdup(config->vhost_name);
|
||||||
clone->port = config->port;
|
clone->port = config->port;
|
||||||
|
|
||||||
|
wsfs_authenticators_clone(&config->authenticators, &clone->authenticators);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wsfs_server_config * wsfs_server_config_create(void)
|
struct wsfs_server_config * wsfs_server_config_create(void)
|
||||||
@ -108,3 +114,13 @@ void wsfs_server_config_set_port(
|
|||||||
{
|
{
|
||||||
config->port = 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);
|
||||||
|
}
|
@ -2,6 +2,7 @@
|
|||||||
#define WSFS_ADAPTER_SERVER_CONFIG_INTERN_H
|
#define WSFS_ADAPTER_SERVER_CONFIG_INTERN_H
|
||||||
|
|
||||||
#include "wsfs/adapter/server_config.h"
|
#include "wsfs/adapter/server_config.h"
|
||||||
|
#include "wsfs/adapter/authenticators.h"
|
||||||
|
|
||||||
struct wsfs_server_config
|
struct wsfs_server_config
|
||||||
{
|
{
|
||||||
@ -11,6 +12,7 @@ struct wsfs_server_config
|
|||||||
char * cert_path;
|
char * cert_path;
|
||||||
char * vhost_name;
|
char * vhost_name;
|
||||||
int port;
|
int port;
|
||||||
|
struct wsfs_authenticators authenticators;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -32,7 +32,7 @@ void wsfsp_getattr_default(
|
|||||||
ino_t WSFS_UNUSED_PARAM(inode),
|
ino_t WSFS_UNUSED_PARAM(inode),
|
||||||
void * WSFS_UNUSED_PARAM(user_data))
|
void * WSFS_UNUSED_PARAM(user_data))
|
||||||
{
|
{
|
||||||
wsfsp_respond_error(request, -1);
|
wsfsp_respond_error(request, WSFS_BAD_NOENTRY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wsfsp_respond_getattr(
|
void wsfsp_respond_getattr(
|
||||||
|
Loading…
Reference in New Issue
Block a user