X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Futil%2FReplayCache.cpp;h=4172cac7decda9d55e39577092886af77f01e2c7;hb=2d795c731e6729309044607154978696a87fd900;hp=a3c845411c54ef16e1a48ce2711bfdea8b96acad;hpb=5cb314df178f78c6fa7b9826c2c5a5298ec7a473;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/util/ReplayCache.cpp b/xmltooling/util/ReplayCache.cpp index a3c8454..4172cac 100644 --- a/xmltooling/util/ReplayCache.cpp +++ b/xmltooling/util/ReplayCache.cpp @@ -1,17 +1,21 @@ -/* - * Copyright 2001-2007 Internet2 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at +/** + * Licensed to the University Corporation for Advanced Internet + * Development, Inc. (UCAID) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + * + * UCAID licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the + * License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. */ /** @@ -21,15 +25,19 @@ */ #include "internal.h" +#include "logging.h" +#include "security/SecurityHelper.h" #include "util/ReplayCache.h" +using namespace xmltooling::logging; using namespace xmltooling; using namespace std; -ReplayCache::ReplayCache(StorageService* storage) : m_owned(storage==NULL), m_storage(storage) +ReplayCache::ReplayCache(StorageService* storage) + : m_owned(storage==nullptr), + m_storage(storage ? storage : XMLToolingConfig::getConfig().StorageServiceManager.newPlugin(MEMORY_STORAGE_SERVICE, nullptr)), + m_storageCaps(m_storage->getCapabilities()) { - if (!m_storage) - m_storage = XMLToolingConfig::getConfig().StorageServiceManager.newPlugin(MEMORY_STORAGE_SERVICE, NULL); } ReplayCache::~ReplayCache() @@ -40,9 +48,39 @@ ReplayCache::~ReplayCache() bool ReplayCache::check(const char* context, const char* s, time_t expires) { + if (strlen(context) > m_storageCaps.getContextSize()) { + // This is a design/coding failure. + Category::getInstance(XMLTOOLING_LOGCAT ".ReplayCache").error( + "context (%s) too long for StorageService (limit %u)", context, m_storageCaps.getContextSize() + ); + return false; + } + else if (strlen(s) > m_storageCaps.getKeySize()) { + // This is something to work around with a hash. +#ifndef XMLTOOLING_NO_XMLSEC + string h = SecurityHelper::doHash("SHA1", s, strlen(s)); + // In storage already? + if (m_storage->readString(context, h.c_str())) + return false; + m_storage->createString(context, h.c_str(), "x", expires); + return true; +#else + Category::getInstance(XMLTOOLING_LOGCAT ".ReplayCache").error( + "key (%s) too long for StorageService (limit %u)", s, m_storageCaps.getKeySize() + ); + return false; +#endif + } + // In storage already? if (m_storage->readString(context, s)) return false; - m_storage->createText(context, s, "x", expires); + m_storage->createString(context, s, "x", expires); return true; } + +bool ReplayCache::check(const char* context, const XMLCh* s, time_t expires) +{ + auto_ptr_char temp(s); + return check(context, temp.get(), expires); +}