Index: content/browser/renderer_host/database_message_filter.cc |
diff --git a/content/browser/renderer_host/database_message_filter.cc b/content/browser/renderer_host/database_message_filter.cc |
index 5f9a8ae5d721979ce16d2accacca7e37a4a05512..8bf1adbb41ab6338cc48b20c6382395fd6f26bc4 100644 |
--- a/content/browser/renderer_host/database_message_filter.cc |
+++ b/content/browser/renderer_host/database_message_filter.cc |
@@ -25,6 +25,7 @@ |
#include "storage/browser/quota/quota_manager_proxy.h" |
#include "storage/common/database/database_identifier.h" |
#include "third_party/sqlite/sqlite3.h" |
+#include "url/origin.h" |
#if defined(OS_POSIX) |
#include "base/file_descriptor_posix.h" |
@@ -42,6 +43,10 @@ namespace { |
const int kNumDeleteRetries = 2; |
const int kDelayDeleteRetryMs = 100; |
+bool IsOriginValid(const url::Origin& origin) { |
+ return !origin.unique(); |
+} |
+ |
} // namespace |
DatabaseMessageFilter::DatabaseMessageFilter( |
@@ -249,10 +254,17 @@ void DatabaseMessageFilter::OnDatabaseGetFileSize( |
} |
void DatabaseMessageFilter::OnDatabaseGetSpaceAvailable( |
- const std::string& origin_identifier, IPC::Message* reply_msg) { |
+ const url::Origin& origin, |
+ IPC::Message* reply_msg) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK(db_tracker_->quota_manager_proxy()); |
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage( |
+ this, bad_message::DBMF_INVALID_ORIGIN_ON_GET_SPACE); |
+ return; |
+ } |
+ |
QuotaManager* quota_manager = |
db_tracker_->quota_manager_proxy()->quota_manager(); |
if (!quota_manager) { |
@@ -267,10 +279,9 @@ void DatabaseMessageFilter::OnDatabaseGetSpaceAvailable( |
TRACE_EVENT0("io", "DatabaseMessageFilter::OnDatabaseGetSpaceAvailable"); |
quota_manager->GetUsageAndQuota( |
- storage::GetOriginFromIdentifier(origin_identifier), |
- storage::kStorageTypeTemporary, |
- base::Bind( |
- &DatabaseMessageFilter::OnDatabaseGetUsageAndQuota, this, reply_msg)); |
+ GURL(origin.Serialize()), storage::kStorageTypeTemporary, |
+ base::Bind(&DatabaseMessageFilter::OnDatabaseGetUsageAndQuota, this, |
+ reply_msg)); |
} |
void DatabaseMessageFilter::OnDatabaseGetUsageAndQuota( |
@@ -298,36 +309,45 @@ void DatabaseMessageFilter::OnDatabaseSetFileSize( |
} |
void DatabaseMessageFilter::OnDatabaseOpened( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name, |
const base::string16& description, |
int64_t estimated_size) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- if (!storage::IsValidOriginIdentifier(origin_identifier)) { |
+ if (!IsOriginValid(origin)) { |
bad_message::ReceivedBadMessage(this, |
bad_message::DBMF_INVALID_ORIGIN_ON_OPEN); |
return; |
} |
- UMA_HISTOGRAM_BOOLEAN( |
- "websql.OpenDatabase", |
- IsOriginSecure(storage::GetOriginFromIdentifier(origin_identifier))); |
+ GURL origin_url(origin.Serialize()); |
+ UMA_HISTOGRAM_BOOLEAN("websql.OpenDatabase", IsOriginSecure(origin_url)); |
int64_t database_size = 0; |
+ std::string origin_identifier(storage::GetIdentifierFromOrigin(origin_url)); |
db_tracker_->DatabaseOpened(origin_identifier, database_name, description, |
estimated_size, &database_size); |
+ |
database_connections_.AddConnection(origin_identifier, database_name); |
- Send(new DatabaseMsg_UpdateSize(origin_identifier, database_name, |
- database_size)); |
+ Send(new DatabaseMsg_UpdateSize(origin, database_name, database_size)); |
} |
void DatabaseMessageFilter::OnDatabaseModified( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- if (!database_connections_.IsDatabaseOpened( |
- origin_identifier, database_name)) { |
+ |
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage( |
+ this, bad_message::DBMF_INVALID_ORIGIN_ON_MODIFIED); |
+ return; |
+ } |
+ |
+ std::string origin_identifier( |
+ storage::GetIdentifierFromOrigin(GURL(origin.Serialize()))); |
+ if (!database_connections_.IsDatabaseOpened(origin_identifier, |
+ database_name)) { |
bad_message::ReceivedBadMessage(this, |
bad_message::DBMF_DB_NOT_OPEN_ON_MODIFY); |
return; |
@@ -337,9 +357,18 @@ void DatabaseMessageFilter::OnDatabaseModified( |
} |
void DatabaseMessageFilter::OnDatabaseClosed( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ |
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage(this, |
+ bad_message::DBMF_INVALID_ORIGIN_ON_CLOSED); |
+ return; |
+ } |
+ |
+ std::string origin_identifier( |
+ storage::GetIdentifierFromOrigin(GURL(origin.Serialize()))); |
if (!database_connections_.IsDatabaseOpened( |
origin_identifier, database_name)) { |
bad_message::ReceivedBadMessage(this, |
@@ -352,17 +381,18 @@ void DatabaseMessageFilter::OnDatabaseClosed( |
} |
void DatabaseMessageFilter::OnHandleSqliteError( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name, |
int error) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- if (!storage::IsValidOriginIdentifier(origin_identifier)) { |
+ if (!IsOriginValid(origin)) { |
bad_message::ReceivedBadMessage( |
this, bad_message::DBMF_INVALID_ORIGIN_ON_SQLITE_ERROR); |
return; |
} |
- |
- db_tracker_->HandleSqliteError(origin_identifier, database_name, error); |
+ db_tracker_->HandleSqliteError( |
+ storage::GetIdentifierFromOrigin(GURL(origin.Serialize())), database_name, |
+ error); |
} |
void DatabaseMessageFilter::OnDatabaseSizeChanged( |
@@ -371,8 +401,9 @@ void DatabaseMessageFilter::OnDatabaseSizeChanged( |
int64_t database_size) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
if (database_connections_.IsOriginUsed(origin_identifier)) { |
- Send(new DatabaseMsg_UpdateSize(origin_identifier, database_name, |
- database_size)); |
+ Send(new DatabaseMsg_UpdateSize( |
+ url::Origin(storage::GetOriginFromIdentifier(origin_identifier)), |
+ database_name, database_size)); |
} |
} |
@@ -380,7 +411,9 @@ void DatabaseMessageFilter::OnDatabaseScheduledForDeletion( |
const std::string& origin_identifier, |
const base::string16& database_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- Send(new DatabaseMsg_CloseImmediately(origin_identifier, database_name)); |
+ Send(new DatabaseMsg_CloseImmediately( |
+ url::Origin(storage::GetOriginFromIdentifier(origin_identifier)), |
+ database_name)); |
} |
} // namespace content |