]> Git repositories of Nishi - repoview.git/commitdiff
deleting repo works
authorNishi <nishi@nishi.boats>
Wed, 21 Aug 2024 15:36:37 +0000 (15:36 +0000)
committerNishi <nishi@nishi.boats>
Wed, 21 Aug 2024 15:36:37 +0000 (15:36 +0000)
git-svn-id: file:///raid/svn-personal/repoview/trunk@15 7e8b2a19-8934-dd40-8cb3-db22cdd5a80f

CGI/db/sqlite.c
CGI/repo.c
CGI/rv_repo.h
CGI/rv_util.h
CGI/sanity.c
CGI/theme/modern.c
CGI/util.c
config.h.tmpl

index 15fce1728de22a63a6f62788e82e22ff786aa2b0..f23ca4b690f3e0a71aa8ef50183488032f5814a3 100644 (file)
@@ -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) {
index df4f54dce4be2525b7c594bba1e2ce8351df4d3a..27e506bc61dd80430bb3395a0c3106d25e72582e 100644 (file)
@@ -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];
index 95eccab438ccfdeda34146f8396d2b796bd8615d..77761bd2eadbc0d2b52871bbfe873d3c9352ca86 100644 (file)
@@ -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
index 0c2939a64106121ef37139cab6966e202e4a73d9..28ad1ac95cce96e18e6faa7b42adce80db6073ea 100644 (file)
@@ -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
index 79db11a9e939476d82efec46807a1933b401bdc8..9bcabaf5a10b0cb852ab9cf6032910edfe26f7ee 100644 (file)
@@ -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);
        }
 }
index ff7d82da966978306b752af7115e2c1d328148f8..836d05ce5cb83c8317d1032d3592d8d6e4f610dd 100644 (file)
@@ -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, "<h2 id=\"repoinfo\">Info</h2>\n");
+                               add_data(&page, "<a href=\"");
+                               add_data(&page, WWW_SVN_ROOT);
+                               add_data(&page, "/");
+                               char* escru = url_escape(repouser);
+                               add_data(&page, escru);
+                               free(escru);
+                               add_data(&page, "\">Raw repository</a>");
+#endif
 
                                int isdir;
                                char* path = rv_get_query("path");
                                if(path == NULL) path = "/";
                                fcounter = 0;
                                add_data(&page, "<table border=\"0\" style=\"width: 100%;\">");
+                               bool rej = false;
                                if(!rv_get_list(repouser, path, list_files, &isdir)) {
                                        add_data(&page, "<tr><td>Path not found.</td></tr>\n");
+                                       rej = true;
                                }
                                add_data(&page, "</table>");
-                               if(isdir == 0) {
+                               if(isdir == 0 && !rej) {
                                        add_data(&nav, "<li><a href=\"#filecontent\">Content</a></li>");
                                        add_data(&page, "<h2 id=\"filecontent\">Content</h2>\n");
                                        add_data(&page, "<pre class=\"codeblock\"><code>");
@@ -535,11 +548,143 @@ void render_page(void) {
 #endif
                                        add_data(&page, "</code></pre>");
                                }
+                               if(user != NULL && strcmp(user, ruser) == 0) {
+                                       char* esc;
+                                       add_data(&nav, "<li><a href=\"#managerepo\">Manage The Repository</a></li>\n");
+                                       add_data(&page, "<h2 id=\"managerepo\">Manage The Repository</h2>\n");
+                                       add_data(&page, "<form action=\"");
+                                       add_data(&page, INSTANCE_ROOT);
+                                       add_data(&page, "/?page=sendmanrepo&username=");
+                                       esc = url_escape(ruser);
+                                       add_data(&page, esc);
+                                       free(esc);
+                                       add_data(&page, "&reponame=");
+                                       esc = url_escape(ruser);
+                                       add_data(&page, esc);
+                                       free(esc);
+                                       add_data(&page, "\" method=\"POST\">\n");
+                                       add_data(&page, "<table border=\"0\" style=\"width: 100%;\">\n");
+                                       add_data(&page, "       <tr>\n");
+                                       add_data(&page, "               <th>README</th>\n");
+                                       add_data(&page, "               <td>\n");
+                                       add_data(&page, "                       <textarea name=\"readme\" style=\"width: 100%;resize: none;height: 128px;\">\n");
+                                       char* readme = rv_get_readme(repouser);
+                                       esc = html_escape(readme);
+                                       add_data(&page, esc);
+                                       free(esc);
+                                       free(readme);
+                                       add_data(&page, "                       </textarea>\n");
+                                       add_data(&page, "               </td>\n");
+                                       add_data(&page, "       </tr>\n");
+                                       add_data(&page, "</table>\n");
+                                       add_data(&page, "<input type=\"submit\" value=\"Send\">\n");
+                                       add_data(&page, "</form>\n");
+                                       add_data(&page, "<a href=\"");
+                                       add_data(&page, INSTANCE_ROOT);
+                                       add_data(&page, "/?page=deleterepo&username=");
+                                       esc = url_escape(ruser);
+                                       add_data(&page, esc);
+                                       free(esc);
+                                       add_data(&page, "&reponame=");
+                                       esc = url_escape(ruser);
+                                       add_data(&page, esc);
+                                       free(esc);
+                                       add_data(&page, "\">\n");
+                                       add_data(&page, "Delete repository\n");
+                                       add_data(&page, "</a>\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.<br>Want to <a href=\"");
+                       add_data(&page, INSTANCE_ROOT);
+                       add_data(&page, "/?page=login\">log in</a>?\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, "<form method=\"POST\" action=\"");
+                       add_data(&page, INSTANCE_ROOT);
+                       add_data(&page, "/?page=senddeleterepo&username=");
+                       esc = url_escape(rv_get_query("username"));
+                       add_data(&page, esc);
+                       free(esc);
+                       add_data(&page, "&reponame=");
+                       esc = url_escape(rv_get_query("reponame"));
+                       add_data(&page, esc);
+                       free(esc);
+                       add_data(&page, "\">");
+                       add_data(&page, "       <input type=\"submit\" value=\"Yes\">\n");
+                       add_data(&page, "</form>\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.<br>Want to <a href=\"");
+                       add_data(&page, INSTANCE_ROOT);
+                       add_data(&page, "/?page=login\">log in</a>?\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.<br>\n");
+                       } else {
+                               add_data(&page, "Repository does not exist.<br>\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.<br>Want to <a href=\"");
+                       add_data(&page, INSTANCE_ROOT);
+                       add_data(&page, "/?page=login\">log in</a>?\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.<br>\n");
+                       add_data(&page, "<a href=\"");
+                       add_data(&page, INSTANCE_ROOT);
+                       add_data(&page, "?page=repo&username=");
+                       esc = url_escape(rv_get_query("username"));
+                       add_data(&page, esc);
+                       free(esc);
+                       add_data(&page, "&reponame=");
+                       esc = url_escape(rv_get_query("reponame"));
+                       add_data(&page, esc);
+                       free(esc);
+                       add_data(&page, "\">Go back to the repository</a>.\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, "                     </div>\n");
        add_data(&buffer, "                     <div class=\"fixfloat\"></div>\n");
+#ifdef INSTANCE_BANNERS
+       add_data(&buffer, "                     <div id=\"banners\" style=\"clear: both;\">\n");
+       add_data(&buffer, INSTANCE_BANNERS);
+       add_data(&buffer, "                     </div>\n");
+#else
+       add_data(&buffer, "                     <div class=\"fixfloat\"></div>\n");
+#endif
        add_data(&buffer, "             </div>\n");
        add_data(&buffer, "     </body>\n");
        add_data(&buffer, "</html>\n");
index ef8d199581400cfcf4bd06d5f9b61359f0f87086..b483cce3473841688d8d902559c1422ec561bd76 100644 (file)
@@ -10,6 +10,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
 
 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);
+       }
+}
index 6baa1f57f9d10821a0cb9212bd2881773725b5b2..2a17faf8b3434b2cbc1e91d81b1b2bb72d67a6f7 100644 (file)
@@ -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 <john.doe@example.com>"
+#define INSTANCE_ADMIN         "John Doe <john.doe@example.com>"
 
 /* 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       "<img src=\"http://netbsd.org/images/logos/pnetbsd.gif\" width=\"88px\" height=\"31px\">"
 
 /* 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
 #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