Socket
Socket
Sign inDemoInstall

@nictool/api

Package Overview
Dependencies
92
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 3.0.0-alpha.4 to 3.0.0-alpha.5

lib/test/rrs/a.json

10

CHANGELOG.md

@@ -6,2 +6,11 @@ # CHANGES

### [3.0.0-alpha.5] - 2024-03-06
- feat(lib/zone): added, with tests, fixes #22
- feat(lib/zone_record): added, with tests, fixes #23
- feat: default GET sets deleted=false
- group, nameserver, permission, user, zone
- sql: return indicative boolean for delete
- test(zr): added maps from NT SQL 2 to dns-rr std formats
### [3.0.0-alpha.4] - 2024-03-05

@@ -25,1 +34,2 @@

[3.0.0-alpha.4]: https://github.com/NicTool/api/releases/tag/3.0.0-alpha.4
[3.0.0-alpha.5]: https://github.com/NicTool/api/releases/tag/3.0.0-alpha.5

24

lib/group.js

@@ -24,2 +24,5 @@ import Mysql from './mysql.js'

async get(args) {
args = JSON.parse(JSON.stringify(args))
if (args.deleted === undefined) args.deleted = false
const rows = await Mysql.execute(

@@ -35,6 +38,7 @@ ...Mysql.select(

)
for (const r of rows) {
for (const row of rows) {
for (const b of boolFields) {
r[b] = r[b] === 1
row[b] = row[b] === 1
}
if (args.deleted === false) delete row.deleted
}

@@ -48,3 +52,2 @@ return rows

delete args.id
// Mysql.debug(1)
const r = await Mysql.execute(

@@ -57,3 +60,2 @@ ...Mysql.update(

)
// console.log(r)
return r.changedRows === 1

@@ -63,13 +65,15 @@ }

async delete(args) {
await Mysql.execute(`UPDATE nt_group SET deleted=? WHERE nt_group_id=?`, [
args.deleted ?? 1,
args.id,
])
return true
const r = await Mysql.execute(
...Mysql.update(`nt_group`, `nt_group_id=${args.id}`, {
deleted: args.deleted ?? 1,
}),
)
return r.changedRows === 1
}
async destroy(args) {
return await Mysql.execute(
const r = await Mysql.execute(
...Mysql.delete(`nt_group`, { nt_group_id: args.id }),
)
return r.affectedRows === 1
}

@@ -76,0 +80,0 @@ }

@@ -23,3 +23,2 @@ import assert from 'node:assert/strict'

parent_gid: 0,
deleted: false,
})

@@ -34,3 +33,2 @@ })

parent_gid: 0,
deleted: false,
})

@@ -46,3 +44,2 @@ })

parent_gid: 0,
deleted: false,
},

@@ -59,4 +56,4 @@ ])

g = await Group.get({ id: testCase.id })
assert.equal(g[0].deleted, false)
assert.equal(g[0].deleted, undefined)
})
})

@@ -38,2 +38,5 @@ import Mysql from './mysql.js'

async get(args) {
args = JSON.parse(JSON.stringify(args))
if (args.deleted === undefined) args.deleted = false
if (args.name !== undefined) {

@@ -65,6 +68,7 @@ args['ns.name'] = args.name

)
for (const r of rows) {
for (const row of rows) {
for (const b of boolFields) {
r[b] = r[b] === 1
row[b] = row[b] === 1
}
if (args.deleted === false) delete row.deleted
}

@@ -86,3 +90,2 @@ return dbToObject(rows)

)
// console.log(r)
return r.changedRows === 1

@@ -92,13 +95,15 @@ }

async delete(args) {
await Mysql.execute(
`UPDATE nt_nameserver SET deleted=? WHERE nt_nameserver_id=?`,
[args.deleted ?? 1, args.id],
const r = await Mysql.execute(
...Mysql.update(`nt_nameserver`, `nt_nameserver_id=${args.id}`, {
deleted: args.deleted ?? 1,
}),
)
return true
return r.changedRows === 1
}
async destroy(args) {
return await Mysql.execute(
const r = await Mysql.execute(
...Mysql.delete(`nt_nameserver`, { nt_nameserver_id: args.id }),
)
return r.affectedRows === 1
}

@@ -105,0 +110,0 @@ }

@@ -44,4 +44,4 @@ import assert from 'node:assert/strict'

g = await Nameserver.get({ id: testCase.id })
assert.equal(g[0].deleted, false)
assert.equal(g[0].deleted, undefined)
})
})

