
From: Jose E. Marchesi <jemarch@gnu.org>
Subject: encrypted fields are now decrypted when using field expressions in recsel

Origin: upstream, http://git.savannah.gnu.org/cgit/recutils.git/commit/?id=00e937052b3979a579a2852a52bb167c8a380113
Origin: upstream, http://git.savannah.gnu.org/cgit/recutils.git/commit/?id=a8ea07f0b60dd1e3a26b6a6654c934cace1adf80
Bug: http://lists.gnu.org/archive/html/help-recutils/2011-11/msg00001.html

--- recutils-1.4.orig/src/rec-writer.c
+++ recutils-1.4/src/rec-writer.c
@@ -54,6 +54,16 @@ struct rec_writer_s
                         fields.  */
 };
 
+static void
+rec_writer_new_common (rec_writer_t writer)
+{
+ writer->file_out = NULL;
+ writer->buf_out = NULL;
+ writer->line = 1;
+ writer->eof = false;
+ writer->password = NULL;
+}
+
 rec_writer_t
 rec_writer_new (FILE *file_out)
 {
@@ -62,11 +72,8 @@ rec_writer_new (FILE *file_out)
   new = malloc (sizeof(struct rec_writer_s));
   if (new)
     {
+      rec_writer_new_common (new);
       new->file_out = file_out;
-      new->buf_out = NULL;
-      new->line = 1;
-      new->eof = false;
-      new->password = NULL;
     }
 
   return new;
@@ -80,10 +87,8 @@ rec_writer_new_str (char **str, size_t *
   new = malloc (sizeof(struct rec_writer_s));
   if (new)
     {
-      new->file_out = NULL;
+      rec_writer_new_common (new);
       new->buf_out = rec_buf_new (str, str_size);
-      new->line = 1;
-      new->eof = false;
     }
 
   return new;
@@ -502,6 +507,13 @@ rec_write_record_with_fex (rec_writer_t
 
           written_fields++;
 
+#if defined REC_CRYPT_SUPPORT
+ if (writer->password)
+ {
+ rec_decrypt_field (field, writer->password);
+ }
+#endif /* REC_CRYPT_SUPPORT */
+
           if (print_values_p)
             {
               /* Write just the value of the field.  */
--- recutils-1.4.orig/utils/recsel.c
+++ recutils-1.4/utils/recsel.c
@@ -392,7 +392,8 @@ recsel_process_data (rec_db_t db)
                                                          record,
                                                          recsel_write_mode,
                                                          recsel_print_values,
-                                                         recsel_print_row);
+                                                         recsel_print_row,
+                                                         recsel_password);
                 }
 
               /* Insert a newline?  */
--- recutils-1.4.orig/utils/recutl.h
+++ recutils-1.4/utils/recutl.h
@@ -172,7 +172,8 @@ char *recutl_eval_field_expression (rec_
                                     rec_record_t record,
                                     rec_writer_mode_t mode,
                                     bool print_values_p,
-                                    bool print_in_a_row_p);
+                                    bool print_in_a_row_p,
+                                    char *password);
 
 rec_db_t recutl_read_db_from_file (char *file_name);
 void recutl_write_db_to_file (rec_db_t db, char *file_name);
--- recutils-1.4.orig/utils/recutl.c
+++ recutils-1.4/utils/recutl.c
@@ -279,7 +279,8 @@ recutl_eval_field_expression (rec_fex_t
                               rec_record_t record,
                               rec_writer_mode_t mode,
                               bool print_values_p,
-                              bool print_in_a_row_p)
+                              bool print_in_a_row_p,
+                              char *password)
 {
   char *res;
   size_t res_size;
@@ -287,6 +288,11 @@ recutl_eval_field_expression (rec_fex_t
   bool wrote_p;
 
   writer = rec_writer_new_str (&res, &res_size);
+  if (password)
+    {
+      rec_writer_set_password (writer,
+      password);
+    }
   wrote_p = rec_write_record_with_fex (writer, record, fex, mode,
                                        print_values_p, print_in_a_row_p);
   rec_writer_destroy (writer);
--- recutils-1.4.orig/torture/utils/recsel.sh
+++ recutils-1.4/torture/utils/recsel.sh
@@ -172,10 +172,48 @@ Role: Student
 Age: 15
 '
 
+test_declare_input_file confidential \
+'%rec: Account
+%confidential: Password
+
+User: foo
+Password: encrypted-MHyd3Dqz+iaViL8h1m18sA==
+'
+
 #
 # Declare tests
 #
 
+test_tool recsel-confidential ok \
+ recsel \
+ '-s secret' \
+ confidential \
+'User: foo
+Password: secret
+'
+
+test_tool recsel-confidential-fex ok \
+ recsel \
+ '-s secret -p Password' \
+ confidential \
+'Password: secret
+'
+
+test_tool recsel-confidential-fex-value ok \
+ recsel \
+ '-s secret -P Password' \
+ confidential \
+'secret
+'
+
+test_tool recsel-confidential-num ok \
+ recsel \
+ '-s secret -n 0' \
+ confidential \
+'User: foo
+Password: secret
+'
+
 # Select the whole record set.
 test_tool recsel-all-fields ok \
           recsel \
