- Create the cache directly from the schema (installed) file.
[platform/upstream/libzypp.git] / zypp / VendorAttr.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /*
10   File:       VendorAttr.cc
11
12   Author:     Michael Andres <ma@suse.de>
13   Maintainer: Michael Andres <ma@suse.de>
14
15   Purpose: Manage vendor attributes
16
17 /-*/
18
19 #include <iostream>
20 #include <fstream>
21 #include <set>
22 #include <map>
23
24 #include "zypp/base/LogTools.h"
25 #include "zypp/base/IOStream.h"
26 #include "zypp/base/String.h"
27
28 #include "zypp/VendorAttr.h"
29 #include "zypp/ZYppFactory.h"
30
31 using namespace std;
32
33 #undef  ZYPP_BASE_LOGGER_LOGGROUP
34 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::VendorAttr"
35
36 ///////////////////////////////////////////////////////////////////
37 namespace zypp
38 { /////////////////////////////////////////////////////////////////
39
40   ///////////////////////////////////////////////////////////////////
41   namespace
42   { /////////////////////////////////////////////////////////////////
43
44     typedef std::map<Vendor,bool> TrustMap;
45     TrustMap _trustMap;
46
47     typedef std::set<std::string> VendorList;
48     VendorList _trustedVendors;
49
50     bool addTrustedVendor( const std::string & str_r )
51     {
52       std::string line( str::trim( str_r ) );
53       if ( ! line.empty() && line[0] != '#')
54         {
55           _trustedVendors.insert( str::toLower( line ) );
56         }
57       return true;
58     }
59
60     bool trusted( const Vendor & vendor_r )
61     {
62       TrustMap::value_type val( vendor_r, false );
63       pair<TrustMap::iterator, bool> res = _trustMap.insert( val );
64
65       if ( res.second )
66         {
67           // check the new vendor in map
68           for ( VendorList::const_iterator it = _trustedVendors.begin();
69                 it != _trustedVendors.end(); ++it )
70             {
71               if ( str::toLower( res.first->first.substr( 0, it->size() ) )
72                    == str::toLower( *it ) )
73                 {
74                   // match
75                   res.first->second = true;
76                   break;
77                 }
78             }
79         }
80       return res.first->second;
81     }
82
83     bool applyAutoProtection = true;
84
85     /////////////////////////////////////////////////////////////////
86   } // namespace
87   ///////////////////////////////////////////////////////////////////
88
89   const VendorAttr & VendorAttr::instance()
90   {
91     static VendorAttr _val;
92     return _val;
93   }
94
95   VendorAttr::VendorAttr ()
96   {
97     char * vendors[] = {
98       "jpackage project",
99       "novell",
100       "opensuse",
101       "sgi",
102       "silicon graphics",
103       "suse",
104       "ati technologies inc.",
105       "nvidia"
106     };
107     _trustedVendors.insert( vendors, vendors+(sizeof(vendors)/sizeof(char *)) );
108
109     Pathname vendorrcPath( getZYpp()->homePath() / "db/trustedVendors" );
110     try
111       {
112         Target_Ptr trg( getZYpp()->target() );
113         if ( trg )
114           vendorrcPath = trg->root() / vendorrcPath;
115       }
116     catch ( ... )
117       {
118         // noop: Someone decided to let target() throw if the ptr is NULL ;(
119       }
120
121     PathInfo vendorrc( vendorrcPath );
122     if ( vendorrc.isFile() )
123       {
124         MIL << "Reading " << vendorrc << endl;
125         ifstream inp( vendorrc.asString().c_str() );
126         iostr::forEachLine( inp, addTrustedVendor );
127       }
128     MIL << "Trusted Vendors: " << _trustedVendors << endl;
129   }
130
131   void VendorAttr::enableAutoProtect()
132   {
133     MIL << "Foreign vendor auto protection enabled." << endl;
134     applyAutoProtection = true;
135   }
136
137   void VendorAttr::disableAutoProtect()
138   {
139     MIL << "Foreign vendor auto protection disabled." << endl;
140     applyAutoProtection = false;
141   }
142
143   bool VendorAttr::isKnown( const Vendor & vendor_r ) const
144   { return trusted( vendor_r ); }
145
146
147   bool VendorAttr::autoProtect( const Vendor & vendor_r ) const
148   { return( applyAutoProtection && ! trusted( vendor_r ) ); }
149
150   /////////////////////////////////////////////////////////////////
151 } // namespace zypp
152 ///////////////////////////////////////////////////////////////////
153