18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DatabaseAuthorizer.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(DATABASE)
335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
35ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <wtf/PassRefPtr.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockPassRefPtr<DatabaseAuthorizer> DatabaseAuthorizer::create(const String& databaseInfoTableName)
40ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
41ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return adoptRef(new DatabaseAuthorizer(databaseInfoTableName));
42ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
43ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
44ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockDatabaseAuthorizer::DatabaseAuthorizer(const String& databaseInfoTableName)
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_securityEnabled(false)
46ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    , m_databaseInfoTableName(databaseInfoTableName)
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    reset();
49d0825bca7fe65beaee391d30da42e937db621564Steve Block    addWhitelistedFunctions();
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid DatabaseAuthorizer::reset()
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionWasInsert = false;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = false;
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_permissions = ReadWriteMask;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid DatabaseAuthorizer::resetDeletes()
60545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_hadDeletes = false;
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
63545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
64d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid DatabaseAuthorizer::addWhitelistedFunctions()
65d0825bca7fe65beaee391d30da42e937db621564Steve Block{
66d0825bca7fe65beaee391d30da42e937db621564Steve Block    // SQLite functions used to help implement some operations
67d0825bca7fe65beaee391d30da42e937db621564Steve Block    // ALTER TABLE helpers
68d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("sqlite_rename_table");
69d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("sqlite_rename_trigger");
70d0825bca7fe65beaee391d30da42e937db621564Steve Block    // GLOB helpers
71d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("glob");
72d0825bca7fe65beaee391d30da42e937db621564Steve Block
73d0825bca7fe65beaee391d30da42e937db621564Steve Block    // SQLite core functions
74d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("abs");
75d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("changes");
76d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("coalesce");
77d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("glob");
78d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("ifnull");
79d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("hex");
80d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("last_insert_rowid");
81d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("length");
82d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("like");
83d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("lower");
84d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("ltrim");
85d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("max");
86d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("min");
87d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("nullif");
88d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("quote");
89d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("replace");
90d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("round");
91d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("rtrim");
92d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("soundex");
93d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("sqlite_source_id");
94d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("sqlite_version");
95d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("substr");
96d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("total_changes");
97d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("trim");
98d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("typeof");
99d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("upper");
100d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("zeroblob");
101d0825bca7fe65beaee391d30da42e937db621564Steve Block
102d0825bca7fe65beaee391d30da42e937db621564Steve Block    // SQLite date and time functions
103d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("date");
104d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("time");
105d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("datetime");
106d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("julianday");
107d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("strftime");
108d0825bca7fe65beaee391d30da42e937db621564Steve Block
109d0825bca7fe65beaee391d30da42e937db621564Steve Block    // SQLite aggregate functions
110d0825bca7fe65beaee391d30da42e937db621564Steve Block    // max() and min() are already in the list
111d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("avg");
112d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("count");
113d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("group_concat");
114d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("sum");
115d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("total");
116d0825bca7fe65beaee391d30da42e937db621564Steve Block
117d0825bca7fe65beaee391d30da42e937db621564Steve Block    // SQLite FTS functions
1185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_whitelistedFunctions.add("match");
119d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("snippet");
120d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("offsets");
121d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("optimize");
122d0825bca7fe65beaee391d30da42e937db621564Steve Block
123d0825bca7fe65beaee391d30da42e937db621564Steve Block    // SQLite ICU functions
124d0825bca7fe65beaee391d30da42e937db621564Steve Block    // like(), lower() and upper() are already in the list
125d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_whitelistedFunctions.add("regexp");
126d0825bca7fe65beaee391d30da42e937db621564Steve Block}
127d0825bca7fe65beaee391d30da42e937db621564Steve Block
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::createTable(const String& tableName)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
1315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
1325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = true;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::createTempTable(const String& tableName)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_CREATE_TEMP_TABLE results in a UPDATE operation, which is not
140231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // allowed in read-only transactions or private browsing, so we might as
141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // well disallow SQLITE_CREATE_TEMP_TABLE in these cases
142f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return SQLAuthDeny;
144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::dropTable(const String& tableName)
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
1515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
1525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
153545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::dropTempTable(const String& tableName)
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_DROP_TEMP_TABLE results in a DELETE operation, which is not
159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // allowed in read-only transactions or private browsing, so we might as
160231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // well disallow SQLITE_DROP_TEMP_TABLE in these cases
161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return SQLAuthDeny;
163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
164545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::allowAlterTable(const String&, const String& tableName)
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
1715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = true;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::createIndex(const String&, const String& tableName)
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
1795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
1805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = true;
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::createTempIndex(const String&, const String& tableName)
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_CREATE_TEMP_INDEX should result in a UPDATE or INSERT operation,
188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // which is not allowed in read-only transactions or private browsing,
189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // so we might as well disallow SQLITE_CREATE_TEMP_INDEX in these cases
190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return SQLAuthDeny;
192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::dropIndex(const String&, const String& tableName)
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
198f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
1995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
2005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
201545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::dropTempIndex(const String&, const String& tableName)
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_DROP_TEMP_INDEX should result in a DELETE operation, which is
207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // not allowed in read-only transactions or private browsing, so we might
208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // as well disallow SQLITE_DROP_TEMP_INDEX in these cases
209f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return SQLAuthDeny;
211231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
212545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::createTrigger(const String&, const String& tableName)
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
2185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
2195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = true;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::createTempTrigger(const String&, const String& tableName)
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_CREATE_TEMP_TRIGGER results in a INSERT operation, which is not
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // allowed in read-only transactions or private browsing, so we might as
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // well disallow SQLITE_CREATE_TEMP_TRIGGER in these cases
229f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return SQLAuthDeny;
231231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::dropTrigger(const String&, const String& tableName)
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
237f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
2385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
2395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
240545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::dropTempTrigger(const String&, const String& tableName)
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_DROP_TEMP_TRIGGER results in a DELETE operation, which is not
246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // allowed in read-only transactions or private browsing, so we might as
247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // well disallow SQLITE_DROP_TEMP_TRIGGER in these cases
248f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return SQLAuthDeny;
250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
251545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockint DatabaseAuthorizer::createView(const String&)
255231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return (!allowWrite() ? SQLAuthDeny : SQLAuthAllow);
257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
258231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockint DatabaseAuthorizer::createTempView(const String&)
260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_CREATE_TEMP_VIEW results in a UPDATE operation, which is not
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // allowed in read-only transactions or private browsing, so we might as
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // well disallow SQLITE_CREATE_TEMP_VIEW in these cases
264f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return (!allowWrite() ? SQLAuthDeny : SQLAuthAllow);
265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockint DatabaseAuthorizer::dropView(const String&)
268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
270545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return SQLAuthDeny;
271545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
272545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_hadDeletes = true;
273545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return SQLAuthAllow;
274231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
275231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
276231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockint DatabaseAuthorizer::dropTempView(const String&)
277231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
278231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // SQLITE_DROP_TEMP_VIEW results in a DELETE operation, which is not
279231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // allowed in read-only transactions or private browsing, so we might as
280231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // well disallow SQLITE_DROP_TEMP_VIEW in these cases
281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
282545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return SQLAuthDeny;
283545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
284545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_hadDeletes = true;
285545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return SQLAuthAllow;
286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
288692e5dbf12901edacf14812a6fae25462920af42Steve Blockint DatabaseAuthorizer::createVTable(const String& tableName, const String& moduleName)
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
2915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
2925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Allow only the FTS3 extension
294967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!equalIgnoringCase(moduleName, "fts3"))
295692e5dbf12901edacf14812a6fae25462920af42Steve Block        return SQLAuthDeny;
296692e5dbf12901edacf14812a6fae25462920af42Steve Block
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = true;
298692e5dbf12901edacf14812a6fae25462920af42Steve Block    return denyBasedOnTableName(tableName);
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
301692e5dbf12901edacf14812a6fae25462920af42Steve Blockint DatabaseAuthorizer::dropVTable(const String& tableName, const String& moduleName)
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
303f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
3045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
3055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Allow only the FTS3 extension
307967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!equalIgnoringCase(moduleName, "fts3"))
308692e5dbf12901edacf14812a6fae25462920af42Steve Block        return SQLAuthDeny;
309692e5dbf12901edacf14812a6fae25462920af42Steve Block
310545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::allowDelete(const String& tableName)
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
315f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
3165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
3175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
318545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return updateDeletesBasedOnTableName(tableName);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::allowInsert(const String& tableName)
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
3245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
3255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = true;
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionWasInsert = true;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::allowUpdate(const String& tableName, const String&)
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
333f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!allowWrite())
3345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return SQLAuthDeny;
3355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastActionChangedDatabase = true;
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::allowTransaction()
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_securityEnabled ? SQLAuthDeny : SQLAuthAllow;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::allowRead(const String& tableName, const String&)
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
347f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (m_permissions & NoAccessMask && m_securityEnabled)
348f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return SQLAuthDeny;
349f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
353231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockint DatabaseAuthorizer::allowReindex(const String&)
354231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
355f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return (!allowWrite() ? SQLAuthDeny : SQLAuthAllow);
356231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
357231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint DatabaseAuthorizer::allowAnalyze(const String& tableName)
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return denyBasedOnTableName(tableName);
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::allowPragma(const String&, const String&)
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_securityEnabled ? SQLAuthDeny : SQLAuthAllow;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::allowAttach(const String&)
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_securityEnabled ? SQLAuthDeny : SQLAuthAllow;
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint DatabaseAuthorizer::allowDetach(const String&)
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_securityEnabled ? SQLAuthDeny : SQLAuthAllow;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378d0825bca7fe65beaee391d30da42e937db621564Steve Blockint DatabaseAuthorizer::allowFunction(const String& functionName)
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
380d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (m_securityEnabled && !m_whitelistedFunctions.contains(functionName))
381d0825bca7fe65beaee391d30da42e937db621564Steve Block        return SQLAuthDeny;
382d0825bca7fe65beaee391d30da42e937db621564Steve Block
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return SQLAuthAllow;
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid DatabaseAuthorizer::disable()
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_securityEnabled = false;
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid DatabaseAuthorizer::enable()
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_securityEnabled = true;
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
396f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool DatabaseAuthorizer::allowWrite()
397f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
398f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return !(m_securityEnabled && (m_permissions & ReadOnlyMask || m_permissions & NoAccessMask));
399f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
400f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
4015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid DatabaseAuthorizer::setReadOnly()
4025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
403f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_permissions |= ReadOnlyMask;
404f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
405f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
406f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid DatabaseAuthorizer::setPermissions(int permissions)
407f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
408f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_permissions = permissions;
4095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
4105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
411ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockint DatabaseAuthorizer::denyBasedOnTableName(const String& tableName) const
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_securityEnabled)
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SQLAuthAllow;
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Sadly, normal creates and drops end up affecting sqlite_master in an authorizer callback, so
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // it will be tough to enforce all of the following policies
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //if (equalIgnoringCase(tableName, "sqlite_master") || equalIgnoringCase(tableName, "sqlite_temp_master") ||
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //    equalIgnoringCase(tableName, "sqlite_sequence") || equalIgnoringCase(tableName, Database::databaseInfoTableName()))
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //        return SQLAuthDeny;
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
422ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (equalIgnoringCase(tableName, m_databaseInfoTableName))
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SQLAuthDeny;
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return SQLAuthAllow;
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochint DatabaseAuthorizer::updateDeletesBasedOnTableName(const String& tableName)
429545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
430545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    int allow = denyBasedOnTableName(tableName);
431545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (allow)
432545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_hadDeletes = true;
433545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return allow;
434545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
435545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
4375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
439