Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
16 changes: 4 additions & 12 deletions .github/workflows/kyarasu-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,16 @@ jobs:

- uses: actions/setup-node@v3
with:
node-version: 18
node-version: 20

# Backend
- name: Install backend
run: |
cd Backend
npm install

- name: Test backend
- name: Run backend tests
run: |
cd Backend

# Frontend
- name: Install frontend
run: |
cd Frontend
npm install

- name: Test frontend
run: |
cd Frontend
npm ci
npm test -- Test
95 changes: 95 additions & 0 deletions Backend/TestSpace/Register.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
const request = require('supertest');
const express = require('express');
const cookieParser = require('cookie-parser');
const fs = require('fs');
const path = require('path');

// Register.js の存在確認
const registerPath = path.resolve(__dirname, '../Workspace/Routes/Register.js');
const registerExists = fs.existsSync(registerPath);

// describe を動的切り替え
const describeIf = registerExists ? describe : describe.skip;

// Router を条件付きで読み込み
let registerRouter;
if (registerExists) {
registerRouter = require('../Workspace/Routes/Register');
}

// DBPerfモック化
jest.mock('../Workspace/Tools/DBPerf', () => jest.fn());
const DBPerf = require('../Workspace/Tools/DBPerf');

// Symbol SDKをモック化
jest.mock('symbol-sdk', () => {
const original = jest.requireActual('symbol-sdk');
return {
...original,
PrivateKey: { random: () => 'dummy-private-key' },
Account: { createFromPrivateKey: () => ({ address: { plain: () => 'dummy-address' } }) },
NetworkType: { TEST_NET: 'TEST_NET' },
facade: { SymbolFacade: jest.fn() },
};
});

// AESControlをモック化
jest.mock('../Workspace/Tools/AESControl', () => ({
encrypt: jest.fn(() => 'encrypted-key')
}));

const app = express();
app.use(express.json());
app.use(cookieParser());

if (registerExists) {
app.use('/Register', registerRouter);
}

describeIf('/Register', () => {
// cookieがある場合
it('should redirect to Home if cookie exists', async () => {
const res = await request(app)
.get('/Register')
.set('Cookie', ['LoginToken=dummy-jwt']);

expect(res.status).toBe(302); // リダイレクト
expect(res.headers.location).toBe('/Home');
});

// cookieがない場合
it('should render register page if no cookie', async () => {
const res = await request(app)
.get('/Register');

expect(res.status).toBe(200);
expect(res.text).toContain('index.html'); // 登録画面が返る
});
});

describeIf('/Register/Submit', () => {
beforeEach(() => {
DBPerf.mockReset();
});

// 空送信
it('should return 400 if userId or password missing', async () => {
const res = await request(app).post('/Register/Submit').send({});
expect(res.status).toBe(400);
});

// 重複検知
it('should return 409 if userId exists', async () => {
DBPerf.mockResolvedValue([{ UserID: 'test' }]);
const res = await request(app).post('/Register/Submit').send({ userId: 'test', password: 'pass' });
expect(res.status).toBe(409);
});

// 登録成功処理
it('should succeed with new user', async () => {
DBPerf.mockResolvedValue([]);
const res = await request(app).post('/Register/Submit').send({ userId: 'newuser', password: 'pass' });
expect(res.status).toBe(200);
expect(res.body).toHaveProperty('redirect', '/Home');
});
});
56 changes: 56 additions & 0 deletions Backend/Workspace/Tools/AESControl.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
const crypto = require('crypto');

// ========== 暗号化 ==========
function encrypt(plainKey, plainText) {
// ① 平文1から32byteの鍵を作る
const key = crypto
.createHash('sha256')
.update(plainKey)
.digest();

// ② IV(12byteがGCM推奨)
const iv = crypto.randomBytes(12);

// ③ 暗号化
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
const encrypted = Buffer.concat([
cipher.update(plainText, 'utf8'),
cipher.final()
]);

// ④ 認証タグ
const authTag = cipher.getAuthTag();

return {
iv: iv.toString('hex'),
data: encrypted.toString('hex'),
tag: authTag.toString('hex')
};
}

// ========== 復号化 ==========
function decrypt(plainKey, encryptedObj) {
const key = crypto
.createHash('sha256')
.update(plainKey)
.digest();

const iv = Buffer.from(encryptedObj.iv, 'hex');
const encryptedText = Buffer.from(encryptedObj.data, 'hex');
const authTag = Buffer.from(encryptedObj.tag, 'hex');

const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
decipher.setAuthTag(authTag);

const decrypted = Buffer.concat([
decipher.update(encryptedText),
decipher.final()
]);

return decrypted.toString('utf8');
}

module.exports = {
encrypt,
decrypt
};
49 changes: 49 additions & 0 deletions Backend/Workspace/Tools/DBPerf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*==========Manual(/Profile/:UserID)==========
# Input
label: ログをコンソールに表示する際のわかりやすいラベルを設定する
例: "Select From Identify To Login"
query: SQL文を入力する
例: "SELECT Address, Password FROM Identify WHERE UserID = ?;"
elements: プレースホルダー用の配列を入力する
例: [userId]

# Output
JSON
例:
{
{ UserID: int, Password: "string", Status: 0 or 1},
{ UserID: int, Password: "string", Status: 0 or 1},
{ UserID: int, Password: "string", Status: 0 or 1},
...
}
========== Manual ==========*/

// DBPerf.js
async function DBPerf(label, query, elements) {
// Startup Log
const logOwner = "DBPerf";
console.log(`\n${logOwner}-Function is running!\n`);
// I/O Log
console.log(`[${logOwner}] Input => label: ${label}, query: ${query}, elements: ${elements}`);

try{
// 計測と実行
const start = Date.now();
const [result] = await db.query(query, elements);
const end = Date.now();
// 計測結果の表示
console.log(`[${logOwner}] ${label} is executed!: ${end - start} ms`);

// I/O Log(JSON.stringify(表示するJSON, 表示項目指定, インデックス空白数指定))
console.log(`[${logOwner}] Output => ${JSON.stringify(result, null, 2)}`);
// Shutdown Log
console.log(`[${logOwner}] Shutdown!`);
return result;
}catch(err){
console.error(`[${logOwner}] Error executing "${label}":`, err);
console.log(`[${logOwner}] Shutdown!`);
throw err;
}
}

module.exports = DBPerf;
1 change: 1 addition & 0 deletions Backend/node_modules/.bin/baseline-browser-mapping

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/browserslist

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/esparse

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/esvalidate

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/glob

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/import-local-fixture

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/jest

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/js-yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/jsesc

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/json5

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/mime

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/napi-postinstall

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/node-which

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/parser

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/semver

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Backend/node_modules/.bin/update-browserslist-db

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading