15 #include <rpm/rpmcli.h>
16 #include <rpm/rpmlog.h>
59 #define WARNINGMAILPATH "/var/log/YaST2/"
60 #define FILEFORBACKUPFILES "YaSTBackupModifiedFiles"
61 #define MAXRPMMESSAGELINES 10000
63 #define WORKAROUNDRPMPWDBUG
65 #undef ZYPP_BASE_LOGGER_LOGGROUP
66 #define ZYPP_BASE_LOGGER_LOGGROUP "librpmDb"
70 namespace zypp_readonly_hack
78 static bool val = [](){
79 const char * env = getenv(
"ZYPP_RPM_DEBUG");
94 #if 1 // No more need to escape whitespace since rpm-4.4.2.3
95 const char* quoteInFilename_m =
"\'\"";
97 const char* quoteInFilename_m =
" \t\'\"";
99 inline std::string rpmQuoteFilename(
const Pathname & path_r )
101 std::string path( path_r.
asString() );
103 pos != std::string::npos;
104 pos = path.find_first_of( quoteInFilename_m, pos ) )
106 path.insert( pos,
"\\" );
119 #if defined(WORKAROUNDRPMPWDBUG)
123 AutoDispose<char*> cwd( ::get_current_dir_name(), ::free );
126 WAR <<
"Can't get cwd!" << endl;
147 MIL <<
"trusted key added to zypp Keyring. Importing..." << endl;
148 _rpmdb.importPubkey( key );
153 MIL <<
"Trusted key removed from zypp Keyring. Removing..." << endl;
154 _rpmdb.removePubkey( key );
162 unsigned diffFiles(
const std::string file1,
const std::string file2, std::string& out,
int maxlines)
183 if (maxlines<0?
true:count<maxlines)
209 #define FAILIFNOTINITIALIZED if( ! initialized() ) { ZYPP_THROW(RpmDbNotOpenException()); }
220 : _backuppath (
"/var/adm/backup")
221 , _packagebackups(false)
228 setenv(
"RPM_IgnoreFailedSymlinks",
"1", 1 );
240 MIL <<
"~RpmDb()" << endl;
243 MIL <<
"~RpmDb() end" << endl;
269 bool quickinit( root_r.
empty() );
271 if ( root_r.
empty() )
282 ERR <<
"Illegal root or dbPath: " <<
stringPath( root_r, dbPath_r ) << endl;
286 if ( !
PathInfo( root_r/
"/var/lib/rpm" ).isExist()
287 &&
PathInfo( root_r/
"/usr/lib/sysimage/rpm" ).isDir() )
289 WAR <<
"Rpm package was deleted? Injecting missing rpmdb compat symlink." << endl;
293 MIL <<
"Calling initDatabase: " <<
stringPath( root_r, dbPath_r )
294 << ( doRebuild_r ?
" (rebuilddb)" :
"" )
295 << ( quickinit ?
" (quickinit)" :
"" ) << endl;
319 MIL <<
"QUICK initDatabase (no systemRoot set)" << endl;
341 MIL <<
"Synchronizing keys with zypp keyring" << endl;
350 MIL <<
"InitDatabase: " << *
this << endl;
366 MIL <<
"Calling closeDatabase: " << *
this << endl;
378 MIL <<
"closeDatabase: " << *
this << endl;
408 MIL <<
"RpmDb::rebuildDatabase" << *
this << endl;
422 opts.push_back(
"--rebuilddb");
423 opts.push_back(
"-vv");
433 tics.
range( hdrTotal );
444 static const std::string debugPrefix {
"D:" };
445 static const std::string progressPrefix {
"D: read h#" };
446 static const std::string ignoreSuffix {
"digest: OK" };
461 WAR <<
"User requested abort." << endl;
485 void computeKeyRingSync( std::set<Edition> & rpmKeys_r, std::list<PublicKeyData> & zyppKeys_r )
496 void updateIf(
const Edition & rpmKey_r )
498 std::string keyRelease( rpmKey_r.
release() );
499 int comp = _release.compare( keyRelease );
503 _release.swap( keyRelease );
504 _inRpmKeys = &rpmKey_r;
505 _inZyppKeys =
nullptr;
506 if ( !keyRelease.empty() )
507 DBG <<
"Old key in Z: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
509 else if ( comp == 0 )
513 _inRpmKeys = &rpmKey_r;
517 DBG <<
"Old key in R: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
520 void updateIf(
const PublicKeyData & zyppKey_r )
522 std::string keyRelease( zyppKey_r.gpgPubkeyRelease() );
523 int comp = _release.compare( keyRelease );
527 _release.swap( keyRelease );
528 _inRpmKeys =
nullptr;
529 _inZyppKeys = &zyppKey_r;
530 if ( !keyRelease.empty() )
531 DBG <<
"Old key in R: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
533 else if ( comp == 0 )
537 _inZyppKeys = &zyppKey_r;
541 DBG <<
"Old key in Z: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
544 std::string _release;
545 const Edition * _inRpmKeys;
546 const PublicKeyData * _inZyppKeys;
551 std::map<std::string,Key> _keymap;
553 for_( it, rpmKeys_r.begin(), rpmKeys_r.end() )
555 _keymap[(*it).version()].updateIf( *it );
558 for_( it, zyppKeys_r.begin(), zyppKeys_r.end() )
560 _keymap[(*it).gpgPubkeyVersion()].updateIf( *it );
564 std::set<Edition> rpmKeys;
565 std::list<PublicKeyData> zyppKeys;
566 for_( it, _keymap.begin(), _keymap.end() )
568 DBG <<
"gpg-pubkey-" << (*it).first <<
"-" << (*it).second._release <<
" "
569 << ( (*it).second._inRpmKeys ?
"R" :
"_" )
570 << ( (*it).second._inZyppKeys ?
"Z" :
"_" ) << endl;
571 if ( ! (*it).second._inRpmKeys )
573 zyppKeys.push_back( *(*it).second._inZyppKeys );
575 if ( ! (*it).second._inZyppKeys )
577 rpmKeys.insert( *(*it).second._inRpmKeys );
580 rpmKeys_r.swap( rpmKeys );
581 zyppKeys_r.swap( zyppKeys );
588 MIL <<
"Going to sync trusted keys..." << endl;
590 std::list<PublicKeyData> zyppKeys( getZYpp()->keyRing()->trustedPublicKeyData() );
602 MIL <<
"Removing excess keys in zypp trusted keyring" << std::endl;
608 if ( ! rpmKeys.count( keyData.gpgPubkeyEdition() ) )
610 DBG <<
"Excess key in Z to delete: gpg-pubkey-" << keyData.gpgPubkeyEdition() << endl;
611 getZYpp()->keyRing()->deleteKey( keyData.id(),
true );
612 if ( !dirty ) dirty =
true;
616 zyppKeys = getZYpp()->keyRing()->trustedPublicKeyData();
619 computeKeyRingSync( rpmKeys, zyppKeys );
620 MIL << (mode_r &
SYNC_TO_KEYRING ?
"" :
"(skip) ") <<
"Rpm keys to export into zypp trusted keyring: " << rpmKeys.size() << endl;
621 MIL << (mode_r &
SYNC_FROM_KEYRING ?
"" :
"(skip) ") <<
"Zypp trusted keys to import into rpm database: " << zyppKeys.size() << endl;
627 MIL <<
"Exporting rpm keyring into zypp trusted keyring" <<endl;
632 TmpFile tmpfile( getZYpp()->tmpPath() );
634 std::ofstream tmpos( tmpfile.
path().
c_str() );
635 for_( it, rpmKeys.begin(), rpmKeys.end() )
639 getData(
"gpg-pubkey", *it, result );
640 tmpos << result->tag_description() << endl;
645 getZYpp()->keyRing()->multiKeyImport( tmpfile.
path(),
true );
649 std::set<Edition> missingKeys;
650 for (
const Edition & key : rpmKeys )
652 if ( getZYpp()->keyRing()->isKeyTrusted( key.version() ) )
654 ERR <<
"Could not import key:" <<
str::Format(
"gpg-pubkey-%s") % key <<
" into zypp keyring (V3 key?)" << endl;
655 missingKeys.insert( key );
657 if ( ! missingKeys.empty() )
663 ERR <<
"Could not import keys into zypp keyring: " << endl;
671 MIL <<
"Importing zypp trusted keyring" << std::endl;
672 for_( it, zyppKeys.begin(), zyppKeys.end() )
676 importPubkey( getZYpp()->keyRing()->exportTrustedPublicKey( *it ) );
684 MIL <<
"Trusted keys synced." << endl;
706 WAR <<
"Key " << pubkey_r <<
" can not be imported. (READONLY MODE)" << endl;
713 bool hasOldkeys =
false;
715 for_( it, rpmKeys.begin(), rpmKeys.end() )
724 MIL <<
"Key " << pubkey_r <<
" is already in the rpm trusted keyring. (skip import)" << endl;
728 if ( keyEd.
version() != (*it).version() )
731 if ( keyEd.
release() < (*it).release() )
733 MIL <<
"Key " << pubkey_r <<
" is older than one in the rpm trusted keyring. (skip import)" << endl;
741 MIL <<
"Key " << pubkey_r <<
" will be imported into the rpm trusted keyring." << (hasOldkeys?
"(update)":
"(new)") << endl;
747 std::string keyName(
"gpg-pubkey-" + keyEd.
version() );
749 opts.push_back (
"-e" );
750 opts.push_back (
"--allmatches" );
751 opts.push_back (
"--" );
752 opts.push_back ( keyName.c_str() );
763 ERR <<
"Failed to remove key " << pubkey_r <<
" from RPM trusted keyring (ignored)" << endl;
767 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
773 opts.push_back (
"--import" );
774 opts.push_back (
"--" );
776 opts.push_back ( pubkeypath.c_str() );
780 std::vector<std::string> excplines;
786 excplines.push_back( std::move(line) );
802 MIL <<
"Key " << pubkey_r <<
" imported in rpm trusted keyring." << endl;
819 std::set<Edition>::const_iterator found_edition = rpm_keys.end();
822 for_( it, rpm_keys.begin(), rpm_keys.end() )
824 if ( (*it).version() == pubkeyVersion )
832 if (found_edition == rpm_keys.end())
834 WAR <<
"Key " << pubkey_r.
id() <<
" is not in rpm db" << endl;
838 std::string rpm_name(
"gpg-pubkey-" + found_edition->asString());
841 opts.push_back (
"-e" );
842 opts.push_back (
"--" );
843 opts.push_back ( rpm_name.c_str() );
847 std::vector<std::string> excplines;
853 excplines.push_back( std::move(line) );
869 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
881 std::list<PublicKey> ret;
884 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
886 Edition edition = it->tag_edition();
891 getData(
"gpg-pubkey", edition, result );
892 TmpFile file(getZYpp()->tmpPath());
898 os << result->tag_description();
907 catch ( std::exception & e )
909 ERR <<
"Could not dump key " << edition.
asString() <<
" in tmp file " << file.
path() << endl;
919 std::set<Edition> ret;
922 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
924 Edition edition = it->tag_edition();
926 ret.insert( edition );
943 std::list<FileInfo> result;
970 bool RpmDb::hasFile(
const std::string & file_r,
const std::string & name_r )
const
980 res = (it->tag_name() == name_r);
1001 return it->tag_name();
1115 struct RpmlogCapture :
public std::string
1118 { rpmlog()._cap =
this; }
1121 { rpmlog()._cap =
nullptr; }
1129 rpmlogSetCallback( rpmLogCB,
this );
1130 rpmSetVerbosity( RPMLOG_INFO );
1131 _f = ::fopen(
"/dev/null",
"w");
1132 rpmlogSetFile(
_f );
1136 {
if (
_f ) ::fclose(
_f ); }
1138 static int rpmLogCB( rpmlogRec rec_r, rpmlogCallbackData data_r )
1139 {
return reinterpret_cast<Rpmlog*
>(data_r)->rpmLog( rec_r ); }
1141 int rpmLog( rpmlogRec rec_r )
1143 if (
_cap ) (*_cap) += rpmlogRecMessage( rec_r );
1144 return RPMLOG_DEFAULT;
1151 static Rpmlog & rpmlog()
1152 {
static Rpmlog _rpmlog;
return _rpmlog; }
1157 bool requireGPGSig_r,
1158 RpmDb::CheckPackageDetail & detail_r )
1161 if ( ! file.isFile() )
1163 ERR <<
"Not a file: " << file << endl;
1167 FD_t fd = ::Fopen( file.asString().c_str(),
"r.ufdio" );
1168 if ( fd == 0 || ::Ferror(fd) )
1170 ERR <<
"Can't open file for reading: " << file <<
" (" << ::Fstrerror(fd) <<
")" << endl;
1175 rpmts ts = ::rpmtsCreate();
1176 ::rpmtsSetRootDir( ts, root_r.
c_str() );
1177 ::rpmtsSetVSFlags( ts, RPMVSF_DEFAULT );
1179 rpmQVKArguments_s qva;
1180 memset( &qva, 0,
sizeof(rpmQVKArguments_s) );
1181 #ifdef HAVE_NO_RPMTSSETVFYFLAGS
1184 qva.qva_flags = (VERIFY_DIGEST|VERIFY_SIGNATURE);
1186 ::rpmtsSetVfyFlags( ts, RPMVSF_DEFAULT );
1188 RpmlogCapture vresult;
1189 LocaleGuard guard( LC_ALL,
"C" );
1190 int res = ::rpmVerifySignatures( &qva, ts, fd, path_r.
basename().c_str() );
1203 std::vector<std::string> lines;
1204 str::split( vresult, std::back_inserter(lines),
"\n" );
1205 unsigned count[7] = { 0, 0, 0, 0, 0, 0, 0 };
1207 for (
unsigned i = 1; i < lines.size(); ++i )
1209 std::string & line( lines[i] );
1211 if ( line.find(
": OK" ) != std::string::npos )
1214 if ( line.find(
"Signature, key ID" ) == std::string::npos )
1217 else if ( line.find(
": NOKEY" ) != std::string::npos )
1219 else if ( line.find(
": BAD" ) != std::string::npos )
1221 else if ( line.find(
": UNKNOWN" ) != std::string::npos )
1223 else if ( line.find(
": NOTRUSTED" ) != std::string::npos )
1225 else if ( line.find(
": NOTFOUND" ) != std::string::npos )
1229 detail_r.push_back( RpmDb::CheckPackageDetail::value_type( lineres, std::move(line) ) );
1250 detail_r.push_back( RpmDb::CheckPackageDetail::value_type(
RpmDb::CHK_NOSIG, std::string(
" ")+
_(
"Package is not signed!") ) );
1251 if ( requireGPGSig_r )
1258 WAR << path_r <<
" (" << requireGPGSig_r <<
" -> " << ret <<
")" << endl;
1271 {
return doCheckPackageSig( path_r,
root(),
false, detail_r ); }
1277 {
return doCheckPackageSig( path_r,
root(),
true, detail_r ); }
1292 opts.push_back (
"-V");
1293 opts.push_back (
"--nodeps");
1294 opts.push_back (
"--noscripts");
1295 opts.push_back (
"--nomd5");
1296 opts.push_back (
"--");
1297 opts.push_back (packageName.c_str());
1318 if (line.length() > 12 &&
1319 (line[0] ==
'S' || line[0] ==
's' ||
1320 (line[0] ==
'.' && line[7] ==
'T')))
1323 std::string filename;
1325 filename.assign(line, 11, line.length() - 11);
1366 #if defined(WORKAROUNDRPMPWDBUG)
1367 args.push_back(
"#/");
1369 args.push_back(
"rpm");
1370 args.push_back(
"--root");
1372 args.push_back(
"--dbpath");
1375 args.push_back(
"-vv");
1376 const char* argv[args.size() + opts.size() + 1];
1378 const char** p = argv;
1379 p =
copy (args.begin (), args.end (), p);
1380 p =
copy (opts.begin (), opts.end (), p);
1410 const auto &readResult =
io::receiveUpto( inputfile,
'\n', 5 * 1000,
false );
1411 switch ( readResult.first ) {
1417 line += readResult.second;
1421 line += readResult.second;
1422 if ( line.size() && line.back() ==
'\n')
1427 line += readResult.second;
1429 if ( line.size() && line.back() ==
'\n')
1433 L_DBG(
"RPM_DEBUG") << line << endl;
1477 void RpmDb::processConfigFiles(
const std::string& line,
const std::string& name,
const char* typemsg,
const char* difffailmsg,
const char* diffgenmsg)
1479 std::string msg = line.substr(9);
1482 std::string file1s, file2s;
1486 pos1 = msg.find (typemsg);
1489 if ( pos1 == std::string::npos )
1492 pos2 = pos1 + strlen (typemsg);
1494 if (pos2 >= msg.length() )
1497 file1 = msg.substr (0, pos1);
1498 file2 = msg.substr (pos2);
1505 file1 =
_root + file1;
1506 file2 =
_root + file2;
1516 ERR <<
"Could not create " << file.
asString() << endl;
1520 std::ofstream notify(file.
asString().c_str(), std::ios::out|std::ios::app);
1523 ERR <<
"Could not open " << file << endl;
1529 notify <<
str::form(
_(
"Changed configuration files for %s:"), name.c_str()) << endl;
1532 ERR <<
"diff failed" << endl;
1534 file1s.c_str(), file2s.c_str()) << endl;
1539 file1s.c_str(), file2s.c_str()) << endl;
1544 if (out.substr(0,4) ==
"--- ")
1546 out.replace(4, file1.
asString().length(), file1s);
1549 if (pos != std::string::npos)
1551 out.replace(pos+5, file2.
asString().length(), file2s);
1554 notify << out << endl;
1557 notify.open(
"/var/lib/update-messages/yast2-packagemanager.rpmdb.configfiles");
1562 WAR <<
"rpm created " << file2 <<
" but it is not different from " << file2 << endl;
1593 report->finish( excpt_r );
1609 MIL <<
"RpmDb::installPackage(" << filename <<
"," << flags <<
")" << endl;
1618 ERR <<
"backup of " << filename.
asString() <<
" failed" << endl;
1627 opts.push_back(
"-i");
1629 opts.push_back(
"-U");
1631 opts.push_back(
"--percent");
1632 opts.push_back(
"--noglob");
1636 opts.push_back(
"--ignorearch");
1639 opts.push_back(
"--nodigest");
1641 opts.push_back(
"--nosignature");
1643 opts.push_back (
"--excludedocs");
1645 opts.push_back (
"--noscripts");
1647 opts.push_back (
"--force");
1649 opts.push_back (
"--nodeps");
1651 opts.push_back (
"--ignoresize");
1653 opts.push_back (
"--justdb");
1655 opts.push_back (
"--test");
1657 opts.push_back (
"--noposttrans");
1659 opts.push_back(
"--");
1662 std::string quotedFilename( rpmQuoteFilename( workaroundRpmPwdBug( filename ) ) );
1663 opts.push_back ( quotedFilename.c_str() );
1668 unsigned lineno = 0;
1671 cmdout.
set(
"line", std::cref(line) );
1672 cmdout.
set(
"lineno", lineno );
1676 std::vector<std::string> configwarnings;
1683 sscanf( line.c_str() + 2,
"%d", &percent );
1684 report->progress( percent );
1688 cmdout.
set(
"lineno", lineno );
1689 report->report( cmdout );
1692 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1696 rpmmsg += line+
'\n';
1699 configwarnings.push_back(line);
1702 rpmmsg +=
"[truncated]\n";
1707 for (std::vector<std::string>::iterator it = configwarnings.begin();
1708 it != configwarnings.end(); ++it)
1712 _(
"rpm saved %s as %s, but it was impossible to determine the difference"),
1714 _(
"rpm saved %s as %s.\nHere are the first 25 lines of difference:\n"));
1717 _(
"rpm created %s as %s, but it was impossible to determine the difference"),
1719 _(
"rpm created %s as %s.\nHere are the first 25 lines of difference:\n"));
1722 if ( rpm_status != 0 )
1727 std::ostringstream sstr;
1728 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1729 historylog.
comment(sstr.str());
1733 else if ( ! rpmmsg.empty() )
1738 std::ostringstream sstr;
1739 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1740 historylog.
comment(sstr.str());
1744 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1758 +
"-" + package->edition().version()
1759 +
"-" + package->edition().release()
1760 +
"." + package->arch().asString(), flags );
1788 report->finish( excpt_r );
1805 MIL <<
"RpmDb::doRemovePackage(" << name_r <<
"," << flags <<
")" << endl;
1814 ERR <<
"backup of " << name_r <<
" failed" << endl;
1825 opts.push_back(
"-e");
1826 opts.push_back(
"--allmatches");
1829 opts.push_back(
"--noscripts");
1831 opts.push_back(
"--nodeps");
1833 opts.push_back(
"--justdb");
1835 opts.push_back (
"--test");
1838 WAR <<
"IGNORE OPTION: 'rpm -e' does not support '--force'" << endl;
1841 opts.push_back(
"--");
1842 opts.push_back(name_r.c_str());
1847 unsigned lineno = 0;
1850 cmdout.
set(
"line", std::cref(line) );
1851 cmdout.
set(
"lineno", lineno );
1865 cmdout.
set(
"lineno", lineno );
1866 report->report( cmdout );
1869 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1872 rpmmsg += line+
'\n';
1875 rpmmsg +=
"[truncated]\n";
1879 if ( rpm_status != 0 )
1882 str::form(
"%s remove failed", name_r.c_str()),
true );
1883 std::ostringstream sstr;
1884 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1885 historylog.
comment(sstr.str());
1889 else if ( ! rpmmsg.empty() )
1892 str::form(
"%s removed ok", name_r.c_str()),
true );
1894 std::ostringstream sstr;
1895 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1896 historylog.
comment(sstr.str());
1900 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1934 INT <<
"_backuppath empty" << endl;
1942 ERR <<
"Error while getting changed files for package " <<
1943 packageName << endl;
1949 DBG <<
"package " << packageName <<
" not changed -> no backup" << endl;
1961 struct tm *currentLocalTime = localtime(&
currentTime);
1963 int date = (currentLocalTime->tm_year + 1900) * 10000
1964 + (currentLocalTime->tm_mon + 1) * 100
1965 + currentLocalTime->tm_mday;
1971 +
str::form(
"%s-%d-%d.tar.gz",packageName.c_str(), date, num);
1974 while (
PathInfo(backupFilename).isExist() && num++ < 1000);
1979 ERR << filestobackupfile.
asString() <<
" already exists and is no file" << endl;
1983 std::ofstream fp ( filestobackupfile.
asString().c_str(), std::ios::out|std::ios::trunc );
1987 ERR <<
"could not open " << filestobackupfile.
asString() << endl;
1991 for (FileList::const_iterator cit =
fileList.begin();
1994 std::string name = *cit;
1995 if ( name[0] ==
'/' )
1998 name = name.substr( 1 );
2000 DBG <<
"saving file "<< name << endl;
2005 const char*
const argv[] =
2011 "--ignore-failed-read",
2015 filestobackupfile.
asString().c_str(),
2031 int ret = tar.
close();
2035 ERR <<
"tar failed: " << tarmsg << endl;
2040 MIL <<
"tar backup ok" << endl;
2061 #define OUTS(E,S) case RpmDb::E: return str << "["<< (unsigned)obj << "-"<< S << "]"; break
2063 OUTS( CHK_OK,
_(
"Signature is OK") );
2065 OUTS( CHK_NOTFOUND,
_(
"Unknown type of signature") );
2067 OUTS( CHK_FAIL,
_(
"Signature does not verify") );
2069 OUTS( CHK_NOTTRUSTED,
_(
"Signature is OK, but key is not trusted") );
2071 OUTS( CHK_NOKEY,
_(
"Signatures public key is not available") );
2073 OUTS( CHK_ERROR,
_(
"File does not exist or signature can't be checked") );
2075 OUTS( CHK_NOSIG,
_(
"File is unsigned") );
2083 for (
const auto & el : obj )
2084 str << el.second << endl;