From: A-Larsen Date: Thu, 15 Oct 2026 22:27:23 +0000 (-0400) Subject: first commit X-Git-Url: https://nyquistdev.net/git/?a=commitdiff_plain;h=refs%2Fheads%2Fmain;p=low-level-website.git first commit --- 2a9fdd0527e4b920709fcd2264d245a37f4a53c1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..65143d5 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +CLIBS = -llua5.4 -lsqlite3 -lm -lpthread -lcrypto -lssl +CFLAGS = -Wall -Wextra +CFILES = index.c +HFILES = file.h net.h file.h parse.h render.h config.h perr.h + +index: $(CFILES) $(HFILES) + gcc $(CGLAGS) $^ -o $@ $(CLIBS) + +debug: index.c + gcc $(CGLAGS) -D DEBUG -g $^ -o $@ $(CLIBS) diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..d34b3d7 --- /dev/null +++ b/README.adoc @@ -0,0 +1,21 @@ += Low Level Website + +A website made using low level libraries that incorporates ssl through openssl. + +== Running + +Run index to start the server. It does need to be ran as root so it can connect +to a web socket. The server will be hosted on https://localhost[]. You also need +to allow your browser to access the page because it might be considered unsafe +if you don't have the correct certificate files for openssl. Any html +inside of the public directory will be rendered. + +---- +sudo ./index +---- + +== Building + +---- +make +---- diff --git a/config.h b/config.h new file mode 100644 index 0000000..5db1672 --- /dev/null +++ b/config.h @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2024 Austin Larsen + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#define PEMFILE "server.pem" diff --git a/docinfo.conf b/docinfo.conf new file mode 100644 index 0000000..57fa5b9 --- /dev/null +++ b/docinfo.conf @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +HOSTNAME=nyquistdev.net +DOCINFODIR=/usr/local/share/readme-to-html diff --git a/file.h b/file.h new file mode 100644 index 0000000..b1ceae3 --- /dev/null +++ b/file.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2024 Austin Larsen + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef _FILE_H_ +#define _GNU_SOURCE +#define _FILE_H_ +#include +#include +#include + +void readLines(fp, data, callback) + // SYNOPSIS: + // reads lines from a file descriptor and performs job based on those + // lines + + FILE *fp; /* File descriptor */ + void *data; /* data that can be passed to callback*/ + void (*callback) /* callback to be called for each line of file*/ + (char *line, /* string of the current line in the loop */ + size_t len, /* length of the current line in the loop */ + void *data, /* passed to callback from readLines */ + uint32_t linenum); +{ + rewind(fp); + size_t read; + size_t len = 0; + uint32_t linenum = 0; + + while(1) { + char *line = NULL; + read = getline(&line, &len, fp); + if (read == (size_t)-1) {free(line); return;} + linenum++; + callback(line, read, data, linenum); + free(line); + } +} // readLines() + +#endif // _FILE_H_ diff --git a/http_headers/basic b/http_headers/basic new file mode 100644 index 0000000..a6155b7 --- /dev/null +++ b/http_headers/basic @@ -0,0 +1,3 @@ +HTTP/1.1 200 OK +Connection: close +Content-Type: text/html diff --git a/index b/index new file mode 100755 index 0000000..b3713b3 Binary files /dev/null and b/index differ diff --git a/index.c b/index.c new file mode 100644 index 0000000..8b09ec6 --- /dev/null +++ b/index.c @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2024 Austin Larsen + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "render.h" + +void handle_posts (char *request, char *message) { + printf("YO, HANDLE A POST!\n"); + printf("handle_posts request:\n%s\n", request); + memcpy(message, "

HELLO

\0", sizeof(char) * 14); + +} + +void htmlRenderCallback(file_path, file_name, linenum) + char *file_path; + char *file_name; + uint32_t linenum; +{ + lua_State *L = luaL_newstate(); + luaL_openlibs(L); + if (strcmp(file_name, "index.html")) return; + + Html html; + HttpHeader header; + + htmlFile2Header_alloc(&header, "./http_headers/basic"); + + htmlFile2Str_alloc(&html, file_path); + + LuaTag luaTag; + luaTag_alloc(&luaTag, L); + Render render; + renderInit(&render, &luaTag, &html, &header); + + readLines(html.fp, &render, getRenderInfoCallback); + + + lua_pushlightuserdata(L, &html); + lua_setglobal(L, "html"); + + + lua_pushcfunction(L, l_tagToStr); + lua_setglobal(L, "tagToStr"); + + if(luaL_dostring(luaTag.state, luaTag.h_buffer) != LUA_OK) { + fprintf(stderr, "[C] error reading lua at\n%s line %d\n", + __FILE__, __LINE__); + } + + lua_getglobal(luaTag.state, "var"); + + /* const char *var = lua_tostring(luaTag.state, -1); */ + /* printf("var: %s\n", var); */ + + /* printf("%s\n", render.h_buffer); */ + NetServer netServer; + netInit(&netServer, PEMFILE); + /* netAssign(&netServer, "/", "GET", "

hello!

"); */ + /* netAssign(&netServer, "/", "GET", render.h_buffer); */ + netAssign(&netServer, "/next", "GET", "

hello then

"); + printf("WHAT IS THAT?\n"); + netAssign(&netServer, "/", "GET", render.h_buffer); + netAssign(&netServer, "/", "POST", "

might work

