📄 pssecret.cxx
字号:
/* ==================================================================== * The Vovida Software License, Version 1.0 * * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The names "VOCAL", "Vovida Open Communication Application Library", * and "Vovida Open Communication Application Library (VOCAL)" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor * may "VOCAL" appear in their name, without prior written * permission of Vovida Networks, Inc. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * ==================================================================== * * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc. For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */static const char* const PSSecret_cxx_Version = "$Id: PSSecret.cxx,v 1.2.2.1 2003/03/13 17:46:12 bko Exp $";#include "PSSecret.hxx"#include <fstream>#include "cpLog.h"#include "vocalconfig.h"#include "Lock.hxx"#include "VIoException.hxx"#include "FileStat.hxx"using Vocal::IO::FileStat;PSSecret* PSSecret::instance_ = 0;PSSecret::PSSecret() :myReadLastModified(0), myWriteLastModified(0){}void PSSecret::create(const char* readFile, const char* writeFile){ if(!instance_) { instance_ = new PSSecret; } instance_->myReadFile = readFile; instance_->myWriteFile = writeFile; instance_->update(true); assert(instance_);}Data PSSecret::readEntry(const char* filename, const char* user) throw (VException& ){ Data tmp; // need to read the data std::ifstream openFile(filename); if(!openFile) { // do something throw VIoException("failed to read file", __FILE__, __LINE__, 0); } char buf[256]; while(openFile && !openFile.eof()) { openFile.getline(buf, 256); buf[255] = '\0'; if(strncmp(buf, user, 6) == 0) { tmp = buf; } } openFile.close(); if(tmp == "") { cpLog(LOG_ERR, "could not find an entry for %s in %s", user, filename); } else { cpLog(LOG_DEBUG, "found user %s in file %s", user, filename); } return tmp;}void PSSecret::update(bool force){ Vocal::Threads::Lock x(myMutex); FileStat readStat(myReadFile); if(force || (readStat.lastModified() > myReadLastModified)) { cpLog(LOG_DEBUG_STACK, "trying to read file: %s", myReadFile.c_str()); // do this if the file has changed try { myReadSecret = readEntry(myReadFile.c_str(), "reader:"); myReadLastModified = readStat.lastModified(); } catch (VException& e) { cpLog(LOG_ERR, "failed to read reader password from %s (cannot get data from pserver)", myReadFile.c_str()); myReadSecret = ""; } } else { cpLog(LOG_DEBUG_STACK, "skipping rereading %s because up to date", myReadFile.c_str()); } FileStat writeStat(myWriteFile); if(force || (writeStat.lastModified() > myWriteLastModified)) { cpLog(LOG_DEBUG_STACK, "trying to read file: %s", myWriteFile.c_str()); try { myWriteSecret = readEntry(myWriteFile.c_str(), "vocal:"); myWriteLastModified = writeStat.lastModified(); } catch (VException& e) { cpLog(LOG_DEBUG, "failed to read writer password from %s (cannot synchronize redundant pservers)", myReadFile.c_str()); myWriteSecret = ""; } } else { cpLog(LOG_DEBUG_STACK, "skipping rereading %s because up to date", myWriteFile.c_str()); }}Data PSSecret::readSecret(){ if(!instance_) { cpLog(LOG_ALERT, "you should not create PSSecret from scratch! -- you must instantiate first"); assert(0);// exit(-1); PSSecret::create(VOCAL_INSTALL_PATH "/etc/vocal.secret", VOCAL_INSTALL_PATH "/etc/vocal.secret"); // xxx we should read from the vocal.conf file } instance_->update(false); LocalScopeAllocator lo; cpLog(LOG_DEBUG_STACK, "read secret: %s", instance_->myReadSecret.getData(lo)); if(instance_->myReadSecret == "") { cpLog(LOG_ERR, "read secret is empty!"); } return instance_->myReadSecret;}Data PSSecret::writeSecret(){ if(!instance_) { cpLog(LOG_ALERT, "you should not create PSSecret from scratch! -- you must instantiate first"); assert(0);// exit(-1); PSSecret::create(VOCAL_INSTALL_PATH "/etc/vocal.secret", VOCAL_INSTALL_PATH "/etc/vocal.secret"); // xxx we should read from the vocal.conf file } instance_->update(false); LocalScopeAllocator lo; cpLog(LOG_DEBUG_STACK, "write secret: %s", instance_->myWriteSecret.getData(lo)); if(instance_->myWriteSecret == "") { cpLog(LOG_DEBUG, "write secret is empty!"); } return instance_->myWriteSecret;}/* Local Variables: *//* c-file-style: "stroustrup" *//* indent-tabs-mode: nil *//* c-file-offsets: ((access-label . -) (inclass . ++)) *//* c-basic-offset: 4 *//* End: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -