diff options
Diffstat (limited to 'indra/llmessage')
| -rw-r--r-- | indra/llmessage/llares.cpp | 6 | ||||
| -rw-r--r-- | indra/llmessage/llassetstorage.cpp | 133 | ||||
| -rw-r--r-- | indra/llmessage/llassetstorage.h | 9 | ||||
| -rw-r--r-- | indra/llmessage/llcachename.cpp | 4 | ||||
| -rw-r--r-- | indra/llmessage/llcurl.cpp | 36 | ||||
| -rw-r--r-- | indra/llmessage/llcurl.h | 12 | ||||
| -rw-r--r-- | indra/llmessage/llhttpassetstorage.cpp | 8 | ||||
| -rw-r--r-- | indra/llmessage/llhttpassetstorage.h | 5 | ||||
| -rw-r--r-- | indra/llmessage/llhttpclient.cpp | 21 | ||||
| -rw-r--r-- | indra/llmessage/llhttpclient.h | 11 | ||||
| -rw-r--r-- | indra/llmessage/llinstantmessage.cpp | 1 | ||||
| -rw-r--r-- | indra/llmessage/llinstantmessage.h | 1 | ||||
| -rw-r--r-- | indra/llmessage/lltemplatemessagebuilder.cpp | 2 | ||||
| -rw-r--r-- | indra/llmessage/lltemplatemessagereader.cpp | 5 | ||||
| -rw-r--r-- | indra/llmessage/lltransfersourceasset.cpp | 51 | ||||
| -rw-r--r-- | indra/llmessage/lltransfersourceasset.h | 20 | ||||
| -rw-r--r-- | indra/llmessage/llurlrequest.cpp | 51 | ||||
| -rw-r--r-- | indra/llmessage/llurlrequest.h | 68 | ||||
| -rw-r--r-- | indra/llmessage/message_prehash.cpp | 2 | ||||
| -rw-r--r-- | indra/llmessage/tests/llareslistener_test.cpp | 2 | 
20 files changed, 220 insertions, 228 deletions
diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp index 00e77d20e9..5b7e5138ef 100644 --- a/indra/llmessage/llares.cpp +++ b/indra/llmessage/llares.cpp @@ -108,7 +108,8 @@ LLAres::LLAres() :      mInitSuccess(false),      mListener(new LLAresListener(this))  { -	if (ares_init(&chan_) != ARES_SUCCESS) +	if (ares_library_init( ARES_LIB_INIT_ALL ) != ARES_SUCCESS || +		ares_init(&chan_) != ARES_SUCCESS)  	{  		llwarns << "Could not succesfully initialize ares!" << llendl;  		return; @@ -120,6 +121,7 @@ LLAres::LLAres() :  LLAres::~LLAres()  {  	ares_destroy(chan_); +	ares_library_cleanup();  }  void LLAres::cancel() @@ -473,7 +475,7 @@ bool LLAres::process(U64 timeout)  		ll_init_apr();  	} -	int socks[ARES_GETSOCK_MAXNUM]; +	ares_socket_t socks[ARES_GETSOCK_MAXNUM];  	apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM];  	apr_int32_t nsds = 0;	  	int nactive = 0; diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 0ab1081200..970b6747f7 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -283,28 +283,30 @@ LLEstateAssetRequest::~LLEstateAssetRequest()  // TODO: rework tempfile handling? -LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, const LLHost &upstream_host) +LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host)  { -	_init(msg, xfer, vfs, upstream_host); +	_init(msg, xfer, vfs, static_vfs, upstream_host);  }  LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, -							   LLVFS *vfs) +							   LLVFS *vfs, LLVFS *static_vfs)  { -	_init(msg, xfer, vfs, LLHost::invalid); +	_init(msg, xfer, vfs, static_vfs, LLHost::invalid);  }  void LLAssetStorage::_init(LLMessageSystem *msg,  						   LLXferManager *xfer,  						   LLVFS *vfs, +						   LLVFS *static_vfs,  						   const LLHost &upstream_host)  {  	mShutDown = FALSE;  	mMessageSys = msg;  	mXferManager = xfer;  	mVFS = vfs; +	mStaticVFS = static_vfs;  	setUpstream(upstream_host);  	msg->setHandlerFuncFast(_PREHASH_AssetUploadComplete, processUploadComplete, (void **)this); @@ -396,7 +398,33 @@ void LLAssetStorage::_cleanupRequests(BOOL all, S32 error)  BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType type)  { -	return mVFS->getExists(uuid, type); +	return mStaticVFS->getExists(uuid, type) || mVFS->getExists(uuid, type); +} + +bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type, +													  LLGetAssetCallback callback, void *user_data) +{ +	BOOL exists = mStaticVFS->getExists(uuid, type); +	if (exists) +	{ +		LLVFile file(mStaticVFS, uuid, type); +		U32 size = file.getSize(); +		if (size > 0) +		{ +			// we've already got the file +			if (callback) +			{ +				callback(mStaticVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); +			} +			return true; +		} +		else +		{ +			llwarns << "Asset vfile " << uuid << ":" << type +					<< " found in static cache with bad size " << file.getSize() << ", ignoring" << llendl; +		} +	} +	return false;  }  /////////////////////////////////////////////////////////////////////////// @@ -404,12 +432,15 @@ BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType  ///////////////////////////////////////////////////////////////////////////  // IW - uuid is passed by value to avoid side effects, please don't re-add &     -void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, void (*callback)(LLVFS *vfs, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat), void *user_data, BOOL is_priority) +void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LLGetAssetCallback callback, void *user_data, BOOL is_priority)  {  	lldebugs << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl; +	llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl; +  	if (mShutDown)  	{ +		llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;  		return; // don't get the asset or do any callbacks, we are shutting down  	} @@ -423,11 +454,30 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo  		return;  	} +	// Try static VFS first. +	if (findInStaticVFSAndInvokeCallback(uuid,type,callback,user_data)) +	{ +		llinfos << "ASSET_TRACE asset " << uuid << " found in static VFS" << llendl; +		return; +	} +  	BOOL exists = mVFS->getExists(uuid, type);  	LLVFile file(mVFS, uuid, type);  	U32 size = exists ? file.getSize() : 0; -	if (size < 1) +	if (size > 0) +	{ +		// we've already got the file +		// theoretically, partial files w/o a pending request shouldn't happen +		// unless there's a weird error +		if (callback) +		{ +			callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); +		} + +		llinfos << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl; +	} +	else  	{  		if (exists)  		{ @@ -466,16 +516,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo  		// This can be overridden by subclasses  		_queueDataRequest(uuid, type, callback, user_data, duplicate, is_priority);	  	} -	else -	{ -		// we've already got the file -		// theoretically, partial files w/o a pending request shouldn't happen -		// unless there's a weird error -		if (callback) -		{ -			callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); -		} -	} +  }  void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType atype, @@ -528,6 +569,8 @@ void LLAssetStorage::downloadCompleteCallback(  	LLAssetType::EType file_type,  	void* user_data, LLExtStat ext_status)  { +	llinfos << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl; +  	lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id  		 << "," << LLAssetType::lookup(file_type) << llendl;  	LLAssetRequest* req = (LLAssetRequest*)user_data; @@ -616,11 +659,27 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen  		return;  	} +	// Try static VFS first. +	if (findInStaticVFSAndInvokeCallback(asset_id,atype,callback,user_data)) +	{ +		return; +	} +	  	BOOL exists = mVFS->getExists(asset_id, atype);  	LLVFile file(mVFS, asset_id, atype);  	U32 size = exists ? file.getSize() : 0; -	if (size < 1) +	if (size > 0) +	{ +		// we've already got the file +		// theoretically, partial files w/o a pending request shouldn't happen +		// unless there's a weird error +		if (callback) +		{ +			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); +		} +	} +	else  	{  		if (exists)  		{ @@ -671,16 +730,6 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen  			}  		}  	} -	else -	{ -		// we've already got the file -		// theoretically, partial files w/o a pending request shouldn't happen -		// unless there's a weird error -		if (callback) -		{ -			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); -		} -	}  }  void LLAssetStorage::downloadEstateAssetCompleteCallback( @@ -747,6 +796,12 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age  	if(asset_id.notNull())  	{ +		// Try static VFS first. +		if (findInStaticVFSAndInvokeCallback( asset_id, atype, callback, user_data)) +		{ +			return; +		} +  		exists = mVFS->getExists(asset_id, atype);  		LLVFile file(mVFS, asset_id, atype);  		size = exists ? file.getSize() : 0; @@ -758,7 +813,17 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age  	} -	if (size < 1) +	if (size > 0) +	{ +		// we've already got the file +		// theoretically, partial files w/o a pending request shouldn't happen +		// unless there's a weird error +		if (callback) +		{ +			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); +		} +	} +	else  	{  		// See whether we should talk to the object's originating sim,  		// or the upstream provider. @@ -807,16 +872,6 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age  			}  		}  	} -	else -	{ -		// we've already got the file -		// theoretically, partial files w/o a pending request shouldn't happen -		// unless there's a weird error -		if (callback) -		{ -			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); -		} -	}  } diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h index 83cfdf6110..e97b398ca7 100644 --- a/indra/llmessage/llassetstorage.h +++ b/indra/llmessage/llassetstorage.h @@ -218,6 +218,7 @@ class LLAssetStorage : public LLTempAssetStorage  public:  	// VFS member is public because static child methods need it :(  	LLVFS *mVFS; +	LLVFS *mStaticVFS;  	typedef void (*LLStoreAssetCallback)(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status);  	enum ERequestType @@ -247,10 +248,10 @@ protected:  public:  	LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, -				   LLVFS *vfs, const LLHost &upstream_host); +				   LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host);  	LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, -				   LLVFS *vfs); +				   LLVFS *vfs, LLVFS *static_vfs);  	virtual ~LLAssetStorage();  	void setUpstream(const LLHost &upstream_host); @@ -315,6 +316,9 @@ public:  	void		markAssetToxic( const LLUUID& uuid );  protected: +	bool findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type, +										  LLGetAssetCallback callback, void *user_data); +  	virtual LLSD getPendingDetailsImpl(const request_list_t* requests,  	 				LLAssetType::EType asset_type,  	 				const std::string& detail_prefix) const; @@ -442,6 +446,7 @@ private:  	void _init(LLMessageSystem *msg,  			   LLXferManager *xfer,  			   LLVFS *vfs, +			   LLVFS *static_vfs,  			   const LLHost &upstream_host);  protected: diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index 9363b3a8d5..9871c922f1 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -486,7 +486,7 @@ BOOL LLCacheName::getName(const LLUUID& id, std::string& first, std::string& las  	{  		first = sCacheName["nobody"];  		last.clear(); -		return FALSE; +		return TRUE;  	}  	LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id ); @@ -530,7 +530,7 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)  	if(id.isNull())  	{  		group = sCacheName["none"]; -		return FALSE; +		return TRUE;  	}  	LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache,id); diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index 024e17a777..36874a5d48 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -89,10 +89,6 @@ S32 gCurlMultiCount = 0;  std::vector<LLMutex*> LLCurl::sSSLMutex;  std::string LLCurl::sCAPath;  std::string LLCurl::sCAFile; -// Verify SSL certificates by default (matches libcurl default). The ability -// to alter this flag is only to allow us to suppress verification if it's -// broken for some reason. -bool LLCurl::sSSLVerify = true;  //static  void LLCurl::setCAPath(const std::string& path) @@ -107,18 +103,6 @@ void LLCurl::setCAFile(const std::string& file)  }  //static -void LLCurl::setSSLVerify(bool verify) -{ -	sSSLVerify = verify; -} - -//static -bool LLCurl::getSSLVerify() -{ -	return sSSLVerify; -} - -//static  std::string LLCurl::getVersionString()  {  	return std::string(curl_version()); @@ -381,6 +365,13 @@ U32 LLCurl::Easy::report(CURLcode code)  		responseReason = strerror(code) + " : " + mErrorBuffer;  	} +	if(responseCode >= 300 && responseCode < 400) //redirect +	{ +		char new_url[512] ; +		curl_easy_getinfo(mCurlEasyHandle, CURLINFO_REDIRECT_URL, new_url); +		responseReason = new_url ; //get the new URL. +	} +  	if (mResponder)  	{	  		mResponder->completedRaw(responseCode, responseReason, mChannels, mOutput); @@ -481,8 +472,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,  	setErrorBuffer();  	setCA(); -	setopt(CURLOPT_SSL_VERIFYPEER, LLCurl::getSSLVerify()); -	setopt(CURLOPT_SSL_VERIFYHOST, LLCurl::getSSLVerify()? 2 : 0); +	setopt(CURLOPT_SSL_VERIFYPEER, true);  	setopt(CURLOPT_TIMEOUT, CURL_REQUEST_TIMEOUT);  	setoptString(CURLOPT_URL, url); @@ -912,6 +902,15 @@ void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userd  	}  } +void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata) +{ +	if (mEasy) +	{ +		mEasy->setopt(CURLOPT_SSL_CTX_FUNCTION, (void*)callback); +		mEasy->setopt(CURLOPT_SSL_CTX_DATA, userdata); +	} +} +  void LLCurlEasyRequest::slist_append(const char* str)  {  	if (mEasy) @@ -1061,3 +1060,4 @@ void LLCurl::cleanupClass()  #endif  	curl_global_cleanup();  } + diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index caf02cccd9..b6a637ae5b 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -158,16 +158,6 @@ public:  	static const std::string& getCAPath() { return sCAPath; }  	/** -	 * @ brief Set flag controlling whether to verify HTTPS certs. -	 */ -	static void setSSLVerify(bool verify); - -	/** -	 * @ brief Get flag controlling whether to verify HTTPS certs. -	 */ -	static bool getSSLVerify(); - -	/**  	 * @ brief Initialize LLCurl class  	 */  	static void initClass(); @@ -192,7 +182,6 @@ public:  private:  	static std::string sCAPath;  	static std::string sCAFile; -	static bool sSSLVerify;  };  namespace boost @@ -240,6 +229,7 @@ public:  	void setHeaderCallback(curl_header_callback callback, void* userdata);  	void setWriteCallback(curl_write_callback callback, void* userdata);  	void setReadCallback(curl_read_callback callback, void* userdata); +	void setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata);  	void slist_append(const char* str);  	void sendRequest(const std::string& url);  	void requestComplete(); diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp index 1980735bbb..fc326790eb 100644 --- a/indra/llmessage/llhttpassetstorage.cpp +++ b/indra/llmessage/llhttpassetstorage.cpp @@ -401,21 +401,23 @@ size_t LLHTTPAssetRequest::curlCompressedUploadCallback(  LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, -									 LLVFS *vfs, const LLHost &upstream_host, +									 LLVFS *vfs, LLVFS *static_vfs,  +									 const LLHost &upstream_host,  									 const std::string& web_host,  									 const std::string& local_web_host,  									 const std::string& host_name) -	: LLAssetStorage(msg, xfer, vfs, upstream_host) +	: LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host)  {  	_init(web_host, local_web_host, host_name);  }  LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,  									   LLVFS *vfs, +									   LLVFS *static_vfs,  									   const std::string& web_host,  									   const std::string& local_web_host,  									   const std::string& host_name) -	: LLAssetStorage(msg, xfer, vfs) +	: LLAssetStorage(msg, xfer, vfs, static_vfs)  {  	_init(web_host, local_web_host, host_name);  } diff --git a/indra/llmessage/llhttpassetstorage.h b/indra/llmessage/llhttpassetstorage.h index 231437dad4..3e85e898e2 100644 --- a/indra/llmessage/llhttpassetstorage.h +++ b/indra/llmessage/llhttpassetstorage.h @@ -48,13 +48,14 @@ class LLHTTPAssetStorage : public LLAssetStorage  {  public:  	LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, -					   LLVFS *vfs, const LLHost &upstream_host, +					   LLVFS *vfs, LLVFS *static_vfs, +					   const LLHost &upstream_host,  					   const std::string& web_host,  					   const std::string& local_web_host,  					   const std::string& host_name);  	LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, -					   LLVFS *vfs, +					   LLVFS *vfs, LLVFS *static_vfs,  					   const std::string& web_host,  					   const std::string& local_web_host,  					   const std::string& host_name); diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index dd56e18caf..e8dc207114 100644 --- a/indra/llmessage/llhttpclient.cpp +++ b/indra/llmessage/llhttpclient.cpp @@ -31,7 +31,7 @@   */  #include "linden_common.h" - +#include <openssl/x509_vfy.h>  #include "llhttpclient.h"  #include "llassetstorage.h" @@ -46,7 +46,10 @@  #include "message.h"  #include <curl/curl.h> +  const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f; +LLURLRequest::SSLCertVerifyCallback LLHTTPClient::mCertVerifyCallback = NULL; +  ////////////////////////////////////////////////////////////////////////////  // Responder class moved to LLCurl @@ -79,8 +82,10 @@ namespace  		{  			if (mResponder.get())  			{ -				mResponder->completedRaw(mStatus, mReason, channels, buffer); +				// Allow clients to parse headers before we attempt to parse +				// the body and provide completed/result/error calls.  				mResponder->completedHeader(mStatus, mReason, mHeaderOutput); +				mResponder->completedRaw(mStatus, mReason, channels, buffer);  			}  		}  		virtual void header(const std::string& header, const std::string& value) @@ -194,6 +199,7 @@ namespace  			fileBuffer = new U8 [fileSize];              vfile.read(fileBuffer, fileSize);              ostream.write((char*)fileBuffer, fileSize); +			delete [] fileBuffer;  			eos = true;  			return STATUS_DONE;  		} @@ -206,13 +212,19 @@ namespace  	LLPumpIO* theClientPump = NULL;  } +void LLHTTPClient::setCertVerifyCallback(LLURLRequest::SSLCertVerifyCallback callback) +{ +	LLHTTPClient::mCertVerifyCallback = callback; +} +  static void request(  	const std::string& url,  	LLURLRequest::ERequestAction method,  	Injector* body_injector,  	LLCurl::ResponderPtr responder,  	const F32 timeout = HTTP_REQUEST_EXPIRY_SECS, -	const LLSD& headers = LLSD()) +	const LLSD& headers = LLSD() +    )  {  	if (!LLHTTPClient::hasPump())  	{ @@ -222,7 +234,7 @@ static void request(  	LLPumpIO::chain_t chain;  	LLURLRequest* req = new LLURLRequest(method, url); -	req->checkRootCertificate(LLCurl::getSSLVerify()); +	req->setSSLVerifyCallback(LLHTTPClient::getCertVerifyCallback(), (void *)req);  	lldebugs << LLURLRequest::actionAsVerb(method) << " " << url << " " @@ -417,7 +429,6 @@ static LLSD blocking_request(  	std::string body_str;  	// other request method checks root cert first, we skip? -	//req->checkRootCertificate(true);  	// * Set curl handle options  	curl_easy_setopt(curlp, CURLOPT_NOSIGNAL, 1);	// don't use SIGALRM for timeouts diff --git a/indra/llmessage/llhttpclient.h b/indra/llmessage/llhttpclient.h index 3d0646e5fe..8afbc9e0fc 100644 --- a/indra/llmessage/llhttpclient.h +++ b/indra/llmessage/llhttpclient.h @@ -40,7 +40,8 @@  #include <string>  #include <boost/intrusive_ptr.hpp> - +#include <openssl/x509_vfy.h> +#include "llurlrequest.h"  #include "llassettype.h"  #include "llcurl.h"  #include "lliopipe.h" @@ -61,6 +62,7 @@ public:  	typedef LLCurl::Responder Responder;  	typedef LLCurl::ResponderPtr ResponderPtr; +	  	/** @name non-blocking API */  	//@{  	static void head( @@ -155,7 +157,12 @@ public:  	static void setPump(LLPumpIO& pump);  		///< must be called before any of the above calls are made  	static bool hasPump(); -		///< for testing + +	static void setCertVerifyCallback(LLURLRequest::SSLCertVerifyCallback callback); +	static  LLURLRequest::SSLCertVerifyCallback getCertVerifyCallback() { return mCertVerifyCallback; } + +protected: +	static LLURLRequest::SSLCertVerifyCallback mCertVerifyCallback;  };  #endif // LL_LLHTTPCLIENT_H diff --git a/indra/llmessage/llinstantmessage.cpp b/indra/llmessage/llinstantmessage.cpp index a9e1ee77ef..57e8a22546 100644 --- a/indra/llmessage/llinstantmessage.cpp +++ b/indra/llmessage/llinstantmessage.cpp @@ -61,6 +61,7 @@ const char EMPTY_BINARY_BUCKET[] = "";  const S32 EMPTY_BINARY_BUCKET_SIZE = 1;  const U32 NO_TIMESTAMP = 0;  const std::string SYSTEM_FROM("Second Life"); +const std::string INTERACTIVE_SYSTEM_FROM("F387446C-37C4-45f2-A438-D99CBDBB563B");  const S32 IM_TTL = 1; diff --git a/indra/llmessage/llinstantmessage.h b/indra/llmessage/llinstantmessage.h index 272e753f3c..f11b649f78 100644 --- a/indra/llmessage/llinstantmessage.h +++ b/indra/llmessage/llinstantmessage.h @@ -226,6 +226,7 @@ extern const S32 EMPTY_BINARY_BUCKET_SIZE;  extern const U32 NO_TIMESTAMP;  extern const std::string SYSTEM_FROM; +extern const std::string INTERACTIVE_SYSTEM_FROM;  // Number of retry attempts on sending the im.  extern const S32 IM_TTL; diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp index 55379fc6fd..fa02456d90 100644 --- a/indra/llmessage/lltemplatemessagebuilder.cpp +++ b/indra/llmessage/lltemplatemessagebuilder.cpp @@ -326,7 +326,7 @@ void LLTemplateMessageBuilder::addData(const char *varname, const void *data, EM  			       << "(" << size << ").  Clamping size and truncating data." << llendl;  			size = 255;  			char *truncate = (char *)data; -			truncate[255] = 0; +			truncate[254] = 0; // array size is 255 but the last element index is 254  		}  		// no correct size for MVT_VARIABLE, instead we need to tell how many bytes the size will be encoded as diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index 6682575ca5..8f56cf2521 100644 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -433,10 +433,9 @@ inline void LLTemplateMessageReader::getString(const char *block, const char *va  inline void LLTemplateMessageReader::getString(const char *block, const char *var, std::string& outstr, S32 blocknum )  { -	char s[MTUBYTES]; -	s[0] = '\0'; +	char s[MTUBYTES + 1]= {0}; // every element is initialized with 0  	getData(block, var, s, 0, blocknum, MTUBYTES); -	s[MTUBYTES - 1] = '\0'; +	s[MTUBYTES] = '\0';  	outstr = s;  } diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp index 8f36d516d7..43f7c07e94 100644 --- a/indra/llmessage/lltransfersourceasset.cpp +++ b/indra/llmessage/lltransfersourceasset.cpp @@ -60,7 +60,7 @@ void LLTransferSourceAsset::initTransfer()  		// to the simulator. This is subset of assets we allow to be  		// simply pulled straight from the asset system.  		LLUUID* tidp; -		if(is_asset_fetch_by_id_allowed(mParams.getAssetType())) +		if(LLAssetType::lookupIsAssetFetchByIDAllowed(mParams.getAssetType()))  		{  			tidp = new LLUUID(getID());  			gAssetStorage->getAssetData( @@ -131,7 +131,7 @@ LLTSCode LLTransferSourceAsset::dataCallback(const S32 packet_id,  	*data_handle = tmpp;  	if (!vf.read(tmpp, max_bytes))		/* Flawfinder: Ignore */  	{ -		// Crap, read failure, need to deal with it. +		// Read failure, need to deal with it.  		delete[] tmpp;  		*data_handle = NULL;  		returned_bytes = 0; @@ -257,50 +257,3 @@ BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)  	return TRUE;  } - -/** - * Helper functions - */ -bool is_asset_fetch_by_id_allowed(LLAssetType::EType type) -{ -	// *FIX: Make this list smaller. -	bool rv = false; -	switch(type) -	{ -		case LLAssetType::AT_SOUND: -		case LLAssetType::AT_LANDMARK: -		case LLAssetType::AT_CLOTHING: -		case LLAssetType::AT_BODYPART: -		case LLAssetType::AT_ANIMATION: -		case LLAssetType::AT_GESTURE: -			rv = true; -			break; -		default: -			break; -	} -	return rv; -} - -bool is_asset_id_knowable(LLAssetType::EType type) -{ -	// *FIX: Make this list smaller. -	bool rv = false; -	switch(type) -	{ -		case LLAssetType::AT_TEXTURE: -		case LLAssetType::AT_SOUND: -		case LLAssetType::AT_LANDMARK: -		case LLAssetType::AT_CLOTHING: -		case LLAssetType::AT_NOTECARD: -		case LLAssetType::AT_BODYPART: -		case LLAssetType::AT_ANIMATION: -		case LLAssetType::AT_GESTURE: -		case LLAssetType::AT_LINK: -		case LLAssetType::AT_LINK_FOLDER: -			rv = true; -			break; -		default: -			break; -	} -	return rv; -} diff --git a/indra/llmessage/lltransfersourceasset.h b/indra/llmessage/lltransfersourceasset.h index 70b09b6aaf..8616595654 100644 --- a/indra/llmessage/lltransfersourceasset.h +++ b/indra/llmessage/lltransfersourceasset.h @@ -84,24 +84,4 @@ protected:  	S32 mCurPos;  }; -/** - * @brief Quick check to see if the asset allows direct download. - * - * This might not be the right place for this function call, but it - * originally started life inside the LLTransferSourceAsset code. - * @param type The type of asset. - * @return Returns true if the asset can be fetched by id. - */ -bool is_asset_fetch_by_id_allowed(LLAssetType::EType type); - -/** - * @brief Quick check to see if all asset data can be known by the viewer. - * - * This might not be the right place for this function call, but it - * originally started life inside the LLTransferSourceAsset code. - * @param type The type of asset. - * @return Returns true if the asset id can be transmitted to the viewer. - */ -bool is_asset_id_knowable(LLAssetType::EType type); -  #endif // LL_LLTRANSFERSOURCEASSET_H diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index 4e7ceff984..1e76d10828 100644 --- a/indra/llmessage/llurlrequest.cpp +++ b/indra/llmessage/llurlrequest.cpp @@ -36,7 +36,8 @@  #include "llurlrequest.h"  #include <algorithm> - +#include <openssl/x509_vfy.h> +#include <openssl/ssl.h>  #include "llcurl.h"  #include "llioutil.h"  #include "llmemtype.h" @@ -56,6 +57,8 @@ const std::string CONTEXT_TRANSFERED_BYTES("transfered_bytes");  static size_t headerCallback(void* data, size_t size, size_t nmemb, void* user); + +  /**   * class LLURLRequestDetail   */ @@ -72,6 +75,7 @@ public:  	U32 mBodyLimit;  	S32 mByteAccumulator;  	bool mIsBodyLimitSet; +	LLURLRequest::SSLCertVerifyCallback mSSLVerifyCallback;  };  LLURLRequestDetail::LLURLRequestDetail() : @@ -80,7 +84,8 @@ LLURLRequestDetail::LLURLRequestDetail() :  	mLastRead(NULL),  	mBodyLimit(0),  	mByteAccumulator(0), -	mIsBodyLimitSet(false) +	mIsBodyLimitSet(false), +    mSSLVerifyCallback(NULL)  {  	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);  	mCurlRequest = new LLCurlEasyRequest(); @@ -94,6 +99,36 @@ LLURLRequestDetail::~LLURLRequestDetail()  	mLastRead = NULL;  } +void LLURLRequest::setSSLVerifyCallback(SSLCertVerifyCallback callback, void *param) +{ +	mDetail->mSSLVerifyCallback = callback; +	mDetail->mCurlRequest->setSSLCtxCallback(LLURLRequest::_sslCtxCallback, (void *)this); +	mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, true); +	mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, 2);	 +} + + +// _sslCtxFunction +// Callback function called when an SSL Context is created via CURL +// used to configure the context for custom cert validation + +CURLcode LLURLRequest::_sslCtxCallback(CURL * curl, void *sslctx, void *param) +{	 +	LLURLRequest *req = (LLURLRequest *)param; +	if(req == NULL || req->mDetail->mSSLVerifyCallback == NULL) +	{ +		SSL_CTX_set_cert_verify_callback((SSL_CTX *)sslctx, NULL, NULL); +		return CURLE_OK; +	} +	SSL_CTX * ctx = (SSL_CTX *) sslctx; +	// disable any default verification for server certs +	SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); +	// set the verification callback. +	SSL_CTX_set_cert_verify_callback(ctx, req->mDetail->mSSLVerifyCallback, (void *)req); +	// the calls are void +	return CURLE_OK; +	 +}  /**   * class LLURLRequest @@ -148,6 +183,11 @@ void LLURLRequest::setURL(const std::string& url)  	mDetail->mURL = url;  } +std::string LLURLRequest::getURL() const +{ +	return mDetail->mURL; +} +  void LLURLRequest::addHeader(const char* header)  {  	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST); @@ -160,13 +200,6 @@ void LLURLRequest::setBodyLimit(U32 size)  	mDetail->mIsBodyLimitSet = true;  } -void LLURLRequest::checkRootCertificate(bool check) -{ -	mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, (check? TRUE : FALSE)); -	mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, (check? 2 : 0)); -	mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, ""); -} -  void LLURLRequest::setCallback(LLURLRequestComplete* callback)  {  	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST); diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h index cb3c466440..69fd22e592 100644 --- a/indra/llmessage/llurlrequest.h +++ b/indra/llmessage/llurlrequest.h @@ -44,6 +44,8 @@  #include "lliopipe.h"  #include "llchainio.h"  #include "llerror.h" +#include <openssl/x509_vfy.h> +#include "llcurl.h"  extern const std::string CONTEXT_REQUEST; @@ -72,6 +74,8 @@ class LLURLRequest : public LLIOPipe  {  	LOG_CLASS(LLURLRequest);  public: + +	typedef int (* SSLCertVerifyCallback)(X509_STORE_CTX *ctx, void *param);  	/**   	 * @brief This enumeration is for specifying the type of request.  	 */ @@ -125,7 +129,7 @@ public:  	 *   	 */  	void setURL(const std::string& url); - +	std::string getURL() const;  	/**   	 * @brief Add a header to the http post.  	 * @@ -143,8 +147,9 @@ public:  	 * Set whether request will check that remote server  	 * certificates are signed by a known root CA when using HTTPS.  	 */ -	void checkRootCertificate(bool check); +	void setSSLVerifyCallback(SSLCertVerifyCallback callback, void * param); +	  	/**  	 * @brief Return at most size bytes of body.  	 * @@ -189,6 +194,7 @@ public:  	 * @brief Give this pipe a chance to handle a generated error  	 */  	virtual EStatus handleError(EStatus status, LLPumpIO* pump); +  protected:  	/**  @@ -217,6 +223,8 @@ protected:  	 S32 mRequestTransferedBytes;  	 S32 mResponseTransferedBytes; +	static CURLcode _sslCtxCallback(CURL * curl, void *sslctx, void *param); +	  private:  	/**   	 * @brief Initialize the object. Called during construction. @@ -364,62 +372,6 @@ protected:  }; -/**  - * @class LLURLRequestClientFactory - * @brief Template class to build url request based client chains  - * - * This class eases construction of a basic sd rpc client. Here is an - * example of it's use: - * <code> - *  class LLUsefulService : public LLService { ... }<br> - *  LLService::registerCreator(<br> - *    "useful",<br> - *    LLService::creator_t(new LLURLRequestClientFactory<LLUsefulService>))<br> - * </code> - * - * This class should work, but I never got around to using/testing it. - * - */ -#if 0 -template<class Client> -class LLURLRequestClientFactory : public LLChainIOFactory -{ -public: -	LLURLRequestClientFactory(LLURLRequest::ERequestAction action) {} -	LLURLRequestClientFactory( -		LLURLRequest::ERequestAction action, -		const std::string& fixed_url) : -		mAction(action), -		mURL(fixed_url) -	{ -	} -	virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const -	{ -		lldebugs << "LLURLRequestClientFactory::build" << llendl; -		LLIOPipe::ptr_t service(new Client); -		chain.push_back(service); -		LLURLRequest* http(new LLURLRequest(mAction)); -		LLIOPipe::ptr_t http_pipe(http); -		// *FIX: how do we know the content type? -		//http->addHeader("Content-Type: text/llsd"); -		if(mURL.empty()) -		{ -			chain.push_back(LLIOPipe::ptr_t(new LLContextURLExtractor(http))); -		} -		else -		{ -			http->setURL(mURL); -		} -		chain.push_back(http_pipe); -		chain.push_back(service); -		return true; -	} - -protected: -	LLURLRequest::ERequestAction mAction; -	std::string mURL; -}; -#endif  /**   * External constants diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index 9e3986f257..a118e21ffb 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -1147,7 +1147,7 @@ char* _PREHASH_ForceObjectSelect = LLMessageStringTable::getInstance()->getStrin  char* _PREHASH_Price = LLMessageStringTable::getInstance()->getString("Price");  char* _PREHASH_SunDirection = LLMessageStringTable::getInstance()->getString("SunDirection");  char* _PREHASH_FromName = LLMessageStringTable::getInstance()->getString("FromName"); -char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangeInventoryItemFlags"); +char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangLLInventoryItemFlags");  char* _PREHASH_Force = LLMessageStringTable::getInstance()->getString("Force");  char* _PREHASH_TransactionBlock = LLMessageStringTable::getInstance()->getString("TransactionBlock");  char* _PREHASH_PowersMask = LLMessageStringTable::getInstance()->getString("PowersMask"); diff --git a/indra/llmessage/tests/llareslistener_test.cpp b/indra/llmessage/tests/llareslistener_test.cpp index ac4886ccf4..6ee74c8e7a 100644 --- a/indra/llmessage/tests/llareslistener_test.cpp +++ b/indra/llmessage/tests/llareslistener_test.cpp @@ -4,7 +4,7 @@   * @date   2009-02-26   * @brief  Tests of llareslistener.h.   *  - * $LicenseInfo:firstyear=2009&license=internal$ + * $LicenseInfo:firstyear=2009&license=viewergpl$   * Copyright (c) 2009, Linden Research, Inc.   * $/LicenseInfo$   */  | 
