merged from the mvo branch
[ntk/apt.git] / apt-pkg / vendorlist.cc
1 #include <apt-pkg/vendorlist.h>
2 #include <apt-pkg/fileutl.h>
3 #include <apt-pkg/error.h>
4 #include <apti18n.h>
5
6 pkgVendorList::~pkgVendorList()
7 {
8 for (vector<const Vendor *>::const_iterator I = VendorList.begin();
9 I != VendorList.end(); I++)
10 delete *I;
11 }
12
13 // pkgVendorList::ReadMainList - Read list of known package vendors /*{{{*/
14 // ---------------------------------------------------------------------
15 /* This also scans a directory of vendor files similar to apt.conf.d
16 which can contain the usual suspects of distribution provided data.
17 The APT config mechanism allows the user to override these in their
18 configuration file. */
19 bool pkgVendorList::ReadMainList()
20 {
21 Configuration Cnf;
22
23 string CnfFile = _config->FindDir("Dir::Etc::vendorparts");
24 if (FileExists(CnfFile) == true)
25 if (ReadConfigDir(Cnf,CnfFile,true) == false)
26 return false;
27 CnfFile = _config->FindFile("Dir::Etc::vendorlist");
28 if (FileExists(CnfFile) == true)
29 if (ReadConfigFile(Cnf,CnfFile,true) == false)
30 return false;
31
32 return CreateList(Cnf);
33 }
34 /*}}}*/
35 bool pkgVendorList::Read(string File) /*{{{*/
36 {
37 Configuration Cnf;
38 if (ReadConfigFile(Cnf,File,true) == false)
39 return false;
40
41 return CreateList(Cnf);
42 }
43 /*}}}*/
44 bool pkgVendorList::CreateList(Configuration& Cnf) /*{{{*/
45 {
46 for (vector<const Vendor *>::const_iterator I = VendorList.begin();
47 I != VendorList.end(); I++)
48 delete *I;
49 VendorList.erase(VendorList.begin(),VendorList.end());
50
51 const Configuration::Item *Top = Cnf.Tree("Vendor");
52 for (Top = (Top == 0?0:Top->Child); Top != 0; Top = Top->Next)
53 {
54 Configuration Block(Top);
55 string VendorID = Top->Tag;
56 vector <struct Vendor::Fingerprint *> *Fingerprints = new vector<Vendor::Fingerprint *>;
57 struct Vendor::Fingerprint *Fingerprint = new struct Vendor::Fingerprint;
58 string Origin = Block.Find("Origin");
59
60 Fingerprint->Print = Block.Find("Fingerprint");
61 Fingerprint->Description = Block.Find("Name");
62 Fingerprints->push_back(Fingerprint);
63
64 if (Fingerprint->Print.empty() || Fingerprint->Description.empty())
65 {
66 _error->Error(_("Vendor block %s contains no fingerprint"), VendorID.c_str());
67 delete Fingerprints;
68 continue;
69 }
70 if (_config->FindB("Debug::sourceList", false))
71 std::cerr << "Adding vendor with ID: " << VendorID
72 << " Fingerprint: " << Fingerprint->Print << std::endl;
73
74 VendorList.push_back(new Vendor(VendorID, Origin, Fingerprints));
75 }
76
77 /* Process 'group-key' type sections */
78 Top = Cnf.Tree("group-key");
79 for (Top = (Top == 0?0:Top->Child); Top != 0; Top = Top->Next)
80 {
81 // Configuration Block(Top);
82 // vector<Vendor::Fingerprint *> Fingerprints;
83 // string VendorID = Top->Tag;
84
85 // while (Block->Next)
86 // {
87 // struct Vendor::Fingerprint Fingerprint = new struct Vendor::Fingerprint;
88 // Fingerprint->Print = Block.Find("Fingerprint");
89 // Fingerprint->Description = Block.Find("Name");
90 // if (Fingerprint->print.empty() || Fingerprint->Description.empty())
91 // {
92 // _error->Error(_("Vendor block %s is invalid"),
93 // Vendor->VendorID.c_str());
94 // delete Fingerprint;
95 // break;
96 // }
97 // Block = Block->Next->Next;
98 // }
99 // if (_error->PendingError())
100 // {
101 // for (vector <struct Vendor::Fingerprint *>::iterator I = Fingerprints.begin();
102 // I != Fingerprints.end(); I++)
103 // delete *I;
104 // delete Fingerprints;
105 // continue;
106 // }
107
108 // VendorList.push_back(new Vendor(VendorID, Fingerprints));
109 }
110
111 return !_error->PendingError();
112 }
113 /*}}}*/
114 const Vendor* pkgVendorList::LookupFingerprint(string Fingerprint) /*{{{*/
115 {
116 for (const_iterator I = VendorList.begin(); I != VendorList.end(); ++I)
117 {
118 if ((*I)->LookupFingerprint(Fingerprint) != "")
119 return *I;
120 }
121
122 return NULL;
123 }
124 /*}}}*/
125 const Vendor* pkgVendorList::FindVendor(const std::vector<string> GPGVOutput) /*{{{*/
126 {
127 for (std::vector<string>::const_iterator I = GPGVOutput.begin(); I != GPGVOutput.end(); I++)
128 {
129 string::size_type pos = (*I).find("VALIDSIG ");
130 if (_config->FindB("Debug::Vendor", false))
131 std::cerr << "Looking for VALIDSIG in \"" << (*I) << "\": pos " << pos << std::endl;
132 if (pos != std::string::npos)
133 {
134 string Fingerprint = (*I).substr(pos+sizeof("VALIDSIG"));
135 if (_config->FindB("Debug::Vendor", false))
136 std::cerr << "Looking for \"" << Fingerprint << "\" in vendor..." << std::endl;
137 const Vendor* vendor = this->LookupFingerprint(Fingerprint);
138 if (vendor != NULL)
139 return vendor;
140 }
141 }
142
143 return NULL;
144 }
145 /*}}}*/