Demonstration release of the principles underpinning krsd.
[krsd] / src / rs-serve.h
index 12382be..3134c13 100644 (file)
 #ifndef RS_SERVE_H
 #define RS_SERVE_H
 
-#define _XOPEN_SOURCE_EXTENDED
+#define _GNU_SOURCE
 
 // standard headers
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
 #include <errno.h>
 #include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <unistd.h>
 #include <dirent.h>
 #include <fcntl.h>
 #include <pwd.h>
 #include <grp.h>
 #include <stdarg.h>
+#include <search.h>
+#include <limits.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/signalfd.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/prctl.h>
+#include <sys/un.h>
 
 // libevent headers
 #include <event2/event.h>
 #include <event2/buffer.h>
-#include <event2/http.h>
-#include <event2/keyvalq_struct.h>
-
 #include <event2/util.h>
-// libevent doesn't define this for some reason.
-#define HTTP_UNAUTHORIZED 401
+
+// libevhtp headers
+#include <evhtp.h>
 
 // libmagic headers
 #include <magic.h>
 
-// rs-serve headers
+// libattr headers
 
-#include "version.h"
-#include "config.h"
-#include "auth_struct.h"
+#include <attr/xattr.h>
 
-extern magic_t magic_cookie;
-#include "session.h"
+// libssl headers (for SHA1 computation)
 
-/* CONFIG */
+#include <openssl/sha.h>
 
-void init_config(int argc, char **argv);
-void cleanup_config(void);
+// kerberos headers
+#include <krb5.h>
+#include <gssapi.h>
+#include <gssapi/gssapi_krb5.h>
 
-/* COMMON */
-
-void log_starting(void);
-void log_request(struct evhttp_request *request);
-void add_cors_headers(struct evkeyvalq *headers);
-
-/* HANDLER */
-void log_debug(char *format, ...);
-
-char *generate_token(size_t bytes);
-void fatal_error_callback(int err);
-void handle_request_callback(struct evhttp_request *request, void *ctx);
-
-/* STORAGE */
-
-void storage_options(struct evhttp_request *request);
-void storage_get(struct evhttp_request *request, int sendbody);
-void storage_put(struct evhttp_request *request);
-void storage_delete(struct evhttp_request *request);
-
-/* AUTH */
+// rs-serve headers
 
-int authorize_request(struct evhttp_request *request);
-void auth_get(struct evhttp_request *request);
-void auth_post(struct evhttp_request *request);
-void auth_delete(struct evhttp_request *request);
+#include "version.h"
+#include "config.h"
 
-/* WEBFINGER */
+#include "common/log.h"
+#include "common/user.h"
+#include "common/auth.h"
+#include "common/json.h"
+#include "common/attributes.h"
 
-void webfinger_get_resource(struct evhttp_request *request, const char *address);
-void webfinger_get_hostmeta(struct evhttp_request *request);
+#include "handler/auth.h"
+#include "handler/dispatch.h"
+#include "handler/storage.h"
+#include "handler/webfinger.h"
 
-/* UI */
+extern magic_t magic_cookie;
 
-void ui_prompt_authorization(struct evhttp_request *request, struct rs_authorization *authorization, const char *redirect_uri, const char *scope_string);
-void ui_list_authorizations(struct evhttp_request *request);
+// users with UIDs that don't pass this test don't exist for rs-serve.
+#define UID_ALLOWED(uid) ( (uid) >= RS_MIN_UID )
+
+/* friendly accessors for requests (evhtp_request_t): */
+
+// get username (string) from storage request path
+#define REQUEST_GET_USER(req) (req)->uri->path->match_start
+// get requested file path (i.e. relative path below user's storage_root)
+// from storage request path.
+#define REQUEST_GET_PATH(req) (req)->uri->path->match_end
+// adds a response header. doesn't copy any values, so only works with
+// static strings
+#define ADD_RESP_HEADER(req, key, val)                                  \
+  evhtp_headers_add_header(req->headers_out, evhtp_header_new(key, val, 0, 0))
+// same as ADD_RESP_HEADER, but value is copied (i.e. can be a volatile pointer)
+#define ADD_RESP_HEADER_CP(req, key, val)                                  \
+  evhtp_headers_add_header(req->headers_out, evhtp_header_new(key, val, 0, 1))
 
 #endif /* !RS_SERVE_H */