Imported Upstream version 14.47.0
[platform/upstream/libzypp.git] / zypp / repo / Downloader.cc
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 }
32 Downloader::~Downloader()
33 {
34 }
35
36 RepoStatus Downloader::status( MediaSetAccess &media )
37 {
38   WAR << "Non implemented" << endl;
39   return RepoStatus();
40 }
41
42 void Downloader::download( MediaSetAccess &media,
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 )
101     _repoinfo.setValidRepoSignature( sigchecker.fileValidated() );
102   else
103     _repoinfo.setValidRepoSignature( indeterminate );
104 }
105
106
107 }// ns repo
108 } // ns zypp
109
110
111