libzypp  17.14.0
Downloader.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
9 
10 #include <fstream>
11 #include "zypp/base/String.h"
12 #include "zypp/base/Logger.h"
13 #include "zypp/base/Gettext.h"
14 
15 #include "Downloader.h"
16 #include "zypp/KeyContext.h"
17 #include "zypp/ZYppCallbacks.h"
18 
19 using namespace std;
20 
21 namespace zypp
22 {
23 namespace repo
24 {
25 
26 Downloader::Downloader()
27 {
28 }
29 Downloader::Downloader(const RepoInfo & repoinfo) : _repoinfo(repoinfo)
30 {
31 }
33 {
34 }
35 
37 {
38  WAR << "Non implemented" << endl;
39  return RepoStatus();
40 }
41 
43  const Pathname &dest_dir,
44  const ProgressData::ReceiverFnc & progress )
45 {
46  WAR << "Non implemented" << endl;
47 }
48 
49 void Downloader::defaultDownloadMasterIndex( MediaSetAccess & media_r, const Pathname & destdir_r, const Pathname & masterIndex_r )
50 {
51  Pathname sigpath = masterIndex_r.extend( ".asc" );
52  Pathname keypath = masterIndex_r.extend( ".key" );
53 
54  // always download them, even if repoGpgCheck is disabled
55  enqueue( OnMediaLocation( sigpath, 1 ).setOptional( true ).setDownloadSize( ByteCount( 20, ByteCount::MB ) ) );
56  enqueue( OnMediaLocation( keypath, 1 ).setOptional( true ).setDownloadSize( ByteCount( 20, ByteCount::MB ) ) );
57  start( destdir_r, media_r );
58  reset();
59 
60  FileChecker checker; // set to sigchecker if appropriate, else Null.
61  SignatureFileChecker sigchecker;
62  bool isSigned = PathInfo(destdir_r / sigpath).isExist();
63 
64  if ( repoInfo().repoGpgCheck() )
65  {
66  if ( isSigned || repoInfo().repoGpgCheckIsMandatory() )
67  {
68  // only add the signature if it exists
69  if ( isSigned )
70  sigchecker = SignatureFileChecker( destdir_r / sigpath );
71 
72  KeyContext context;
73  context.setRepoInfo( repoInfo() );
74  // only add the key if it exists
75  if ( PathInfo(destdir_r / keypath).isExist() )
76  sigchecker.addPublicKey( destdir_r / keypath, context );
77  else
78  // set the checker context even if the key is not known (unsigned repo, key
79  // file missing; bnc #495977)
80  sigchecker.setKeyContext( context );
81 
82  checker = FileChecker( ref(sigchecker) ); // ref() to the local sigchecker is important as we want back fileValidated!
83  }
84  else
85  {
86  WAR << "Accept unsigned repository because repoGpgCheck is not mandatory for " << repoInfo().alias() << endl;
87  }
88  }
89  else
90  {
91  WAR << "Signature checking disabled in config of repository " << repoInfo().alias() << endl;
92  }
93 
94  enqueue( OnMediaLocation( masterIndex_r, 1 ).setDownloadSize( ByteCount( 20, ByteCount::MB ) ), checker ? checker : FileChecker(NullFileChecker()) );
95  start( destdir_r, media_r );
96  reset();
97 
98  // Accepted!
99  _repoinfo.setMetadataPath( destdir_r );
100  if ( isSigned )
102  else
103  _repoinfo.setValidRepoSignature( indeterminate );
104 }
105 
106 
107 }// ns repo
108 } // ns zypp
109 
110 
111