]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/restore.c
Add new features in plugin
[bacula/bacula] / bacula / src / filed / restore.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version three of the GNU Affero General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU Affero General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  *  Bacula File Daemon  restore.c Restorefiles.
30  *
31  *    Kern Sibbald, November MM
32  *
33  */
34
35 #include "bacula.h"
36 #include "filed.h"
37 #include "ch.h"
38 #include "restore.h"
39
40 #ifdef HAVE_DARWIN_OS
41 #include <sys/attr.h>
42 const bool have_darwin_os = true;
43 #else
44 const bool have_darwin_os = false;
45 #endif
46
47 #if defined(HAVE_CRYPTO)
48 const bool have_crypto = true;
49 #else
50 const bool have_crypto = false;
51 #endif
52
53 #if defined(HAVE_ACL)
54 const bool have_acl = true;
55 #else
56 const bool have_acl = false;
57 #endif
58
59 #ifdef HAVE_SHA2
60 const bool have_sha2 = true;
61 #else
62 const bool have_sha2 = false;
63 #endif
64
65 #if defined(HAVE_XATTR)
66 const bool have_xattr = true;
67 #else
68 const bool have_xattr = false;
69 #endif
70
71 /*
72  * Data received from Storage Daemon
73  */
74 static char rec_header[] = "rechdr %ld %ld %ld %ld %ld";
75
76 /*
77  * Forward referenced functions
78  */
79 #if   defined(HAVE_LIBZ)
80 static const char *zlib_strerror(int stat);
81 const bool have_libz = true;
82 #else
83 const bool have_libz = false;
84 #endif
85 #ifdef HAVE_LZO
86 const bool have_lzo = true;
87 #else
88 const bool have_lzo = false;
89 #endif
90
91
92 static void deallocate_cipher(r_ctx &rctx);
93 static void deallocate_fork_cipher(r_ctx &rctx);
94 static void free_signature(r_ctx &rctx);
95 static void free_session(r_ctx &rctx);
96 static void close_previous_stream(r_ctx &rctx);
97
98 static bool verify_signature(JCR *jcr, r_ctx &rctx);
99 int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
100                      uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx);
101 bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, int32_t stream,
102                   RESTORE_CIPHER_CTX *cipher_ctx);
103
104 /*
105  * Close a bfd check that we are at the expected file offset.
106  * Makes use of some code from set_attributes().
107  */
108 static int bclose_chksize(JCR *jcr, BFILE *bfd, boffset_t osize)
109 {
110    char ec1[50], ec2[50];
111    boffset_t fsize;
112
113    fsize = blseek(bfd, 0, SEEK_CUR);
114    bclose(bfd);
115    if (fsize > 0 && fsize != osize) {
116       Qmsg3(jcr, M_WARNING, 0, _("Size of data or stream of %s not correct. Original %s, restored %s.\n"),
117             jcr->last_fname, edit_uint64(osize, ec1),
118             edit_uint64(fsize, ec2));
119       return -1;
120    }
121    return 0;
122 }
123
124 #ifdef HAVE_DARWIN_OS
125 bool restore_finderinfo(JCR *jcr, POOLMEM *buf, int32_t buflen)
126 {
127    struct attrlist attrList;
128
129    memset(&attrList, 0, sizeof(attrList));
130    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
131    attrList.commonattr = ATTR_CMN_FNDRINFO;
132
133    Dmsg0(130, "Restoring Finder Info\n");
134    jcr->ff->flags |= FO_HFSPLUS;
135    if (buflen != 32) {
136       Jmsg(jcr, M_WARNING, 0, _("Invalid length of Finder Info (got %d, not 32)\n"), buflen);
137       return false;
138    }
139
140    if (setattrlist(jcr->last_fname, &attrList, buf, buflen, 0) != 0) {
141       Jmsg(jcr, M_WARNING, 0, _("Could not set Finder Info on %s\n"), jcr->last_fname);
142       return false;
143    }
144
145    return true;
146 }
147 #else
148 bool restore_finderinfo(JCR *jcr, POOLMEM *buf, int32_t buflen)
149 {
150    return true;
151 }
152 #endif
153
154 /*
155  * Restore the requested files.
156  */
157 void do_restore(JCR *jcr)
158 {
159    BSOCK *sd;
160    uint32_t VolSessionId, VolSessionTime;
161    int32_t file_index;
162    char ec1[50];                      /* Buffer printing huge values */
163    uint32_t buf_size;                 /* client buffer size */
164    int stat;
165    int64_t rsrc_len = 0;              /* Original length of resource fork */
166    r_ctx rctx;
167    ATTR *attr;
168    /* ***FIXME*** make configurable */
169    crypto_digest_t signing_algorithm = have_sha2 ? 
170                                        CRYPTO_DIGEST_SHA256 : CRYPTO_DIGEST_SHA1;
171    memset(&rctx, 0, sizeof(rctx));
172    rctx.jcr = jcr;
173
174    /*
175     * The following variables keep track of "known unknowns"
176     */
177    int non_support_data = 0;
178    int non_support_attr = 0;
179    int non_support_rsrc = 0;
180    int non_support_finfo = 0;
181    int non_support_acl = 0;
182    int non_support_progname = 0;
183    int non_support_crypto = 0;
184    int non_support_xattr = 0;
185
186    sd = jcr->store_bsock;
187    jcr->setJobStatus(JS_Running);
188
189    LockRes();
190    CLIENT *client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
191    UnlockRes();
192    if (client) {
193       buf_size = client->max_network_buffer_size;
194    } else {
195       buf_size = 0;                   /* use default */
196    }
197    if (!bnet_set_buffer_size(sd, buf_size, BNET_SETBUF_WRITE)) {
198       jcr->setJobStatus(JS_ErrorTerminated);
199       return;
200    }
201    jcr->buf_size = sd->msglen;
202
203    /*
204     * St Bernard code goes here if implemented -- see end of file
205     */
206
207    /* use the same buffer size to decompress both gzip and lzo */
208    if (have_libz || have_lzo) {
209       uint32_t compress_buf_size = jcr->buf_size + 12 + ((jcr->buf_size+999) / 1000) + 100;
210       jcr->compress_buf = get_memory(compress_buf_size);
211       jcr->compress_buf_size = compress_buf_size;
212    }
213
214 #ifdef HAVE_LZO
215    if (lzo_init() != LZO_E_OK) {
216       Jmsg(jcr, M_FATAL, 0, _("LZO init failed\n"));
217       goto bail_out;
218    }
219 #endif
220
221    if (have_crypto) {
222       rctx.cipher_ctx.buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
223       if (have_darwin_os) {
224          rctx.fork_cipher_ctx.buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
225       }
226    }
227    
228    /*
229     * Get a record from the Storage daemon. We are guaranteed to
230     *   receive records in the following order:
231     *   1. Stream record header
232     *   2. Stream data (one or more of the following in the order given)
233     *        a. Attributes (Unix or Win32)
234     *        b. Possibly stream encryption session data (e.g., symmetric session key)
235     *        c. File data for the file
236     *        d. Alternate data stream (e.g. Resource Fork)
237     *        e. Finder info
238     *        f. ACLs
239     *        g. XATTRs
240     *        h. Possibly a cryptographic signature
241     *        i. Possibly MD5 or SHA1 record
242     *   3. Repeat step 1
243     *
244     * NOTE: We keep track of two bacula file descriptors:
245     *   1. bfd for file data.
246     *      This fd is opened for non empty files when an attribute stream is
247     *      encountered and closed when we find the next attribute stream.
248     *   2. fork_bfd for alternate data streams
249     *      This fd is opened every time we encounter a new alternate data
250     *      stream for the current file. When we find any other stream, we
251     *      close it again.
252     *      The expected size of the stream, fork_len, should be set when
253     *      opening the fd.
254     *   3. Not all the stream data records are required -- e.g. if there
255     *      is no fork, there is no alternate data stream, no ACL, ...
256     */
257    binit(&rctx.bfd);
258    binit(&rctx.forkbfd);
259    attr = rctx.attr = new_attr(jcr);
260    if (have_acl) {
261       jcr->acl_data = (acl_data_t *)malloc(sizeof(acl_data_t));
262       memset((caddr_t)jcr->acl_data, 0, sizeof(acl_data_t));
263       jcr->acl_data->content = get_pool_memory(PM_MESSAGE);
264    }
265    if (have_xattr) {
266       jcr->xattr_data = (xattr_data_t *)malloc(sizeof(xattr_data_t));
267       memset((caddr_t)jcr->xattr_data, 0, sizeof(xattr_data_t));
268       jcr->xattr_data->content = get_pool_memory(PM_MESSAGE);
269    }
270
271    while (bget_msg(sd) >= 0 && !job_canceled(jcr)) {
272       /*
273        * Remember previous stream type
274        */
275       rctx.prev_stream = rctx.stream;
276
277       /*
278        * First we expect a Stream Record Header
279        */
280       if (sscanf(sd->msg, rec_header, &VolSessionId, &VolSessionTime, &file_index,
281           &rctx.full_stream, &rctx.size) != 5) {
282          Jmsg1(jcr, M_FATAL, 0, _("Record header scan error: %s\n"), sd->msg);
283          goto bail_out;
284       }
285       /* Strip off new stream high bits */
286       rctx.stream = rctx.full_stream & STREAMMASK_TYPE;
287       Dmsg5(150, "Got hdr: Files=%d FilInx=%d size=%d Stream=%d, %s.\n", 
288             jcr->JobFiles, file_index, rctx.size, rctx.stream, stream_to_ascii(rctx.stream));
289
290       /*
291        * Now we expect the Stream Data
292        */
293       if (bget_msg(sd) < 0) {
294          Jmsg1(jcr, M_FATAL, 0, _("Data record error. ERR=%s\n"), sd->bstrerror());
295          goto bail_out;
296       }
297       if (rctx.size != (uint32_t)sd->msglen) {
298          Jmsg2(jcr, M_FATAL, 0, _("Actual data size %d not same as header %d\n"), 
299                sd->msglen, rctx.size);
300          Dmsg2(50, "Actual data size %d not same as header %d\n",
301                sd->msglen, rctx.size);
302          goto bail_out;
303       }
304       Dmsg3(130, "Got stream: %s len=%d extract=%d\n", stream_to_ascii(rctx.stream), 
305             sd->msglen, rctx.extract);
306
307       /*
308        * If we change streams, close and reset alternate data streams
309        */
310       if (rctx.prev_stream != rctx.stream) {
311          if (is_bopen(&rctx.forkbfd)) {
312             deallocate_fork_cipher(rctx);
313             bclose_chksize(jcr, &rctx.forkbfd, rctx.fork_size);
314          }
315          /*
316           * Use an impossible value and set a proper one below
317           */
318          rctx.fork_size = -1;
319          rctx.fork_addr = 0;
320       }
321
322       /*
323        * File Attributes stream
324        */
325       switch (rctx.stream) {
326       case STREAM_UNIX_ATTRIBUTES:
327       case STREAM_UNIX_ATTRIBUTES_EX:
328          /*
329           * if any previous stream open, close it
330           */
331          close_previous_stream(rctx);
332
333          /*
334           * TODO: manage deleted files
335           */
336          if (rctx.type == FT_DELETED) { /* deleted file */
337             continue;
338          }
339          /*
340           * Restore objects should be ignored here -- they are
341           * returned at the beginning of the restore. 
342           */
343          if (IS_FT_OBJECT(rctx.type)) {
344             continue;
345          }
346
347          /*
348           * Unpack attributes and do sanity check them
349           */
350          if (!unpack_attributes_record(jcr, rctx.stream, sd->msg, sd->msglen, attr)) {
351             goto bail_out;
352          }
353
354          Dmsg3(100, "File %s\nattrib=%s\nattribsEx=%s\n", attr->fname,
355                attr->attr, attr->attrEx);
356          Dmsg3(100, "=== msglen=%d attrExlen=%d msg=%s\n", sd->msglen,
357                strlen(attr->attrEx), sd->msg);
358
359          attr->data_stream = decode_stat(attr->attr, &attr->statp, sizeof(attr->statp), &attr->LinkFI);
360
361          if (!is_restore_stream_supported(attr->data_stream)) {
362             if (!non_support_data++) {
363                Jmsg(jcr, M_WARNING, 0, _("%s stream not supported on this Client.\n"),
364                     stream_to_ascii(attr->data_stream));
365             }
366             continue;
367          }
368
369          build_attr_output_fnames(jcr, attr);
370
371          /*
372           * Try to actually create the file, which returns a status telling
373           * us if we need to extract or not.
374           */
375          jcr->num_files_examined++;
376          rctx.extract = false;
377          stat = CF_CORE;        /* By default, let Bacula's core handle it */
378
379          if (jcr->plugin) {
380             stat = plugin_create_file(jcr, attr, &rctx.bfd, jcr->replace);
381          } 
382          
383          if (stat == CF_CORE) {
384             stat = create_file(jcr, attr, &rctx.bfd, jcr->replace);
385          }
386          jcr->lock();  
387          pm_strcpy(jcr->last_fname, attr->ofname);
388          jcr->last_type = attr->type;
389          jcr->unlock();
390          Dmsg2(130, "Outfile=%s create_file stat=%d\n", attr->ofname, stat);
391          switch (stat) {
392          case CF_ERROR:
393          case CF_SKIP:
394             jcr->JobFiles++;
395             break;
396          case CF_EXTRACT:
397             /*
398              * File created and we expect file data
399              */
400             rctx.extract = true;
401             /*
402              * FALLTHROUGH
403              */
404          case CF_CREATED:
405             /*
406              * File created, but there is no content
407              */
408             rctx.fileAddr = 0;
409             print_ls_output(jcr, attr);
410
411             if (have_darwin_os) {
412                /*
413                 * Only restore the resource fork for regular files
414                 */
415                from_base64(&rsrc_len, attr->attrEx);
416                if (attr->type == FT_REG && rsrc_len > 0) {
417                   rctx.extract = true;
418                }
419
420                /*
421                 * Do not count the resource forks as regular files being restored.
422                 */
423                if (rsrc_len == 0) {
424                   jcr->JobFiles++;
425                }
426             } else {
427                jcr->JobFiles++;
428             }
429
430             if (!rctx.extract) {
431                /*
432                 * set attributes now because file will not be extracted
433                 */
434                if (jcr->plugin) {
435                   plugin_set_attributes(jcr, attr, &rctx.bfd);
436                } else {
437                   set_attributes(jcr, attr, &rctx.bfd);
438                }
439             }
440             break;
441          }
442          break;
443
444       /*
445        * Data stream
446        */
447       case STREAM_ENCRYPTED_SESSION_DATA:
448          crypto_error_t cryptoerr;
449
450          /*
451           * Is this an unexpected session data entry?
452           */
453          if (rctx.cs) {
454             Jmsg0(jcr, M_ERROR, 0, _("Unexpected cryptographic session data stream.\n"));
455             rctx.extract = false;
456             bclose(&rctx.bfd);
457             continue;
458          }
459
460          /*
461           * Do we have any keys at all?
462           */
463          if (!jcr->crypto.pki_recipients) {
464             Jmsg(jcr, M_ERROR, 0, _("No private decryption keys have been defined to decrypt encrypted backup data.\n"));
465             rctx.extract = false;
466             bclose(&rctx.bfd);
467             break;
468          }
469
470          if (jcr->crypto.digest) {
471             crypto_digest_free(jcr->crypto.digest);
472          }  
473          jcr->crypto.digest = crypto_digest_new(jcr, signing_algorithm);
474          if (!jcr->crypto.digest) {
475             Jmsg0(jcr, M_FATAL, 0, _("Could not create digest.\n"));
476             rctx.extract = false;
477             bclose(&rctx.bfd);
478             break;
479          }
480
481          /*
482           * Decode and save session keys.
483           */
484          cryptoerr = crypto_session_decode((uint8_t *)sd->msg, (uint32_t)sd->msglen, 
485                         jcr->crypto.pki_recipients, &rctx.cs);
486          switch(cryptoerr) {
487          case CRYPTO_ERROR_NONE:
488             /*
489              * Success
490              */
491             break;
492          case CRYPTO_ERROR_NORECIPIENT:
493             Jmsg(jcr, M_ERROR, 0, _("Missing private key required to decrypt encrypted backup data.\n"));
494             break;
495          case CRYPTO_ERROR_DECRYPTION:
496             Jmsg(jcr, M_ERROR, 0, _("Decrypt of the session key failed.\n"));
497             break;
498          default:
499             /*
500              * Shouldn't happen
501              */
502             Jmsg1(jcr, M_ERROR, 0, _("An error occurred while decoding encrypted session data stream: %s\n"), crypto_strerror(cryptoerr));
503             break;
504          }
505
506          if (cryptoerr != CRYPTO_ERROR_NONE) {
507             rctx.extract = false;
508             bclose(&rctx.bfd);
509             continue;
510          }
511
512          break;
513
514       case STREAM_FILE_DATA:
515       case STREAM_SPARSE_DATA:
516       case STREAM_WIN32_DATA:
517       case STREAM_GZIP_DATA:
518       case STREAM_SPARSE_GZIP_DATA:
519       case STREAM_WIN32_GZIP_DATA:
520       case STREAM_COMPRESSED_DATA:
521       case STREAM_SPARSE_COMPRESSED_DATA:
522       case STREAM_WIN32_COMPRESSED_DATA:
523       case STREAM_ENCRYPTED_FILE_DATA:
524       case STREAM_ENCRYPTED_WIN32_DATA:
525       case STREAM_ENCRYPTED_FILE_GZIP_DATA:
526       case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
527       case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA:
528       case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA:
529          /*
530           * Force an expected, consistent stream type here
531           */
532          if (rctx.extract && (rctx.prev_stream == rctx.stream 
533                          || rctx.prev_stream == STREAM_UNIX_ATTRIBUTES
534                          || rctx.prev_stream == STREAM_UNIX_ATTRIBUTES_EX
535                          || rctx.prev_stream == STREAM_ENCRYPTED_SESSION_DATA)) {
536             rctx.flags = 0;
537
538             if (rctx.stream == STREAM_SPARSE_DATA
539                   || rctx.stream == STREAM_SPARSE_COMPRESSED_DATA
540                   || rctx.stream == STREAM_SPARSE_GZIP_DATA) {
541                rctx.flags |= FO_SPARSE;
542             }
543
544             if (rctx.stream == STREAM_GZIP_DATA 
545                   || rctx.stream == STREAM_SPARSE_GZIP_DATA
546                   || rctx.stream == STREAM_WIN32_GZIP_DATA
547                   || rctx.stream == STREAM_ENCRYPTED_FILE_GZIP_DATA
548                   || rctx.stream == STREAM_COMPRESSED_DATA
549                   || rctx.stream == STREAM_SPARSE_COMPRESSED_DATA
550                   || rctx.stream == STREAM_WIN32_COMPRESSED_DATA
551                   || rctx.stream == STREAM_ENCRYPTED_FILE_COMPRESSED_DATA
552                   || rctx.stream == STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA
553                   || rctx.stream == STREAM_ENCRYPTED_WIN32_GZIP_DATA) {
554                rctx.flags |= FO_COMPRESS;
555                rctx.comp_stream = rctx.stream;
556             }
557
558             if (rctx.stream == STREAM_ENCRYPTED_FILE_DATA
559                   || rctx.stream == STREAM_ENCRYPTED_FILE_GZIP_DATA
560                   || rctx.stream == STREAM_ENCRYPTED_WIN32_DATA
561                   || rctx.stream == STREAM_ENCRYPTED_FILE_COMPRESSED_DATA
562                   || rctx.stream == STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA
563                   || rctx.stream == STREAM_ENCRYPTED_WIN32_GZIP_DATA) {               
564                /*
565                 * Set up a decryption context
566                 */
567                if (!rctx.cipher_ctx.cipher) {
568                   if (!rctx.cs) {
569                      Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname);
570                      rctx.extract = false;
571                      bclose(&rctx.bfd);
572                      continue;
573                   }
574
575                   if ((rctx.cipher_ctx.cipher = crypto_cipher_new(rctx.cs, false, 
576                            &rctx.cipher_ctx.block_size)) == NULL) {
577                      Jmsg1(jcr, M_ERROR, 0, _("Failed to initialize decryption context for %s\n"), jcr->last_fname);
578                      free_session(rctx);
579                      rctx.extract = false;
580                      bclose(&rctx.bfd);
581                      continue;
582                   }
583                }
584                rctx.flags |= FO_ENCRYPT;
585             }
586
587             if (is_win32_stream(rctx.stream) && !have_win32_api()) {
588                set_portable_backup(&rctx.bfd);
589                /*
590                 * "decompose" BackupWrite data
591                 */
592                rctx.flags |= FO_WIN32DECOMP;
593             }
594
595             if (extract_data(jcr, &rctx.bfd, sd->msg, sd->msglen, &rctx.fileAddr,
596                              rctx.flags, rctx.stream, &rctx.cipher_ctx) < 0) {
597                rctx.extract = false;
598                bclose(&rctx.bfd);
599                continue;
600             }
601          }
602          break;
603
604       /*
605        * Resource fork stream - only recorded after a file to be restored
606        * Silently ignore if we cannot write - we already reported that
607        */
608       case STREAM_ENCRYPTED_MACOS_FORK_DATA:
609       case STREAM_MACOS_FORK_DATA:
610          if (have_darwin_os) {
611             rctx.fork_flags = 0;
612             jcr->ff->flags |= FO_HFSPLUS;
613
614             if (rctx.stream == STREAM_ENCRYPTED_MACOS_FORK_DATA) {
615                rctx.fork_flags |= FO_ENCRYPT;
616
617                /*
618                 * Set up a decryption context
619                 */
620                if (rctx.extract && !rctx.fork_cipher_ctx.cipher) {
621                   if (!rctx.cs) {
622                      Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname);
623                      rctx.extract = false;
624                      bclose(&rctx.bfd);
625                      continue;
626                   }
627
628                   if ((rctx.fork_cipher_ctx.cipher = crypto_cipher_new(rctx.cs, false, &rctx.fork_cipher_ctx.block_size)) == NULL) {
629                      Jmsg1(jcr, M_ERROR, 0, _("Failed to initialize decryption context for %s\n"), jcr->last_fname);
630                      free_session(rctx);
631                      rctx.extract = false;
632                      bclose(&rctx.bfd);
633                      continue;
634                   }
635                }
636             }
637
638             if (rctx.extract) {
639                if (rctx.prev_stream != rctx.stream) {
640                   if (bopen_rsrc(&rctx.forkbfd, jcr->last_fname, O_WRONLY | O_TRUNC | O_BINARY, 0) < 0) {
641                      Jmsg(jcr, M_WARNING, 0, _("Cannot open resource fork for %s.\n"), jcr->last_fname);
642                      rctx.extract = false;
643                      continue;
644                   }
645
646                   rctx.fork_size = rsrc_len;
647                   Dmsg0(130, "Restoring resource fork\n");
648                }
649
650                if (extract_data(jcr, &rctx.forkbfd, sd->msg, sd->msglen, &rctx.fork_addr, rctx.fork_flags,
651                                 rctx.stream, &rctx.fork_cipher_ctx) < 0) {
652                   rctx.extract = false;
653                   bclose(&rctx.forkbfd);
654                   continue;
655                }
656             }
657          } else {
658             non_support_rsrc++;
659          }
660          break;
661
662       case STREAM_HFSPLUS_ATTRIBUTES:
663          if (have_darwin_os) {
664             if (!restore_finderinfo(jcr, sd->msg, sd->msglen)) {
665                continue;
666             }
667          } else {
668             non_support_finfo++;
669          }
670          break;
671
672       case STREAM_UNIX_ACCESS_ACL:
673       case STREAM_UNIX_DEFAULT_ACL:
674       case STREAM_ACL_AIX_TEXT:
675       case STREAM_ACL_DARWIN_ACCESS_ACL:
676       case STREAM_ACL_FREEBSD_DEFAULT_ACL:
677       case STREAM_ACL_FREEBSD_ACCESS_ACL:
678       case STREAM_ACL_HPUX_ACL_ENTRY:
679       case STREAM_ACL_IRIX_DEFAULT_ACL:
680       case STREAM_ACL_IRIX_ACCESS_ACL:
681       case STREAM_ACL_LINUX_DEFAULT_ACL:
682       case STREAM_ACL_LINUX_ACCESS_ACL:
683       case STREAM_ACL_TRU64_DEFAULT_ACL:
684       case STREAM_ACL_TRU64_DEFAULT_DIR_ACL:
685       case STREAM_ACL_TRU64_ACCESS_ACL:
686       case STREAM_ACL_SOLARIS_ACLENT:
687       case STREAM_ACL_SOLARIS_ACE:
688       case STREAM_ACL_AFS_TEXT:
689       case STREAM_ACL_AIX_AIXC:
690       case STREAM_ACL_AIX_NFS4:
691       case STREAM_ACL_FREEBSD_NFS4_ACL:
692          /*
693           * Do not restore ACLs when
694           * a) The current file is not extracted
695           * b)     and it is not a directory (they are never "extracted")
696           * c) or the file name is empty
697           */
698          if ((!rctx.extract && jcr->last_type != FT_DIREND) || (*jcr->last_fname == 0)) {
699             break;
700          }
701          if (have_acl) {
702             pm_memcpy(jcr->acl_data->content, sd->msg, sd->msglen);
703             jcr->acl_data->content_length = sd->msglen;
704             switch (parse_acl_streams(jcr, rctx.stream)) {
705             case bacl_exit_fatal:
706                goto bail_out;
707             case bacl_exit_error:
708                /*
709                 * Non-fatal errors, count them and when the number is under ACL_REPORT_ERR_MAX_PER_JOB
710                 * print the error message set by the lower level routine in jcr->errmsg.
711                 */
712                if (jcr->acl_data->nr_errors < ACL_REPORT_ERR_MAX_PER_JOB) {
713                   Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg);
714                }
715                jcr->acl_data->nr_errors++;
716                break;
717             case bacl_exit_ok:
718                break;
719             }
720          } else {
721             non_support_acl++;
722          }
723          break;
724
725       case STREAM_XATTR_IRIX:
726       case STREAM_XATTR_TRU64:
727       case STREAM_XATTR_AIX:
728       case STREAM_XATTR_OPENBSD:
729       case STREAM_XATTR_SOLARIS_SYS:
730       case STREAM_XATTR_SOLARIS:
731       case STREAM_XATTR_DARWIN:
732       case STREAM_XATTR_FREEBSD:
733       case STREAM_XATTR_LINUX:
734       case STREAM_XATTR_NETBSD:
735          /*
736           * Do not restore Extended Attributes when
737           * a) The current file is not extracted
738           * b)     and it is not a directory (they are never "extracted")
739           * c) or the file name is empty
740           */
741          if ((!rctx.extract && jcr->last_type != FT_DIREND) || (*jcr->last_fname == 0)) {
742             break;
743          }
744          if (have_xattr) {
745             pm_memcpy(jcr->xattr_data->content, sd->msg, sd->msglen);
746             jcr->xattr_data->content_length = sd->msglen;
747             switch (parse_xattr_streams(jcr, rctx.stream)) {
748             case bxattr_exit_fatal:
749                goto bail_out;
750             case bxattr_exit_error:
751                /*
752                 * Non-fatal errors, count them and when the number is under XATTR_REPORT_ERR_MAX_PER_JOB
753                 * print the error message set by the lower level routine in jcr->errmsg.
754                 */
755                if (jcr->xattr_data->nr_errors < XATTR_REPORT_ERR_MAX_PER_JOB) {
756                   Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg);
757                }
758                jcr->xattr_data->nr_errors++;
759                break;
760             case bxattr_exit_ok:
761                break;
762             }
763          } else {
764             non_support_xattr++;
765          }
766          break;
767
768       case STREAM_SIGNED_DIGEST:
769          /*
770           * Is this an unexpected signature?
771           */
772          if (rctx.sig) {
773             Jmsg0(jcr, M_ERROR, 0, _("Unexpected cryptographic signature data stream.\n"));
774             free_signature(rctx);
775             continue;
776          }
777          /*
778           * Save signature.
779           */
780          if (rctx.extract && (rctx.sig = crypto_sign_decode(jcr, (uint8_t *)sd->msg, (uint32_t)sd->msglen)) == NULL) {
781             Jmsg1(jcr, M_ERROR, 0, _("Failed to decode message signature for %s\n"), jcr->last_fname);
782          }
783          break;
784
785       case STREAM_MD5_DIGEST:
786       case STREAM_SHA1_DIGEST:
787       case STREAM_SHA256_DIGEST:
788       case STREAM_SHA512_DIGEST:
789          break;
790
791       case STREAM_PROGRAM_NAMES:
792       case STREAM_PROGRAM_DATA:
793          if (!non_support_progname) {
794             Pmsg0(000, "Got Program Name or Data Stream. Ignored.\n");
795             non_support_progname++;
796          }
797          break;
798
799       case STREAM_PLUGIN_NAME:
800          close_previous_stream(rctx);
801          Dmsg1(50, "restore stream_plugin_name=%s\n", sd->msg);
802          plugin_name_stream(jcr, sd->msg);
803          break;
804
805       case STREAM_RESTORE_OBJECT:
806          break;                    /* these are sent by Director */
807
808       default:
809          close_previous_stream(rctx);
810          Jmsg(jcr, M_WARNING, 0, _("Unknown stream=%d ignored. This shouldn't happen!\n"),
811               rctx.stream);
812          Dmsg2(0, "Unknown stream=%d data=%s\n", rctx.stream, sd->msg);
813          break;
814       } /* end switch(stream) */
815    } /* end while get_msg() */
816
817    /*
818     * If output file is still open, it was the last one in the
819     * archive since we just hit an end of file, so close the file.
820     */
821    if (is_bopen(&rctx.forkbfd)) {
822       bclose_chksize(jcr, &rctx.forkbfd, rctx.fork_size);
823    }
824
825    close_previous_stream(rctx);
826    jcr->setJobStatus(JS_Terminated);
827    goto ok_out;
828
829 bail_out:
830    jcr->setJobStatus(JS_ErrorTerminated);
831
832 ok_out:
833    /*
834     * First output the statistics.
835     */
836    Dmsg2(10, "End Do Restore. Files=%d Bytes=%s\n", jcr->JobFiles,
837       edit_uint64(jcr->JobBytes, ec1));
838    if (have_acl && jcr->acl_data->nr_errors > 0) {
839       Jmsg(jcr, M_WARNING, 0, _("Encountered %ld acl errors while doing restore\n"),
840            jcr->acl_data->nr_errors);
841    }
842    if (have_xattr && jcr->xattr_data->nr_errors > 0) {
843       Jmsg(jcr, M_WARNING, 0, _("Encountered %ld xattr errors while doing restore\n"),
844            jcr->xattr_data->nr_errors);
845    }
846    if (non_support_data > 1 || non_support_attr > 1) {
847       Jmsg(jcr, M_WARNING, 0, _("%d non-supported data streams and %d non-supported attrib streams ignored.\n"),
848          non_support_data, non_support_attr);
849    }
850    if (non_support_rsrc) {
851       Jmsg(jcr, M_INFO, 0, _("%d non-supported resource fork streams ignored.\n"), non_support_rsrc);
852    }
853    if (non_support_finfo) {
854       Jmsg(jcr, M_INFO, 0, _("%d non-supported Finder Info streams ignored.\n"), non_support_rsrc);
855    }
856    if (non_support_acl) {
857       Jmsg(jcr, M_INFO, 0, _("%d non-supported acl streams ignored.\n"), non_support_acl);
858    }
859    if (non_support_crypto) {
860       Jmsg(jcr, M_INFO, 0, _("%d non-supported crypto streams ignored.\n"), non_support_acl);
861    }
862    if (non_support_xattr) {
863       Jmsg(jcr, M_INFO, 0, _("%d non-supported xattr streams ignored.\n"), non_support_xattr);
864    }
865
866    /*
867     * Free Signature & Crypto Data
868     */
869    free_signature(rctx);
870    free_session(rctx);
871    if (jcr->crypto.digest) {
872       crypto_digest_free(jcr->crypto.digest);
873       jcr->crypto.digest = NULL;
874    }
875
876    /*
877     * Free file cipher restore context
878     */
879    if (rctx.cipher_ctx.cipher) {
880       crypto_cipher_free(rctx.cipher_ctx.cipher);
881       rctx.cipher_ctx.cipher = NULL;
882    }
883
884    if (rctx.cipher_ctx.buf) {
885       free_pool_memory(rctx.cipher_ctx.buf);
886       rctx.cipher_ctx.buf = NULL;
887    }
888
889    /*
890     * Free alternate stream cipher restore context
891     */
892    if (rctx.fork_cipher_ctx.cipher) {
893       crypto_cipher_free(rctx.fork_cipher_ctx.cipher);
894       rctx.fork_cipher_ctx.cipher = NULL;
895    }
896    if (rctx.fork_cipher_ctx.buf) {
897       free_pool_memory(rctx.fork_cipher_ctx.buf);
898       rctx.fork_cipher_ctx.buf = NULL;
899    }
900
901    if (jcr->compress_buf) {
902       free_pool_memory(jcr->compress_buf);
903       jcr->compress_buf = NULL;
904       jcr->compress_buf_size = 0;
905    }
906
907    if (have_acl && jcr->acl_data) {
908       free_pool_memory(jcr->acl_data->content);
909       free(jcr->acl_data);
910       jcr->acl_data = NULL;
911    }
912
913    if (have_xattr && jcr->xattr_data) {
914       free_pool_memory(jcr->xattr_data->content);
915       free(jcr->xattr_data);
916       jcr->xattr_data = NULL;
917    }
918
919    bclose(&rctx.forkbfd);
920    bclose(&rctx.bfd);
921    free_attr(rctx.attr);
922 }
923
924 #ifdef HAVE_LIBZ
925 /*
926  * Convert ZLIB error code into an ASCII message
927  */
928 static const char *zlib_strerror(int stat)
929 {
930    if (stat >= 0) {
931       return _("None");
932    }
933    switch (stat) {
934    case Z_ERRNO:
935       return _("Zlib errno");
936    case Z_STREAM_ERROR:
937       return _("Zlib stream error");
938    case Z_DATA_ERROR:
939       return _("Zlib data error");
940    case Z_MEM_ERROR:
941       return _("Zlib memory error");
942    case Z_BUF_ERROR:
943       return _("Zlib buffer error");
944    case Z_VERSION_ERROR:
945       return _("Zlib version error");
946    default:
947       return _("*none*");
948    }
949 }
950 #endif
951
952 static int do_file_digest(JCR *jcr, FF_PKT *ff_pkt, bool top_level) 
953 {
954    Dmsg1(50, "do_file_digest jcr=%p\n", jcr);
955    return (digest_file(jcr, ff_pkt, jcr->crypto.digest));
956 }
957
958 /*
959  * Verify the signature for the last restored file
960  * Return value is either true (signature correct)
961  * or false (signature could not be verified).
962  * TODO landonf: Implement without using find_one_file and
963  * without re-reading the file.
964  */
965 static bool verify_signature(JCR *jcr, r_ctx &rctx)
966 {
967    X509_KEYPAIR *keypair;
968    DIGEST *digest = NULL;
969    crypto_error_t err;
970    uint64_t saved_bytes;
971    crypto_digest_t signing_algorithm = have_sha2 ? 
972                                        CRYPTO_DIGEST_SHA256 : CRYPTO_DIGEST_SHA1;
973    crypto_digest_t algorithm;
974    SIGNATURE *sig = rctx.sig;
975
976
977    if (!jcr->crypto.pki_sign) {
978       /*
979        * no signature OK
980        */
981       return true;
982    }
983    if (!sig) {
984       if (rctx.type == FT_REGE || rctx.type == FT_REG || rctx.type == FT_RAW) { 
985          Jmsg1(jcr, M_ERROR, 0, _("Missing cryptographic signature for %s\n"), 
986                jcr->last_fname);
987          goto bail_out;
988       }
989       return true;
990    }
991
992    /*
993     * Iterate through the trusted signers
994     */
995    foreach_alist(keypair, jcr->crypto.pki_signers) {
996       err = crypto_sign_get_digest(sig, jcr->crypto.pki_keypair, algorithm, &digest);
997       switch (err) {
998       case CRYPTO_ERROR_NONE:
999          Dmsg0(50, "== Got digest\n");
1000          /*
1001           * We computed jcr->crypto.digest using signing_algorithm while writing
1002           * the file. If it is not the same as the algorithm used for 
1003           * this file, punt by releasing the computed algorithm and 
1004           * computing by re-reading the file.
1005           */
1006          if (algorithm != signing_algorithm) {
1007             if (jcr->crypto.digest) {
1008                crypto_digest_free(jcr->crypto.digest);
1009                jcr->crypto.digest = NULL;
1010             }  
1011          }
1012          if (jcr->crypto.digest) {
1013              /*
1014               * Use digest computed while writing the file to verify the signature
1015               */
1016             if ((err = crypto_sign_verify(sig, keypair, jcr->crypto.digest)) != CRYPTO_ERROR_NONE) {
1017                Dmsg1(50, "Bad signature on %s\n", jcr->last_fname);
1018                Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), 
1019                      jcr->last_fname, crypto_strerror(err));
1020                goto bail_out;
1021             }
1022          } else {   
1023             /*
1024              * Signature found, digest allocated.  Old method, 
1025              * re-read the file and compute the digest
1026              */
1027             jcr->crypto.digest = digest;
1028
1029             /*
1030              * Checksum the entire file
1031              * Make sure we don't modify JobBytes by saving and restoring it
1032              */
1033             saved_bytes = jcr->JobBytes;                     
1034             if (find_one_file(jcr, jcr->ff, do_file_digest, jcr->last_fname, (dev_t)-1, 1) != 0) {
1035                Jmsg(jcr, M_ERROR, 0, _("Digest one file failed for file: %s\n"), 
1036                     jcr->last_fname);
1037                jcr->JobBytes = saved_bytes;
1038                goto bail_out;
1039             }
1040             jcr->JobBytes = saved_bytes;
1041
1042             /*
1043              * Verify the signature
1044              */
1045             if ((err = crypto_sign_verify(sig, keypair, digest)) != CRYPTO_ERROR_NONE) {
1046                Dmsg1(50, "Bad signature on %s\n", jcr->last_fname);
1047                Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), 
1048                      jcr->last_fname, crypto_strerror(err));
1049                goto bail_out;
1050             }
1051             jcr->crypto.digest = NULL;
1052          }
1053
1054          /*
1055           * Valid signature
1056           */
1057          Dmsg1(50, "Signature good on %s\n", jcr->last_fname);
1058          crypto_digest_free(digest);
1059          return true;
1060
1061       case CRYPTO_ERROR_NOSIGNER:
1062          /*
1063           * Signature not found, try again
1064           */
1065          if (digest) {
1066             crypto_digest_free(digest);
1067             digest = NULL;
1068          }
1069          continue;
1070       default:
1071          /*
1072           * Something strange happened (that shouldn't happen!)...
1073           */
1074          Qmsg2(jcr, M_ERROR, 0, _("Signature validation failed for %s: %s\n"), jcr->last_fname, crypto_strerror(err));
1075          goto bail_out;
1076       }
1077    }
1078
1079    /*
1080     * No signer
1081     */
1082    Dmsg1(50, "Could not find a valid public key for signature on %s\n", jcr->last_fname);
1083
1084 bail_out:
1085    if (digest) {
1086       crypto_digest_free(digest);
1087    }
1088    return false;
1089 }
1090
1091 bool sparse_data(JCR *jcr, BFILE *bfd, uint64_t *addr, char **data, uint32_t *length)
1092 {
1093       unser_declare;
1094       uint64_t faddr;
1095       char ec1[50];
1096       unser_begin(*data, OFFSET_FADDR_SIZE);
1097       unser_uint64(faddr);
1098       if (*addr != faddr) {
1099          *addr = faddr;
1100          if (blseek(bfd, (boffset_t)*addr, SEEK_SET) < 0) {
1101             berrno be;
1102             Jmsg3(jcr, M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"),
1103                   edit_uint64(*addr, ec1), jcr->last_fname, 
1104                   be.bstrerror(bfd->berrno));
1105             return false;
1106          }
1107       }
1108       *data += OFFSET_FADDR_SIZE;
1109       *length -= OFFSET_FADDR_SIZE;
1110       return true;
1111 }
1112
1113 bool decompress_data(JCR *jcr, int32_t stream, char **data, uint32_t *length)
1114 {
1115    char ec1[50]; /* Buffer printing huge values */
1116
1117    Dmsg1(200, "Stream found in decompress_data(): %d\n", stream);
1118    if(stream == STREAM_COMPRESSED_DATA || stream == STREAM_SPARSE_COMPRESSED_DATA || stream == STREAM_WIN32_COMPRESSED_DATA
1119        || stream == STREAM_ENCRYPTED_FILE_COMPRESSED_DATA || stream == STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA)
1120    {
1121       uint32_t comp_magic, comp_len;
1122       uint16_t comp_level, comp_version;
1123 #ifdef HAVE_LZO
1124       lzo_uint compress_len;
1125       const unsigned char *cbuf;
1126       int r, real_compress_len;
1127 #endif
1128
1129       /* read compress header */
1130       unser_declare;
1131       unser_begin(*data, sizeof(comp_stream_header));
1132       unser_uint32(comp_magic);
1133       unser_uint32(comp_len);
1134       unser_uint16(comp_level);
1135       unser_uint16(comp_version);
1136       Dmsg4(200, "Compressed data stream found: magic=0x%x, len=%d, level=%d, ver=0x%x\n", comp_magic, comp_len,
1137                               comp_level, comp_version);
1138
1139       /* version check */
1140       if (comp_version != COMP_HEAD_VERSION) {
1141          Qmsg(jcr, M_ERROR, 0, _("Compressed header version error. version=0x%x\n"), comp_version);
1142          return false;
1143       }
1144       /* size check */
1145       if (comp_len + sizeof(comp_stream_header) != *length) {
1146          Qmsg(jcr, M_ERROR, 0, _("Compressed header size error. comp_len=%d, msglen=%d\n"),
1147               comp_len, *length);
1148          return false;
1149       }
1150       switch(comp_magic) {
1151 #ifdef HAVE_LZO
1152          case COMPRESS_LZO1X:
1153             compress_len = jcr->compress_buf_size;
1154             cbuf = (const unsigned char*)*data + sizeof(comp_stream_header);
1155             real_compress_len = *length - sizeof(comp_stream_header);
1156             Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1157             while ((r=lzo1x_decompress_safe(cbuf, real_compress_len,
1158                                             (unsigned char *)jcr->compress_buf, &compress_len, NULL)) == LZO_E_OUTPUT_OVERRUN)
1159             {
1160                /*
1161                 * The buffer size is too small, try with a bigger one
1162                 */
1163                compress_len = jcr->compress_buf_size = jcr->compress_buf_size + (jcr->compress_buf_size >> 1);
1164                Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1165                jcr->compress_buf = check_pool_memory_size(jcr->compress_buf,
1166                                                     compress_len);
1167             }
1168             if (r != LZO_E_OK) {
1169                Qmsg(jcr, M_ERROR, 0, _("LZO uncompression error on file %s. ERR=%d\n"),
1170                     jcr->last_fname, r);
1171                return false;
1172             }
1173             *data = jcr->compress_buf;
1174             *length = compress_len;
1175             Dmsg2(200, "Write uncompressed %d bytes, total before write=%s\n", compress_len, edit_uint64(jcr->JobBytes, ec1));
1176             return true;
1177 #endif
1178          default:
1179             Qmsg(jcr, M_ERROR, 0, _("Compression algorithm 0x%x found, but not supported!\n"), comp_magic);
1180             return false;
1181       }
1182     } else {
1183 #ifdef HAVE_LIBZ
1184       uLong compress_len;
1185       int stat;
1186
1187       /* 
1188        * NOTE! We only use uLong and Byte because they are
1189        * needed by the zlib routines, they should not otherwise
1190        * be used in Bacula.
1191        */
1192       compress_len = jcr->compress_buf_size;
1193       Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1194       while ((stat=uncompress((Byte *)jcr->compress_buf, &compress_len,
1195                               (const Byte *)*data, (uLong)*length)) == Z_BUF_ERROR)
1196       {
1197          /*
1198           * The buffer size is too small, try with a bigger one
1199           */
1200          compress_len = jcr->compress_buf_size = jcr->compress_buf_size + (jcr->compress_buf_size >> 1);
1201          Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1202          jcr->compress_buf = check_pool_memory_size(jcr->compress_buf,
1203                                                     compress_len);
1204       }
1205       if (stat != Z_OK) {
1206          Qmsg(jcr, M_ERROR, 0, _("Uncompression error on file %s. ERR=%s\n"),
1207               jcr->last_fname, zlib_strerror(stat));
1208          return false;
1209       }
1210       *data = jcr->compress_buf;
1211       *length = compress_len;
1212       Dmsg2(200, "Write uncompressed %d bytes, total before write=%s\n", compress_len, edit_uint64(jcr->JobBytes, ec1));
1213       return true;
1214 #else
1215       Qmsg(jcr, M_ERROR, 0, _("GZIP data stream found, but GZIP not configured!\n"));
1216       return false;
1217 #endif
1218    }
1219 }
1220
1221 static void unser_crypto_packet_len(RESTORE_CIPHER_CTX *ctx)
1222 {
1223    unser_declare;
1224    if (ctx->packet_len == 0 && ctx->buf_len >= CRYPTO_LEN_SIZE) {
1225       unser_begin(&ctx->buf[0], CRYPTO_LEN_SIZE);
1226       unser_uint32(ctx->packet_len);
1227       ctx->packet_len += CRYPTO_LEN_SIZE;
1228    }
1229 }
1230
1231 bool store_data(JCR *jcr, BFILE *bfd, char *data, const int32_t length, bool win32_decomp)
1232 {
1233    if (jcr->crypto.digest) {
1234       crypto_digest_update(jcr->crypto.digest, (uint8_t *)data, length);
1235    }
1236    if (win32_decomp) {
1237       if (!processWin32BackupAPIBlock(bfd, data, length)) {
1238          berrno be;
1239          Jmsg2(jcr, M_ERROR, 0, _("Write error in Win32 Block Decomposition on %s: %s\n"), 
1240                jcr->last_fname, be.bstrerror(bfd->berrno));
1241          return false;
1242       }
1243    } else if (bwrite(bfd, data, length) != (ssize_t)length) {
1244       berrno be;
1245       Jmsg2(jcr, M_ERROR, 0, _("Write error on %s: %s\n"), 
1246             jcr->last_fname, be.bstrerror(bfd->berrno));
1247       return false;
1248    }
1249
1250    return true;
1251 }
1252
1253 /*
1254  * In the context of jcr, write data to bfd.
1255  * We write buflen bytes in buf at addr. addr is updated in place.
1256  * The flags specify whether to use sparse files or compression.
1257  * Return value is the number of bytes written, or -1 on errors.
1258  */
1259 int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
1260                      uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx)
1261 {
1262    char *wbuf;                 /* write buffer */
1263    uint32_t wsize;             /* write size */
1264    uint32_t rsize;             /* read size */
1265    uint32_t decrypted_len = 0; /* Decryption output length */
1266    char ec1[50];               /* Buffer printing huge values */
1267
1268    rsize = buflen;
1269    jcr->ReadBytes += rsize;
1270    wsize = rsize;
1271    wbuf = buf;
1272
1273    if (flags & FO_ENCRYPT) {
1274       ASSERT(cipher_ctx->cipher);
1275
1276       /*
1277        * NOTE: We must implement block preserving semantics for the
1278        * non-streaming compression and sparse code.
1279        *
1280        * Grow the crypto buffer, if necessary.
1281        * crypto_cipher_update() will process only whole blocks,
1282        * buffering the remaining input.
1283        */
1284       cipher_ctx->buf = check_pool_memory_size(cipher_ctx->buf, 
1285                         cipher_ctx->buf_len + wsize + cipher_ctx->block_size);
1286
1287       /*
1288        * Decrypt the input block
1289        */
1290       if (!crypto_cipher_update(cipher_ctx->cipher, 
1291                                 (const u_int8_t *)wbuf, 
1292                                 wsize, 
1293                                 (u_int8_t *)&cipher_ctx->buf[cipher_ctx->buf_len], 
1294                                 &decrypted_len)) {
1295          /*
1296           * Decryption failed. Shouldn't happen.
1297           */
1298          Jmsg(jcr, M_FATAL, 0, _("Decryption error\n"));
1299          goto bail_out;
1300       }
1301
1302       if (decrypted_len == 0) {
1303          /*
1304           * No full block of encrypted data available, write more data
1305           */
1306          return 0;
1307       }
1308
1309       Dmsg2(200, "decrypted len=%d encrypted len=%d\n", decrypted_len, wsize);
1310
1311       cipher_ctx->buf_len += decrypted_len;
1312       wbuf = cipher_ctx->buf;
1313
1314       /*
1315        * If one full preserved block is available, write it to disk,
1316        * and then buffer any remaining data. This should be effecient
1317        * as long as Bacula's block size is not significantly smaller than the
1318        * encryption block size (extremely unlikely!)
1319        */
1320       unser_crypto_packet_len(cipher_ctx);
1321       Dmsg1(500, "Crypto unser block size=%d\n", cipher_ctx->packet_len - CRYPTO_LEN_SIZE);
1322
1323       if (cipher_ctx->packet_len == 0 || cipher_ctx->buf_len < cipher_ctx->packet_len) {
1324          /*
1325           * No full preserved block is available.
1326           */
1327          return 0;
1328       }
1329
1330       /*
1331        * We have one full block, set up the filter input buffers
1332        */
1333       wsize = cipher_ctx->packet_len - CRYPTO_LEN_SIZE;
1334       wbuf = &wbuf[CRYPTO_LEN_SIZE]; /* Skip the block length header */
1335       cipher_ctx->buf_len -= cipher_ctx->packet_len;
1336       Dmsg2(130, "Encryption writing full block, %u bytes, remaining %u bytes in buffer\n", wsize, cipher_ctx->buf_len);
1337    }
1338
1339    if ((flags & FO_SPARSE) || (flags & FO_OFFSETS)) {
1340       if (!sparse_data(jcr, bfd, addr, &wbuf, &wsize)) {
1341          goto bail_out;
1342       }
1343    }
1344
1345    if (flags & FO_COMPRESS) {
1346       if (!decompress_data(jcr, stream, &wbuf, &wsize)) {
1347          goto bail_out;
1348       }
1349    }
1350
1351    if (!store_data(jcr, bfd, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) {
1352       goto bail_out;
1353    }
1354    jcr->JobBytes += wsize;
1355    *addr += wsize;
1356    Dmsg2(130, "Write %u bytes, JobBytes=%s\n", wsize, edit_uint64(jcr->JobBytes, ec1));
1357
1358    /*
1359     * Clean up crypto buffers
1360     */
1361    if (flags & FO_ENCRYPT) {
1362       /* Move any remaining data to start of buffer */
1363       if (cipher_ctx->buf_len > 0) {
1364          Dmsg1(130, "Moving %u buffered bytes to start of buffer\n", cipher_ctx->buf_len);
1365          memmove(cipher_ctx->buf, &cipher_ctx->buf[cipher_ctx->packet_len], 
1366             cipher_ctx->buf_len);
1367       }
1368       /*
1369        * The packet was successfully written, reset the length so that the next
1370        * packet length may be re-read by unser_crypto_packet_len()
1371        */
1372       cipher_ctx->packet_len = 0;
1373    }
1374    return wsize;
1375
1376 bail_out:
1377    return -1;
1378 }
1379
1380
1381 /*
1382  * If extracting, close any previous stream
1383  */
1384 static void close_previous_stream(r_ctx &rctx)
1385 {
1386    /*
1387     * If extracting, it was from previous stream, so
1388     * close the output file and validate the signature.
1389     */
1390    if (rctx.extract) {
1391       if (rctx.size > 0 && !is_bopen(&rctx.bfd)) {
1392          Jmsg0(rctx.jcr, M_ERROR, 0, _("Logic error: output file should be open\n"));
1393          Dmsg2(000, "=== logic error size=%d bopen=%d\n", rctx.size, 
1394             is_bopen(&rctx.bfd));
1395       }
1396
1397       if (rctx.prev_stream != STREAM_ENCRYPTED_SESSION_DATA) {
1398          deallocate_cipher(rctx);
1399          deallocate_fork_cipher(rctx);
1400       }
1401
1402       if (rctx.jcr->plugin) {
1403          plugin_set_attributes(rctx.jcr, rctx.attr, &rctx.bfd);
1404       } else {
1405          set_attributes(rctx.jcr, rctx.attr, &rctx.bfd);
1406       }
1407       rctx.extract = false;
1408
1409       /*
1410        * Verify the cryptographic signature, if any
1411        */
1412       rctx.type = rctx.attr->type;
1413       verify_signature(rctx.jcr, rctx);
1414
1415       /*
1416        * Free Signature
1417        */
1418       free_signature(rctx);
1419       free_session(rctx);
1420       rctx.jcr->ff->flags = 0;
1421       Dmsg0(130, "Stop extracting.\n");
1422    } else if (is_bopen(&rctx.bfd)) {
1423       Jmsg0(rctx.jcr, M_ERROR, 0, _("Logic error: output file should not be open\n"));
1424       Dmsg0(000, "=== logic error !open\n");
1425       bclose(&rctx.bfd);
1426    }
1427 }
1428
1429
1430 /*
1431  * In the context of jcr, flush any remaining data from the cipher context,
1432  * writing it to bfd.
1433  * Return value is true on success, false on failure.
1434  */
1435 bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, int32_t stream,
1436                   RESTORE_CIPHER_CTX *cipher_ctx)
1437 {
1438    uint32_t decrypted_len = 0;
1439    char *wbuf;                        /* write buffer */
1440    uint32_t wsize;                    /* write size */
1441    char ec1[50];                      /* Buffer printing huge values */
1442    bool second_pass = false;
1443
1444 again:
1445    /*
1446     * Write out the remaining block and free the cipher context
1447     */
1448    cipher_ctx->buf = check_pool_memory_size(cipher_ctx->buf, cipher_ctx->buf_len + 
1449                                             cipher_ctx->block_size);
1450
1451    if (!crypto_cipher_finalize(cipher_ctx->cipher, (uint8_t *)&cipher_ctx->buf[cipher_ctx->buf_len],
1452         &decrypted_len)) {
1453       /*
1454        * Writing out the final, buffered block failed. Shouldn't happen.
1455        */
1456       Jmsg3(jcr, M_ERROR, 0, _("Decryption error. buf_len=%d decrypt_len=%d on file %s\n"), 
1457             cipher_ctx->buf_len, decrypted_len, jcr->last_fname);
1458    }
1459
1460    Dmsg2(130, "Flush decrypt len=%d buf_len=%d\n", decrypted_len, cipher_ctx->buf_len);
1461    /*
1462     * If nothing new was decrypted, and our output buffer is empty, return
1463     */
1464    if (decrypted_len == 0 && cipher_ctx->buf_len == 0) {
1465       return true;
1466    }
1467
1468    cipher_ctx->buf_len += decrypted_len;
1469
1470    unser_crypto_packet_len(cipher_ctx);
1471    Dmsg1(500, "Crypto unser block size=%d\n", cipher_ctx->packet_len - CRYPTO_LEN_SIZE);
1472    wsize = cipher_ctx->packet_len - CRYPTO_LEN_SIZE;
1473    /*
1474     * Decrypted, possibly decompressed output here.
1475     */
1476    wbuf = &cipher_ctx->buf[CRYPTO_LEN_SIZE];
1477    cipher_ctx->buf_len -= cipher_ctx->packet_len;
1478    Dmsg2(130, "Encryption writing full block, %u bytes, remaining %u bytes in buffer\n", wsize, cipher_ctx->buf_len);
1479
1480    if ((flags & FO_SPARSE) || (flags & FO_OFFSETS)) {
1481       if (!sparse_data(jcr, bfd, addr, &wbuf, &wsize)) {
1482          return false;
1483       }
1484    }
1485
1486    if (flags & FO_COMPRESS) {
1487       if (!decompress_data(jcr, stream, &wbuf, &wsize)) {
1488          return false;
1489       }
1490    }
1491
1492    Dmsg0(130, "Call store_data\n");
1493    if (!store_data(jcr, bfd, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) {
1494       return false;
1495    }
1496    jcr->JobBytes += wsize;
1497    Dmsg2(130, "Flush write %u bytes, JobBytes=%s\n", wsize, edit_uint64(jcr->JobBytes, ec1));
1498
1499    /*
1500     * Move any remaining data to start of buffer
1501     */
1502    if (cipher_ctx->buf_len > 0) {
1503       Dmsg1(130, "Moving %u buffered bytes to start of buffer\n", cipher_ctx->buf_len);
1504       memmove(cipher_ctx->buf, &cipher_ctx->buf[cipher_ctx->packet_len], 
1505          cipher_ctx->buf_len);
1506    }
1507    /*
1508     * The packet was successfully written, reset the length so that the next
1509     * packet length may be re-read by unser_crypto_packet_len()
1510     */
1511    cipher_ctx->packet_len = 0;
1512
1513    if (cipher_ctx->buf_len >0 && !second_pass) {
1514       second_pass = true;
1515       goto again;
1516    }
1517
1518    /*
1519     * Stop decryption
1520     */
1521    cipher_ctx->buf_len = 0;
1522    cipher_ctx->packet_len = 0;
1523
1524    return true;
1525 }
1526
1527 static void deallocate_cipher(r_ctx &rctx)
1528 {
1529    /*
1530     * Flush and deallocate previous stream's cipher context
1531     */
1532    if (rctx.cipher_ctx.cipher) {
1533       flush_cipher(rctx.jcr, &rctx.bfd, &rctx.fileAddr, rctx.flags, rctx.comp_stream, &rctx.cipher_ctx);
1534       crypto_cipher_free(rctx.cipher_ctx.cipher);
1535       rctx.cipher_ctx.cipher = NULL;
1536    }
1537 }
1538
1539 static void deallocate_fork_cipher(r_ctx &rctx)
1540 {
1541
1542    /*
1543     * Flush and deallocate previous stream's fork cipher context
1544     */
1545    if (rctx.fork_cipher_ctx.cipher) {
1546       flush_cipher(rctx.jcr, &rctx.forkbfd, &rctx.fork_addr, rctx.fork_flags, rctx.comp_stream, &rctx.fork_cipher_ctx);
1547       crypto_cipher_free(rctx.fork_cipher_ctx.cipher);
1548       rctx.fork_cipher_ctx.cipher = NULL;
1549    }
1550 }
1551
1552 static void free_signature(r_ctx &rctx)
1553 {
1554    if (rctx.sig) {
1555       crypto_sign_free(rctx.sig);
1556       rctx.sig = NULL;
1557    }
1558 }
1559
1560 static void free_session(r_ctx &rctx)
1561 {
1562    if (rctx.cs) {
1563       crypto_session_free(rctx.cs);
1564       rctx.cs = NULL;
1565    }
1566 }
1567
1568
1569 /*
1570  * This code if implemented goes above
1571  */
1572 #ifdef stbernard_implemented
1573 /  #if defined(HAVE_WIN32)
1574    bool        bResumeOfmOnExit = FALSE;
1575    if (isOpenFileManagerRunning()) {
1576        if ( pauseOpenFileManager() ) {
1577           Jmsg(jcr, M_INFO, 0, _("Open File Manager paused\n") );
1578           bResumeOfmOnExit = TRUE;
1579        }
1580        else {
1581           Jmsg(jcr, M_ERROR, 0, _("FAILED to pause Open File Manager\n") );
1582        }
1583    }
1584    {
1585        char username[UNLEN+1];
1586        DWORD usize = sizeof(username);
1587        int privs = enable_backup_privileges(NULL, 1);
1588        if (GetUserName(username, &usize)) {
1589           Jmsg2(jcr, M_INFO, 0, _("Running as '%s'. Privmask=%#08x\n"), username,
1590        } else {
1591           Jmsg(jcr, M_WARNING, 0, _("Failed to retrieve current UserName\n"));
1592        }
1593    }
1594 #endif