1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/FileChecker.cc
13 #include "zypp/base/Logger.h"
14 #include "zypp/FileChecker.h"
15 #include "zypp/ZYppFactory.h"
16 #include "zypp/Digest.h"
17 #include "zypp/KeyRing.h"
21 ///////////////////////////////////////////////////////////////////
23 { /////////////////////////////////////////////////////////////////
25 ChecksumFileChecker::ChecksumFileChecker( const CheckSum &checksum )
30 void ChecksumFileChecker::operator()( const Pathname &file ) const
32 MIL << "checking " << file << " file against checksum '" << _checksum << "'" << endl;
33 callback::SendReport<DigestReport> report;
34 CheckSum real_checksum( _checksum.type(), filesystem::checksum( file, _checksum.type() ));
36 if ( _checksum.empty() )
38 MIL << "File " << file << " has no checksum available." << std::endl;
39 if ( report->askUserToAcceptNoDigest(file) )
41 MIL << "User accepted " << file << " with no checksum." << std::endl;
46 ZYPP_THROW( FileCheckException( "No checksum available for " + file.basename() ) );
51 if ( (real_checksum != _checksum) )
53 if ( report->askUserToAcceptWrongDigest( file, _checksum.checksum(), real_checksum.checksum() ) )
55 WAR << "User accepted " << file << " with WRONG CHECKSUM." << std::endl;
60 ZYPP_THROW( FileCheckException( "Wrong checksum for " + file.basename() ) );
66 void NullFileChecker::operator()(const Pathname &file ) const
68 MIL << "+ null check on " << file << endl;
72 void CompositeFileChecker::operator()(const Pathname &file ) const
74 //MIL << _checkers.size() << " checkers" << endl;
75 for ( list<FileChecker>::const_iterator it = _checkers.begin(); it != _checkers.end(); ++it )
79 //MIL << "+ chk" << endl;
84 ERR << "Invalid checker" << endl;
89 void CompositeFileChecker::add( const FileChecker &checker )
91 //MIL << "||# " << _checkers.size() << endl;
92 _checkers.push_back(checker);
93 //MIL << "||* " << _checkers.size() << endl;
97 SignatureFileChecker::SignatureFileChecker( const Pathname &signature,
98 const std::string &description )
99 : _signature(signature)
100 , _description(description)
105 SignatureFileChecker::SignatureFileChecker( const std::string &description )
106 : _description(description)
111 SignatureFileChecker::SignatureFileChecker()
115 void SignatureFileChecker::addPublicKey( const Pathname &publickey )
117 ZYpp::Ptr z = getZYpp();
118 z->keyRing()->importKey(publickey, false);
121 void SignatureFileChecker::operator()(const Pathname &file ) const
123 ZYpp::Ptr z = getZYpp();
125 if ( (! PathInfo(_signature).isExist()) && (!_signature.empty()))
127 ZYPP_THROW(FileCheckException("Signature " + _signature.asString() + " not found."));
130 MIL << "checking " << file << " file validity using digital signature.." << endl;
131 bool valid = z->keyRing()->verifyFileSignatureWorkflow( file, _description.empty() ? file.basename() : _description, _signature);
134 ZYPP_THROW( FileCheckException( "Signature verification failed for " + file.basename() ) );
137 /******************************************************************
139 ** FUNCTION NAME : operator<<
140 ** FUNCTION TYPE : std::ostream &
142 std::ostream & operator<<( std::ostream & str, const FileChecker & obj )
147 /////////////////////////////////////////////////////////////////
149 ///////////////////////////////////////////////////////////////////