Nearly all <FORM> blocks now contain a hidden input
[citadel.git] / webcit / downloads.c
index a1d2984c459615e8e0ef53f453f92f9527cdc60e..d29e7fc7ebd635f8658436332dd2ccaca2c7fbf8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: downloads.c 4849 2007-01-08 20:05:56Z ajc $
+ * $Id$
  */
 #include "webcit.h"
 
@@ -50,7 +50,32 @@ void display_room_directory(void)
                wprintf("</tr>\n");
        }
 
-       wprintf("</table></div>\n");
+       wprintf("</table>\n");
+
+       /** Now offer the ability to upload files... */
+       if (WC->room_flags & QR_UPLOAD)
+       {
+               wprintf("<hr>");
+               wprintf("<form "
+                       "enctype=\"multipart/form-data\" "
+                       "method=\"POST\" "
+                       "accept-charset=\"UTF-8\" "
+                       "action=\"upload_file\" "
+                       "name=\"upload_file_form\""
+                       ">\n"
+               );
+               wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%ld\">\n", WC->nonce);
+
+               wprintf(_("Upload a file:"));
+               wprintf("&nbsp;<input NAME=\"filename\" SIZE=16 TYPE=\"file\">&nbsp;\n");
+               wprintf(_("Description:"));
+               wprintf("&nbsp;<input type=\"text\" name=\"description\" maxlength=\"64\" size=\"64\">&nbsp;");
+               wprintf("<input type=\"submit\" name=\"attach_button\" value=\"%s\">\n", _("Upload"));
+
+               wprintf("</form>\n");
+       }
+
+       wprintf("</div>\n");
        wDumpContent(1);
 }
 
@@ -61,9 +86,13 @@ void download_file(char *filename)
        off_t bytes;
        char content_type[256];
        char *content = NULL;
-       int force_download = 0;
+
+       /* Setting to nonzero forces a MIME type of application/octet-stream */
+       int force_download = 1;
        
-       serv_printf("OPEN %s", filename);
+       safestrncpy(buf, filename, sizeof buf);
+       unescape_input(buf);
+       serv_printf("OPEN %s", buf);
        serv_getln(buf, sizeof buf);
        if (buf[0] == '2') {
                bytes = extract_long(&buf[4], 0);
@@ -90,3 +119,42 @@ void download_file(char *filename)
 
 }
 
+
+
+void upload_file(void)
+{
+       char buf[1024];
+       size_t bytes_transmitted = 0;
+       size_t blocksize;
+
+       serv_printf("UOPN %s|%s", WC->upload_filename, bstr("description"));
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2')
+       {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_room_directory();
+               return;
+       }
+
+       while (bytes_transmitted < WC->upload_length)
+       {
+               blocksize = 4096;
+               if (blocksize > (WC->upload_length - bytes_transmitted))
+               {
+                       blocksize = (WC->upload_length - bytes_transmitted);
+               }
+               serv_printf("WRIT %d", blocksize);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '7')
+               {
+                       blocksize = atoi(&buf[4]);
+                       serv_write(&WC->upload[bytes_transmitted], blocksize);
+                       bytes_transmitted += blocksize;
+               }
+       }
+
+       serv_puts("UCLS 1");
+       serv_getln(buf, sizeof buf);
+       strcpy(WC->ImportantMessage, &buf[4]);
+       display_room_directory();
+}