Skip to content

Commit

Permalink
#36 ddnsserver update
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefan Werfling committed Oct 17, 2023
1 parent 92cc278 commit 7907bcb
Show file tree
Hide file tree
Showing 10 changed files with 146 additions and 14 deletions.
13 changes: 13 additions & 0 deletions backend/src/Routes/Main/DynDnsServer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import {DefaultRoute} from 'flyingfish_core';
import {Router} from 'express';
import {SchemaDynDnsServerData} from 'flyingfish_schemas';
import {List} from './DynDnsServer/List.js';
import {Save} from './DynDnsServer/Save.js';

/**
* DynDnsServer
Expand All @@ -20,6 +22,17 @@ export class DynDnsServer extends DefaultRoute {
}
);

this._post(
'/json/dyndnsclient/save',
async(req, res) => {
if (this.isUserLogin(req, res)) {
if (this.isSchemaValidate(SchemaDynDnsServerData, req.body, res)) {
res.status(200).json(await Save.saveUser(req.body));
}
}
}
);

return super.getExpressRouter();
}

Expand Down
3 changes: 1 addition & 2 deletions backend/src/Routes/Main/DynDnsServer/List.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ export class List {
password: user.password,
last_update: user.last_update
},
domains: domainList,
last_update: user.last_update
domains: domainList
});
}
}
Expand Down
95 changes: 92 additions & 3 deletions backend/src/Routes/Main/DynDnsServer/Save.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,99 @@
import {DefaultReturn, StatusCodes} from 'flyingfish_schemas';
import * as bcrypt from 'bcrypt';
import {
DynDnsClientDomainServiceDB, DynDnsServerDomainDB,
DynDnsServerDomainServiceDB,
DynDnsServerUserDB,
DynDnsServerUserServiceDB
} from 'flyingfish_core';
import {DefaultReturn, DynDnsServerData, StatusCodes} from 'flyingfish_schemas';

export class Save {

public async saveUser(): Promise<DefaultReturn> {
public static async saveUser(data: DynDnsServerData): Promise<DefaultReturn> {
let user: DynDnsServerUserDB|null = null;

if (data.user.id > 0) {
const tuser = await DynDnsServerUserServiceDB.getInstance().findOne(data.user.id);

if (tuser) {
user = tuser;
}
}

if (user === null) {
user = new DynDnsServerUserDB();
}

// check username only one exist -------------------------------------------------------------------------------

const userByName = await DynDnsServerUserServiceDB.getInstance().findByName(data.user.username);

if (userByName) {
if ((data.user.id > 0) && (data.user.id !== userByName.id)) {
return {
statusCode: StatusCodes.INTERNAL_ERROR,
msg: 'Username is already in use.'
};
}
}

// -------------------------------------------------------------------------------------------------------------

user.username = data.user.username;

if (data.user.password && data.user.password !== '') {
user.password = await bcrypt.hash(data.user.password, 10);
}

user = await DynDnsServerUserServiceDB.getInstance().save(user);

if (user) {
if (data.domains.length === 0) {
await DynDnsServerDomainServiceDB.getInstance().removeByUserId(user.id);
} else {
const odomains = await DynDnsServerDomainServiceDB.getInstance().findByUser(user.id);

if (odomains) {
const checkDomainExistence = (domainId: number): boolean => data.domains.some(({id}) => id ===
domainId);

for await (const oldDomain of odomains) {
if (!checkDomainExistence(oldDomain.domain_id)) {
await DynDnsServerDomainServiceDB.getInstance().remove(oldDomain.id);
}
}
}

// update or add ---------------------------------------------------------------------------------------

for await (const domain of data.domains) {
let newDomain: DynDnsServerDomainDB|null = null;

const tdomain = await DynDnsServerDomainServiceDB.getInstance().findByDomainId(domain.id, user.id);

if (tdomain) {
newDomain = tdomain;
}

if (newDomain === null) {
newDomain = new DynDnsServerDomainDB();
}

newDomain.user_id = user.id;
newDomain.domain_id = domain.id;

await DynDnsServerDomainServiceDB.getInstance().save(newDomain);
}
}

return {
statusCode: StatusCodes.OK
};
}

return {
statusCode: StatusCodes.OK
statusCode: StatusCodes.INTERNAL_ERROR,
msg: 'User data can not save.'
};
}

Expand Down
31 changes: 29 additions & 2 deletions core/src/inc/Db/MariaDb/DynDnsServerDomainService.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import {DeleteResult} from 'typeorm';
import {DBService} from './DBService.js';
import {DynDnsServerDomain} from './Entity/DynDnsServerDomain.js';

Expand All @@ -23,8 +24,8 @@ export class DynDnsServerDomainService extends DBService<DynDnsServerDomain> {
}

/**
* findByUser
* @param userid
* Find all entries by user ID.
* @param {number} userid - DynDns Server user ID.
*/
public async findByUser(userid: number): Promise<DynDnsServerDomain[]> {
return this._repository.find({
Expand All @@ -34,4 +35,30 @@ export class DynDnsServerDomainService extends DBService<DynDnsServerDomain> {
});
}

/**
* Remove all domain links by user ID.
* @param {number} userId - DynDns Server user ID.
* @returns {DeleteResult}
*/
public async removeByUserId(userId: number): Promise<DeleteResult> {
return this._repository.delete({
user_id: userId
});
}

/**
* Find domain by user ID and domain ID.
* @param {number} domainId
* @param {number} userId
* @returns {DynDnsServerDomain|null}
*/
public async findByDomainId(domainId: number, userId: number): Promise<DynDnsServerDomain|null> {
return this._repository.findOne({
where: {
domain_id: domainId,
user_id: userId
}
});
}

}
2 changes: 1 addition & 1 deletion core/src/inc/Db/MariaDb/Entity/DynDnsServerDomain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {DBBaseEntityId} from '../DBBaseEntityId.js';
/**
* DynDnsServerDomain
*/
@Entity({name: 'dyndnsserver_domain'})
@Entity({name: 'dyndns_server_domain'})
export class DynDnsServerDomain extends DBBaseEntityId {

/**
Expand Down
2 changes: 1 addition & 1 deletion core/src/inc/Db/MariaDb/Entity/DynDnsServerUser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {DBBaseEntityId} from '../DBBaseEntityId.js';
/**
* DynDnsServerUser
*/
@Entity({name: 'ddns_user'})
@Entity({name: 'dyndns_server_user'})
export class DynDnsServerUser extends DBBaseEntityId {

/**
Expand Down
2 changes: 2 additions & 0 deletions ddnsserver/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"homepage": "https://github.com/stefanwerfling/flyingfish#readme",
"devDependencies": {
"@types/basic-auth": "^1.1.3",
"@types/bcrypt": "^5.0.0",
"@types/cookie-parser": "^1.4.3",
"@types/express": "^4.17.17",
"@types/express-session": "^1.17.7",
Expand All @@ -35,6 +36,7 @@
},
"dependencies": {
"basic-auth": "^2.0.1",
"bcrypt": "^5.1.0",
"cookie-parser": "^1.4.6",
"express": "^4.18.2",
"express-rate-limit": "^6.7.1",
Expand Down
7 changes: 5 additions & 2 deletions ddnsserver/src/Routes/Main/Update.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import * as bcrypt from 'bcrypt';
import {Request, Response, Router} from 'express';
import {
DateHelper,
Expand Down Expand Up @@ -152,7 +153,9 @@ export class Update extends DefaultRoute {
if (ddnsUser) {
Logger.getLogger().silly(`Update::nic-update: basic auth - user found by id: ${ddnsUser.id}`);

if (ddnsUser.password === credentials.pass) {
const bresult = await bcrypt.compare(credentials.pass, ddnsUser.password);

if (bresult) {
Logger.getLogger().silly(`Update::nic-update: password accept for user id: ${ddnsUser.id}`);
granted = true;
userId = ddnsUser.id;
Expand All @@ -174,7 +177,7 @@ export class Update extends DefaultRoute {
req.session.user.userid = userId;
req.session.user.isLogin = true;

Update.setNicUpdate(req, req.session, res);
await Update.setNicUpdate(req, req.session, res);
}
} else {
res.set('WWW-Authenticate', 'Basic realm="401"');
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/inc/Pages/DynDnsServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ export class DynDnsServer extends BasePage {
domainsTd.append('&nbsp;');
}

const date = moment(entry.last_update * 1000);
const date = moment(entry.user.last_update * 1000);

// eslint-disable-next-line no-new
new Td(trbody, date.format('<b>YYYY-MM-DD</b> HH:mm:ss'));
Expand Down
3 changes: 1 addition & 2 deletions schemas/src/Backend/Routes/DynDnsServer/List.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ export type DynDnsServerDomain = ExtractSchemaResultType<typeof SchemaDynDnsServ
*/
export const SchemaDynDnsServerData = Vts.object({
user: SchemaDynDnsServerUser,
domains: Vts.array(SchemaDynDnsServerDomain),
last_update: Vts.number()
domains: Vts.array(SchemaDynDnsServerDomain)
});

/**
Expand Down

0 comments on commit 7907bcb

Please sign in to comment.