220 lines
5.2 KiB
C
220 lines
5.2 KiB
C
#include <kore/kore.h>
|
|
#include <kore/http.h>
|
|
#ifdef BUILD_PROD
|
|
#include <luajit.h>
|
|
#else
|
|
#define LUA_OK 0
|
|
#endif
|
|
#include <lauxlib.h>
|
|
#include <lua.h>
|
|
#include <lualib.h>
|
|
#include "smr.h"
|
|
#include "libkore.h"
|
|
#include "libcrypto.h"
|
|
#include <dirent.h>
|
|
#include <kore/seccomp.h>
|
|
|
|
int home(struct http_request *);
|
|
int post_story(struct http_request *);
|
|
int edit_story(struct http_request *);
|
|
int edit_bio(struct http_request *);
|
|
int read_story(struct http_request *);
|
|
int login(struct http_request *);
|
|
int claim(struct http_request *);
|
|
int download(struct http_request *);
|
|
int preview(struct http_request *);
|
|
int search(struct http_request *);
|
|
int style(struct http_request *);
|
|
int miligram(struct http_request *);
|
|
int do_lua(struct http_request *req, const char *name);
|
|
int errhandeler(lua_State *);
|
|
lua_State *L;
|
|
|
|
/*
|
|
static / index
|
|
static / _post post
|
|
static / _edit edit
|
|
dynamic / .* read
|
|
static / _login login
|
|
static / _claim claim
|
|
*/
|
|
|
|
/*Allow seccomp things for luajit and sqlite*/
|
|
KORE_SECCOMP_FILTER("app",
|
|
KORE_SYSCALL_ALLOW(pread64),
|
|
KORE_SYSCALL_ALLOW(pwrite64),
|
|
KORE_SYSCALL_ALLOW(fdatasync),
|
|
KORE_SYSCALL_ALLOW(unlinkat),
|
|
KORE_SYSCALL_ALLOW(mremap),
|
|
KORE_SYSCALL_ALLOW(newfstatat)
|
|
);
|
|
|
|
int
|
|
errhandeler(lua_State *L){
|
|
printf("Error: %s\n",lua_tostring(L,1));//"error"
|
|
lua_getglobal(L,"debug");//"error",{debug}
|
|
lua_getglobal(L,"print");//"error",{debug},print()
|
|
lua_getfield(L,-2,"traceback");//"error",{debug},print(),traceback()
|
|
lua_call(L,0,1);//"error",{debug},print(),"traceback"
|
|
lua_call(L,1,0);//"error",{debug}
|
|
printf("Called print()\n");
|
|
lua_getfield(L,-1,"traceback");//"error",{debug},traceback()
|
|
printf("got traceback\n");
|
|
lua_call(L,0,1);//"error",{debug},"traceback"
|
|
lua_pushstring(L,"\n");
|
|
printf("called traceback\n");
|
|
lua_pushvalue(L,-4);//"error",{debug},"traceback","error"
|
|
printf("pushed error\n");
|
|
lua_concat(L,3);//"error",{debug},"traceback .. error"
|
|
printf("concated\n");
|
|
int ref = luaL_ref(L,LUA_REGISTRYINDEX);//"error",{debug}
|
|
lua_pop(L,2);//
|
|
lua_rawgeti(L,LUA_REGISTRYINDEX,ref);//"traceback .. error"
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
do_lua(struct http_request *req, const char *name){
|
|
printf("About to do lua %s\n",name);
|
|
lua_pushcfunction(L,errhandeler);
|
|
printf("Pushed errhandler function\n");
|
|
lua_getglobal(L,name);//err(),name()
|
|
if(!lua_isfunction(L,-1)){
|
|
printf("Could not find a method named %s\n",name);
|
|
lua_pop(L,2);//
|
|
return (KORE_RESULT_OK);
|
|
}
|
|
printf("About to push light userdata: %p\n",(void*)req);
|
|
lua_pushlightuserdata(L,req);//err,name(),ud_req
|
|
printf("About to pcall\n");
|
|
int err = lua_pcall(L,1,0,-3);
|
|
if(err != LUA_OK){
|
|
size_t retlen;
|
|
const char *ret = lua_tolstring(L,-1,&retlen);
|
|
printf("Failed to run %s: %s\n",name,lua_tostring(L,-1));
|
|
http_response(req, 500, ret, retlen);
|
|
lua_pop(L,lua_gettop(L));
|
|
return (KORE_RESULT_OK);
|
|
}
|
|
return KORE_RESULT_OK;
|
|
}
|
|
|
|
int
|
|
post_story(struct http_request *req){
|
|
printf("We want to post!\n");
|
|
return do_lua(req,"paste");
|
|
}
|
|
|
|
int
|
|
edit_story(struct http_request *req){
|
|
printf("We want to edit!\n");
|
|
return do_lua(req,"edit");
|
|
}
|
|
|
|
int
|
|
edit_bio(struct http_request *req){
|
|
printf("We want to edit bio!\n");
|
|
return do_lua(req,"edit_bio");
|
|
}
|
|
|
|
int
|
|
read_story(struct http_request *req){
|
|
printf("We want to read!\n");
|
|
return do_lua(req,"read");
|
|
}
|
|
|
|
int
|
|
login(struct http_request *req){
|
|
printf("We want to login!\n");
|
|
return do_lua(req,"login");
|
|
}
|
|
|
|
int
|
|
claim(struct http_request *req){
|
|
printf("We want to claim!\n");
|
|
return do_lua(req,"claim");
|
|
}
|
|
|
|
int
|
|
download(struct http_request *req){
|
|
printf("We want to do download!\n");
|
|
return do_lua(req,"download");
|
|
}
|
|
|
|
int
|
|
preview(struct http_request *req){
|
|
printf("We want to do preview!\n");
|
|
return do_lua(req,"preview");
|
|
}
|
|
|
|
int
|
|
search(struct http_request *req){
|
|
printf("We want to do search!\n");
|
|
return do_lua(req,"search");
|
|
}
|
|
|
|
int
|
|
home(struct http_request *req){
|
|
return do_lua(req,"home");
|
|
}
|
|
|
|
void
|
|
kore_worker_configure(void){
|
|
printf("Configuring worker...\n");
|
|
int err;
|
|
/*DIR *dp;*/
|
|
/*struct dirent *ep;*/
|
|
/*dp = opendir("./");*/
|
|
/*if(dp != NULL){*/
|
|
/*while(ep = readdir(dp)){*/
|
|
/*printf("%s\n",ep->d_name);*/
|
|
/*}*/
|
|
/*closedir(dp);*/
|
|
/*}*/
|
|
L = luaL_newstate();
|
|
luaL_openlibs(L);
|
|
load_kore_libs(L);
|
|
load_crypto_libs(L);
|
|
lua_pushcfunction(L,errhandeler);
|
|
printf("About to run loadfile...\n");
|
|
luaL_loadfile(L,SM_INIT);
|
|
printf("Done running loadfile...\n");
|
|
if(!lua_isfunction(L,-1)){//failed to loadfile()
|
|
printf("Failed to load %s: %s\n",SM_INIT,lua_tostring(L,-1));
|
|
lua_pop(L,1);
|
|
return;
|
|
}
|
|
printf("About to pcall\n");
|
|
err = lua_pcall(L,0,LUA_MULTRET,-2);
|
|
printf("Done pcalling\n");
|
|
//err = luaL_dofile(L,"init.lua");
|
|
if(err){
|
|
printf("Failed to run %s\n",SM_INIT);
|
|
return;
|
|
}
|
|
lua_pushcfunction(L,errhandeler);
|
|
lua_getglobal(L,"configure");
|
|
err = lua_pcall(L,0,0,-2);
|
|
if(err != LUA_OK){
|
|
printf("Failed to run configure(): %s\n",lua_tostring(L,-1));
|
|
lua_pop(L,2);
|
|
return;
|
|
}
|
|
lua_pop(L,lua_gettop(L));
|
|
printf("Finished configuring worker\n");
|
|
}
|
|
|
|
void
|
|
kore_worker_teardown(void){
|
|
int err;
|
|
lua_pushcfunction(L,errhandeler);
|
|
lua_getglobal(L,"teardown");
|
|
err = lua_pcall(L,0,0,1);
|
|
if(err != LUA_OK){
|
|
printf("Failed to run configure(): %s\n",lua_tostring(L,-1));
|
|
lua_pop(L,2);
|
|
return;
|
|
}
|
|
lua_close(L);
|
|
}
|