@@ -29,2 +29,5 @@ import Mysql from './mysql.js'

async get(args) {
args = JSON.parse(JSON.stringify(args))
if (args.deleted === undefined) args.deleted = false
const query = `SELECT p.nt_perm_id AS id

@@ -38,4 +41,2 @@ , p.nt_user_id AS uid

FROM nt_perm p`
// Mysql.debug(1)
if (args.deleted === undefined) args.deleted = false

@@ -51,3 +52,5 @@ const rows = await Mysql.execute(

}
return dbToObject(rows[0])
const row = dbToObject(rows[0])
if (args.deleted === false) delete row.deleted
return row
}

@@ -65,7 +68,9 @@

INNER JOIN nt_user u ON p.nt_group_id = u.nt_group_id
WHERE p.deleted=0
WHERE p.deleted=${args.deleted === true ? 1 : 0}
AND u.deleted=0
AND u.nt_user_id=?`
const rows = await Mysql.execute(...Mysql.select(query, [args.uid]))
return dbToObject(rows[0])
const row = dbToObject(rows[0])
if ([false, undefined].includes(args.deleted)) delete row.deleted
return row
}

@@ -77,3 +82,2 @@

delete args.id
// Mysql.debug(1)
const r = await Mysql.execute(

@@ -90,13 +94,16 @@ ...Mysql.update(

async delete(args) {
await Mysql.execute(`UPDATE nt_perm SET deleted=? WHERE nt_perm_id=?`, [
args.deleted ?? 1,
args.id,
])
return true
if (!args.id) return false
const r = await Mysql.execute(
...Mysql.update(`nt_perm`, `nt_perm_id=${args.id}`, {
deleted: args.deleted ?? 1,
}),
)
return r.changedRows === 1
}
async destroy(args) {
return await Mysql.execute(
const r = await Mysql.execute(
...Mysql.delete(`nt_perm`, mapToDbColumn(args, permDbMap)),
)
return r.affectedRows === 1
}

@@ -194,9 +201,9 @@ }

function dbToObject(row) {
const newRow = JSON.parse(JSON.stringify(row))
row = JSON.parse(JSON.stringify(row))
for (const f of ['group', 'nameserver', 'zone', 'zonerecord', 'user']) {
for (const p of ['create', 'write', 'delete', 'delegate']) {
if (newRow[`${f}_${p}`] !== undefined) {
if (newRow[f] === undefined) newRow[f] = {}
newRow[f][p] = newRow[`${f}_${p}`] === 1
delete newRow[`${f}_${p}`]
if (row[`${f}_${p}`] !== undefined) {
if (row[f] === undefined) row[f] = {}
row[f][p] = row[`${f}_${p}`] === 1
delete row[`${f}_${p}`]
}

@@ -206,47 +213,48 @@ }

for (const b of boolFields) {
newRow[b] = newRow[b] === 1
row[b] = row[b] === 1
}
if (newRow.uid !== undefined) {
newRow.user.id = newRow.uid
delete newRow.uid
if (row.uid !== undefined) {
row.user.id = row.uid
delete row.uid
}
if (newRow.gid !== undefined) {
newRow.group.id = newRow.gid
delete newRow.gid
if (row.gid !== undefined) {
row.group.id = row.gid
delete row.gid
}
newRow.nameserver.usable = []
if (![undefined, ''].includes(newRow.usable_ns)) {
newRow.nameserver.usable = newRow.usable_ns.split(',')
row.nameserver.usable = []
if (![undefined, ''].includes(row.usable_ns)) {
row.nameserver.usable = row.usable_ns.split(',')
}
delete newRow.usable_ns
return newRow
delete row.usable_ns
return row
}
function objectToDb(row) {
const newRow = JSON.parse(JSON.stringify(row))
if (newRow?.user?.id !== undefined) {
newRow.uid = newRow.user.id
delete newRow.user.id
row = JSON.parse(JSON.stringify(row))
if (row?.user?.id !== undefined) {
row.uid = row.user.id
delete row.user.id
}
if (newRow?.group?.id !== undefined) {
newRow.gid = newRow.group.id
delete newRow.group.id
if (row?.group?.id !== undefined) {
row.gid = row.group.id
delete row.group.id
}
if (newRow?.nameserver?.usable !== undefined) {
newRow.usable_ns = newRow.nameserver.usable.join(',')
delete newRow.nameserver.usable
if (row?.nameserver?.usable !== undefined) {
row.usable_ns = row.nameserver.usable.join(',')
delete row.nameserver.usable
}
for (const f of ['group', 'nameserver', 'zone', 'zonerecord', 'user']) {
for (const p of ['create', 'write', 'delete', 'delegate']) {
if (newRow[f] === undefined) continue
if (newRow[f][p] === undefined) continue
newRow[`${f}_${p}`] = newRow[f][p] === true ? 1 : 0
delete newRow[f][p]
if (row[f] === undefined) continue
if (row[f][p] === undefined) continue
row[`${f}_${p}`] = row[f][p] === true ? 1 : 0
delete row[f][p]
}
delete newRow[f]
delete row[f]
}
for (const b of boolFields) {
newRow[b] = newRow[b] === true ? 1 : 0
row[b] = row[b] === true ? 1 : 0
}
return newRow
return row
}

@@ -69,8 +69,7 @@ import assert from 'node:assert/strict'

p = await Permission.get({ id: permTestCase.id })
assert.equal(p.deleted, false)
assert.equal(p.deleted, undefined)
})
it('destroys a permission', async () => {
const r = await Permission.destroy({ id: permTestCase.id })
assert.equal(r.affectedRows, 1)
assert.ok(await Permission.destroy({ id: permTestCase.id }))
const p = await Permission.get({ id: permTestCase.id })

@@ -77,0 +76,0 @@ assert.equal(p, undefined)

{
"id": 4096,
"parent_gid": 0,
"name": "example.com",
"deleted": false
"name": "example.com"
}

@@ -17,4 +17,3 @@ {

},
"ttl": 3600,
"deleted": false
"ttl": 3600
}

@@ -6,3 +6,2 @@ {

"self_write": false,
"deleted": false,
"group": { "id": 4096, "create": false, "write": false, "delete": false },

@@ -9,0 +8,0 @@ "nameserver": {

@@ -9,4 +9,3 @@ {

"last_name": "Test",
"is_admin": false,
"deleted": false
"is_admin": false
}

@@ -18,3 +18,3 @@ import crypto from 'node:crypto'

async authenticate(authTry) {
if (this.debug) console.log(authTry)
// if (this.debug) console.log(authTry)
let [username, groupName] = authTry.username.split('@')

@@ -70,2 +70,4 @@ if (!groupName) groupName = this.cfg.group ?? 'NicTool'

args = JSON.parse(JSON.stringify(args))
if (args.password) {

@@ -83,3 +85,5 @@ if (!args.pass_salt) args.pass_salt = this.generateSalt()

async get(args) {
args = JSON.parse(JSON.stringify(args))
if (args.deleted === undefined) args.deleted = false
const rows = await Mysql.execute(

@@ -103,2 +107,3 @@ ...Mysql.select(

}
if (args.deleted === false) delete r.deleted
}

@@ -124,4 +129,5 @@ return rows

const r = await Mysql.execute(
`UPDATE nt_user SET deleted=? WHERE nt_user_id=?`,
[args.deleted ?? 1, args.id],
...Mysql.update(`nt_user`, `nt_user_id=${args.id}`, {
deleted: args.deleted ?? 1,
}),
)

@@ -132,5 +138,6 @@ return r.changedRows === 1

async destroy(args) {
await Mysql.execute(
const r = await Mysql.execute(
...Mysql.delete(`nt_user`, mapToDbColumn({ id: args.id }, userDbMap)),
)
return r.affectedRows === 1
}

@@ -137,0 +144,0 @@

@@ -7,3 +7,3 @@ import assert from 'node:assert/strict'

import testCase from './test/user.json' with { type: 'json' }
import userCase from './test/user.json' with { type: 'json' }
import groupCase from './test/group.json' with { type: 'json' }

@@ -30,5 +30,5 @@

it('creates a user', async () => {
assert.ok(await User.create(testCase))
let users = await User.get({ id: testCase.id })
assert.deepEqual(users[0], sanitize(testCase))
assert.ok(await User.create(userCase))
let users = await User.get({ id: userCase.id })
assert.deepEqual(users[0], sanitize(userCase))
})

@@ -39,5 +39,5 @@ })

it('finds existing user by id', async () => {
const u = await User.get({ id: testCase.id })
const u = await User.get({ id: userCase.id })
// console.log(u)
assert.deepEqual(u[0], sanitize(testCase))
assert.deepEqual(u[0], sanitize(userCase))
})

@@ -47,3 +47,3 @@

const u = await User.get({ username: 'unit-test' })
assert.deepEqual(u[0], sanitize(testCase))
assert.deepEqual(u[0], sanitize(userCase))
})

@@ -54,6 +54,6 @@ })

it('modifies existing user', async () => {
assert.ok(await User.put({ id: testCase.id, first_name: 'Untie' }))
let users = await User.get({ id: testCase.id })
assert.ok(await User.put({ id: userCase.id, first_name: 'Untie' }))
let users = await User.get({ id: userCase.id })
assert.equal(users[0].first_name, 'Untie')
await User.put({ id: testCase.id, first_name: 'Unit' })
await User.put({ id: userCase.id, first_name: 'Unit' })
})

@@ -64,8 +64,8 @@ })

it('deletes a user', async () => {
assert.ok(await User.delete({ id: testCase.id }))
let u = await User.get({ id: testCase.id, deleted: 1 })
assert.ok(await User.delete({ id: userCase.id }))
let u = await User.get({ id: userCase.id, deleted: true })
assert.equal(u[0].deleted, true)
await User.delete({ id: testCase.id, deleted: 0 }) // restore
u = await User.get({ id: testCase.id })
assert.equal(u[0].deleted, false)
await User.delete({ id: userCase.id, deleted: false }) // restore
u = await User.get({ id: userCase.id })
assert.equal(u[0].deleted, undefined)
})

@@ -138,4 +138,4 @@ })

const u = await User.authenticate({
username: 'unit-test@example.com',
password: 'Wh@tA-Decent#P6ssw0rd',
username: `${userCase.username}@${groupCase.name}`,
password: userCase.password,
})

@@ -142,0 +142,0 @@ assert.ok(u)

{
"name": "@nictool/api",
"version": "3.0.0-alpha.4",
"version": "3.0.0-alpha.5",
"description": "NicTool API",

@@ -46,2 +46,3 @@ "main": "index.js",

"@hapi/vision": "^7.0.3",
"@nictool/dns-resource-record": "^1.2.1",
"@nictool/validate": "^0.8.0",

@@ -48,0 +49,0 @@ "hapi-swagger": "^17.2.1",

@@ -50,3 +50,2 @@ import validate from '@nictool/validate'

handler: async (request, h) => {
const users = await User.get({

@@ -143,4 +142,3 @@ deleted: request.query.deleted ?? 0,

const action = request.query.destroy === 'true' ? 'destroy' : 'delete'
await User[action]({ id: users[0].id })
await User.delete({ id: users[0].id })

@@ -147,0 +145,0 @@ delete users[0].gid

@@ -119,6 +119,6 @@ import assert from 'node:assert/strict'

// console.log(res.result)
assert.equal(res.statusCode, 204)
assert.ok([200, 204].includes(res.statusCode))
})
it(`GET /user/${userId2}?deleted=1`, async () => {
it(`GET /user/${userId2}?deleted=true`, async () => {
const res = await server.inject({

@@ -132,3 +132,3 @@ method: 'GET',

// console.log(res.result)
assert.equal(res.statusCode, 200)
assert.ok([200, 204].includes(res.statusCode))
})

@@ -135,0 +135,0 @@

@@ -10,5 +10,9 @@ 'use strict'

import Nameserver from './lib/nameserver.js'
import Zone from './lib/zone.js'
// import ZoneRecord from './lib/zone_record.js'
import groupCase from './lib/test/group.json' with { type: 'json' }
import userCase from './lib/test/user.json' with { type: 'json' }
import zoneCase from './lib/test/zone.json' with { type: 'json' }
// import zrCase from './lib/test/zone_record.json' with { type: 'json' }
import groupCaseR from './routes/test/group.json' with { type: 'json' }

@@ -51,2 +55,4 @@ import userCaseR from './routes/test/user.json' with { type: 'json' }

async function teardown() {
// await ZoneRecord.destroy({ id: zrCase.id })
await Zone.destroy({ id: zoneCase.id })
await Nameserver.destroy({ id: nsCaseR.id })

@@ -53,0 +59,0 @@ await Nameserver.destroy({ id: nsCaseR.id - 1 })

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc