228 lines
5.3 KiB
C++
228 lines
5.3 KiB
C++
/**
|
|
* @file llurlwhitelist.cpp
|
|
* @author Callum Prentice
|
|
* @brief maintains a "white list" of acceptable URLS that are stored on disk
|
|
*
|
|
* $LicenseInfo:firstyear=2005&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2005-2009, Linden Research, Inc.
|
|
*
|
|
* Second Life Viewer Source Code
|
|
* The source code in this file ("Source Code") is provided by Linden Lab
|
|
* to you under the terms of the GNU General Public License, version 2.0
|
|
* ("GPL"), unless you have obtained a separate licensing agreement
|
|
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
|
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
|
*
|
|
* There are special exceptions to the terms and conditions of the GPL as
|
|
* it is applied to this Source Code. View the full text of the exception
|
|
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
|
* online at
|
|
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge
|
|
* that you have read and understood your obligations described above,
|
|
* and agree to abide by those obligations.
|
|
*
|
|
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
|
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
|
* COMPLETENESS OR PERFORMANCE.
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
#include "llurlwhitelist.h"
|
|
|
|
#include <iostream>
|
|
#include <fstream>
|
|
|
|
LLUrlWhiteList* LLUrlWhiteList::sInstance = 0;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
LLUrlWhiteList::LLUrlWhiteList () :
|
|
mLoaded ( false ),
|
|
mFilename ( "url_whitelist.ini" ),
|
|
mUrlList ( 0 ),
|
|
mCurIndex ( 0 )
|
|
{
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
LLUrlWhiteList::~LLUrlWhiteList ()
|
|
{
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//static
|
|
void LLUrlWhiteList::initClass ()
|
|
{
|
|
if ( ! sInstance )
|
|
{
|
|
sInstance = new LLUrlWhiteList ();
|
|
}
|
|
}
|
|
|
|
//static
|
|
void LLUrlWhiteList::cleanupClass ()
|
|
{
|
|
delete sInstance;
|
|
sInstance = NULL;
|
|
}
|
|
|
|
LLUrlWhiteList* LLUrlWhiteList::getInstance ()
|
|
{
|
|
return sInstance;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool LLUrlWhiteList::load ()
|
|
{
|
|
// don't load if we're already loaded
|
|
if ( mLoaded )
|
|
return ( true );
|
|
|
|
// remove current entries before we load over them
|
|
clear ();
|
|
|
|
// build filename for each user
|
|
std::string resolvedFilename = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, mFilename );
|
|
|
|
// open a file for reading
|
|
llifstream file ( resolvedFilename );
|
|
if ( file.is_open () )
|
|
{
|
|
// add each line in the file to the list
|
|
std::string line;
|
|
while ( std::getline ( file, line ) )
|
|
{
|
|
addItem ( line, false );
|
|
};
|
|
|
|
file.close ();
|
|
|
|
// flag as loaded
|
|
mLoaded = true;
|
|
|
|
return true;
|
|
};
|
|
|
|
return false;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool LLUrlWhiteList::save ()
|
|
{
|
|
// build filename for each user
|
|
std::string resolvedFilename = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, mFilename );
|
|
|
|
if (resolvedFilename.empty())
|
|
{
|
|
LL_INFOS() << "No per-user dir for saving URL whitelist - presumably not logged in yet. Skipping." << LL_ENDL;
|
|
return false;
|
|
}
|
|
|
|
// open a file for writing
|
|
llofstream file ( resolvedFilename );
|
|
if ( file.is_open () )
|
|
{
|
|
// for each entry we have
|
|
for ( string_list_t::iterator iter = mUrlList.begin (); iter != mUrlList.end (); ++iter )
|
|
{
|
|
file << ( *iter ) << std::endl;
|
|
}
|
|
|
|
file.close ();
|
|
|
|
return true;
|
|
};
|
|
|
|
return false;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool LLUrlWhiteList::clear ()
|
|
{
|
|
mUrlList.clear ();
|
|
|
|
mCurIndex = 0;
|
|
|
|
return true;
|
|
}
|
|
|
|
std::string url_cleanup(std::string pattern)
|
|
{
|
|
LLStringUtil::trim(pattern);
|
|
S32 length = pattern.length();
|
|
S32 position = 0;
|
|
std::string::reverse_iterator it = pattern.rbegin();
|
|
++it; // skip last char, might be '/'
|
|
++position;
|
|
for (; it < pattern.rend(); ++it)
|
|
{
|
|
char c = *it;
|
|
if (c == '/')
|
|
{
|
|
// found second to last '/'
|
|
S32 desired_length = length - position;
|
|
LLStringUtil::truncate(pattern, desired_length);
|
|
break;
|
|
}
|
|
++position;
|
|
}
|
|
return pattern;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool LLUrlWhiteList::addItem ( const std::string& itemIn, bool saveAfterAdd )
|
|
{
|
|
std::string item = url_cleanup(itemIn);
|
|
|
|
mUrlList.push_back ( item );
|
|
|
|
// use this when all you want to do is call addItem ( ... ) where necessary
|
|
if ( saveAfterAdd )
|
|
save ();
|
|
|
|
return true;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool LLUrlWhiteList::getFirst ( std::string& valueOut )
|
|
{
|
|
if ( mUrlList.size () == 0 )
|
|
return false;
|
|
|
|
mCurIndex = 0;
|
|
valueOut = mUrlList[mCurIndex++];
|
|
|
|
return true;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool LLUrlWhiteList::getNext ( std::string& valueOut )
|
|
{
|
|
if ( mCurIndex >= mUrlList.size () )
|
|
return false;
|
|
|
|
valueOut = mUrlList[mCurIndex++];
|
|
|
|
return true;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool LLUrlWhiteList::containsMatch ( const std::string& patternIn )
|
|
{
|
|
return false;
|
|
}
|