1 |
blino |
21273 |
diff --git a/src/Daemon/Makefile.am b/src/Daemon/Makefile.am |
2 |
|
|
index ef67726..9316aeb 100644 |
3 |
|
|
--- a/src/Daemon/Makefile.am |
4 |
|
|
+++ b/src/Daemon/Makefile.am |
5 |
|
|
@@ -24,6 +24,7 @@ abrtd_CPPFLAGS = \ |
6 |
|
|
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ |
7 |
|
|
$(GLIB_CFLAGS) \ |
8 |
|
|
$(DBUS_CFLAGS) \ |
9 |
|
|
+ $(RPM_CFLAGS) \ |
10 |
|
|
$(XMLRPC_CFLAGS) $(XMLRPC_CLIENT_CFLAGS) \ |
11 |
|
|
$(ENABLE_SOCKET_OR_DBUS) \ |
12 |
|
|
-D_GNU_SOURCE \ |
13 |
|
|
diff --git a/src/Daemon/RPM.cpp b/src/Daemon/RPM.cpp |
14 |
|
|
index e4208a2..0b45877 100644 |
15 |
|
|
--- a/src/Daemon/RPM.cpp |
16 |
|
|
+++ b/src/Daemon/RPM.cpp |
17 |
|
|
@@ -28,7 +28,6 @@ CRPM::CRPM() |
18 |
|
|
|
19 |
|
|
CRPM::~CRPM() |
20 |
|
|
{ |
21 |
|
|
- rpmFreeCrypto(); |
22 |
|
|
rpmFreeRpmrc(); |
23 |
|
|
rpmcliFini(m_poptContext); |
24 |
|
|
} |
25 |
|
|
@@ -50,7 +49,6 @@ void CRPM::LoadOpenGPGPublicKey(const char* pFileName) |
26 |
|
|
if (fedoraFingerprint != NULL) |
27 |
|
|
{ |
28 |
|
|
m_setFingerprints.insert(fedoraFingerprint); |
29 |
|
|
- free(fedoraFingerprint); |
30 |
|
|
} |
31 |
|
|
} |
32 |
|
|
free(pkt); |
33 |
|
|
@@ -60,45 +58,38 @@ bool CRPM::CheckFingerprint(const char* pPackage) |
34 |
|
|
{ |
35 |
|
|
bool ret = false; |
36 |
|
|
rpmts ts = rpmtsCreate(); |
37 |
|
|
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); |
38 |
|
|
- Header header = rpmdbNextIterator(iter); |
39 |
|
|
+ rpmmi iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); |
40 |
|
|
+ Header header = rpmmiNext(iter); |
41 |
|
|
|
42 |
|
|
if (header != NULL) |
43 |
|
|
{ |
44 |
|
|
- rpmTag rpmTags[] = { RPMTAG_DSAHEADER, RPMTAG_RSAHEADER, RPMTAG_SHA1HEADER }; |
45 |
|
|
- int ii; |
46 |
|
|
- for (ii = 0; ii < 3; ii++) |
47 |
|
|
- { |
48 |
|
|
- if (headerIsEntry(header, rpmTags[ii])) |
49 |
|
|
- { |
50 |
|
|
- rpmtd td = rpmtdNew(); |
51 |
|
|
- headerGet(header, rpmTags[ii] , td, HEADERGET_DEFAULT); |
52 |
|
|
- char* pgpsig = rpmtdFormat(td, RPMTD_FORMAT_PGPSIG , NULL); |
53 |
|
|
- rpmtdFree(td); |
54 |
|
|
- if (pgpsig) |
55 |
|
|
- { |
56 |
|
|
- std::string PGPSignatureText = pgpsig; |
57 |
|
|
- free(pgpsig); |
58 |
|
|
- |
59 |
|
|
- size_t Key_ID_pos = PGPSignatureText.find(" Key ID "); |
60 |
|
|
- if (Key_ID_pos != std::string::npos) |
61 |
|
|
- { |
62 |
|
|
- std::string headerFingerprint = PGPSignatureText.substr(Key_ID_pos + sizeof (" Key ID ") - 1); |
63 |
|
|
- |
64 |
|
|
- if (headerFingerprint != "") |
65 |
|
|
- { |
66 |
|
|
- if (m_setFingerprints.find(headerFingerprint) != m_setFingerprints.end()) |
67 |
|
|
- { |
68 |
|
|
- ret = true; |
69 |
|
|
- break; |
70 |
|
|
- } |
71 |
|
|
- } |
72 |
|
|
- } |
73 |
|
|
- } |
74 |
|
|
- } |
75 |
|
|
- } |
76 |
|
|
+ char *pgpsig = headerSprintf( |
77 |
|
|
+ header, |
78 |
|
|
+ "%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:" |
79 |
|
|
+ "{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|", |
80 |
|
|
+ NULL, |
81 |
|
|
+ NULL, |
82 |
|
|
+ NULL); |
83 |
|
|
+ if(pgpsig) { |
84 |
|
|
+ std::string PGPSignatureText = pgpsig; |
85 |
|
|
+ free(pgpsig); |
86 |
|
|
+ |
87 |
|
|
+ size_t Key_ID_pos = PGPSignatureText.find(" Key ID "); |
88 |
|
|
+ if (Key_ID_pos != std::string::npos) |
89 |
|
|
+ { |
90 |
|
|
+ std::string headerFingerprint = PGPSignatureText.substr(Key_ID_pos + sizeof (" Key ID ") - 1); |
91 |
|
|
+ |
92 |
|
|
+ if (headerFingerprint != "") |
93 |
|
|
+ { |
94 |
|
|
+ if (m_setFingerprints.find(headerFingerprint) != m_setFingerprints.end()) |
95 |
|
|
+ { |
96 |
|
|
+ ret = true; |
97 |
|
|
+ } |
98 |
|
|
+ } |
99 |
|
|
+ } |
100 |
|
|
+ } |
101 |
|
|
} |
102 |
|
|
- rpmdbFreeIterator(iter); |
103 |
|
|
+ rpmmiFree(iter); |
104 |
|
|
rpmtsFree(ts); |
105 |
|
|
return ret; |
106 |
|
|
} |
107 |
|
|
@@ -107,28 +98,49 @@ bool CheckHash(const char* pPackage, const char* pPath) |
108 |
|
|
{ |
109 |
|
|
bool ret = false; |
110 |
|
|
rpmts ts = rpmtsCreate(); |
111 |
|
|
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); |
112 |
|
|
- Header header = rpmdbNextIterator(iter); |
113 |
|
|
+ rpmmi iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); |
114 |
|
|
+ Header header = rpmmiNext(iter); |
115 |
|
|
if (header != NULL) |
116 |
|
|
{ |
117 |
|
|
rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, 0); |
118 |
|
|
pgpHashAlgo hashAlgo; |
119 |
|
|
std::string headerHash; |
120 |
|
|
char computedHash[1024] = ""; |
121 |
|
|
+ const unsigned char *digest = NULL; |
122 |
|
|
+ char * pgpHex = NULL; |
123 |
|
|
+ size_t lenp; |
124 |
|
|
+ struct stat sb; |
125 |
|
|
+ size_t digestlen = 0; |
126 |
|
|
+ char buf[8*BUFSIZ]; |
127 |
|
|
+ size_t nb; |
128 |
|
|
+ int xx; |
129 |
|
|
|
130 |
|
|
while (rpmfiNext(fi) != -1) |
131 |
|
|
{ |
132 |
|
|
if (strcmp(pPath, rpmfiFN(fi)) == 0) |
133 |
|
|
{ |
134 |
|
|
- headerHash = rpmfiFDigestHex(fi, &hashAlgo); |
135 |
|
|
- rpmDoDigest(hashAlgo, pPath, 1, (unsigned char*) computedHash, NULL); |
136 |
|
|
+ digest = rpmfiDigest(fi, reinterpret_cast<int*>(&hashAlgo), &lenp); |
137 |
|
|
+ pgpHex = pgpHexStr(digest, lenp); |
138 |
|
|
+ headerHash = std::string((const char*)digest, lenp*2); |
139 |
|
|
+ |
140 |
|
|
+ if(Stat(pPath, &sb) >= 0) { |
141 |
|
|
+ DIGEST_CTX ctx = rpmDigestInit(hashAlgo, RPMDIGEST_NONE); |
142 |
|
|
+ FD_t fd = Fopen(pPath, "r"); |
143 |
|
|
+ |
144 |
|
|
+ while ((nb = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0) |
145 |
|
|
+ xx = rpmDigestUpdate(ctx, buf, nb); |
146 |
|
|
+ xx = Fclose(fd); fd = NULL; |
147 |
|
|
+ xx = rpmDigestFinal(ctx, &digest, &digestlen, 0); |
148 |
|
|
+ pgpHex = pgpHexStr(digest, digestlen); |
149 |
|
|
+ snprintf(computedHash, digestlen*2, "%s", pgpHex); |
150 |
|
|
+ } |
151 |
|
|
ret = (headerHash != "" && headerHash == computedHash); |
152 |
|
|
break; |
153 |
|
|
} |
154 |
|
|
} |
155 |
|
|
rpmfiFree(fi); |
156 |
|
|
} |
157 |
|
|
- rpmdbFreeIterator(iter); |
158 |
|
|
+ rpmmiFree(iter); |
159 |
|
|
rpmtsFree(ts); |
160 |
|
|
return ret; |
161 |
|
|
} |
162 |
|
|
@@ -137,20 +149,26 @@ std::string GetDescription(const char* pPackage) |
163 |
|
|
{ |
164 |
|
|
std::string pDescription; |
165 |
|
|
rpmts ts = rpmtsCreate(); |
166 |
|
|
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); |
167 |
|
|
- Header header = rpmdbNextIterator(iter); |
168 |
|
|
+ rpmmi iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); |
169 |
|
|
+ Header header = rpmmiNext(iter); |
170 |
|
|
if (header != NULL) |
171 |
|
|
{ |
172 |
|
|
- rpmtd td = rpmtdNew(); |
173 |
|
|
- headerGet(header, RPMTAG_SUMMARY, td, HEADERGET_DEFAULT); |
174 |
|
|
- const char* summary = rpmtdGetString(td); |
175 |
|
|
- headerGet(header, RPMTAG_DESCRIPTION, td, HEADERGET_DEFAULT); |
176 |
|
|
- const char* description = rpmtdGetString(td); |
177 |
|
|
- pDescription = summary + std::string("\n\n") + description; |
178 |
|
|
- rpmtdFree(td); |
179 |
|
|
+ HE_t he = (HE_t)memset(alloca(sizeof(*he)), 0, sizeof(*he)); |
180 |
|
|
+ he->tag = RPMTAG_SUMMARY; |
181 |
|
|
+ if(headerGet(header, he, 0)) |
182 |
|
|
+ { |
183 |
|
|
+ pDescription += he->p.str; |
184 |
|
|
+ _free(he->p.ptr); |
185 |
|
|
+ } |
186 |
|
|
+ pDescription += "\n\n"; |
187 |
|
|
+ he->tag = RPMTAG_DESCRIPTION; |
188 |
|
|
+ if(headerGet(header, he, 0)) |
189 |
|
|
+ { |
190 |
|
|
+ pDescription += he->p.str; |
191 |
|
|
+ _free(he->p.ptr); |
192 |
|
|
+ } |
193 |
|
|
} |
194 |
|
|
- rpmdbFreeIterator(iter); |
195 |
|
|
- rpmtsFree(ts); |
196 |
|
|
+ rpmmiFree(iter); |
197 |
|
|
return pDescription; |
198 |
|
|
} |
199 |
|
|
|
200 |
|
|
@@ -159,23 +177,21 @@ std::string GetComponent(const char* pFileName) |
201 |
|
|
std::string ret; |
202 |
|
|
char *package_name; |
203 |
|
|
rpmts ts = rpmtsCreate(); |
204 |
|
|
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); |
205 |
|
|
- Header header = rpmdbNextIterator(iter); |
206 |
|
|
+ rpmmi iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); |
207 |
|
|
+ Header header = rpmmiNext(iter); |
208 |
|
|
if (header != NULL) |
209 |
|
|
{ |
210 |
|
|
- rpmtd td = rpmtdNew(); |
211 |
|
|
- headerGet(header, RPMTAG_SOURCERPM, td, HEADERGET_DEFAULT); |
212 |
|
|
- const char * srpm = rpmtdGetString(td); |
213 |
|
|
- if (srpm != NULL) |
214 |
|
|
+ HE_t he = (HE_t)memset(alloca(sizeof(*he)), 0, sizeof(*he)); |
215 |
|
|
+ he->tag = RPMTAG_SOURCERPM; |
216 |
|
|
+ if(headerGet(header, he, 0)) |
217 |
|
|
{ |
218 |
|
|
- package_name = get_package_name_from_NVR_or_NULL(srpm); |
219 |
|
|
+ package_name = get_package_name_from_NVR_or_NULL(he->p.str); |
220 |
|
|
ret = std::string(package_name); |
221 |
|
|
- free(package_name); |
222 |
|
|
+ _free(he->p.ptr); |
223 |
|
|
} |
224 |
|
|
- rpmtdFree(td); |
225 |
|
|
} |
226 |
|
|
|
227 |
|
|
- rpmdbFreeIterator(iter); |
228 |
|
|
+ rpmmiFree(iter); |
229 |
|
|
rpmtsFree(ts); |
230 |
|
|
return ret; |
231 |
|
|
} |
232 |
|
|
@@ -184,14 +200,14 @@ char* GetPackage(const char* pFileName) |
233 |
|
|
{ |
234 |
|
|
char* ret = NULL; |
235 |
|
|
rpmts ts = rpmtsCreate(); |
236 |
|
|
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); |
237 |
|
|
- Header header = rpmdbNextIterator(iter); |
238 |
|
|
+ rpmmi iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); |
239 |
|
|
+ Header header = rpmmiNext(iter); |
240 |
|
|
if (header != NULL) |
241 |
|
|
{ |
242 |
|
|
- ret = headerGetNEVR(header, NULL); |
243 |
|
|
+ ret = headerSprintf(header, "%{name}-%{version}-%{release}", NULL, NULL, NULL); |
244 |
|
|
} |
245 |
|
|
|
246 |
|
|
- rpmdbFreeIterator(iter); |
247 |
|
|
+ rpmmiFree(iter); |
248 |
|
|
rpmtsFree(ts); |
249 |
|
|
return ret; |
250 |
|
|
} |
251 |
|
|
diff --git a/src/Daemon/RPM.h b/src/Daemon/RPM.h |
252 |
|
|
index 4df868d..db77137 100644 |
253 |
|
|
--- a/src/Daemon/RPM.h |
254 |
|
|
+++ b/src/Daemon/RPM.h |
255 |
|
|
@@ -22,9 +22,10 @@ |
256 |
|
|
#ifndef RPM_H_ |
257 |
|
|
#define RPM_H_ |
258 |
|
|
|
259 |
|
|
-#include <rpm/rpmcli.h> |
260 |
|
|
-#include <rpm/rpmts.h> |
261 |
|
|
-#include <rpm/rpmdb.h> |
262 |
|
|
+#include <rpmcli.h> |
263 |
|
|
+#include <rpmts.h> |
264 |
|
|
+#include <rpmdb.h> |
265 |
|
|
+#include <rpmio.h> |
266 |
|
|
#include "abrt_types.h" |
267 |
|
|
|
268 |
|
|
/** |