From bd966ba2e6c7a8d3e0d341145d040164df784eff Mon Sep 17 00:00:00 2001 From: ArsenArsen Date: Thu, 7 Dec 2017 01:25:36 +0100 Subject: [PATCH] added a wait mode to make ncurses possible --- .clang-format | 48 ++++++++++++ .gitignore | 2 +- Makefile | 17 +++- rsudo.c | 211 ++++++++++++++++++++++++++++---------------------- 4 files changed, 183 insertions(+), 95 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..4fbd279 --- /dev/null +++ b/.clang-format @@ -0,0 +1,48 @@ +# vim: set syntax=yaml : +AccessModifierOffset: -4 +AlignEscapedNewlinesLeft: false +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortFunctionsOnASingleLine: false +AllowShortIfStatementsOnASingleLine: true +AllowShortLoopsOnASingleLine: true +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackParameters: false +BreakBeforeBinaryOperators: true +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 120 +CommentPragmas: '' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 0 +ContinuationIndentWidth: 0 +Cpp11BracedListStyle: false +DerivePointerBinding: false +IndentCaseLabels: false +IndentFunctionDeclarationAfterType: false +IndentWidth: 4 +Language: Cpp +MaxEmptyLinesToKeep: 2 +NamespaceIndentation: All +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 100 +PenaltyBreakComment: 100 +PenaltyBreakFirstLessLess: 0 +PenaltyBreakString: 100 +PenaltyExcessCharacter: 1 +PenaltyReturnTypeOnItsOwnLine: 20 +PointerBindsToType: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +Standard: Auto +TabWidth: 4 +UseTab: Never diff --git a/.gitignore b/.gitignore index 1ac2413..65d0218 100644 --- a/.gitignore +++ b/.gitignore @@ -51,5 +51,5 @@ Module.symvers Mkfile.old dkms.conf - +tags rsudo diff --git a/Makefile b/Makefile index c738ac7..ac90de7 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,16 @@ +INSTALL_PREFIX = /usr/local/bin +CC = gcc -all: - gcc -o ./rsudo rsudo.c +all: rsudo setuid + +setuid: rsudo + chown root:root rsudo + chmod 4711 rsudo + +.PHONY: all setuid + +rsudo: rsudo.c + $(CC) -o ./rsudo rsudo.c + +install: rsudo + install -Dm4711 rsudo $(INSTALL_PREFIX)/rsudo diff --git a/rsudo.c b/rsudo.c index a9ae75d..041039e 100644 --- a/rsudo.c +++ b/rsudo.c @@ -11,28 +11,39 @@ Copyright (C) Luna Mendes 2017 */ -#include +#include #include -#include -#include +#include +#include #include +#include +#include +#include #include #include "log.h" -const char* sock_path = "/home/luna/local.git/memed/memed.succ"; +// lol C bool lib +typedef int bool; +enum { false, true }; + +const char *sock_path = "/var/sock/memed.sock"; + +struct args_context { + int positional_count; + char **positional; + bool nowait; +}; struct header_s { unsigned int len; int op; }; -char *join(const char* s1, const char* s2) -{ - char* result = malloc(strlen(s1) + strlen(s2) + 1); - - if (result) - { +char *join(const char *s1, const char *s2) { + free((void *)s1); + char *result = malloc(strlen(s1) + strlen(s2) + 1); + if (result) { strcpy(result, s1); strcat(result, s2); } @@ -40,8 +51,19 @@ char *join(const char* s1, const char* s2) return result; } -int main(int argc, char **argv) -{ +void print_help() { + printf("sudo thing that integrates (badly) with discord\n\n" + "made by: luba and arsen\n\n" + "Usage: <--nowait> [command ...]\n" + " --nowait - Schedule command for execution by memed\n"); +} + + +int main(int argc, char **argv) { + if (argc == 1) { + print_help(); + return -1; + } // the idea here is to open the socket // send a message to it and run asap struct sockaddr_un addr; @@ -54,8 +76,7 @@ int main(int argc, char **argv) // rc read count int fd, rc; - if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) - { + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket error"); exit(-1); } @@ -63,96 +84,102 @@ int main(int argc, char **argv) memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, sock_path, sizeof(addr.sun_path)-1); + strncpy(addr.sun_path, sock_path, sizeof(addr.sun_path) - 1); LOG_INFO("main", "connecting"); - if ( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1 ) - { + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { perror("connect error"); exit(-1); } // read the hello // We start by reading and filling our header - if ((rc = recv(fd, &header, 8, 0)) < 0) - { + if ((rc = recv(fd, &header, 8, 0)) < 0) { perror("recv"); exit(-1); } - printf("%d %d\n", header.len, header.op); + if (strcmp(argv[1], "--nowait") == 0) { + argv++; // luba pls no use argv[0] becus its --nowait now + printf("%d %d\n", header.len, header.op); - // Then we proceed to, with the data from header, - // read the message - if ((rc = recv(fd, &buffer, header.len, 0)) < 0) - { - perror("recv"); - exit(-1); + // Then we proceed to, with the data from header, + // read the message + if ((rc = recv(fd, &buffer, header.len, 0)) < 0) { + perror("recv"); + exit(-1); + } + + /* + + if(strlen(buffer) != header.len || strlen(buffer) - 1 != header.len) + { + printf("%u %d\n", strlen(buffer), header.len); + LOG_ERROR("main", "hello length != header length"); + exit(-1); + } + + */ + + if (header.op != 0) { + LOG_ERROR("main", "incorrect header op"); + exit(-1); + } + + LOG_INFO("main", "finished hello"); + + char *tot = ""; + for (int i = 1; i < argc; i++) { + char *arg = argv[i]; + tot = join(tot, arg); + + if (i != argc - 1) tot = join(tot, " "); + } + + // convert uid to string + int uid = getuid(); + char uid_str[6]; + + sprintf(uid_str, "%d", uid); + + tot = join(tot, ","); + tot = join(tot, uid_str); + + tot = join(tot, ","); + tot = join(tot, getenv("USER")); + + printf("sending command: %s\n", tot); + + // encode our data + struct header_s send_h; + send_h.len = strlen(tot); + send_h.op = 2; + + if (send(fd, &send_h, sizeof(send_h), 0) < 0) { + perror("send req"); + exit(-1); + } + + if (send(fd, tot, strlen(tot), 0) < 0) { + perror("send req total"); + exit(-1); + } + + shutdown(fd, SHUT_RDWR); + + printf("Successfully communicated your command to memed!\n"); + + close(fd); + exit(0); + } else { + // TODO luna make thje check + setuid(0); + setenv("USER", "root", true); + setenv("HOME", "/root", true); // todo: dont care + int err = execvp(argv[1], argv + 1); + if (err == -1) + perror("rsudo: exec"); + else + return err; } - - /* - - if(strlen(buffer) != header.len || strlen(buffer) - 1 != header.len) - { - printf("%u %d\n", strlen(buffer), header.len); - LOG_ERROR("main", "hello length != header length"); - exit(-1); - } - - */ - - if(header.op != 0) - { - LOG_ERROR("main", "incorrect header op"); - exit(-1); - } - - LOG_INFO("main", "finished hello"); - - char *tot = ""; - for(int i = 1; i < argc; i++) - { - char *arg = argv[i]; - tot = join(tot, arg); - - if(i != argc - 1) tot = join(tot, " "); - } - - // convert uid to string - int uid = getuid(); - char uid_str[6]; - - sprintf(uid_str, "%d", uid); - - tot = join(tot, ","); - tot = join(tot, uid_str); - - tot = join(tot, ","); - tot = join(tot, getenv("USER")); - - printf("sending command: %s\n", tot); - - // encode our data - struct header_s send_h; - send_h.len = strlen(tot); - send_h.op = 2; - - if (send(fd, &send_h, sizeof(send_h), 0) < 0) - { - perror("send req"); - exit(-1); - } - - if (send(fd, tot, strlen(tot), 0) < 0) - { - perror("send req total"); - exit(-1); - } - - shutdown(fd, SHUT_RDWR); - - printf("Successfully communicated your command to memed!\n"); - - close(fd); - exit(0); }