Browse Source

text options to encrypt_file and pencrypt

David Rose 16 years ago
parent
commit
f360650ccc
2 changed files with 42 additions and 9 deletions
  1. 15 2
      panda/src/downloadertools/pencrypt.cxx
  2. 27 7
      panda/src/express/encrypt_string.cxx

+ 15 - 2
panda/src/downloadertools/pencrypt.cxx

@@ -62,6 +62,10 @@ usage() {
     << "      are more secure.  If this is not specified, the user is prompted from\n"
     << "      are more secure.  If this is not specified, the user is prompted from\n"
     << "      standard input.\n\n"
     << "      standard input.\n\n"
 
 
+    << "  -t  Read the file as a text file.  This will automatically convert\n"
+    << "      universal end-of-line characters into a newline character, ascii\n"
+    << "      10.\n\n"
+
     << "  -a \"algorithm\"\n"
     << "  -a \"algorithm\"\n"
     << "      Specifies the particular encryption algorithm to use.  The complete\n"
     << "      Specifies the particular encryption algorithm to use.  The complete\n"
     << "      set of available algorithms is defined by the current version of\n"
     << "      set of available algorithms is defined by the current version of\n"
@@ -88,10 +92,11 @@ int
 main(int argc, char *argv[]) {
 main(int argc, char *argv[]) {
   extern char *optarg;
   extern char *optarg;
   extern int optind;
   extern int optind;
-  const char *optstr = "o:p:a:k:i:h";
+  const char *optstr = "o:p:ta:k:i:h";
 
 
   Filename dest_filename;
   Filename dest_filename;
   bool got_dest_filename = false;
   bool got_dest_filename = false;
+  bool text_file = false;
 
 
   int flag = getopt(argc, argv, optstr);
   int flag = getopt(argc, argv, optstr);
 
 
@@ -102,6 +107,10 @@ main(int argc, char *argv[]) {
       got_dest_filename = true;
       got_dest_filename = true;
       break;
       break;
 
 
+    case 't':
+      text_file = true;
+      break;
+
     case 'p':
     case 'p':
       password = optarg;
       password = optarg;
       got_password = true;
       got_password = true;
@@ -157,7 +166,11 @@ main(int argc, char *argv[]) {
 
 
       // Open source file
       // Open source file
       pifstream read_stream;
       pifstream read_stream;
-      source_file.set_binary();
+      if (text_file) {
+        source_file.set_text();
+      } else {
+        source_file.set_binary();
+      }
       if (!source_file.open_read(read_stream)) {
       if (!source_file.open_read(read_stream)) {
         cerr << "Couldn't read: " << source_file << endl;
         cerr << "Couldn't read: " << source_file << endl;
         all_ok = false;
         all_ok = false;

+ 27 - 7
panda/src/express/encrypt_string.cxx

@@ -89,19 +89,39 @@ decrypt_string(const string &source, const string &password) {
 EXPCL_PANDAEXPRESS bool 
 EXPCL_PANDAEXPRESS bool 
 encrypt_file(const Filename &source, const Filename &dest, const string &password,
 encrypt_file(const Filename &source, const Filename &dest, const string &password,
              const string &algorithm, int key_length, int iteration_count) {
              const string &algorithm, int key_length, int iteration_count) {
-  Filename source_filename = Filename::binary_filename(source);
-  VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
-  istream *source_stream = vfs->open_read_file(source_filename, true);
-  if (source_stream == NULL) {
-    express_cat.info() << "Couldn't open file " << source_filename << "\n";
-    return false;
+  Filename source_filename = source;
+  if (!source_filename.is_binary() && !source_filename.is_text()) {
+    // The default is binary, if not specified otherwise.
+    source_filename.set_binary();
   }
   }
   
   
   Filename dest_filename = Filename::binary_filename(dest);
   Filename dest_filename = Filename::binary_filename(dest);
   pofstream dest_stream;
   pofstream dest_stream;
   if (!dest_filename.open_write(dest_stream)) {
   if (!dest_filename.open_write(dest_stream)) {
     express_cat.info() << "Couldn't open file " << dest_filename << "\n";
     express_cat.info() << "Couldn't open file " << dest_filename << "\n";
-    vfs->close_read_file(source_stream);
+    return false;
+  }
+
+  // Try to open the file from disk first, instead of using the vfs,
+  // so we can get the newline conversion with a text file.  This is a
+  // little weird if you have a vfs file shadowing a disk file, but
+  // whatever.
+  if (source_filename.is_text()) {
+    pifstream source_stream;
+    if (source_filename.open_read(source_stream)) {
+      bool result = encrypt_stream(source_stream, dest_stream, password,
+                                   algorithm, key_length, iteration_count);
+      return result;
+    }
+  }
+
+  // OK, couldn't read the disk file, or it wasn't set in text mode.
+  // Read the file from the vfs, and sorry--no text conversion for
+  // you.
+  VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
+  istream *source_stream = vfs->open_read_file(source_filename, true);
+  if (source_stream == NULL) {
+    express_cat.info() << "Couldn't open file " << source_filename << "\n";
     return false;
     return false;
   }
   }