/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// treeArrayElStr // // structure used to hold map of tree. Each thread (an organization // field from a cert) has an element in the array. The numChildren field // stores the number of certs corresponding to that thread. struct treeArrayElStr {
nsString orgName; /* heading for thread */ bool open; /* toggle open state for thread */
int32_t certIndex; /* index into cert array for 1st cert */
int32_t numChildren; /* number of chidren (certs) for thread */
};
CompareCacheHashEntryPtr::CompareCacheHashEntryPtr() {
entry = new CompareCacheHashEntry;
}
// CountOrganizations // // Count the number of different organizations encountered in the cert // list.
int32_t nsCertTree::CountOrganizations() {
uint32_t i, certCount;
certCount = mDispInfo.Length(); if (certCount == 0) return 0;
nsCOMPtr<nsIX509Cert> orgCert = mDispInfo.ElementAt(0)->mCert;
nsCOMPtr<nsIX509Cert> nextCert = nullptr;
int32_t orgCount = 1; for (i = 1; i < certCount; i++) {
nextCert = mDispInfo.SafeElementAt(i, nullptr)->mCert; // XXX we assume issuer org is always criterion 1 if (CmpBy(&mCompareCache, orgCert, nextCert, sort_IssuerOrg, sort_None,
sort_None) != 0) {
orgCert = nextCert;
orgCount++;
}
} return orgCount;
}
// GetThreadDescAtIndex // // If the row at index is an organization thread, return the collection // associated with that thread. Otherwise, return null.
treeArrayEl* nsCertTree::GetThreadDescAtIndex(int32_t index) { int i, idx = 0; if (index < 0) return nullptr; for (i = 0; i < mNumOrgs; i++) { if (index == idx) { return &mTreeArray[i];
} if (mTreeArray[i].open) {
idx += mTreeArray[i].numChildren;
}
idx++; if (idx > index) break;
} return nullptr;
}
// GetCertAtIndex // // If the row at index is a cert, return that cert. Otherwise, return null.
already_AddRefed<nsIX509Cert> nsCertTree::GetCertAtIndex(
int32_t index, int32_t* outAbsoluteCertOffset) {
RefPtr<nsCertTreeDispInfo> certdi(
GetDispInfoAtIndex(index, outAbsoluteCertOffset)); if (!certdi) return nullptr;
nsCOMPtr<nsIX509Cert> ret = certdi->mCert; return ret.forget();
}
// If the row at index is a cert, return that cert. Otherwise, return null.
already_AddRefed<nsCertTreeDispInfo> nsCertTree::GetDispInfoAtIndex(
int32_t index, int32_t* outAbsoluteCertOffset) { int i, idx = 0, cIndex = 0, nc; if (index < 0) return nullptr; // Loop over the threads for (i = 0; i < mNumOrgs; i++) { if (index == idx) return nullptr; // index is for thread
idx++; // get past the thread
nc = (mTreeArray[i].open) ? mTreeArray[i].numChildren : 0; if (index < idx + nc) { // cert is within range of this thread
int32_t certIndex = cIndex + index - idx; if (outAbsoluteCertOffset) *outAbsoluteCertOffset = certIndex;
RefPtr<nsCertTreeDispInfo> certdi(
mDispInfo.SafeElementAt(certIndex, nullptr)); if (certdi) { return certdi.forget();
} break;
} if (mTreeArray[i].open) idx += mTreeArray[i].numChildren;
cIndex += mTreeArray[i].numChildren; if (idx > index) break;
} return nullptr;
}
nsCertTree::nsCertCompareFunc nsCertTree::GetCompareFuncFromCertType(
uint32_t aType) { switch (aType) { case nsIX509Cert::ANY_CERT: case nsIX509Cert::USER_CERT: return CmpUserCert; case nsIX509Cert::EMAIL_CERT: return CmpEmailCert; case nsIX509Cert::CA_CERT: default: return CmpCACert;
}
}
if (aWantedType == nsIX509Cert::SERVER_CERT) { return NS_ERROR_INVALID_ARG;
}
int count = 0; for (constauto& cert : aCertList) { bool wantThisCert = (aWantedType == nsIX509Cert::ANY_CERT);
if (!wantThisCert) {
uint32_t thisCertType;
nsresult rv = cert->GetCertType(&thisCertType); if (NS_FAILED(rv)) { return rv;
} if (thisCertType == aWantedType) {
wantThisCert = true;
}
}
if (wantThisCert) { int InsertPosition = 0; for (; InsertPosition < count; ++InsertPosition) {
nsCOMPtr<nsIX509Cert> otherCert = nullptr;
RefPtr<nsCertTreeDispInfo> elem(
mDispInfo.SafeElementAt(InsertPosition, nullptr)); if (elem) {
otherCert = elem->mCert;
} if ((*aCertCmpFn)(aCertCmpFnArg, cert, otherCert) < 0) { break;
}
}
nsCertTreeDispInfo* certdi = new nsCertTreeDispInfo(cert);
mDispInfo.InsertElementAt(InsertPosition, certdi);
++count;
++InsertPosition;
}
}
return NS_OK;
}
// LoadCerts // // Load all of the certificates in the DB for this type. Sort them // by token, organization, then common name.
NS_IMETHODIMP
nsCertTree::LoadCertsFromCache(const nsTArray<RefPtr<nsIX509Cert>>& aCache,
uint32_t aType) { if (mTreeArray) {
FreeCertArray(); delete[] mTreeArray;
mTreeArray = nullptr;
mNumRows = 0;
}
ClearCompareHash();
if (count) {
uint32_t j = 0;
nsCOMPtr<nsIX509Cert> orgCert = mDispInfo.ElementAt(j)->mCert; for (int32_t i = 0; i < mNumOrgs; i++) {
nsString& orgNameRef = mTreeArray[i].orgName; if (!orgCert) {
GetPIPNSSBundleString("CertOrgUnknown", orgNameRef);
} else {
orgCert->GetIssuerOrganization(orgNameRef); if (orgNameRef.IsEmpty()) orgCert->GetCommonName(orgNameRef);
}
mTreeArray[i].open = true;
mTreeArray[i].certIndex = j;
mTreeArray[i].numChildren = 1; if (++j >= count) break;
nsCOMPtr<nsIX509Cert> nextCert =
mDispInfo.SafeElementAt(j, nullptr)->mCert; while (0 == CmpBy(&mCompareCache, orgCert, nextCert, sort_IssuerOrg,
sort_None, sort_None)) {
mTreeArray[i].numChildren++; if (++j >= count) break;
nextCert = mDispInfo.SafeElementAt(j, nullptr)->mCert;
}
orgCert = nextCert;
}
} if (mTree) {
mTree->BeginUpdateBatch();
mTree->RowCountChanged(0, -mNumRows);
}
mNumRows = count + mNumOrgs; if (mTree) mTree->EndUpdateBatch(); return NS_OK;
}
NS_IMETHODIMP
nsCertTree::DeleteEntryObject(uint32_t index) { if (!mTreeArray) { return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIX509CertDB> certdb =
do_GetService("@mozilla.org/security/x509certdb;1"); if (!certdb) { return NS_ERROR_FAILURE;
}
int i;
uint32_t idx = 0, cIndex = 0, nc; // Loop over the threads for (i = 0; i < mNumOrgs; i++) { if (index == idx) return NS_OK; // index is for thread
idx++; // get past the thread
nc = (mTreeArray[i].open) ? mTreeArray[i].numChildren : 0; if (index < idx + nc) { // cert is within range of this thread
int32_t certIndex = cIndex + index - idx;
treeArrayEl* el = GetThreadDescAtIndex(row); if (el) { if (u"certcol"_ns.Equals(colID))
_retval.Assign(el->orgName); else
_retval.Truncate(); return NS_OK;
}
int32_t absoluteCertOffset;
RefPtr<nsCertTreeDispInfo> certdi(
GetDispInfoAtIndex(row, &absoluteCertOffset)); if (!certdi) return NS_ERROR_FAILURE;
int32_t result; if (!str_a.IsVoid() && !str_b.IsVoid())
result = Compare(str_a, str_b, nsCaseInsensitiveStringComparator); else
result = str_a.IsVoid() ? (str_b.IsVoid() ? 0 : -1) : 1;
if (sort_IssuedDateDescending == crit) result *= -1; // reverse compare order
return result;
}
int32_t nsCertTree::CmpBy(void* cache, nsIX509Cert* a, nsIX509Cert* b,
sortCriterion c0, sortCriterion c1,
sortCriterion c2) { // This will be called when comparing items for display sorting. // Some items might have no cert associated, so either a or b is null. // We want all those orphans show at the top of the list, // so we treat a null cert as "smaller" by returning -1. // We don't try to sort within the group of no-cert entries, // so we treat them as equal wrt sort order.
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.