summaryrefslogtreecommitdiff
path: root/indra/newview/llurlwhitelist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llurlwhitelist.cpp')
-rw-r--r--indra/newview/llurlwhitelist.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/indra/newview/llurlwhitelist.cpp b/indra/newview/llurlwhitelist.cpp
new file mode 100644
index 0000000000..d582d2d19f
--- /dev/null
+++ b/indra/newview/llurlwhitelist.cpp
@@ -0,0 +1,221 @@
+/**
+ * @file llurlwhitelist.cpp
+ * @author Callum Prentice
+ * @brief maintains a "white list" of acceptable URLS that are stored on disk
+ *
+ * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llurlwhitelist.h"
+
+#include <iostream>
+#include <fstream>
+
+LLUrlWhiteList* LLUrlWhiteList::sInstance = 0;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+LLUrlWhiteList::LLUrlWhiteList () :
+ mLoaded ( false ),
+ mFilename ( "url_whitelist.ini" ),
+ mUrlList ( 0 ),
+ mUrlListIter ( 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
+ LLString resolvedFilename = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, mFilename.c_str () );
+
+ // open a file for reading
+ llifstream file ( resolvedFilename.c_str () );
+ 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
+ LLString resolvedFilename = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, mFilename.c_str () );
+
+ // open a file for writing
+ llofstream file ( resolvedFilename.c_str () );
+ if ( file.is_open () )
+ {
+ // for each entry we have
+ for ( LLStringListIter iter = mUrlList.begin (); iter != mUrlList.end (); ++iter )
+ {
+ file << ( *iter ) << std::endl;
+ };
+
+ file.close ();
+
+ return true;
+ };
+
+ return false;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+bool LLUrlWhiteList::clear ()
+{
+ mUrlList.clear ();
+
+ // invalidate iterator since we changed the contents
+ mUrlListIter = mUrlList.end ();
+
+ return true;
+}
+
+LLString url_cleanup(LLString pattern)
+{
+ LLString::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;
+ LLString::truncate(pattern, desired_length);
+ break;
+ }
+ ++position;
+ }
+ return pattern;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+bool LLUrlWhiteList::addItem ( const LLString& itemIn, bool saveAfterAdd )
+{
+ LLString item = url_cleanup(itemIn);
+
+ mUrlList.insert ( mUrlList.end (), item );
+
+ // use this when all you want to do is call addItem ( ... ) where necessary
+ if ( saveAfterAdd )
+ save ();
+
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+bool LLUrlWhiteList::getFirst ( LLString& valueOut )
+{
+ if ( mUrlList.size () == 0 )
+ return false;
+
+ mUrlListIter = mUrlList.begin ();
+
+ valueOut = * ( mUrlListIter );
+
+ ++mUrlListIter;
+
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+bool LLUrlWhiteList::getNext ( LLString& valueOut )
+{
+ if ( mUrlListIter == mUrlList.end () )
+ return false;
+
+ valueOut = * ( mUrlListIter );
+
+ ++mUrlListIter;
+
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+bool LLUrlWhiteList::containsMatch ( const LLString& patternIn )
+{
+ return false;
+
+ // CP: removed since they're not useful without Mozilla enabled
+ #if LL_MOZILLA_ENABLED
+ LLString pattern = url_cleanup(patternIn);
+
+ if (pattern.empty()) return false;
+
+ LLStringListIter iter = std::find ( mUrlList.begin (), mUrlList.end (), pattern );
+
+ if ( iter != mUrlList.end () )
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ };
+ #endif
+}