From 7fde57f7dea4944a6ebfbbe06e64bb8fb9107cc3 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Tue, 20 Sep 2016 14:07:39 -0700 Subject: [PATCH] clear db ignoring foreign key checks --- src/clientdb.js | 13 ++++++++++--- src/database.js | 21 +++++++++------------ src/groupdb.js | 7 ++++++- src/test/database-test.js | 11 ----------- src/test/setupTest | 16 ---------------- 5 files changed, 25 insertions(+), 43 deletions(-) diff --git a/src/clientdb.js b/src/clientdb.js index 3220a00ef..61ce1a153 100644 --- a/src/clientdb.js +++ b/src/clientdb.js @@ -1,5 +1,3 @@ -/* jslint node:true */ - 'use strict'; exports = module.exports = { @@ -15,10 +13,12 @@ exports = module.exports = { delByAppId: delByAppId, delByAppIdAndType: delByAppIdAndType, - _clear: clear + _clear: clear, + _addDefaultClients: addDefaultClients }; var assert = require('assert'), + async = require('async'), database = require('./database.js'), DatabaseError = require('./databaseerror.js'); @@ -159,3 +159,10 @@ function clear(callback) { }); } +function addDefaultClients(callback) { + async.series([ + add.bind(null, 'cid-webadmin', 'Settings', 'built-in', 'secret-webadmin', 'https://admin-localhost', 'cloudron,profile,users,apps,settings'), + add.bind(null, 'cid-sdk', 'SDK', 'built-in', 'secret-sdk', 'https://admin-localhost', '*,roleSdk'), + add.bind(null, 'cid-cli', 'Cloudron Tool', 'built-in', 'secret-cli', 'https://admin-localhost', '*,roleSdk') + ], callback); +} diff --git a/src/database.js b/src/database.js index 421c2904e..b9ef8dd61 100644 --- a/src/database.js +++ b/src/database.js @@ -15,9 +15,10 @@ exports = module.exports = { var assert = require('assert'), async = require('async'), - once = require('once'), + child_process = require('child_process'), config = require('./config.js'), mysql = require('mysql'), + once = require('once'), util = require('util'); var gConnectionPool = null, @@ -93,18 +94,14 @@ function reconnect(callback) { function clear(callback) { assert.strictEqual(typeof callback, 'function'); - // the clear funcs don't completely clear the db, they leave the migration code defaults + var cmd = util.format('mysql --host=%s --user="%s" --password="%s" -Nse "SHOW TABLES" %s | grep -v "^migrations$" | while read table; do mysql --host=%s --user="%s" --password="%s" -e "SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE $table" %s; done', + config.database().hostname, config.database().username, config.database().password, config.database().name, + config.database().hostname, config.database().username, config.database().password, config.database().name); + async.series([ - require('./appdb.js')._clear, - require('./authcodedb.js')._clear, - require('./backupdb.js')._clear, - require('./clientdb.js')._clear, - require('./tokendb.js')._clear, - require('./groupdb.js')._clear, - require('./userdb.js')._clear, - require('./settingsdb.js')._clear, - require('./eventlogdb.js')._clear, - require('./mailboxdb.js')._clear + child_process.exec.bind(null, cmd), + require('./clientdb.js')._addDefaultClients, + require('./groupdb.js')._addDefaultGroups ], callback); } diff --git a/src/groupdb.js b/src/groupdb.js index 3064396c3..0c38fd3b1 100644 --- a/src/groupdb.js +++ b/src/groupdb.js @@ -17,7 +17,8 @@ exports = module.exports = { getGroups: getGroups, setGroups: setGroups, - _clear: clear + _clear: clear, + _addDefaultGroups: addDefaultGroups }; var assert = require('assert'), @@ -214,3 +215,7 @@ function isMember(groupId, userId, callback) { callback(null, result.length !== 0); }); } + +function addDefaultGroups(callback) { + add('admin', 'admin', callback); +} diff --git a/src/test/database-test.js b/src/test/database-test.js index 994b75fbd..8ab5ac51f 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -248,17 +248,6 @@ describe('database', function () { done(); }); }); - - it('can clear table', function (done) { - userdb._clear(function (error) { - expect(error).to.not.be.ok(); - userdb.count(function (error, count) { - expect(error).to.not.be.ok(); - expect(count).to.equal(0); - done(); - }); - }); - }); }); describe('authcode', function () { diff --git a/src/test/setupTest b/src/test/setupTest index c71b1c083..d986ae719 100755 --- a/src/test/setupTest +++ b/src/test/setupTest @@ -2,7 +2,6 @@ set -eu -readonly ADMIN_LOCATION=admin readonly source_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)" ! "${source_dir}/src/test/checkInstall" && exit 1 @@ -16,21 +15,6 @@ mkdir -p data/appdata data/box/appicons data/mail data/nginx/cert data/nginx/app # put cert openssl req -x509 -newkey rsa:2048 -keyout data/nginx/cert/host.key -out data/nginx/cert/host.cert -days 3650 -subj '/CN=localhost' -nodes -webadmin_scopes="cloudron,profile,users,apps,settings" -webadmin_origin="https://${ADMIN_LOCATION}-localhost" - # create docker network (while the infra code does this, most tests skip infra setup) docker network create --subnet=172.18.0.0/16 cloudron || true -# !!!!!! check clientdb.js clear() to not nuke those entries -echo "Add webadmin api client" -mysql --user=root --password="" \ - -e "REPLACE INTO clients (id, appId, type, clientSecret, redirectURI, scope) VALUES (\"cid-webadmin\", \"Settings\", \"built-in\", \"secret-webadmin\", \"${webadmin_origin}\", \"${webadmin_scopes}\")" boxtest - -echo "Add SDK api client" -mysql --user=root --password="" \ - -e "REPLACE INTO clients (id, appId, type, clientSecret, redirectURI, scope) VALUES (\"cid-sdk\", \"SDK\", \"built-in\", \"secret-sdk\", \"${webadmin_origin}\", \"*,roleSdk\")" boxtest - -echo "Add cli api client" -mysql --user=root --password="" \ - -e "REPLACE INTO clients (id, appId, type, clientSecret, redirectURI, scope) VALUES (\"cid-cli\", \"Cloudron Tool\", \"built-in\", \"secret-cli\", \"${webadmin_origin}\", \"*,roleSdk\")" boxtest