"); + + netListen(&netServer, handle_posts); + netClose(netServer); + + luaTag_dealloc(&luaTag, L); + htmlFile2Str_dealloc(&html); + htmlFile2Header_dealloc(&header); + renderFree(render); +} // htmlRenderCallback() + +int main(int args, char **argv) +{ + searchFileType("./public", "html", htmlRenderCallback); + return 0; + +} // main() diff --git a/net.h b/net.h new file mode 100644 index 0000000..2e63edf --- /dev/null +++ b/net.h @@ -0,0 +1,320 @@ +/* + * Copyright (C) 2024 Austin Larsen + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef NET_H +#define NET_H + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "perr.h" + + +typedef struct +_NetKV +{ + char *key; + char *value; +} +NetKV; + +typedef struct _Response +{ + char path[128]; + char method[10]; + char message[2048]; +} Response; + + +typedef struct +_NetServer +{ + SSL_CTX *ctx; + struct addrinfo *bind_address; + int socket; + char pemFile[32]; + SSL * ssl; + Response *responses; + uint8_t reslen; +} +NetServer; + +typedef void (*post_callback) (char *request, char *message); + +void netParse_alloc(out, outlen, netkv, len) + char **out; + uint16_t *outlen; + NetKV *netkv; + uint8_t len; +{ + *out = NULL; + char *outp = NULL; + *outlen = 0; + + for (int i = 0; i < len; ++i) { + char *key = netkv[i].key; + char *value = netkv[i].value; + int keylen = strlen(key); + int valuelen = strlen(value); + + uint16_t llen = keylen + valuelen + 2; + *outlen += llen; + + if (*out == NULL) { + *out = malloc(*outlen); + outp = *out; + } else { + *out = realloc(*out, *outlen); + } + + memcpy(outp, key, keylen); + outp += keylen; + + memcpy(outp, "=", 1); + outp += 1; + + memcpy(outp,value, valuelen); + outp += valuelen; + + if (i != len - 1) { + memcpy(outp, "&", 1); + outp += 1; + } + } +} + +void netAssign(netServer, path, method, message) + NetServer *netServer; + char *path; + char *method; + char *message; +{ + uint8_t i = netServer->reslen; + netServer->reslen++; + + if (i == 0) { + netServer->responses = malloc(sizeof(Response)); + } else { + netServer->responses = realloc(netServer->responses, + sizeof(Response) * (i + 1)); + } + + memset(netServer->responses[i].path, 0, sizeof(netServer->responses->path)); + memset(netServer->responses[i].method, 0, + sizeof(netServer->responses[i].method)); + memset(netServer->responses[i].message, 0, + sizeof(netServer->responses[i].message)); + memcpy(netServer->responses[i].path, path, strlen(path)); + memcpy(netServer->responses[i].method, method, strlen(method)); + memcpy(netServer->responses[i].message, message, strlen(message)); +} + +int netInit(netServer, pemFile) + NetServer *netServer; + char *pemFile; +{ + SSL_library_init(); + OpenSSL_add_all_algorithms(); + SSL_load_error_strings(); + netServer->reslen = 0; + + memset(netServer->pemFile, 0, 32); + memcpy(netServer->pemFile, pemFile, strlen(pemFile)); + + + netServer->ctx = SSL_CTX_new(TLS_server_method()); + if (!netServer->ctx) { + PERROR("SSL_CTX_new() failed"); + return 1; + } + + if (!SSL_CTX_use_certificate_file + (netServer->ctx, + netServer->pemFile, SSL_FILETYPE_PEM) || + !SSL_CTX_use_PrivateKey_file + (netServer->ctx, netServer->pemFile, + SSL_FILETYPE_PEM)) { + PERROR("SSL_CTX_use_certificate_file() failed"); + ERR_print_errors_fp(stderr); + return 2; + } + + printf("Configuring local address...\n"); + + struct addrinfo hints; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; // IPv4 + hints.ai_socktype = SOCK_STREAM; // TCP + hints.ai_flags = AI_PASSIVE; + + /* struct addrinfo *bind_address; */ + getaddrinfo(0, "443", &hints, + &netServer->bind_address); + + printf("Creating socket...\n"); + netServer->socket = socket(netServer->bind_address->ai_family, + netServer->bind_address->ai_socktype, + netServer->bind_address->ai_protocol); + if (netServer->socket < 0) { + PERROR("socket() failed"); + return 3; + } + printf("Binding socket to local address...\n"); + + if (bind(netServer->socket, netServer->bind_address->ai_addr, + netServer->bind_address->ai_addrlen)) { + PERROR("bind() failed"); + return 4; + } + + return 0; +} +int netListen(netServer, callback) + NetServer *netServer; + post_callback callback; +{ + printf("Listening..\n"); + + if (listen(netServer->socket, 10) < 0) { + PERROR("listen() failed"); + return 5; + } + + while(1) { + printf("Waiting for connection...\n"); + struct sockaddr_storage client_address; + socklen_t client_len = sizeof(client_address) + 1; + + int socket_client = accept(netServer->socket, + (struct sockaddr *)&client_address, &client_len); + + if (socket_client < 0) { + PERROR("accept() failed"); + return 1; + } + + printf("Client is connected..."); + char address_buffer[100]; + getnameinfo((struct sockaddr *)&client_address, client_len, + address_buffer, sizeof(address_buffer), 0, 0, NI_NUMERICHOST); + printf("%s\n", address_buffer); + + netServer->ssl = SSL_new(netServer->ctx); + if (!netServer->ctx) { + PERROR("SSL_new() failed"); + return 1; + } + + SSL_set_fd(netServer->ssl, socket_client); + + if (SSL_accept(netServer->ssl) <= 0) { + fprintf(stderr, "SSL_accept() failed.\n"); + ERR_print_errors_fp(stderr); + + SSL_shutdown(netServer->ssl); + close(socket_client); + SSL_free(netServer->ssl); + continue; + } + + //printf("SSL connection using %s\n", SSL_get_cipher(netServer->ssl)); + + //printf("Reading request...\n"); + char request[1024]; + memset(request, 0, 1024); + /* int bytes_received = SSL_read(netServer->ssl, request, 1024); */ + SSL_read(netServer->ssl, request, 1024); + /* printf("Received %d bytes.\n", bytes_received); */ + //printf("request: %s\n", request); + + //printf("=======\n"); + + char *dup = strdup(request); + char *p = dup; + char *line = p; + while (*p && *p != '\r') ++p; + *p = '\0'; + //printf("\n'%s'\n", line); + + bool isGet = strstr(line, "GET") != NULL; + bool isPost = strstr(line, "POST") != NULL; + if (isGet) { + p = line += 4; + }else if (isPost) { + p = line += 5; + } + char *path = p; + while (*p && *p != ' ') ++p; + *p = '\0'; + //printf("path: '%s'\n", path); + + for (int i = 0; i < netServer->reslen; ++i) { + if ((!strcmp(netServer->responses[i].method, "GET") && isGet)) { + if (!strcmp(netServer->responses[i].path, path)) { + //printf("sup\n"); + /* int bytes_sent = SSL_write(netServer->ssl, */ + SSL_write(netServer->ssl, + netServer->responses[i].message, + strlen(netServer->responses[i].message)); + } + } + if ((!strcmp(netServer->responses[i].method, "POST") && isPost)) { + if (!strcmp(netServer->responses[i].path, path)) { + //printf("POST REQUEST!!!\n"); + char message[2048] = {0}; + callback(request, message); + //char *message = "

