From: Nishi Date: Wed, 21 Aug 2024 15:36:37 +0000 (+0000) Subject: deleting repo works X-Git-Url: https://git.chaotic.ninja/gitweb/nishi/?a=commitdiff_plain;h=64c7be7abcbdbfaf3ebe5c086fc917292440a793;p=repoview.git deleting repo works git-svn-id: file:///raid/svn-personal/repoview/trunk@15 7e8b2a19-8934-dd40-8cb3-db22cdd5a80f --- diff --git a/CGI/db/sqlite.c b/CGI/db/sqlite.c index 15fce17..f23ca4b 100644 --- a/CGI/db/sqlite.c +++ b/CGI/db/sqlite.c @@ -125,6 +125,7 @@ void rv_create_user(const char* username, const char* password) { if(ret != SQLITE_OK) { sqlite3_free(err); } + rv_add_auth(username, password); } void rv_save_token(const char* username, const char* token) { diff --git a/CGI/repo.c b/CGI/repo.c index df4f54d..27e506b 100644 --- a/CGI/repo.c +++ b/CGI/repo.c @@ -104,8 +104,9 @@ void rv_create_repo(const char* repouser) { fseek(f, 0, SEEK_END); fprintf(f, "#%%START %s\n", repouser); + fprintf(f, "[%s:/]\n", repouser); fprintf(f, "* = r\n"); - fprintf(f, "%s = r\n", user); + fprintf(f, "%s = rw\n", user); fprintf(f, "#%%END\n"); lockf(fileno(f), F_ULOCK, 0); @@ -205,6 +206,7 @@ void rv_remove_repo(const char* repouser) { discard = true; } else if(discard && strcmp(line, "#%END") == 0) { discard = false; + } else if(strcmp(line, "") == 0) { } else if(!discard) { fprintf(f, "%s\n", line); } @@ -218,6 +220,18 @@ void rv_remove_repo(const char* repouser) { fclose(f); } +void rv_set_readme(const char* repouser, const char* readme) { + char* svnpath = rv_strcat3(SVN_ROOT, "/", repouser); + char* path = rv_strcat(svnpath, "/README.txt"); + FILE* f = fopen(path, "w"); + if(f != NULL) { + fwrite(readme, 1, strlen(readme), f); + fclose(f); + } + free(path); + free(svnpath); +} + bool rv_get_list(const char* repouser, const char* path, void (*handler)(const char* pathname), int* isdir) { char* svnpath = rv_strcat3(SVN_ROOT, "/", repouser); int pipes[2]; diff --git a/CGI/rv_repo.h b/CGI/rv_repo.h index 95eccab..77761bd 100644 --- a/CGI/rv_repo.h +++ b/CGI/rv_repo.h @@ -14,5 +14,6 @@ bool rv_get_list(const char* repouser, const char* path, void (*handler)(const c char* rv_read_file(const char* repouser, char* path); long long rv_get_filesize(const char* repouser, const char* path); void rv_remove_repo(const char* repouser); +void rv_set_readme(const char* repouser, const char* readme); #endif diff --git a/CGI/rv_util.h b/CGI/rv_util.h index 0c2939a..28ad1ac 100644 --- a/CGI/rv_util.h +++ b/CGI/rv_util.h @@ -16,5 +16,6 @@ char* rv_url_decode(const char* str); void rv_error_http(void); char* rv_new_token(const char* username); char* rv_construct_repouser(const char* reponame, const char* username); +void rv_add_auth(const char* username, const char* password); #endif diff --git a/CGI/sanity.c b/CGI/sanity.c index 79db11a..9bcabaf 100644 --- a/CGI/sanity.c +++ b/CGI/sanity.c @@ -49,19 +49,28 @@ void rv_check_sanity(void) { bool svnlook = rv_find_executable("svnlook"); bool svnadmin = rv_find_executable("svnadmin"); bool htpasswd = rv_find_executable("htpasswd"); +#ifdef USE_ENSCRIPT bool enscript = rv_find_executable("enscript"); +#endif + bool rm = rv_find_executable("rm"); if(!svnlook) sane = false; if(!svnadmin) sane = false; if(!htpasswd) sane = false; +#ifdef USE_ENSCRIPT if(!enscript) sane = false; +#endif + if(!rm) sane = false; if(!sane) { rv_error_http(); if(!svnlook) printf("svnlook not found\n"); if(!svnadmin) printf("svnadmin not found\n"); if(!htpasswd) printf("htpasswd not found\n"); +#ifdef USE_ENSCRIPT if(!enscript) printf("enscript not found\n"); +#endif + if(!rm) printf("rm not found\n"); exit(1); } } diff --git a/CGI/theme/modern.c b/CGI/theme/modern.c index ff7d82d..836d05c 100644 --- a/CGI/theme/modern.c +++ b/CGI/theme/modern.c @@ -129,7 +129,7 @@ void list_files(const char* pathname) { add_data(&query, esc); free(esc); add_data(&query, "&username="); - esc = url_escape(user); + esc = url_escape(rv_get_query("username")); add_data(&query, esc); free(esc); add_data(&query, "&path="); @@ -180,7 +180,7 @@ void list_files(const char* pathname) { add_data(&query, esc); free(esc); add_data(&query, "&username="); - esc = url_escape(user); + esc = url_escape(rv_get_query("username")); add_data(&query, esc); free(esc); add_data(&query, "&path="); @@ -465,15 +465,16 @@ void render_page(void) { desc = rv_strdup(""); page = rv_strdup(""); nav = rv_strdup(""); + rv_load_query('Q'); if(rv_get_query("username") == NULL || rv_get_query("reponame") == NULL) { add_data(&page, "Required parameters not set."); } else { - char* user = rv_get_query("username"); + char* ruser = rv_get_query("username"); char* repo = rv_get_query("reponame"); - char* repouser = rv_construct_repouser(repo, user); + char* repouser = rv_construct_repouser(repo, ruser); grepouser = repouser; if(rv_repo_exists(repouser)) { - char* showuser = html_escape(user); + char* showuser = html_escape(ruser); char* showrepo = html_escape(repo); char* showreadme = rv_get_readme(repouser); desc = html_escape_nl_to_br(showreadme); @@ -484,17 +485,29 @@ void render_page(void) { free(showuser); free(showrepo); free(showreadme); +#ifdef WWW_SVN_ROOT + add_data(&page, "

