Skip to content

Commit

Permalink
test TOS acceptance
Browse files Browse the repository at this point in the history
  • Loading branch information
finn-block committed Nov 17, 2023
1 parent 5764b43 commit efe1da6
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 8 deletions.
23 changes: 20 additions & 3 deletions src/tenant-gate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export class TenantGate {
return true;
}

async authorizeTenant(tenant: string): Promise<void> {
async authorizeTenantPOW(tenant: string): Promise<void> {
await this.#db
.insertInto('authorizedTenants')
.values({
Expand Down Expand Up @@ -166,7 +166,7 @@ export class TenantGate {
}

try {
await this.authorizeTenant(body.did);
await this.authorizeTenantPOW(body.did);
} catch (e) {
console.log('error inserting did', e);
res.status(500).json({ success: false });
Expand Down Expand Up @@ -202,7 +202,8 @@ export class TenantGate {

if (body.tosHash != this.#tosHash) {
res.status(400).json({
error: 'incorrect TOS hash',
success: false,
reason: 'incorrect TOS hash',
});
}

Expand All @@ -218,6 +219,22 @@ export class TenantGate {
})),
)
.executeTakeFirst();
res.status(200).json({ success: true });
}

async authorizeTenantTOS(tenant: string): Promise<void> {
await this.#db
.insertInto('authorizedTenants')
.values({
did: tenant,
tos: this.#tosHash,
})
.onConflict((oc) =>
oc.column('did').doUpdateSet((eb) => ({
tos: eb.ref('excluded.tos'),
})),
)
.executeTakeFirst();
}
}

Expand Down
39 changes: 39 additions & 0 deletions tests/fixtures/tos.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla eget efficitur lorem. Duis vel viverra urna. In eget lobortis arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi aliquet purus non lacus scelerisque pellentesque. Nullam tempus arcu auctor nisi placerat cursus. Nunc sed odio sit amet dui eleifend iaculis. Sed enim augue, suscipit non metus eu, vehicula maximus enim. Sed auctor rhoncus tortor ac commodo. Nulla suscipit justo vel purus faucibus varius. Vestibulum mollis, libero vel scelerisque maximus, justo diam laoreet est, elementum suscipit nulla massa quis odio. Nam at consequat ipsum, in rhoncus diam. Suspendisse mattis augue id luctus tincidunt. Vivamus fringilla nisl imperdiet ligula tincidunt eleifend.

Nam et convallis ipsum. Aenean cursus porta rutrum. Nam efficitur a risus ut gravida. Nulla viverra molestie porta. Suspendisse et risus vitae ante hendrerit tempus. Mauris iaculis magna eros, ac lacinia nisl elementum non. Suspendisse ultrices, libero quis faucibus facilisis, purus dolor aliquet nibh, vel scelerisque dolor ante maximus nulla. Aenean nec porta nisi. Nulla suscipit augue sit amet enim eleifend gravida. Quisque tristique finibus mattis. Quisque faucibus eros id nisl lobortis, at rhoncus dui ullamcorper. Phasellus vel risus malesuada, molestie elit eu, condimentum erat. Ut vel elit eu elit pellentesque luctus. Duis venenatis vehicula nisi, in iaculis mi eleifend at. Quisque arcu velit, suscipit in urna sit amet, ullamcorper malesuada ipsum. Donec maximus orci eget tellus blandit, sed tincidunt ante scelerisque.

Curabitur rhoncus egestas consequat. Nunc sed ex turpis. Aliquam rhoncus fringilla arcu id dictum. Nullam dignissim lorem non lectus tempor porttitor. Donec nec nisl nec enim pulvinar tristique. Pellentesque tincidunt sem quis ex varius, quis viverra eros semper. Donec tristique tortor et odio placerat, a auctor nunc interdum. Fusce ultricies ut orci nec viverra. Sed a ex purus. Nunc id dolor eu ante posuere commodo.

Nullam neque magna, maximus sit amet luctus nec, laoreet ac arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam semper posuere laoreet. Curabitur orci velit, venenatis non metus eu, semper varius mi. Quisque non leo non quam molestie commodo ac lobortis turpis. Vestibulum rhoncus iaculis leo, eu tincidunt purus pretium ut. Cras eleifend metus sit amet mi suscipit consequat vel vitae diam. Ut iaculis ullamcorper leo in tincidunt.

Morbi sem ex, vehicula ut augue et, interdum placerat quam. Sed ac ligula nulla. Ut rhoncus dapibus ipsum, sit amet condimentum turpis fermentum ut. Sed in nulla at ipsum vulputate tincidunt vel in ante. Donec nec suscipit nunc. Ut ultricies sem quis metus finibus pharetra. Vestibulum vestibulum nibh augue, ut pellentesque nisi congue at. Etiam pretium dolor ac fringilla cursus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vestibulum posuere placerat pharetra. Vestibulum tempus massa ac nulla pretium, id gravida felis luctus. Sed venenatis sollicitudin odio. Phasellus pellentesque ornare semper. Aenean libero turpis, varius et sapien sed, cursus laoreet lacus. Integer diam tortor, placerat interdum nunc quis, hendrerit tincidunt massa.

Suspendisse et lacus elit. Nunc finibus dolor eget mattis lacinia. Fusce ac libero orci. Vestibulum gravida ligula eget sem venenatis fermentum. Fusce auctor volutpat est a dignissim. Nam eu mollis quam, in imperdiet mi. Mauris nec purus turpis. Nam volutpat metus ac eros eleifend malesuada. Aenean ut erat non lectus suscipit fringilla ac vel ipsum. Donec non mauris quis sem iaculis facilisis. Mauris convallis orci rutrum elit maximus imperdiet.

Integer pellentesque non diam aliquet semper. Mauris ornare, quam vel condimentum pulvinar, purus quam rhoncus ipsum, sed congue dolor lorem in lectus. Pellentesque sed congue sapien. Aenean vitae lectus mollis, molestie purus vitae, tristique diam. Cras tristique consequat orci sit amet laoreet. Donec porta, risus sed fringilla tincidunt, dui magna mattis mauris, sed dignissim libero magna semper velit. Nullam enim tortor, interdum ac lacus eget, pulvinar volutpat libero. Mauris auctor lacinia tortor. Fusce at dolor sit amet dui pellentesque facilisis at ut nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Praesent dictum risus eget enim bibendum, sed cursus orci faucibus.

Pellentesque pulvinar, massa ac tincidunt consequat, enim lacus varius turpis, ut pellentesque nulla nulla ac leo. Pellentesque ac tincidunt neque, sit amet tempor mi. Phasellus imperdiet ornare lacus. Nam viverra vel ligula sed gravida. Aliquam in orci scelerisque, malesuada lorem tristique, hendrerit urna. In vel lacus tortor. Quisque ornare sem a orci convallis interdum. Aenean maximus laoreet velit sed laoreet. Aenean pellentesque a quam imperdiet sagittis. Sed et ultrices arcu, eget molestie lacus. Nullam cursus eros id metus porttitor ullamcorper. Nulla mattis dui ac nibh varius dapibus. Vestibulum quis pharetra ipsum. Morbi cursus sagittis nunc vitae luctus. Suspendisse gravida lacinia diam, ac venenatis justo varius eget. Sed sodales erat justo, ac tincidunt ante commodo eu.

Quisque elit massa, commodo eget rhoncus sit amet, porta vel nunc. Vestibulum id leo leo. Aenean ac est ut justo tincidunt mattis quis sed leo. Nunc libero turpis, congue ut ligula sed, laoreet cursus mi. Pellentesque blandit eget est vel porta. Pellentesque malesuada, magna eu vulputate pharetra, nulla odio mollis nisl, vel rhoncus dui dolor volutpat elit. Aliquam tincidunt ultricies massa, vel finibus turpis aliquet ut. Nunc id nulla et risus pretium blandit. Pellentesque blandit rutrum ornare. Ut id venenatis urna. Interdum et malesuada fames ac ante ipsum primis in faucibus. In maximus, tellus mollis dictum malesuada, lacus lectus blandit orci, id varius tellus libero non nisi. Sed maximus pellentesque vulputate. Praesent placerat, ligula vitae semper feugiat, mi quam finibus lacus, quis maximus tortor ex id lectus. Morbi dapibus eget orci tristique efficitur. Etiam dui magna, efficitur quis venenatis ac, suscipit eu orci.

Aliquam turpis mi, luctus ut auctor vel, finibus sed neque. Integer eleifend sit amet justo vehicula sollicitudin. Aenean nec rutrum magna. In bibendum turpis ullamcorper, commodo metus nec, eleifend neque. Vivamus a interdum massa, ac tincidunt nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque imperdiet, magna ac volutpat mattis, velit lacus rhoncus nisl, quis vehicula justo purus vel eros. Morbi ut dapibus justo, in cursus mauris. Curabitur imperdiet iaculis convallis. Ut mauris diam, venenatis non convallis et, euismod sed ex. Mauris tellus sapien, fermentum a mollis eu, sagittis non mi. Nunc ac vulputate purus. Phasellus orci tellus, interdum sit amet nunc in, vehicula convallis lacus. Curabitur nisl orci, gravida ut turpis a, bibendum molestie eros.

Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut tempor vitae sapien ac sagittis. Vivamus imperdiet, est non venenatis blandit, justo tortor porttitor purus, nec pulvinar lectus ligula ut enim. Donec non erat id velit maximus imperdiet vel vitae quam. Duis eu efficitur massa. Fusce nec sem scelerisque, egestas lectus id, lacinia nunc. Vestibulum sollicitudin consectetur lectus. Donec tempor interdum faucibus. Morbi eget eleifend arcu.

Phasellus ut auctor elit. Vivamus pretium nulla a bibendum rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed justo odio, egestas quis felis vel, mollis pretium mauris. Integer lacinia odio porta justo auctor lacinia. Quisque faucibus eu nisi vel imperdiet. Curabitur et urna orci. Quisque vestibulum interdum ligula, ut rutrum mauris gravida id. Pellentesque iaculis mi in laoreet egestas. Donec lobortis facilisis eros, vel ultricies odio luctus vel. Curabitur in leo nunc. Donec hendrerit risus vitae augue hendrerit lobortis. In scelerisque tempus nunc, eu pellentesque lacus.

Nunc nunc purus, suscipit non dignissim ac, cursus vitae metus. Nulla fringilla leo in libero mollis posuere. Phasellus ornare dignissim risus, at efficitur nisl porta et. Donec mollis fringilla massa, sed venenatis libero vehicula id. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed condimentum turpis ipsum. Ut consectetur turpis orci, sed tincidunt quam maximus nec. Curabitur fermentum nisi in dolor elementum aliquam. Integer dictum pharetra lectus at malesuada. Nunc tincidunt nunc ac bibendum semper. In fringilla purus ex, vel egestas justo vehicula nec. Cras non justo leo. Fusce posuere sapien eget felis dictum semper. Donec hendrerit condimentum magna vel faucibus.

Maecenas tempor auctor augue, vitae lobortis lacus gravida sit amet. Nam ac mi nec sem ultricies luctus in et odio. Cras nibh nulla, finibus non ex et, accumsan euismod libero. Cras pretium ex sit amet sem luctus, sed ultrices enim posuere. Donec faucibus, mauris eu lacinia congue, lectus velit cursus est, ac vestibulum metus dolor eget nisl. Morbi varius quam a sem ullamcorper malesuada. Maecenas velit nibh, accumsan a eleifend ut, iaculis quis magna. Nam ante tortor, venenatis et dignissim sit amet, ornare eget mi. Morbi nec dui nisi.

Integer scelerisque dictum lectus, sit amet feugiat eros pharetra a. Donec scelerisque nibh eget mi venenatis, a bibendum tortor rhoncus. Sed eleifend sit amet quam vitae ullamcorper. Integer libero mi, imperdiet eu ornare vitae, eleifend et orci. Nullam a rutrum dui. Donec eu finibus purus, eu lacinia nunc. Donec nec velit a massa ullamcorper ultrices a a augue. In hac habitasse platea dictumst. Morbi euismod purus at ipsum sollicitudin ullamcorper. Sed interdum dolor vel feugiat consequat. Praesent ac urna malesuada, bibendum turpis suscipit, blandit lacus. Maecenas placerat nisl facilisis pretium dignissim.

Nunc nec sapien malesuada, malesuada nibh vitae, fringilla libero. Aliquam lobortis hendrerit leo, ut dignissim orci. Nunc ut dui nec tellus imperdiet bibendum. In vitae diam et urna luctus viverra in sit amet dui. Nulla ligula dui, laoreet non tempus nec, feugiat sit amet dolor. In condimentum posuere urna, at iaculis enim mollis eu. Ut consectetur odio at congue vulputate. Maecenas iaculis, ex sed fermentum mollis, neque urna pulvinar tellus, ac porttitor lacus dui ut est. Aliquam erat volutpat. Morbi vel tellus eu purus blandit blandit vitae vel elit. Sed est erat, sodales a sollicitudin at, semper vel dui. Pellentesque posuere nibh erat, ac finibus purus mattis id. Aliquam sagittis varius enim, id dignissim mauris hendrerit ut.

Nam in posuere ligula. Pellentesque vehicula vulputate libero, ac porta risus mollis in. Aenean euismod nunc ut nisl interdum elementum. Fusce interdum imperdiet imperdiet. Donec sed massa vitae nunc iaculis rutrum. Quisque scelerisque commodo congue. Aenean porttitor elementum dolor, in accumsan elit pretium sit amet.

Maecenas vitae est eget ex venenatis posuere. Fusce elementum turpis nec maximus semper. Nunc ultricies pulvinar mauris, vel rhoncus lorem molestie vitae. Sed sit amet facilisis urna. Cras ultrices lacus nec porttitor euismod. Ut elementum scelerisque tempor. Phasellus id elit viverra, tincidunt ex eget, vestibulum ligula. Integer non purus purus. Vestibulum dignissim posuere ligula ut vulputate.

Fusce pretium felis in ullamcorper egestas. Sed sit amet gravida metus. Donec hendrerit tellus nec elit hendrerit, a tempor urna mattis. Donec mattis lobortis nulla, sit amet facilisis arcu euismod in. Nunc eget porttitor orci, a varius augue. Aliquam et aliquet eros, ac euismod mauris. Ut ac lacus est. Integer neque odio, efficitur vel tempus id, placerat quis magna. Donec a quam turpis. Ut eget mi maximus, fermentum mauris a, auctor massa.

Quisque a tempus eros. Suspendisse mi felis, feugiat vestibulum bibendum vel, pellentesque sit amet risus. Nam commodo, elit molestie suscipit tristique, diam magna blandit nulla, ut tincidunt dui enim efficitur est. Curabitur rhoncus justo at lorem scelerisque porttitor. Aliquam vitae egestas nibh. Morbi at magna porttitor, cursus leo quis, hendrerit dui. Nulla accumsan libero ac lobortis bibendum. Pellentesque vel velit nunc. Duis volutpat posuere tellus ut tincidunt.
88 changes: 84 additions & 4 deletions tests/http-api.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import {
import type { Dwn } from '@tbd54566975/dwn-sdk-js';

import { expect } from 'chai';
import { createHash } from 'crypto';
import { readFileSync } from 'fs';
import type { Server } from 'http';
import fetch from 'node-fetch';
import { webcrypto } from 'node:crypto';
Expand Down Expand Up @@ -54,15 +56,16 @@ describe('http api', function () {
clock = useFakeTimers({ shouldAdvanceTime: true });

config.registrationRequirementPow = true;
const testdwn = await getTestDwn(true);
const testdwn = await getTestDwn(true, true);
dwn = testdwn.dwn;
tenantGate = testdwn.tenantGate;

httpApi = new HttpApi(dwn, tenantGate);

await tenantGate.initialize();
profile = await createProfile();
tenantGate.authorizeTenant(profile.did);
await tenantGate.authorizeTenantPOW(profile.did);
await tenantGate.authorizeTenantTOS(profile.did);
});

beforeEach(async function () {
Expand Down Expand Up @@ -159,7 +162,7 @@ describe('http api', function () {

it('increase complexity as more challenges are completed', async function () {
for (let i = 1; i <= 60; i++) {
tenantGate.authorizeTenant((await createProfile()).did);
tenantGate.authorizeTenantPOW((await createProfile()).did);
}

const p = await createProfile();
Expand Down Expand Up @@ -272,7 +275,7 @@ describe('http api', function () {
expect(submitResponse.status).to.equal(401);
});

it('rejects unauthorized tenants', async function () {
it('rejects tenants that have not accepted the TOS and have not completed POW', async function () {
const unauthorized = await createProfile();
const recordsQuery = await RecordsQuery.create({
filter: { schema: 'woosa' },
Expand All @@ -294,6 +297,83 @@ describe('http api', function () {
expect(response.body.id).to.equal(requestId);
expect(response.body.result.reply.status.code).to.equal(401);
});

it('rejects tenants that have accepted the TOS but not completed POW', async function () {
const unauthorized = await createProfile();
await tenantGate.authorizeTenantTOS(unauthorized.did);
const recordsQuery = await RecordsQuery.create({
filter: { schema: 'woosa' },
signer: unauthorized.signer,
});

const requestId = uuidv4();
const dwnRequest = createJsonRpcRequest(requestId, 'dwn.processMessage', {
message: recordsQuery.toJSON(),
target: unauthorized.did,
});

const response = await request(httpApi.api)
.post('/')
.set('dwn-request', JSON.stringify(dwnRequest))
.send();

expect(response.statusCode).to.equal(200);
expect(response.body.id).to.equal(requestId);
expect(response.body.result.reply.status.code).to.equal(401);
});
});

describe('/register/tos', function () {
it('correctly accept tos', async function () {
const response = await fetch('http://localhost:3000/register/tos');
expect(response.status).to.equal(200);

const terms = await response.text();

expect(terms).to.equal(
readFileSync('./tests/fixtures/tos.txt').toString(),
);

const hash = createHash('sha256');
hash.update(terms);

const p = await createProfile();

const acceptResponse = await fetch('http://localhost:3000/register/tos', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
did: p.did,
tosHash: hash.digest('hex'),
}),
});

expect(acceptResponse.status).to.equal(200);
}).timeout(30000);

it('rejects tenants that have completed POW but have not accepted the TOS', async function () {
const unauthorized = await createProfile();
await tenantGate.authorizeTenantPOW(unauthorized.did);
const recordsQuery = await RecordsQuery.create({
filter: { schema: 'woosa' },
signer: unauthorized.signer,
});

const requestId = uuidv4();
const dwnRequest = createJsonRpcRequest(requestId, 'dwn.processMessage', {
message: recordsQuery.toJSON(),
target: unauthorized.did,
});

const response = await request(httpApi.api)
.post('/')
.set('dwn-request', JSON.stringify(dwnRequest))
.send();

expect(response.statusCode).to.equal(200);
expect(response.body.id).to.equal(requestId);
expect(response.body.result.reply.status.code).to.equal(401);
});
});

describe('/ (rpc)', function () {
Expand Down
9 changes: 8 additions & 1 deletion tests/test-dwn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import {
MessageStoreSql,
} from '@tbd54566975/dwn-sql-store';

import { readFileSync } from 'node:fs';

import { getDialectFromURI } from '../src/storage.js';
import { TenantGate } from '../src/tenant-gate.js';

Expand All @@ -19,7 +21,12 @@ export async function getTestDwn(
const dataStore = new DataStoreSql(db);
const eventLog = new EventLogSql(db);
const messageStore = new MessageStoreSql(db);
const tenantGate = new TenantGate(db, powRequired, tosRequired);
const tenantGate = new TenantGate(
db,
powRequired,
tosRequired,
tosRequired ? readFileSync('./tests/fixtures/tos.txt').toString() : null,
);

let dwn: Dwn;
try {
Expand Down

0 comments on commit efe1da6

Please sign in to comment.