home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lynx2.8.1dev.10.tar.gz / lynx2.8.1dev.10.tar / lynx2-8 / src / LYUpload.c < prev    next >
C/C++ Source or Header  |  1998-04-23  |  8KB  |  316 lines

  1. /*
  2. **  Routines to upload files to the local filesystem.
  3. **  Created by: Rick Mallett, Carleton University
  4. **  Report problems to rmallett@ccs.carleton.ca
  5. **  Modified 15-Dec-95 George Lindholm (lindholm@ucs.ubc.ca):
  6. **    Reread the upload menu page every time, in case the "upload" directory
  7. **      has changed (make the current directory that for the upload process).
  8. **    Prompt for the upload file name if there is no "%s" in the command
  9. **      string. Most protocols allow the user to specify the file name
  10. **      from the client side.  Xmodem appears to be the only that can't
  11. **      figure out the filename from the transfer data so it needs the
  12. **      information from lynx (or an upload script which prompts for it).
  13. **      On the other hand, zmodem aborts when you give it a filename on
  14. **      the command line (great way of bypassing the nodotfile code :=( ).
  15. */
  16.  
  17. #include <HTUtils.h>
  18. #include <tcp.h>
  19. #include <HTParse.h>
  20. #include <HTAlert.h>
  21. #include <LYCurses.h>
  22. #include <LYUtils.h>
  23. #include <LYGlobalDefs.h>
  24. #include <LYSignal.h>
  25. #include <LYStrings.h>
  26. #include <LYClean.h>
  27. #include <LYGetFile.h>
  28. #include <LYUpload.h>
  29. #include <LYSystem.h>
  30. #include <LYLocal.h>
  31.  
  32. #include <LYexit.h>
  33. #include <LYLeaks.h>
  34.  
  35. #define FREE(x) if (x) {free(x); x = NULL;}
  36.  
  37. PUBLIC char LYUploadFileURL[256] = "\0";
  38.  
  39. /*
  40.  *  LYUpload uploads a file to a given location using a
  41.  *  specified upload method.  It parses an incoming link
  42.  *  that looks like:
  43.  *    LYNXDIRED://UPLOAD=<#>/TO=<STRING>
  44.  */
  45. PUBLIC int LYUpload ARGS1(
  46.     char *,     line)
  47. {
  48.     char *method, *directory, *dir;
  49.     int method_number;
  50.     int count;
  51.     char tmpbuf[256];
  52.     char buffer[256];
  53.     lynx_html_item_type *upload_command = 0;
  54.     int c;
  55.     char *cp;
  56.     FILE *fp;
  57.     char cmd[512];
  58. #ifdef VMS
  59.     extern BOOLEAN HadVMSInterrupt;
  60. #endif /* VMS */
  61.  
  62.     /*
  63.      *    Use configured upload commands.
  64.      */
  65.     if((directory = (char *)strstr(line, "TO=")) == NULL)
  66.     goto failed;
  67.     *(directory - 1) = '\0';
  68.     /* go past "Directory=" */
  69.     directory+=3;
  70.  
  71.     if((method = (char *)strstr(line, "UPLOAD=")) == NULL)
  72.     goto failed;
  73.     /*
  74.      *    Go past "Method=".
  75.      */
  76.     method += 7;
  77.     method_number = atoi(method);
  78.  
  79.     for (count = 0, upload_command = uploaders; count < method_number;
  80.     count++, upload_command = upload_command->next)
  81.       ; /* null body */
  82.  
  83.     /*
  84.      *    Parsed out the Method and the Location?
  85.      */
  86.     if (upload_command->command == NULL) {
  87.     _statusline("ERROR! - upload command is misconfigured");
  88.     sleep(AlertSecs);
  89.     goto failed;
  90.     }
  91.  
  92.     /*
  93.      *    Care about the local name?
  94.      */
  95.     if (strstr(upload_command->command, "%s")) {
  96.     /*
  97.      *  Commands have the form "command %s [etc]"
  98.      *  where %s is the filename.
  99.      */
  100.     _statusline("Enter a filename: ");
  101. retry:
  102.     *tmpbuf = '\0';
  103.     if (LYgetstr(tmpbuf, VISIBLE, sizeof(tmpbuf), NORECALL) < 0)
  104.         goto cancelled;
  105.  
  106.     if (*tmpbuf == '\0')
  107.         goto cancelled;
  108.  
  109.     if (strstr(tmpbuf, "../") != NULL) {
  110.         _statusline(
  111.             "Illegal redirection \"../\" found! Request ignored.");
  112.         sleep(AlertSecs);
  113.         goto cancelled;
  114.     } else if (strchr(tmpbuf, '/') != NULL) {
  115.         _statusline("Illegal character \"/\" found! Request ignored.");
  116.         sleep(AlertSecs);
  117.         goto cancelled;
  118.     } else if (tmpbuf[0] == '~') {
  119.         _statusline(
  120.         "Illegal redirection using \"~\" found! Request ignored.");
  121.         sleep(AlertSecs);
  122.         goto cancelled;
  123.     }
  124.     sprintf(buffer, "%s/%s", directory, tmpbuf);
  125.  
  126.     if (no_dotfiles || !show_dotfiles) {
  127.         if (*buffer == '.' ||
  128. #ifdef VMS
  129.         ((cp = strrchr(buffer, ':')) && *(cp+1) == '.') ||
  130.         ((cp = strrchr(buffer, ']')) && *(cp+1) == '.') ||
  131. #endif /* VMS */
  132.         ((cp = strrchr(buffer, '/')) && *(cp+1) == '.')) {
  133.         _statusline(
  134.           "File name may not begin with dot. Enter a new filename: ");
  135.         goto retry;
  136.         }
  137.     }
  138.  
  139.     /*
  140.      *  See if it already exists.
  141.      */
  142.     if ((fp = fopen(buffer, "r")) != NULL) {
  143.         fclose(fp);
  144.  
  145. #ifdef VMS
  146.         _statusline("File exists. Create higher version? (y/n)");
  147. #else
  148.         _statusline("File exists. Overwrite? (y/n)");
  149. #endif /* VMS */
  150.         c = 0;
  151.         while (TOUPPER(c) != 'Y' && TOUPPER(c) != 'N' && c != 7 && c != 3)
  152.         c = LYgetch();
  153. #ifdef VMS
  154.         if (HadVMSInterrupt) {
  155.         HadVMSInterrupt = FALSE;
  156.         goto cancelled;
  157.         }
  158. #endif /* VMS */
  159.  
  160.         if (c == 7 || c == 3) { /* Control-G or Control-C */
  161.         goto cancelled;
  162.         }
  163.  
  164.         if (TOUPPER(c) == 'N') {
  165.         _statusline("Enter a filename: ");
  166.         goto retry;
  167.         }
  168.     }
  169.  
  170.     /*
  171.      *  See if we can write to it.
  172.      */
  173.     if ((fp = fopen(buffer, "w")) != NULL) {
  174.         fclose(fp);
  175.         remove(buffer);
  176.     } else {
  177.         _statusline("Cannot write to file. Enter a new filename: ");
  178.         goto retry;
  179.     }
  180.  
  181. #if defined (VMS) || defined (__EMX__)
  182.     sprintf(tmpbuf, upload_command->command, buffer, "", "", "", "", "");
  183. #else
  184.     cp = quote_pathname(buffer); /* to prevent spoofing of the shell */
  185.     sprintf(tmpbuf, upload_command->command, cp, "", "", "", "", "");
  186.     FREE(cp);
  187. #endif /* VMS */
  188.     } else {            /* No substitution, no changes */
  189.     strcpy(tmpbuf, upload_command->command);
  190.     }
  191.  
  192.     dir = quote_pathname(directory);
  193.     sprintf(cmd, "cd %s ; %s", dir, tmpbuf);
  194.     FREE(dir);
  195.     stop_curses();
  196.     CTRACE(tfp, "command: %s\n", cmd);
  197.     system(cmd);
  198.     fflush(stdout);
  199.     start_curses();
  200. #ifdef UNIX
  201.     chmod(buffer, HIDE_CHMOD);
  202. #endif /* UNIX */
  203.     /* don't remove(file); */
  204.  
  205.     return 1;
  206.  
  207. failed:
  208.     _statusline("Unable to upload file.");
  209.     sleep(AlertSecs);
  210.     return 0;
  211.  
  212. cancelled:
  213.     _statusline("Cancelling.");
  214.     sleep(InfoSecs);
  215.     return 0;
  216. }
  217.  
  218. /*
  219.  *  LYUpload_options writes out the current upload choices to a
  220.  *  file so that the user can select printers in the same way that
  221.  *  they select all other links.  Upload links look like:
  222.  *    LYNXDIRED://UPLOAD=<#>/TO=<STRING>
  223.  */
  224. PUBLIC int LYUpload_options ARGS2(
  225.     char **,    newfile,
  226.     char *,     directory)
  227. {
  228.     static char tempfile[256];
  229.     static BOOLEAN first = TRUE;
  230.     FILE *fp0;
  231.     lynx_html_item_type *cur_upload;
  232.     int count;
  233.     static char curloc[256];
  234.     char *cp;
  235.  
  236.     if (first) {
  237.     /*
  238.      *  Get an unused tempfile name. - FM
  239.      */
  240.     tempname(tempfile, NEW_FILE);
  241. #ifdef VMS
  242.     } else {
  243.     remove(tempfile);   /* Remove duplicates on VMS. */
  244. #endif /* VMS */
  245.     }
  246.  
  247.     /*
  248.      *    Open the tempfile for writing and set it's
  249.      *    protection in case this wasn't done via an
  250.      *    external umask. - FM
  251.      */
  252.     if ((fp0 = LYNewTxtFile(tempfile)) == NULL) {
  253.     HTAlert(CANNOT_OPEN_TEMP);
  254.     return(-1);
  255.     }
  256.  
  257. #ifdef VMS
  258.     strcpy(curloc, "/sys$login");
  259. #else
  260.     cp = directory;
  261.     if (!strncmp(cp, "file://localhost", 16))
  262.     cp += 16;
  263.     else if (!strncmp(cp, "file:", 5))
  264.     cp += 5;
  265.     strcpy(curloc,cp);
  266.     HTUnEscape(curloc);
  267.     if (curloc[strlen(curloc) - 1] == '/')
  268.     curloc[strlen(curloc) - 1] = '\0';
  269. #endif /* VMS */
  270.  
  271.     if (first) {
  272.     /*
  273.      *  Make the tempfile a URL.
  274.      */
  275. #if defined (VMS) || defined (DOSPATH) || defined (__EMX__)
  276.     sprintf(LYUploadFileURL, "file://localhost/%s", tempfile);
  277. #else
  278.     sprintf(LYUploadFileURL, "file://localhost%s", tempfile);
  279. #endif /* VMS */
  280.     first = FALSE;
  281.     }
  282.     StrAllocCopy(*newfile, LYUploadFileURL);
  283.  
  284.     fprintf(fp0, "<head>\n<title>%s</title>\n</head>\n<body>\n",
  285.          UPLOAD_OPTIONS_TITLE);
  286.  
  287.     fprintf(fp0, "<h1>Upload Options (%s Version %s)</h1>\n",
  288.                       LYNX_NAME, LYNX_VERSION);
  289.  
  290.     fputs("You have the following upload choices.<br>\n", fp0);
  291.     fputs("Please select one:<br>\n<pre>\n", fp0);
  292.  
  293.     if (uploaders != NULL) {
  294.     for (count = 0, cur_upload = uploaders;
  295.          cur_upload != NULL;
  296.          cur_upload = cur_upload->next, count++) {
  297.         fprintf(fp0, "   <a href=\"LYNXDIRED://UPLOAD=%d/TO=%s\">",
  298.              count, curloc);
  299.         fprintf(fp0, (cur_upload->name ?
  300.               cur_upload->name : "No Name Given"));
  301.         fprintf(fp0, "</a>\n");
  302.     }
  303.     } else {
  304.     fprintf(fp0, "\n   \
  305. No other upload methods have been defined yet.  You may define\n   \
  306. an unlimited number of upload methods using the lynx.cfg file.\n");
  307.  
  308.     }
  309.     fprintf(fp0, "</pre>\n</body>\n");
  310.     fclose(fp0);
  311.  
  312.     LYforce_no_cache = TRUE;
  313.  
  314.     return(0);
  315. }
  316.