/*! \internal */ QFileSystemIteratorPrivate::QFileSystemIteratorPrivate(const QString &path, const QStringList &nameFilters, QDir::Filters filters, QFileSystemIterator::IteratorFlags flags) : iteratorFlags(flags) { if (filters == QDir::NoFilter) filters = QDir::AllEntries; this->filters = filters; this->nameFilters = nameFilters; fileInfo.setFile(path); QString dir = fileInfo.isSymLink() ? fileInfo.canonicalFilePath() : path; pushSubDirectory(dir.toLocal8Bit()); // skip to acceptable entry while (true) { if (atEnd()) return; if (isAcceptable()) return; if (advanceHelper()) return; } }
static UDataMemory * checkDataItem ( const DataHeader *pHeader, /* The data item to be checked. */ UDataMemoryIsAcceptable *isAcceptable, /* App's call-back function */ void *context, /* pass-thru param for above. */ const char *type, /* pass-thru param for above. */ const char *name, /* pass-thru param for above. */ UErrorCode *nonFatalErr, /* Error code if this data was not acceptable */ /* but openChoice should continue with */ /* trying to get data from fallback path. */ UErrorCode *fatalErr /* Bad error, caller should return immediately */ ) { UDataMemory *rDataMem = NULL; /* the new UDataMemory, to be returned. */ if (U_FAILURE(*fatalErr)) { return NULL; } if(pHeader->dataHeader.magic1==0xda && pHeader->dataHeader.magic2==0x27 && (isAcceptable==NULL || isAcceptable(context, type, name, &pHeader->info)) ) { rDataMem=UDataMemory_createNewInstance(fatalErr); if (U_FAILURE(*fatalErr)) { return NULL; } rDataMem->pHeader = pHeader; } else { /* the data is not acceptable, look further */ /* If we eventually find something good, this errorcode will be */ /* cleared out. */ *nonFatalErr=U_INVALID_FORMAT_ERROR; } return rDataMem; }
void Config::request(ServerRequest::ptr request, Access access) { const std::string &method = request->request().requestLine.method; if (method == POST) { if (access != READWRITE) { respondError(request, FORBIDDEN); return; } if (request->request().entity.contentType.type != "application" || request->request().entity.contentType.subtype != "x-www-form-urlencoded") { respondError(request, UNSUPPORTED_MEDIA_TYPE); return; } Stream::ptr requestStream = request->requestStream(); requestStream.reset(new LimitedStream(requestStream, 65536)); MemoryStream requestBody; transferStream(requestStream, requestBody); std::string queryString; queryString.resize(requestBody.buffer().readAvailable()); requestBody.buffer().copyOut(&queryString[0], requestBody.buffer().readAvailable()); bool failed = false; URI::QueryString qs(queryString); for (URI::QueryString::const_iterator it = qs.begin(); it != qs.end(); ++it) { ConfigVarBase::ptr var = Mordor::Config::lookup(it->first); if (var && !var->fromString(it->second)) failed = true; } if (failed) { respondError(request, HTTP::FORBIDDEN, "One or more new values were not accepted"); return; } // Fall through } if (method == GET || method == HEAD || method == POST) { Format format = HTML; URI::QueryString qs; if (request->request().requestLine.uri.queryDefined()) qs = request->request().requestLine.uri.queryString(); URI::QueryString::const_iterator it = qs.find("alt"); if (it != qs.end() && it->second == "json") format = JSON; // TODO: use Accept to indicate JSON switch (format) { case HTML: { request->response().status.status = OK; request->response().entity.contentType = MediaType("text", "html"); if (method == HEAD) { if (request->request().requestLine.ver == Version(1, 1) && isAcceptable(request->request().request.te, "chunked", true)) { request->response().general.transferEncoding.push_back("chunked"); } return; } Stream::ptr response = request->responseStream(); response.reset(new BufferedStream(response)); response->write("<html><body><table>\n", 20); Mordor::Config::visit(boost::bind(access == READWRITE ? &eachConfigVarHTMLWrite : &eachConfigVarHTML, _1, response)); response->write("</table></body></html>", 22); response->close(); break; } case JSON: { JSON::Object root; Mordor::Config::visit(boost::bind(&eachConfigVarJSON, _1, boost::ref(root))); std::ostringstream os; os << root; std::string str = os.str(); request->response().status.status = OK; request->response().entity.contentType = MediaType("application", "json"); request->response().entity.contentLength = str.size(); if (method != HEAD) { request->responseStream()->write(str.c_str(), str.size()); request->responseStream()->close(); } break; } default: MORDOR_NOTREACHED(); } } else { respondError(request, METHOD_NOT_ALLOWED); } }
void SCgBus::changeIncidentObject(SCgObject* obj, const QPointF& point, SCgPointObject::IncidentRole role) { if (isAcceptable(obj, role)) setOwner(static_cast<SCgNode*>(obj)); }
ClientRequest::ptr AuthRequestBroker::request(Request &requestHeaders, bool forceNewConnection, boost::function<void (ClientRequest::ptr)> bodyDg) { ClientRequest::ptr priorRequest; std::string scheme, realm, username, password; size_t attempts = 0, proxyAttempts = 0; #ifdef WINDOWS boost::scoped_ptr<NegotiateAuth> negotiateAuth, negotiateProxyAuth; #endif while (true) { #ifdef WINDOWS // Reset Negotiate auth sequence if the server didn't continue the // handshake if (negotiateProxyAuth) { const ChallengeList &challenge = priorRequest->response().response.proxyAuthenticate; if (!isAcceptable(challenge, scheme) || !negotiateProxyAuth->authorize( challengeForSchemeAndRealm(challenge, scheme), requestHeaders.request.proxyAuthorization, requestHeaders.requestLine.uri)) negotiateProxyAuth.reset(); } if (negotiateAuth) { const ChallengeList &challenge = priorRequest->response().response.wwwAuthenticate; if (!isAcceptable(challenge, scheme) || !negotiateAuth->authorize( challengeForSchemeAndRealm(challenge, scheme), requestHeaders.request.authorization, requestHeaders.requestLine.uri)) negotiateAuth.reset(); } // Negotiate auth is a multi-request transaction; if we're in the // middle of one, just do the next step, and skip asking for // credentials again if (!negotiateAuth && !negotiateProxyAuth) { #endif // If this is the first try, or the last one failed UNAUTHORIZED, // ask for credentials, and use them if we got them if ((!priorRequest || priorRequest->response().status.status == UNAUTHORIZED) && m_getCredentialsDg && m_getCredentialsDg(requestHeaders.requestLine.uri, priorRequest, scheme, realm, username, password, attempts++)) { #ifdef WINDOWS MORDOR_ASSERT( stricmp(scheme.c_str(), "Negotiate") == 0 || stricmp(scheme.c_str(), "NTLM") == 0 || stricmp(scheme.c_str(), "Digest") == 0 || stricmp(scheme.c_str(), "Basic") == 0); #else MORDOR_ASSERT( stricmp(scheme.c_str(), "Digest") == 0 || stricmp(scheme.c_str(), "Basic") == 0); #endif #ifdef WINDOWS if (scheme == "Negotiate" || scheme == "NTLM") { negotiateAuth.reset(new NegotiateAuth(username, password)); negotiateAuth->authorize( challengeForSchemeAndRealm(priorRequest->response().response.wwwAuthenticate, scheme), requestHeaders.request.authorization, requestHeaders.requestLine.uri); } else #endif authorize(priorRequest ? &priorRequest->response().response.wwwAuthenticate : NULL, requestHeaders.request.authorization, requestHeaders.requestLine.uri, requestHeaders.requestLine.method, scheme, realm, username, password); } else if (priorRequest && priorRequest->response().status.status == UNAUTHORIZED) { // caller didn't want to retry return priorRequest; } // If this is the first try, or the last one failed (for a proxy) // ask for credentials, and use them if we got them if ((!priorRequest || priorRequest->response().status.status == PROXY_AUTHENTICATION_REQUIRED) && m_getProxyCredentialsDg && m_getProxyCredentialsDg(requestHeaders.requestLine.uri, priorRequest, scheme, realm, username, password, proxyAttempts++)) { #ifdef WINDOWS MORDOR_ASSERT( stricmp(scheme.c_str(), "Negotiate") == 0 || stricmp(scheme.c_str(), "NTLM") == 0 || stricmp(scheme.c_str(), "Digest") == 0 || stricmp(scheme.c_str(), "Basic") == 0); #else MORDOR_ASSERT( stricmp(scheme.c_str(), "Digest") == 0 || stricmp(scheme.c_str(), "Basic") == 0); #endif #ifdef WINDOWS if (scheme == "Negotiate" || scheme == "NTLM") { negotiateProxyAuth.reset(new NegotiateAuth(username, password)); negotiateProxyAuth->authorize( challengeForSchemeAndRealm(priorRequest->response().response.proxyAuthenticate, scheme), requestHeaders.request.proxyAuthorization, requestHeaders.requestLine.uri); } else #endif authorize(priorRequest ? &priorRequest->response().response.proxyAuthenticate : NULL, requestHeaders.request.proxyAuthorization, requestHeaders.requestLine.uri, requestHeaders.requestLine.method, scheme, realm, username, password); } else if (priorRequest && priorRequest->response().status.status == PROXY_AUTHENTICATION_REQUIRED) { // Caller didn't want to retry return priorRequest; } #ifdef WINDOWS } #endif if (priorRequest) { priorRequest->finish(); } else { // We're passed our pre-emptive authentication, regardless of what // actually happened attempts = 1; proxyAttempts = 1; } priorRequest = parent()->request(requestHeaders, forceNewConnection, bodyDg); const ChallengeList *challengeList = NULL; if (priorRequest->response().status.status == UNAUTHORIZED) challengeList = &priorRequest->response().response.wwwAuthenticate; if (priorRequest->response().status.status == PROXY_AUTHENTICATION_REQUIRED) challengeList = &priorRequest->response().response.proxyAuthenticate; if (challengeList && (isAcceptable(*challengeList, "Basic") || isAcceptable(*challengeList, "Digest") #ifdef WINDOWS || isAcceptable(*challengeList, "Negotiate") || isAcceptable(*challengeList, "NTLM") #endif )) continue; return priorRequest; } }
bool getCredentialsFromKeychain(const URI &uri, ClientRequest::ptr priorRequest, std::string &scheme, std::string &realm, std::string &username, std::string &password, size_t attempts) { if (attempts != 1) return false; bool proxy = priorRequest->response().status.status == PROXY_AUTHENTICATION_REQUIRED; const ChallengeList &challengeList = proxy ? priorRequest->response().response.proxyAuthenticate : priorRequest->response().response.wwwAuthenticate; if (isAcceptable(challengeList, "Basic")) scheme = "Basic"; else if (isAcceptable(challengeList, "Digest")) scheme = "Digest"; else return false; std::vector<SecKeychainAttribute> attrVector; std::string host = uri.authority.host(); attrVector.push_back((SecKeychainAttribute){kSecServerItemAttr, host.size(), (void *)host.c_str()}); UInt32 port = 0; if (uri.authority.portDefined()) { port = uri.authority.port(); attrVector.push_back((SecKeychainAttribute){kSecPortItemAttr, sizeof(UInt32), &port}); } SecProtocolType protocol; if (proxy && priorRequest->request().requestLine.method == CONNECT) protocol = kSecProtocolTypeHTTPSProxy; else if (proxy) protocol = kSecProtocolTypeHTTPProxy; else if (uri.scheme() == "https") protocol = kSecProtocolTypeHTTPS; else if (uri.scheme() == "http") protocol = kSecProtocolTypeHTTP; else MORDOR_NOTREACHED(); attrVector.push_back((SecKeychainAttribute){kSecProtocolItemAttr, sizeof(SecProtocolType), &protocol}); ScopedCFRef<SecKeychainSearchRef> search; SecKeychainAttributeList attrList; attrList.count = (UInt32)attrVector.size(); attrList.attr = &attrVector[0]; OSStatus status = SecKeychainSearchCreateFromAttributes(NULL, kSecInternetPasswordItemClass, &attrList, &search); if (status != 0) return false; ScopedCFRef<SecKeychainItemRef> item; status = SecKeychainSearchCopyNext(search, &item); if (status != 0) return false; SecKeychainAttributeInfo info; SecKeychainAttrType tag = kSecAccountItemAttr; CSSM_DB_ATTRIBUTE_FORMAT format = CSSM_DB_ATTRIBUTE_FORMAT_STRING; info.count = 1; info.tag = (UInt32 *)&tag; info.format = (UInt32 *)&format; SecKeychainAttributeList *attrs; UInt32 passwordLength = 0; void *passwordBytes = NULL; status = SecKeychainItemCopyAttributesAndData(item, &info, NULL, &attrs, &passwordLength, &passwordBytes); if (status != 0) return false; try { username.assign((const char *)attrs->attr[0].data, attrs->attr[0].length); password.assign((const char *)passwordBytes, passwordLength); } catch (...) { SecKeychainItemFreeContent(attrs, passwordBytes); throw; } SecKeychainItemFreeContent(attrs, passwordBytes); return true; }
void CollationDataReader::read(const CollationTailoring *base, const uint8_t *inBytes, int32_t inLength, CollationTailoring &tailoring, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return; } if(base != NULL) { if(inBytes == NULL || (0 <= inLength && inLength < 24)) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } const DataHeader *header = reinterpret_cast<const DataHeader *>(inBytes); if(!(header->dataHeader.magic1 == 0xda && header->dataHeader.magic2 == 0x27 && isAcceptable(tailoring.version, NULL, NULL, &header->info))) { errorCode = U_INVALID_FORMAT_ERROR; return; } if(base->getUCAVersion() != tailoring.getUCAVersion()) { errorCode = U_COLLATOR_VERSION_MISMATCH; return; } int32_t headerLength = header->dataHeader.headerSize; inBytes += headerLength; if(inLength >= 0) { inLength -= headerLength; } } if(inBytes == NULL || (0 <= inLength && inLength < 8)) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } const int32_t *inIndexes = reinterpret_cast<const int32_t *>(inBytes); int32_t indexesLength = inIndexes[IX_INDEXES_LENGTH]; if(indexesLength < 2 || (0 <= inLength && inLength < indexesLength * 4)) { errorCode = U_INVALID_FORMAT_ERROR; // Not enough indexes. return; } // Assume that the tailoring data is in initial state, // with NULL pointers and 0 lengths. // Set pointers to non-empty data parts. // Do this in order of their byte offsets. (Should help porting to Java.) int32_t index; // one of the indexes[] slots int32_t offset; // byte offset for the index part int32_t length; // number of bytes in the index part if(indexesLength > IX_TOTAL_SIZE) { length = inIndexes[IX_TOTAL_SIZE]; } else if(indexesLength > IX_REORDER_CODES_OFFSET) { length = inIndexes[indexesLength - 1]; } else { length = 0; // only indexes, and inLength was already checked for them } if(0 <= inLength && inLength < length) { errorCode = U_INVALID_FORMAT_ERROR; return; } const CollationData *baseData = base == NULL ? NULL : base->data; const int32_t *reorderCodes = NULL; int32_t reorderCodesLength = 0; index = IX_REORDER_CODES_OFFSET; offset = getIndex(inIndexes, indexesLength, index); length = getIndex(inIndexes, indexesLength, index + 1) - offset; if(length >= 4) { if(baseData == NULL) { // We assume for collation settings that // the base data does not have a reordering. errorCode = U_INVALID_FORMAT_ERROR; return; } reorderCodes = reinterpret_cast<const int32_t *>(inBytes + offset); reorderCodesLength = length / 4; } // There should be a reorder table only if there are reorder codes. // However, when there are reorder codes the reorder table may be omitted to reduce // the data size. const uint8_t *reorderTable = NULL; index = IX_REORDER_TABLE_OFFSET; offset = getIndex(inIndexes, indexesLength, index); length = getIndex(inIndexes, indexesLength, index + 1) - offset; if(length >= 256) { if(reorderCodesLength == 0) { errorCode = U_INVALID_FORMAT_ERROR; // Reordering table without reordering codes. return; } reorderTable = inBytes + offset; } else { // If we have reorder codes, then build the reorderTable at the end, // when the CollationData is otherwise complete. } if(baseData != NULL && baseData->numericPrimary != (inIndexes[IX_OPTIONS] & 0xff000000)) { errorCode = U_INVALID_FORMAT_ERROR; return; } CollationData *data = NULL; // Remains NULL if there are no mappings. index = IX_TRIE_OFFSET; offset = getIndex(inIndexes, indexesLength, index); length = getIndex(inIndexes, indexesLength, index + 1) - offset; if(length >= 8) { if(!tailoring.ensureOwnedData(errorCode)) { return; } data = tailoring.ownedData; data->base = baseData; data->numericPrimary = inIndexes[IX_OPTIONS] & 0xff000000; data->trie = tailoring.trie = utrie2_openFromSerialized( UTRIE2_32_VALUE_BITS, inBytes + offset, length, NULL, &errorCode); if(U_FAILURE(errorCode)) { return; } } else if(baseData != NULL) { // Use the base data. Only the settings are tailored. tailoring.data = baseData; } else { errorCode = U_INVALID_FORMAT_ERROR; // No mappings. return; } index = IX_CES_OFFSET; offset = getIndex(inIndexes, indexesLength, index); length = getIndex(inIndexes, indexesLength, index + 1) - offset; if(length >= 8) { if(data == NULL) { errorCode = U_INVALID_FORMAT_ERROR; // Tailored ces without tailored trie. return; } data->ces = reinterpret_cast<const int64_t *>(inBytes + offset); data->cesLength = length / 8; } index = IX_CE32S_OFFSET; offset = getIndex(inIndexes, indexesLength, index); length = getIndex(inIndexes, indexesLength, index + 1) - offset; if(length >= 4) { if(data == NULL) { errorCode = U_INVALID_FORMAT_ERROR; // Tailored ce32s without tailored trie. return; } data->ce32s = reinterpret_cast<const uint32_t *>(inBytes + offset); data->ce32sLength = length / 4; } int32_t jamoCE32sStart = getIndex(inIndexes, indexesLength, IX_JAMO_CE32S_START); if(jamoCE32sStart >= 0) { if(data == NULL || data->ce32s == NULL) { errorCode = U_INVALID_FORMAT_ERROR; // Index into non-existent ce32s[]. return; } data->jamoCE32s = data->ce32s + jamoCE32sStart; } else if(data == NULL) { // Nothing to do. } else if(baseData != NULL) { data->jamoCE32s = baseData->jamoCE32s; } else { errorCode = U_INVALID_FORMAT_ERROR; // No Jamo CE32s for Hangul processing. return; } index = IX_ROOT_ELEMENTS_OFFSET; offset = getIndex(inIndexes, indexesLength, index); length = getIndex(inIndexes, indexesLength, index + 1) - offset; if(length >= 4) { length /= 4; if(data == NULL || length <= CollationRootElements::IX_SEC_TER_BOUNDARIES) { errorCode = U_INVALID_FORMAT_ERROR; return; } data->rootElements = reinterpret_cast<const uint32_t *>(inBytes + offset); data->rootElementsLength = length; uint32_t commonSecTer = data->rootElements[CollationRootElements::IX_COMMON_SEC_AND_TER_CE]; if(commonSecTer != Collation::COMMON_SEC_AND_TER_CE) { errorCode = U_INVALID_FORMAT_ERROR; return; } uint32_t secTerBoundaries = data->rootElements[CollationRootElements::IX_SEC_TER_BOUNDARIES]; if((secTerBoundaries >> 24) < CollationKeys::SEC_COMMON_HIGH) { // [fixed last secondary common byte] is too low, // and secondary weights would collide with compressed common secondaries. errorCode = U_INVALID_FORMAT_ERROR; return; } }