iMerge pull request #20 from bket/drop_priv - fiche - A pastebin adjusted for gopher use Err vernunftzentrum.de 70 hgit clone git://vernunftzentrum.de/fiche.git URL:git://vernunftzentrum.de/fiche.git vernunftzentrum.de 70 1Log /ckeen/repos/fiche/log.gph vernunftzentrum.de 70 1Files /ckeen/repos/fiche/files.gph vernunftzentrum.de 70 1Refs /ckeen/repos/fiche/refs.gph vernunftzentrum.de 70 1LICENSE /ckeen/repos/fiche/file/LICENSE.gph vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1commit 4c3f5908e36d6037c26400fc6bbfe7c6fc343b4f /ckeen/repos/fiche/commit/4c3f5908e36d6037c26400fc6bbfe7c6fc343b4f.gph vernunftzentrum.de 70 1parent a284706e78fc19568e8954376b0cb8e04a24221c /ckeen/repos/fiche/commit/a284706e78fc19568e8954376b0cb8e04a24221c.gph vernunftzentrum.de 70 hAuthor: solusipse URL:mailto:solus1ps3@gmail.com vernunftzentrum.de 70 iDate: Tue, 22 Sep 2015 04:33:34 +0200 Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iMerge pull request #20 from bket/drop_priv Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iDrop privileges when running as root Err vernunftzentrum.de 70 iDiffstat: Err vernunftzentrum.de 70 i README.md | 10 ++++++---- Err vernunftzentrum.de 70 i fiche.c | 33 +++++++++++++++++++------------ Err vernunftzentrum.de 70 i fiche.h | 3 +-- Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i3 files changed, 27 insertions(+), 19 deletions(-) Err vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1diff --git a/README.md b/README.md /ckeen/repos/fiche/file/README.md.gph vernunftzentrum.de 70 i@@ -115,13 +115,15 @@ http://domain.com/abcdef/ Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i #### User name #### Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i-If you use fiche as service (see details below) you may want to save files as other user, to do that use `-u` option, Err vernunftzentrum.de 70 i-there's example: Err vernunftzentrum.de 70 i+Set the user that fiche runs as using the `-u` option, example: Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i ``` Err vernunftzentrum.de 70 i-fiche -u http Err vernunftzentrum.de 70 i+fiche -u _fiche Err vernunftzentrum.de 70 i ``` Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+This option has effect only if fiche was started by root, otherwise it is ignored and fiche runs under the Err vernunftzentrum.de 70 i+current user id. Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i ----------------- Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i #### Buffersize #### Err vernunftzentrum.de 70 i@@ -221,7 +223,7 @@ You can run fiche as service, there is simple systemd example: Err vernunftzentrum.de 70 i Description=FICHE-SERVER Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i [Service] Err vernunftzentrum.de 70 i-ExecStart=/usr/local/bin/fiche -d code.solusipse.net -o /home/www/code/ -l /home/www/log.txt Err vernunftzentrum.de 70 i+ExecStart=/usr/local/bin/fiche -d code.solusipse.net -o /home/www/code/ -l /home/www/log.txt -u _fiche Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i [Install] Err vernunftzentrum.de 70 i WantedBy=multi-user.target Err vernunftzentrum.de 70 1diff --git a/fiche.c b/fiche.c /ckeen/repos/fiche/file/fiche.c.gph vernunftzentrum.de 70 i@@ -36,6 +36,17 @@ int main(int argc, char **argv) Err vernunftzentrum.de 70 i time_seed = time(0); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i parse_parameters(argc, argv); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (getuid() == 0) Err vernunftzentrum.de 70 i+ { Err vernunftzentrum.de 70 i+ if (UID == -1) Err vernunftzentrum.de 70 i+ error("ERROR: user not set"); Err vernunftzentrum.de 70 i+ if (setgid(GID) != 0) Err vernunftzentrum.de 70 i+ error("ERROR: Unable to drop group privileges"); Err vernunftzentrum.de 70 i+ if (setuid(UID) != 0) Err vernunftzentrum.de 70 i+ error("ERROR: Unable to drop user privileges"); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i if (BASEDIR == NULL) Err vernunftzentrum.de 70 i set_basedir(); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i@@ -255,12 +266,11 @@ void load_list(char *file_path, int type) Err vernunftzentrum.de 70 i int create_socket() Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i int lsocket = socket(AF_INET, SOCK_STREAM, 0); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i if (lsocket < 0) Err vernunftzentrum.de 70 i- { Err vernunftzentrum.de 70 i error("ERROR: Couldn't open socket"); Err vernunftzentrum.de 70 i- return 0; Err vernunftzentrum.de 70 i- } Err vernunftzentrum.de 70 i- else return lsocket; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ return lsocket; Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i struct sockaddr_in set_address(struct sockaddr_in server_address) Err vernunftzentrum.de 70 i@@ -317,8 +327,6 @@ int create_directory(char *slug) Err vernunftzentrum.de 70 i mkdir(BASEDIR, S_IRWXU | S_IRGRP | S_IROTH | S_IXOTH | S_IXGRP); Err vernunftzentrum.de 70 i int result = mkdir(directory, S_IRWXU | S_IRGRP | S_IROTH | S_IXOTH | S_IXGRP); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- change_owner(directory); Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i free(directory); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i return result; Err vernunftzentrum.de 70 i@@ -335,18 +343,11 @@ void save_to_file(char *slug, char *buffer, struct client_data data) Err vernunftzentrum.de 70 i fprintf(fp, "%s", buffer); Err vernunftzentrum.de 70 i fclose(fp); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- change_owner(directory); Err vernunftzentrum.de 70 i display_info(data, directory, ""); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i free(directory); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i-void change_owner(char *directory) Err vernunftzentrum.de 70 i-{ Err vernunftzentrum.de 70 i- if (UID != -1 && GID != -1) Err vernunftzentrum.de 70 i- chown(directory, UID, GID); Err vernunftzentrum.de 70 i-} Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i void set_uid_gid(char *username) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i struct passwd *userdata = getpwnam(username); Err vernunftzentrum.de 70 i@@ -388,6 +389,12 @@ void startup_message() Err vernunftzentrum.de 70 i printf("====================================\n"); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+void error(char *buffer) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ printf("%s\n", buffer); Err vernunftzentrum.de 70 i+ exit(1); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i void parse_parameters(int argc, char **argv) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i int c; Err vernunftzentrum.de 70 1diff --git a/fiche.h b/fiche.h /ckeen/repos/fiche/file/fiche.h.gph vernunftzentrum.de 70 i@@ -80,7 +80,7 @@ int create_directory(char *slug); Err vernunftzentrum.de 70 i int check_protocol(char *buffer); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i void bind_to_port(int listen_socket, struct sockaddr_in serveraddr); Err vernunftzentrum.de 70 i-void error(char *error_code){perror(error_code); exit(1);} Err vernunftzentrum.de 70 i+void error(char *buffer); Err vernunftzentrum.de 70 i void perform_connection(int listen_socket); Err vernunftzentrum.de 70 i void generate_url(char *buffer, char *slug, size_t slug_length, struct client_data data); Err vernunftzentrum.de 70 i void save_to_file(char *buffer, char *slug, struct client_data data); Err vernunftzentrum.de 70 i@@ -90,7 +90,6 @@ void set_basedir(); Err vernunftzentrum.de 70 i void load_list(char *file_path, int type); Err vernunftzentrum.de 70 i void parse_parameters(int argc, char **argv); Err vernunftzentrum.de 70 i void save_log(char *slug, char *hostaddrp, char *h_name); Err vernunftzentrum.de 70 i-void change_owner(char *directory); Err vernunftzentrum.de 70 i void set_uid_gid(); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i char *check_banlist(char *ip_address); Err vernunftzentrum.de 70 .