Skip to content

Commit 3181934

Browse files
authored
fix: support mysql sql_require_primary_key (#1685)
fixes #1678
1 parent 3ba3b20 commit 3181934

File tree

11 files changed

+37
-36
lines changed

11 files changed

+37
-36
lines changed

.github/workflows/build.yaml

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
branches:
77
- master
88
schedule:
9-
- cron: '0 0 * * 0' # weekly
9+
- cron: "0 0 * * 0" # weekly
1010

1111
jobs:
1212
test:
@@ -46,18 +46,9 @@ jobs:
4646
run: |
4747
sudo systemctl start mysql.service
4848
sleep 5 && mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';" -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }}
49+
mysql -e "SET GLOBAL sql_require_primary_key = ON;" -uroot
4950
- run: npm run lint
50-
# Temporary work around jest memory leaks https://github.com/facebook/jest/issues/11956
51-
- run: |
52-
shopt -s globstar
53-
set -e
54-
for x in server/test/*.test.js; do (node --expose-gc ./node_modules/.bin/jest "$x" && sh -c 'mv coverage/coverage-final.json "coverage/$(basename "$1" .js).json"' sh "$x") || exit 1; done
55-
for x in cli/test/*.test.js; do (node --expose-gc ./node_modules/.bin/jest "$x" && sh -c 'mv coverage/coverage-final.json "coverage/$(basename "$1" .js).json"' sh "$x") || exit 1; done
56-
npx nyc merge coverage coverage-final.json
57-
rm -rf coverage
58-
mkdir coverage
59-
mv coverage-final.json coverage/coverage-final.json
60-
npx nyc report -t coverage --reporter=lcov --report-dir=coverage
51+
- run: node --expose-gc ./node_modules/.bin/jest --coverage
6152
env:
6253
DB_PASSWORD:
6354
LOG_LEVEL: warn
@@ -71,19 +62,19 @@ jobs:
7162
LOG_LEVEL: warn
7263
PORT: 3000
7364
NODE_ENV: production
74-
ADMIN_USERNAME: 'admin@banmanagement.com'
75-
ADMIN_PASSWORD: 'P%@#fjdVJ3Y%pdGR'
65+
ADMIN_USERNAME: "admin@banmanagement.com"
66+
ADMIN_PASSWORD: "P%@#fjdVJ3Y%pdGR" # Keep this as is to avoid HIBP failing checks
7667
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
7768
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7869
CYPRESS_PROJECT_ID: ${{ secrets.PROJECT_ID }}
79-
CONTACT_EMAIL: 'admin@banmanagement.com'
70+
CONTACT_EMAIL: "admin@banmanagement.com"
8071
NOTIFICATION_VAPID_PUBLIC_KEY: ${{ secrets.NOTIFICATION_VAPID_PUBLIC_KEY }}
8172
NOTIFICATION_VAPID_PRIVATE_KEY: ${{ secrets.NOTIFICATION_VAPID_PRIVATE_KEY }}
8273
with:
8374
install: false
8475
build: npm run e2e:build
8576
start: npm start
86-
wait-on: 'http://127.0.0.1:3000'
77+
wait-on: "http://127.0.0.1:3000"
8778
record: true
8879

8980
- name: Coveralls Parallel

docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ services:
55
restart: unless-stopped
66
environment:
77
MYSQL_ROOT_PASSWORD: password
8+
MYSQL_ROOT_HOST: "%"
89
MYSQL_DATABASE: bm_local_dev
910
ports:
1011
- "3306:3306"
@@ -20,6 +21,7 @@ services:
2021
- --character-set-server=utf8mb4
2122
- --collation-server=utf8mb4_unicode_ci
2223
- --default-authentication-plugin=mysql_native_password
24+
- --sql-require-primary-key=ON
2325

2426
volumes:
2527
mysql_data:

jest.config.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module.exports = {
22
collectCoverage: true,
33
testMatch: ['/**/*.test.js'],
4-
testTimeout: 20000
4+
testTimeout: 20000,
5+
maxWorkers: 6,
6+
workerIdleMemoryLimit: '512MB'
57
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
"seed": "node scripts/seed.js",
131131
"seed:reset": "node scripts/seed.js --force",
132132
"start": "node server.js",
133-
"test": "npm run lint && jest --coverage -w 1 --no-cache",
133+
"test": "npm run lint && node --expose-gc ./node_modules/.bin/jest --coverage",
134134
"setup": "node bin/run.js setup --writeFile .env",
135135
"cypress": "cypress open",
136136
"e2e:build": "node cypress/setup.js && npm run build"

server/connections/pool.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ const { attachOnDuplicateUpdate } = require('knex-on-duplicate-update')
33

44
attachOnDuplicateUpdate()
55

6-
module.exports = (config, logger, pool = { min: 0, max: 10 }) => {
6+
module.exports = (config, logger, pool = { min: 0, max: 5 }) => {
77
return knex({
88
client: 'mysql2',
99
asyncStackTraces: true,
10-
// log: logger,
11-
connection: config
10+
connection: config,
11+
pool
1212
})
1313
}

server/data/migrations/sqls/20180122081331-acls-up.sql

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,8 @@ CREATE TABLE `bm_web_role_resources` (
6161
`role_id` INT UNSIGNED NOT NULL,
6262
`resource_id` INT UNSIGNED NOT NULL,
6363
`value` int(11) UNSIGNED DEFAULT NULL,
64-
KEY `bm_web_group_resources_group_id_index` (`role_id`),
65-
KEY `bm_web_group_resources_resource_id_index` (`resource_id`),
64+
PRIMARY KEY (`role_id`, `resource_id`),
6665
KEY `bm_web_group_resources_value_index` (`value`),
67-
KEY `bm_web_group_resources_group_id_resource_id_index` (`role_id`,`resource_id`),
6866
CONSTRAINT `bm_web_role_resources_resource_id_fk` FOREIGN KEY (`resource_id`) REFERENCES `bm_web_resources` (`resource_id`) ON DELETE CASCADE ON UPDATE CASCADE,
6967
CONSTRAINT `bm_web_role_resources_role_id_fk` FOREIGN KEY (`role_id`) REFERENCES `bm_web_roles` (`role_id`) ON DELETE CASCADE ON UPDATE CASCADE
7068
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

server/test/createServer.mutation.test.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,10 @@ describe('Mutation create server', () => {
191191

192192
await pool('bm_players').insert(player)
193193

194-
// Create temp user
195-
await pool.raw('CREATE USER \'foobarcreate\'@\'localhost\' IDENTIFIED BY \'password\';')
196-
await pool.raw('GRANT ALL ON *.* TO \'foobarcreate\'@\'localhost\';')
194+
// Create temp user (use % to allow connections from any host, needed for Docker)
195+
await pool.raw('DROP USER IF EXISTS \'foobarcreate\'@\'%\';')
196+
await pool.raw('CREATE USER \'foobarcreate\'@\'%\' IDENTIFIED BY \'password\';')
197+
await pool.raw('GRANT ALL ON *.* TO \'foobarcreate\'@\'%\';')
197198
await pool.raw('FLUSH PRIVILEGES;')
198199
const server = await createServer(unparse(player.id), setup.dbPool.client.config.connection.database)
199200

@@ -220,7 +221,7 @@ describe('Mutation create server', () => {
220221
.send({ query })
221222

222223
// Delete custom user
223-
await pool('mysql.user').where('user', 'foobarcreate').del()
224+
await pool.raw('DROP USER IF EXISTS \'foobarcreate\'@\'%\';')
224225

225226
assert.strictEqual(statusCode, 200)
226227

server/test/deleteServer.mutation.test.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ describe('Mutation delete server', () => {
137137

138138
await pool('bm_players').insert(player)
139139

140-
// Create temp user
140+
// Create temp user (use % to allow connections from any host, needed for Docker)
141+
await pool.raw('DROP USER IF EXISTS \'foobardelete\'@\'%\';')
141142
await pool.raw('CREATE USER \'foobardelete\'@\'%\' IDENTIFIED BY \'password\';')
142143
await pool.raw('GRANT ALL ON *.* TO \'foobardelete\'@\'%\';')
143144
await pool.raw('FLUSH PRIVILEGES;')
@@ -166,7 +167,7 @@ describe('Mutation delete server', () => {
166167
.send({ query: createQuery })
167168

168169
// Delete custom user
169-
await pool('mysql.user').where('user', 'foobardelete').del()
170+
await pool.raw('DROP USER IF EXISTS \'foobardelete\'@\'%\';')
170171
await pool.raw('FLUSH PRIVILEGES;')
171172

172173
assert.strictEqual(createStatusCode, 200)

server/test/fixtures/server.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
const { randomBytes } = require('crypto')
2-
const { encrypt } = require('../../data/crypto')
32
const tables = JSON.stringify(
43
{
54
players: 'bm_players',
@@ -41,7 +40,7 @@ module.exports = async function (consoleId, database) {
4140
}
4241

4342
if (process.env.DB_PASSWORD) {
44-
server.password = await encrypt(process.env.ENCRYPTION_KEY, process.env.DB_PASSWORD)
43+
server.password = process.env.DB_PASSWORD
4544
}
4645

4746
return server

server/test/lib/setup.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const { setupPool, setupServersPool } = require('../../connections')
88
const { createServer, createPlayer } = require('../fixtures')
99
const loaders = require('../../graphql/loaders')
1010
const { hash } = require('../../data/hash')
11+
const { encrypt } = require('../../data/crypto')
1112

1213
module.exports = async (disableTestMigrations) => { // eslint-disable-line max-statements
1314
const dbName = 'bm_web_tests_' + randomBytes(4).toString('hex')
@@ -79,6 +80,11 @@ module.exports = async (disableTestMigrations) => { // eslint-disable-line max-s
7980
// Create a server
8081
const server = await createServer(playerConsole.id, dbName)
8182

83+
// Encrypt password before storing (setupServersPool will decrypt it when reading)
84+
if (server.password) {
85+
server.password = await encrypt(process.env.ENCRYPTION_KEY, server.password)
86+
}
87+
8288
await dbPool('bm_web_servers').insert(server)
8389

8490
const serversPool = await setupServersPool({ dbPool, logger, disableInterval: true })

0 commit comments

Comments
 (0)