hello

\0"; + SSL_write(netServer->ssl, + message, + strlen(message)); + } + } + } + + SSL_shutdown(netServer->ssl); + free(dup); + close(socket_client); + SSL_free(netServer->ssl); + } + return 0; +} + +int netClose(netServer) + NetServer netServer; +{ + free(netServer.responses); + close(netServer.socket); + SSL_CTX_free(netServer.ctx); + return 0; +} +#endif // NET_H diff --git a/notes.adoc b/notes.adoc new file mode 100644 index 0000000..eef9237 --- /dev/null +++ b/notes.adoc @@ -0,0 +1,114 @@ +== Code layout +Every function needs a comment. A description of every paramenter and what it +does + +=== Structs +basic struct layout + +---- +typedef struct _HTML + // ALLOCATE_FUNCTION: html_file2str_alloc + // DEALLOCATED_FUNCTION: html_file2str_dealloc +{ + char *path; /* the path of the file provided in the path argument */ + char *h_buffer; /* heap allocated string of the html file */ + long size; /* size of @h_buffer */ + xmlDoc *doc; /* parsed html */ +} +HTML; +---- + +Always include and ALLOCATE_FUNCTION and DEALLOCATED_FUNCTION and describe what +each attribute is for. + +=== Functions +basic function layout + +[source, c] +---- +void html_file2str_alloc (path, out_html) + // SYNOPSIS: + // Gets info from a html file. + // + // It gets the path from @path, reads the file, and then places + // information about the file into the @out_html struct + + + char *path; /* path of the html file */ + + HTML *out_html; /* struct the gets allocated with information from the html + * file */ +{ +} +---- + +Always include a SYNOPSIS. describe each argument. If mentioning an argument put +a "@" symbol in from of it. Detailed description is always after SYNOPSIS. + +=== Function arguments +these are listed in the order they should be put in +h_:: function is allocated on the heap and needs to be freed +out_:: function writes to this buffer +in_:: function reads from this buffer +io_:: function reads and write to this buffer + +=== Function names +underscored + +_alloc:: there is heap allocation in this function and needs to be follow by a +`_d` function before the program ends + +_dealloc:: there is heap deallocation in this function + +=== Curly braces +Do newline for left cruly brace. Do this so you can put a comment between the +keyword and the block statement. + +put a comment at the end of every right curly brace that is not a struct +declaration. + +=== Nesting +Do not nest greater then three layers!! + +=== Comments +Always align comments for arguments or attributes in functions, struct, enumns +and unions so the columns all start at the same point + +for example: + +[source, c] +---- +{ + char *path; /* the path of the file provided in the path argument */ + char *h_buffer; /* heap allocated string of the html file */ + long size; /* size of @h_buffer */ + xmlDoc *doc; /* parsed html */ +} +---- + +=== Alphabetize +Alphabetize all Functions. Use function prototyping so errors do not occur. + +order: + +1. all capitals +3. regular + + +=== Includes +include system librarys before user libraries. seperate them with a space. + +== Libraries +libxml2:: parsing html + +== Questions +Associated arrays in c. + +== Links +- https://en.wikipedia.org/wiki/Programming_language +- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers +- https://www.tutorialspoint.com/c-program-to-list-all-files-and-sub-directories-in-a-directory +- https://stackoverflow.com/questions/4553012/checking-if-a-file-is-a-directory-or-just-a-file +- http://www.lua.org/manual/5.1/manual.html#luaL_checktype +- https://www.youtube.com/watch?v=It0OFCbbTJE +- https://www.suse.com/support/kb/doc/?id=000018152 diff --git a/other.adoc b/other.adoc new file mode 100644 index 0000000..3a6351e --- /dev/null +++ b/other.adoc @@ -0,0 +1 @@ +-- https://reqbin.com/Article/HttpGet diff --git a/parse.h b/parse.h new file mode 100644 index 0000000..fc2b575 --- /dev/null +++ b/parse.h @@ -0,0 +1,425 @@ +/* + * Copyright (C) 2024 Austin Larsen + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef _PARSE_H_ +#define _PARSE_H_ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "file.h" + +#define STARTTAG "" +#define ENDTAG "" + +typedef struct _HeaderKV + // ALLOCATE_FUNCTION: htmlFile2Header_alloc + // DEALLOCATED_FUNCTION: htmlFile2Header_dealloc + // + // Key value pairs for the http header. +{ + char key[255]; + char value[255]; +} +HeaderKV; + +typedef struct _LuaTag + // ALLOCATE_FUNCTION: luaTag_alloc + // DEALLOCATED_FUNCTION: luaTag_dealloc +{ + lua_State *state; + bool in_tag; + /* char *h_buffer; */ + /* uint32_t content_len; */ + char h_buffer[2048]; + uint32_t lines_count; +} +LuaTag; + +typedef struct _HttpHeader + // ALLOCATE_FUNCTION: htmlFile2Header_alloc + // DEALLOCATED_FUNCTION: htmlFile2Header_dealloc + // + // The values attribute in @h_parsed are not parsed, just the top level key + // value pairs +{ + FILE *fp; + char h_buffer[2048]; /* heap allocated string for the header */ + HeaderKV *h_parsed; /* heap allocated key value pairs for the header*/ + uint16_t parsed_size; /* size of the @h_parsed attribute */ + char protocol[255]; +} + +HttpHeader; + +typedef struct _Tag + // ALLOCATE_FUNCTION: + // DEALLOCATED_FUNCTION: +{ + char name[10]; + uint32_t startline; + uint32_t endline; + regmatch_t start; + regmatch_t end; +} +Tag; + +typedef struct _Html + // ALLOCATE_FUNCTION: htmlFile2Str_alloc + // DEALLOCATED_FUNCTION: htmlFile2Str_dealloc +{ + FILE *fp; + HttpHeader header; /* header info for the http */ + char *path; /* the path of the file provided in the path + * argument */ + char **h_lines; + uint32_t lines_count; + uint32_t lines_size; + Tag *h_tags; /* heap allocated tags, that specify that name of that + * tag along with their starting and ending locations */ + uint16_t tag_count; /* number of h_tags */ +} +Html; + +void allocHeaderKV(out_header, line, len) + // SYNOPSIS: + // allocates the key value pairs for the http header + + HttpHeader *out_header; /*HttpHeader struct */ + char *line; /*current line of header file */ + uint16_t len; /*length of the current len */ +{ + size_t nlen = strlen(line) -2; + for (int i = 0; i < nlen; ++i) { + if (line[i] == ':') { + HeaderKV *headerkv = out_header->h_parsed; + memcpy(headerkv[out_header->parsed_size - 1].key, line, i + 1); + headerkv[out_header->parsed_size - 1].key[i] = '\0'; + + size_t value_size = nlen - i - 1; + memcpy(headerkv[out_header->parsed_size - 1].value, line + i + 1, + value_size); + return; + } + } +} //allocHeaderKV() + +void allocHeaderCallback(line, len, data, linenum) + char *line; + size_t len; + void *data; + uint32_t linenum; +{ + HttpHeader *out_header = (HttpHeader *) data; + if (linenum == 1) { + memcpy(out_header->protocol, line, strlen(line) - 2); + return; + }; + + out_header->parsed_size++; + + if (out_header->parsed_size == 1) { + out_header->h_parsed = (HeaderKV *)malloc(sizeof(HeaderKV) * + (out_header->parsed_size)); + } else { + out_header->h_parsed = (HeaderKV *)realloc(out_header->h_parsed, + sizeof(HeaderKV) * + (out_header->parsed_size)); + } + + allocHeaderKV(out_header, line, len); +} // allocHeaderCallback() + +void htmlFile2Header_alloc(out_header, header_path) + // SYNOPSIS: + // Gets info from a http header file to a @out_header stgruct + + HttpHeader *out_header; + char *header_path; +{ + out_header->fp = fopen(header_path, "r"); + out_header->parsed_size = 0; + readLines(out_header->fp, out_header, allocHeaderCallback); +} // htmlFile2Header_alloc() + +void htmlFile2Header_dealloc(header) + HttpHeader *header; +{ + free(header->h_parsed); + fclose(header->fp); +} // htmlFile2Header_dealloc() + +bool match(char *comp, char *str, regmatch_t *pmatch) + // SYNOPSIS: + // Sees if str matches the comp regex. if it does it returns true and + // stores the locat +{ + regex_t regex; + regmatch_t lpmatch[1]; + int reti = regcomp(®ex, comp, 0); + if (reti) { + fprintf(stderr, "Could not compile regex at\n%s line %d\n", __FILE__, + __LINE__); + } + bool match = (regexec(®ex, str, sizeof(lpmatch) / sizeof(lpmatch[0]), + lpmatch, 0) == 0); + if (pmatch) { + memcpy(&pmatch->rm_so, &lpmatch[0].rm_so, sizeof(lpmatch[0].rm_so)); + memcpy(&pmatch->rm_eo, &lpmatch[0].rm_eo, sizeof(lpmatch[0].rm_eo)); + } + regfree(®ex); + return match; +} // match() + +void getHtmlInfoCallback(line, len, data, linenum) + char *line; + size_t len; + void *data; + uint32_t linenum; +{ + Html *out_html = (Html *)data; + char startTagReg[] = "<[a-z0-9]*>"; + char endTagReg[] = ""; + regmatch_t pmatch; + out_html->lines_count++; + uint32_t rlen = strlen(line); + out_html->lines_size += rlen; + + + int j = out_html->lines_count - 1; + + if (out_html->lines_count == 1) { + out_html->h_lines = (char **)malloc(out_html->lines_size); + out_html->h_lines[j] = (char *)malloc(rlen); + } else { + out_html->h_lines = (char **)realloc(out_html->h_lines, + out_html->lines_size); + out_html->h_lines[j] = (char *)malloc(rlen); + } + + memcpy(out_html->h_lines[j], line, rlen); + + int i = out_html->tag_count - 1; + + if (match(startTagReg, line, &pmatch)) { + uint16_t matchlen = pmatch.rm_eo - pmatch.rm_so; + + out_html->tag_count++; + i = out_html->tag_count - 1; + + if (out_html->tag_count == 1) { + out_html->h_tags = malloc(sizeof(Tag) * out_html->tag_count); + } else { + out_html->h_tags = realloc(out_html->h_tags, sizeof(Tag) * + out_html->tag_count); + } + + out_html->h_tags[i].startline = j; + + char name[50]; + + memset(name, 0, 10); + memset(out_html->h_tags[i].name, 0, 10); + memcpy(out_html->h_tags[i].name, + line + pmatch.rm_so + 1, matchlen - 2); + + memcpy(&out_html->h_tags[i].start, &pmatch, + sizeof(regmatch_t)); + } + + if (match(endTagReg, line, &pmatch)) { + uint16_t matchlen = pmatch.rm_eo - pmatch.rm_so; + char name[50]; + memset(name, 0, 10); + memcpy(name, line + pmatch.rm_so + 2, matchlen - 3); + + for (int k = 0; k < out_html->tag_count; ++k) { + if (!strcmp(out_html->h_tags[k].name, name)) { + out_html->h_tags[k].endline = j; + memcpy(&out_html->h_tags[k].end, &pmatch, + sizeof(regmatch_t)); + } + } + } + +} // getHtmlInfoCallback() + + +void htmlFile2Str_alloc (out_html, html_path) + // SYNOPSIS: + // Gets info from a html file. + // + // It gets the html_path from @html_path, reads the file, and then places + // information about the file into the @out_html struct + + Html *out_html; /* struct the gets allocated with information from the + * html file */ + char *html_path; /* path of the html file */ +{ + out_html->tag_count = 0; + out_html->lines_count = 0; + out_html->lines_size = 0; + out_html->h_tags = NULL; + out_html->fp = fopen(html_path, "r"); + readLines(out_html->fp, (void *)out_html, getHtmlInfoCallback); + rewind(out_html->fp); +} // htmlFile2Str_alloc() + +void htmlFile2Str_dealloc (out_html) + Html *out_html; /* struct that gets its contents deallocated*/ +{ + if (out_html->h_tags) free(out_html->h_tags); + + for (uint32_t i = 0; i < out_html->lines_count; ++i) { + if (out_html->h_lines[i]) + free(out_html->h_lines[i]); + } + + if (out_html->h_lines) + free(out_html->h_lines); + + fclose(out_html->fp); +} // htmlFile2Str_dealloc() + + +void searchFileType(search_path, filetype, callback) + // SYNOPSIS: + // SearchsByFileType and then performs job based on the search + + char *search_path; /* path to search for files */ + char *filetype; /* type of file to search for ex. html, js, css*/ + void (*callback) /* job to be done once the filetype is found */ + (char *file_path, /* full path for the file found in the loop */ + char *file_name); /* file name for the file found in the loop */ + +{ + regex_t regex; + struct dirent *files; + + DIR *dir = opendir(search_path); + + if (!dir) { + fprintf(stderr, "cannot open public directory at\n%s line %d\n", + __FILE__, __LINE__); + return; + } + + char type[255] = "."; + strcat(type, filetype); + strcat(type, "$"); + + int reti = regcomp(®ex, type, 0); + if (reti) { + fprintf(stderr, "Could not compile regex at\n%s line %d\n", __FILE__, + __LINE__); + } + + while ((files = readdir(dir)) != NULL) { + reti = regexec(®ex, files->d_name, 0, NULL, 0); + if (!reti) { + char file_path[255] = "./public/"; + strcat(file_path, files->d_name); + callback(file_path, files->d_name); + } + } + + regfree(®ex); + closedir(dir); +} // searchFileType() + + +void luaTag_alloc(LuaTag *luaTag, lua_State *L) +{ + memset(luaTag, 0, sizeof(LuaTag)); + luaTag->in_tag = false; + luaTag->state = L; + luaTag->lines_count = 0; +} // luaTag_alloc() + +void luaTag_dealloc(LuaTag *luaTag, lua_State *L) +{ + lua_close(L); +} // luaTag_dealloc() + +int l_tagToStr(L) + lua_State *L; +{ + // because everything is pushed onto the stack + // -1 if second argumnet + // -2 is first argument + const bool isInner = lua_toboolean(L, -1); + const char *tagname = lua_tostring(L, -2); + lua_getglobal(L, "html"); + Html *html = (Html *)lua_touserdata(L, -1); + + uint8_t outlen = 0; + char *out = NULL; + + bool startcontent = false; + for (uint32_t i = 0; i < html->lines_count; ++i) { + char *line = html->h_lines[i]; + + for (int j = 0; j < html->tag_count; ++j) { + char *name = html->h_tags[j].name; + if (!strcmp(tagname, name)) { + + if (html->h_tags[j].startline == i) { + startcontent = true; + if (isInner) continue; + } + if (html->h_tags[j].endline == i) { + if (isInner) { + startcontent = false; + break; + }; + } + + if (startcontent) { + uint16_t len = strlen(line); + outlen += len; + + if (!out) { + out = malloc(len); + } else { + out = realloc(out, outlen); + } + + memcpy(out + outlen - len, line, len); + } + + if (html->h_tags[j].endline == i) { + startcontent = false; + } + } + } + } + lua_pushstring(L, out); + free(out); + return 1; +} // l_tagToStr() + // + +#endif // _PARSE_H_ diff --git a/perr.h b/perr.h new file mode 100644 index 0000000..4bac5ac --- /dev/null +++ b/perr.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2024 Austin Larsen + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef PERR +#define PERR +#include +#define PERROR(s) fprintf(stderr, #s " (%d)\n%s %s:%d\n", errno, \ + __FILE__, __FUNCTION__ , __LINE__); +#endif // PERR diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..719a393 --- /dev/null +++ b/public/index.html @@ -0,0 +1,11 @@ +
+
+
+
+ + +
+ + +print("this is from lua!") + diff --git a/public/index.js b/public/index.js new file mode 100644 index 0000000..e69de29 diff --git a/render.h b/render.h new file mode 100644 index 0000000..a5edb2f --- /dev/null +++ b/render.h @@ -0,0 +1,84 @@ +#ifndef _RENDER_H_ +#define _RENDER_H_ + +#define _GNU_SOURCE + +#include "config.h" +#include "net.h" +#include "parse.h" + +typedef struct _Render +{ + char h_buffer[4096]; + LuaTag *luaTag; + Html *html; +} +Render; + +void getRenderInfoCallback(line, len, data, linenum) + char *line; + size_t len; + void *data; + uint32_t linenum; +{ + Render *render = (Render *)data; + size_t rlen = strlen(line) + 1; + + if (strstr(line, STARTTAG)) { + render->luaTag->in_tag = true; + return; + } + + if (strstr(line, ENDTAG)) { + render->luaTag->in_tag = false; + return; + } + + if (render->luaTag->in_tag) { + strncat(render->luaTag->h_buffer, line, rlen); + render->luaTag->lines_count++; + + } else { + strncat(render->h_buffer, line, rlen + 1); + } +} // getRenderInfoCallback() + +void renderInit(render, luaTag, html, header) + Render *render; + LuaTag *luaTag; + Html *html; + HttpHeader *header; +{ + render->luaTag = luaTag; + render->html = html; + + char proto[500]; + sprintf(proto, "%s\r\n", header->protocol); + int plen = strlen(proto); + strncat(render->h_buffer, proto, plen); + /* printf("%s\n", header->protocol); */ + + + for (int i = 0; i < header->parsed_size; ++i) { + char kv[512]; + memset(kv, 0, 512); + sprintf(kv, "%s:%s\r\n", header->h_parsed[i].key, + header->h_parsed[i].value); + + int kvlen = strlen(kv); + + strncat(render->h_buffer, kv, kvlen); + } + + strncat(render->h_buffer, "\r\n", 3); +} + + +void renderFree(render) + Render render; +{ +} + + + +#endif // _RENDER_H_ diff --git a/rendered.html b/rendered.html new file mode 100644 index 0000000..3b5c681 --- /dev/null +++ b/rendered.html @@ -0,0 +1,863 @@ + + + + + + + +Low Level Website + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

A website made using low level libraries that incorporates ssl through openssl.

+
+
+
+
+

Running

+
+
+

Run index to start the server. It does need to be ran as root so it can connect +to a web socket. The server will be hosted on https://localhost. You also need +to allow your browser to access the page because it might be considered unsafe +if you don’t have the correct certificate files for openssl. Any html +inside of the public directory will be rendered.

+
+
+
+
sudo ./index
+
+
+
+
+
+

Building

+
+
+
+
make
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/server.crt b/server.crt new file mode 100644 index 0000000..fc4597b --- /dev/null +++ b/server.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDazCCAlOgAwIBAgIUDRvbhgRp/5zTuj0z6nXkGGCP8RkwDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMTA2MDYwMzU2NDBaFw0yMjA2 +MDYwMzU2NDBaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDDL0SeaSpf9NFMaocM++NEHGWSsIwX0ZdGknWXvUfc +1Q4lCgnbmh1FWTstC5roCs+iP+eOSTGDqNKxYhc5yLgVvxyvb5nEc1UrpcSvrmqu +MZ7KxrLksFi9044xmrBUCqhGAe86pibqzc6tQn0HfNBJNBachCVjjgpaEl9oZ6qT +1VOLqRrtVKwrDzbF3l6VgOZ99LDV2Enwcklt8l5vzlG7e4CviGDsDsnxAtmIH/vm +LutuvE6iUKK9KYaPfheMEm4c1JztJ5aPIFbjmP/6voLljoIGUWx5FY9sSAyh+vuo ++NgQrqbO6GWob7fMUFhMDCQdmi96Dhhf6rESeDWgxcf5AgMBAAGjUzBRMB0GA1Ud +DgQWBBSiCTPm6DH4q7ZZp7uhi0xnYjHhTTAfBgNVHSMEGDAWgBSiCTPm6DH4q7ZZ +p7uhi0xnYjHhTTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAn +7Vt981M5HkB4QNAM4s75Wt3+MrrSqzSZHCSRU0mPESb9uncnvjLbdi2Sndo1ZkgL +BaEjTsxoxhjZtx6Kc3ogZwFoM0iF1d2EF83wmvfDFWOLs/98/WrzbWoJF/BgqNIi +MTncDqryKhBIJ0ETOThKEzfswldxTG8tPqaW6fglLzJjqDLxkKAPIpNlq8djt57Z +iKQtOY0RQ44xbkNe0TUaeGXSshvFGdsGe2BIi5t4em+TBWnRNUiZMSVzhv5sWqt1 +LoRXmDG1INTs2ev0oj72N9eHRNH20nMagp529jwMkbxbpvSdjD40PJmsfdw1aGLb +EzySebJEPgNHhRbiEVnP +-----END CERTIFICATE----- diff --git a/server.key b/server.key new file mode 100644 index 0000000..0a125d9 --- /dev/null +++ b/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDDL0SeaSpf9NFM +aocM++NEHGWSsIwX0ZdGknWXvUfc1Q4lCgnbmh1FWTstC5roCs+iP+eOSTGDqNKx +Yhc5yLgVvxyvb5nEc1UrpcSvrmquMZ7KxrLksFi9044xmrBUCqhGAe86pibqzc6t +Qn0HfNBJNBachCVjjgpaEl9oZ6qT1VOLqRrtVKwrDzbF3l6VgOZ99LDV2Enwcklt +8l5vzlG7e4CviGDsDsnxAtmIH/vmLutuvE6iUKK9KYaPfheMEm4c1JztJ5aPIFbj +mP/6voLljoIGUWx5FY9sSAyh+vuo+NgQrqbO6GWob7fMUFhMDCQdmi96Dhhf6rES +eDWgxcf5AgMBAAECggEASY50s6Y6W/MtNTkoMBJ1MWPqO3/hK9DGy8fCHS8t9+Eq +9XZ1BJdt1IauMGmhNTVtzl167DpVOKLU1Bh9XD9ycG+XZd4O+uPkAxDzsKlwdrko +eI6tOFXk+5TQj40WSnXBuLBd8aJQJEjvTIg0CjBVZmEE7HM4i+4ppIwr/HKk7BTd +vwMapOBs42qvAl0EfaMIGP/AFbBKBcUQYmLC9Ui0OHbb8h4pqM5aMw6qNTt1HRm2 +2QT4OkSRT+hlueGhFHhKhg31LLmhojl/VX9xJ/RzT9aggnVEN7WpD5lSe2gBTs/q +/jq/assTUdGz+NKNt4Znv5A0T+/5v06VnIdqyviQoQKBgQD0lbthtRlHgYhG/iFh +4WVUg2DYxXVs7RKi76sv3wjy++6Sz4kpkErqbl6esCfg+esXual8Ef12pqIa8YGa +goc91bTnXx6pOB/4tPF5gMFUNYOuI0/+hzWz7Wbp8CILE3D5mEISlc5uloXnhbQC +yar3RPcT6pte9Qc8X5rCwB7OtQKBgQDMS07z6F4JQ28niMJJBrPhIJP1B7zbapRD +OJIL13HKSRs9QyuPmQtMuWxOieGRTv7Q4WBXZDkZAtaNXQYY7dVp94412SyfBZTS +sphyj5LNKzPO4SRlCpYcfkDoxDBU88zMuUA4NJkKnAeQW8Vf6kd6G93L+YsglF3c +Bz94HkpatQKBgQCtocJlqcfpcHaLV4vhTb6+0YmmOf+TtXV+gEB5+o8C2IDUbkrE +W/AjHvlDFHErEKCpth8wuiDC46a/E+XbB4D1D8qeWnOM1BA2YlXu2M3mdxslO2Jl +oh0ov4dI2jWAwWt5dXKqePkUnv0ukEdrlzks0yPIWsu0DKT3YjOev/7e5QKBgEaa +LCH9ByqaZHq8N7C3IUlHUfrXfrwxnCWTEl4HSesH0uMcKJzK3m3YkwadfhgSvduA +WCQ7ncP4CB/4qxfIcf3aMQqJEHOwoRsj362P0sMXECOKCWLmArS8KUCINM/XJcsG +ppwGCXHyNGb+YDrio2se4EsS5bMPs1RMKPIhPb8VAoGANPTvhDSXHEPFI3ZfOkJV +NvoeI4qyuc5RLtPvrL5DThHLBqnUMrveyaO++e638+AenZ4c2QPNfOv2UogMIAON +YdvAtWnEqEpeGOC+BFYCsmpm7iUh1exutXDywaZH0rghAYlCLjNpzjVXfmmDNIH/ +sFpKCBmo9JznTqgqkPjJHFk= +-----END PRIVATE KEY----- diff --git a/server.pem b/server.pem new file mode 100644 index 0000000..9dd0640 --- /dev/null +++ b/server.pem @@ -0,0 +1,49 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDDL0SeaSpf9NFM +aocM++NEHGWSsIwX0ZdGknWXvUfc1Q4lCgnbmh1FWTstC5roCs+iP+eOSTGDqNKx +Yhc5yLgVvxyvb5nEc1UrpcSvrmquMZ7KxrLksFi9044xmrBUCqhGAe86pibqzc6t +Qn0HfNBJNBachCVjjgpaEl9oZ6qT1VOLqRrtVKwrDzbF3l6VgOZ99LDV2Enwcklt +8l5vzlG7e4CviGDsDsnxAtmIH/vmLutuvE6iUKK9KYaPfheMEm4c1JztJ5aPIFbj +mP/6voLljoIGUWx5FY9sSAyh+vuo+NgQrqbO6GWob7fMUFhMDCQdmi96Dhhf6rES +eDWgxcf5AgMBAAECggEASY50s6Y6W/MtNTkoMBJ1MWPqO3/hK9DGy8fCHS8t9+Eq +9XZ1BJdt1IauMGmhNTVtzl167DpVOKLU1Bh9XD9ycG+XZd4O+uPkAxDzsKlwdrko +eI6tOFXk+5TQj40WSnXBuLBd8aJQJEjvTIg0CjBVZmEE7HM4i+4ppIwr/HKk7BTd +vwMapOBs42qvAl0EfaMIGP/AFbBKBcUQYmLC9Ui0OHbb8h4pqM5aMw6qNTt1HRm2 +2QT4OkSRT+hlueGhFHhKhg31LLmhojl/VX9xJ/RzT9aggnVEN7WpD5lSe2gBTs/q +/jq/assTUdGz+NKNt4Znv5A0T+/5v06VnIdqyviQoQKBgQD0lbthtRlHgYhG/iFh +4WVUg2DYxXVs7RKi76sv3wjy++6Sz4kpkErqbl6esCfg+esXual8Ef12pqIa8YGa +goc91bTnXx6pOB/4tPF5gMFUNYOuI0/+hzWz7Wbp8CILE3D5mEISlc5uloXnhbQC +yar3RPcT6pte9Qc8X5rCwB7OtQKBgQDMS07z6F4JQ28niMJJBrPhIJP1B7zbapRD +OJIL13HKSRs9QyuPmQtMuWxOieGRTv7Q4WBXZDkZAtaNXQYY7dVp94412SyfBZTS +sphyj5LNKzPO4SRlCpYcfkDoxDBU88zMuUA4NJkKnAeQW8Vf6kd6G93L+YsglF3c +Bz94HkpatQKBgQCtocJlqcfpcHaLV4vhTb6+0YmmOf+TtXV+gEB5+o8C2IDUbkrE +W/AjHvlDFHErEKCpth8wuiDC46a/E+XbB4D1D8qeWnOM1BA2YlXu2M3mdxslO2Jl +oh0ov4dI2jWAwWt5dXKqePkUnv0ukEdrlzks0yPIWsu0DKT3YjOev/7e5QKBgEaa +LCH9ByqaZHq8N7C3IUlHUfrXfrwxnCWTEl4HSesH0uMcKJzK3m3YkwadfhgSvduA +WCQ7ncP4CB/4qxfIcf3aMQqJEHOwoRsj362P0sMXECOKCWLmArS8KUCINM/XJcsG +ppwGCXHyNGb+YDrio2se4EsS5bMPs1RMKPIhPb8VAoGANPTvhDSXHEPFI3ZfOkJV +NvoeI4qyuc5RLtPvrL5DThHLBqnUMrveyaO++e638+AenZ4c2QPNfOv2UogMIAON +YdvAtWnEqEpeGOC+BFYCsmpm7iUh1exutXDywaZH0rghAYlCLjNpzjVXfmmDNIH/ +sFpKCBmo9JznTqgqkPjJHFk= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDazCCAlOgAwIBAgIUDRvbhgRp/5zTuj0z6nXkGGCP8RkwDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMTA2MDYwMzU2NDBaFw0yMjA2 +MDYwMzU2NDBaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDDL0SeaSpf9NFMaocM++NEHGWSsIwX0ZdGknWXvUfc +1Q4lCgnbmh1FWTstC5roCs+iP+eOSTGDqNKxYhc5yLgVvxyvb5nEc1UrpcSvrmqu +MZ7KxrLksFi9044xmrBUCqhGAe86pibqzc6tQn0HfNBJNBachCVjjgpaEl9oZ6qT +1VOLqRrtVKwrDzbF3l6VgOZ99LDV2Enwcklt8l5vzlG7e4CviGDsDsnxAtmIH/vm +LutuvE6iUKK9KYaPfheMEm4c1JztJ5aPIFbjmP/6voLljoIGUWx5FY9sSAyh+vuo ++NgQrqbO6GWob7fMUFhMDCQdmi96Dhhf6rESeDWgxcf5AgMBAAGjUzBRMB0GA1Ud +DgQWBBSiCTPm6DH4q7ZZp7uhi0xnYjHhTTAfBgNVHSMEGDAWgBSiCTPm6DH4q7ZZ +p7uhi0xnYjHhTTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAn +7Vt981M5HkB4QNAM4s75Wt3+MrrSqzSZHCSRU0mPESb9uncnvjLbdi2Sndo1ZkgL +BaEjTsxoxhjZtx6Kc3ogZwFoM0iF1d2EF83wmvfDFWOLs/98/WrzbWoJF/BgqNIi +MTncDqryKhBIJ0ETOThKEzfswldxTG8tPqaW6fglLzJjqDLxkKAPIpNlq8djt57Z +iKQtOY0RQ44xbkNe0TUaeGXSshvFGdsGe2BIi5t4em+TBWnRNUiZMSVzhv5sWqt1 +LoRXmDG1INTs2ev0oj72N9eHRNH20nMagp529jwMkbxbpvSdjD40PJmsfdw1aGLb +EzySebJEPgNHhRbiEVnP +-----END CERTIFICATE----- diff --git a/todo.adoc b/todo.adoc new file mode 100644 index 0000000..9e606f5 --- /dev/null +++ b/todo.adoc @@ -0,0 +1,10 @@ +== Embeded C in html +for the `readlines()` callback in `indexCallback()` create a token that only +works with the server, like ejs `<%= %>`. Probably use lua in some way. + +== Lua function for inline css + + +== Links +- https://ejs.co/ +- https://stackshare.io/stackups/ejs-vs-pug