Info

\n"); + add_data(&page, "Raw repository"); +#endif int isdir; char* path = rv_get_query("path"); if(path == NULL) path = "/"; fcounter = 0; add_data(&page, ""); + bool rej = false; if(!rv_get_list(repouser, path, list_files, &isdir)) { add_data(&page, "\n"); + rej = true; } add_data(&page, "
Path not found.
"); - if(isdir == 0) { + if(isdir == 0 && !rej) { add_data(&nav, "
  • Content
  • "); add_data(&page, "

    Content

    \n"); add_data(&page, "
    ");
    @@ -535,11 +548,143 @@ void render_page(void) {
     #endif
     					add_data(&page, "
    "); } + if(user != NULL && strcmp(user, ruser) == 0) { + char* esc; + add_data(&nav, "
  • Manage The Repository
  • \n"); + add_data(&page, "

    Manage The Repository

    \n"); + add_data(&page, "
    \n"); + add_data(&page, "\n"); + add_data(&page, " \n"); + add_data(&page, " \n"); + add_data(&page, " \n"); + add_data(&page, " \n"); + add_data(&page, "
    README\n"); + add_data(&page, " \n"); + add_data(&page, "
    \n"); + add_data(&page, "\n"); + add_data(&page, "
    \n"); + add_data(&page, "\n"); + add_data(&page, "Delete repository\n"); + add_data(&page, "\n"); + } } else { add_data(&page, "Repository does not exist.\n"); } free(repouser); } + } else if(strcmp(query, "deleterepo") == 0) { + title = rv_strdup("Delete The Repository"); + page = rv_strdup(""); + + rv_load_query('Q'); + if(user == NULL) { + add_data(&page, "It looks like you are not logged in.
    Want to log in?\n"); + } else if(rv_get_query("username") == NULL || rv_get_query("reponame") == NULL) { + add_data(&page, "Invalid Form.\n"); + } else { + char* esc; + add_data(&page, "Are you sure you want to delete the repository?\n"); + add_data(&page, "
    "); + add_data(&page, " \n"); + add_data(&page, "
    \n"); + } + } else if(strcmp(query, "senddeleterepo") == 0) { + title = rv_strdup("Deleting Repository Result"); + page = rv_strdup(""); + + rv_load_query('Q'); + if(user == NULL) { + add_data(&page, "It looks like you are not logged in.
    Want to log in?\n"); + } else if(rv_get_query("username") == NULL || rv_get_query("reponame") == NULL) { + add_data(&page, "Invalid Form.\n"); + } else if(strcmp(rv_get_query("username"), user) != 0) { + add_data(&page, "You are not the owner of the repository.\n"); + } else { + char* repouser = rv_construct_repouser(rv_get_query("reponame"), rv_get_query("username")); + if(rv_repo_exists(repouser)) { + rv_remove_repo(repouser); + add_data(&page, "Deleted the repository successfully.
    \n"); + } else { + add_data(&page, "Repository does not exist.
    \n"); + } + } + } else if(strcmp(query, "sendmanrepo") == 0) { + title = rv_strdup("Modifying Repository Result"); + page = rv_strdup(""); + + rv_load_query('Q'); + if(user == NULL) { + add_data(&page, "It looks like you are not logged in.
    Want to log in?\n"); + } else if(rv_get_query("username") == NULL || rv_get_query("reponame") == NULL) { + add_data(&page, "Invalid Form.\n"); + } else if(strcmp(rv_get_query("username"), user) != 0) { + add_data(&page, "You are not the owner of the repository.\n"); + } else { + char* esc; + rv_load_query('P'); + char* readme = rv_get_query("readme"); + if(readme != NULL) { + rv_load_query('Q'); + char* name = rv_construct_repouser(rv_get_query("reponame"), rv_get_query("username")); + rv_set_readme(name, readme); + free(name); + } + rv_load_query('Q'); + add_data(&page, "Modified the repository successfully.
    \n"); + add_data(&page, "Go back to the repository.\n"); + } } if(title == NULL) title = rv_strdup(""); @@ -547,6 +692,7 @@ void render_page(void) { if(page == NULL) page = rv_strdup(""); if(nav == NULL) nav = rv_strdup(""); render_stuff(); +freeall: free(page); free(desc); free(title); @@ -785,6 +931,13 @@ void render_stuff(void) { add_data(&buffer, "\n"); add_data(&buffer, " \n"); add_data(&buffer, "
    \n"); +#ifdef INSTANCE_BANNERS + add_data(&buffer, "
    \n"); + add_data(&buffer, INSTANCE_BANNERS); + add_data(&buffer, "
    \n"); +#else + add_data(&buffer, "
    \n"); +#endif add_data(&buffer, " \n"); add_data(&buffer, " \n"); add_data(&buffer, "\n"); diff --git a/CGI/util.c b/CGI/util.c index ef8d199..b483cce 100644 --- a/CGI/util.c +++ b/CGI/util.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include char* rv_strcat(const char* a, const char* b) { char* str = malloc(strlen(a) + strlen(b) + 1); @@ -65,6 +67,10 @@ char* rv_url_decode(const char* str) { r = rv_strcat(tmp, cbuf); free(tmp); i += 2; + } else if(str[i] == '+') { + char* tmp = r; + r = rv_strcat(tmp, " "); + free(tmp); } else { cbuf[0] = str[i]; char* tmp = r; @@ -88,3 +94,14 @@ regenerate: rv_save_token(username, token); return token; } + +void rv_add_auth(const char* username, const char* password) { + pid_t pid = fork(); + if(pid == 0) { + char* cmd[] = {"htpasswd", "-b", APACHE_PASSWD, (char*)username, (char*)password, NULL}; + execvp("htpasswd", cmd); + _exit(0); + } else { + waitpid(pid, 0, 0); + } +} diff --git a/config.h.tmpl b/config.h.tmpl index 6baa1f5..2a17faf 100644 --- a/config.h.tmpl +++ b/config.h.tmpl @@ -8,25 +8,28 @@ #define __CONFIG_H__ /* Your instance name. */ -#define INSTANCE_NAME "Unnamed" +#define INSTANCE_NAME "Unnamed" /* Admin name/email. */ -#define INSTANCE_ADMIN "John Doe " +#define INSTANCE_ADMIN "John Doe " /* Instance Root. */ -#define INSTANCE_ROOT "/cgi-bin" +#define INSTANCE_ROOT "/cgi-bin" /* Instance Logo. */ -#define INSTANCE_LOGO "/logo.png" +#define INSTANCE_LOGO "/logo.png" /* Image to be put in the navbar, for the modern theme. 940x60 should be good. */ -#define INSTANCE_NAVBAR "/paper.png" +#define INSTANCE_NAVBAR "/paper.png" /* Navbar repeat, for the modern theme. */ -#define INSTANCE_REPEAT "resize-x" +#define INSTANCE_REPEAT "resize-x" + +/* Banners, for the modern theme.. */ +#define INSTANCE_BANNERS "" /* Repository/User delimeter. This character will be unusable in the username/repository name. */ -#define REPO_USER_DELIM '$' +#define REPO_USER_DELIM '-' /* Theme. */ #define USE_MODERN @@ -49,16 +52,19 @@ #undef USE_PATH /* SVN filesystem root. */ -#define SVN_ROOT "/www/svn" +#define SVN_ROOT "/www/svn" /* Database root. */ -#define DB_ROOT "/www/db" +#define DB_ROOT "/www/db" /* Apache htpasswd file. */ -#define APACHE_PASSWD "/www/passwd" +#define APACHE_PASSWD "/www/passwd" /* Apache authz file. */ -#define APACHE_AUTHZ "/www/authz" +#define APACHE_AUTHZ "/www/authz" + +/* Subversion root on the HTTP. */ +#define WWW_SVN_ROOT "/svn/" #endif