diff --git a/.gitignore b/.gitignore index 7de2bb5..d9c993a 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,8 @@ build/ node_modules bundle.js bundle.min.js +adminBundle.js +adminBundle.min.js worker.js node src/main/javascript/node/ diff --git a/src/main/frontend/admin/main.ts b/src/main/frontend/admin/main.ts index 6228e96..60cfdd0 100644 --- a/src/main/frontend/admin/main.ts +++ b/src/main/frontend/admin/main.ts @@ -1,10 +1,12 @@ import { changePassphrase } from "./pages/user/ChangePassphrase"; import { EncryptionServiceFactory } from "../common/service/EncryptionServiceFactory"; import log from "loglevel"; +import { AlertifyNotificationService } from "../common/service/AlertifyNotificationService"; log.setLevel("TRACE"); const es = EncryptionServiceFactory.getEncryptionService(); +const ns = new AlertifyNotificationService(); $("#changePassphraseForm").on("submit", (event) => { event.preventDefault(); - changePassphrase(es); + changePassphrase(es, ns); }); diff --git a/src/main/frontend/admin/pages/user/ChangePassphrase.ts b/src/main/frontend/admin/pages/user/ChangePassphrase.ts index 7afe9bb..89ca126 100644 --- a/src/main/frontend/admin/pages/user/ChangePassphrase.ts +++ b/src/main/frontend/admin/pages/user/ChangePassphrase.ts @@ -1,6 +1,4 @@ import { EncryptionService } from "../../../common/service/EncryptionService"; -import { Routes } from "../../../common/routes/Routes"; -import { ChatMessageDTO } from "../../../common/dto/ChatMessageDTO"; import { ReencryptionDTO, DecryptedDTO, @@ -8,8 +6,17 @@ import { import { Credentials } from "../../../common/global/Credentials"; import { MessageCipher } from "../../../common/entity/MessageCipher"; import log from "loglevel"; +import { NotificationService } from "../../../common/service/NotificationService"; +import { isPassphraseValid } from "../../../common/ajax/passphrase"; +import { + getAllMessages, + sendReencryptedMessages, +} from "../../../common/ajax/messages"; -export async function changePassphrase(es: EncryptionService) { +export async function changePassphrase( + es: EncryptionService, + ns: NotificationService +): Promise { // $("#changePassphraseForm").val(); const user = @@ -19,7 +26,14 @@ export async function changePassphrase(es: EncryptionService) { const passphraseOld: string = $("#passphraseOld").val() as string; const passphraseNew: string = $("#passphraseNew").val() as string; - log.debug(Credentials.authToken); + const valid = await isPassphraseValid(passphraseOld, user, es); + + if (!valid) { + log.error("Please check your passphrase"); + ns.error("Please check your passphrase"); + return; + } + const messages = await getAllMessages(user, Credentials.authToken); const decrypted = Promise.all( @@ -41,6 +55,7 @@ export async function changePassphrase(es: EncryptionService) { log.debug(reencrypted); + /* Uncomment to see the reencryption result const decryptedAgain = Promise.all( reencrypted.map(async (m) => { return es.decryptAsPromise(passphraseNew, m.messageCipher); @@ -48,49 +63,9 @@ export async function changePassphrase(es: EncryptionService) { ); const deb = await decryptedAgain; - log.debug(deb); + log.debug(deb); */ sendReencryptedMessages(reencrypted, Credentials.authToken); -} - -async function getAllMessages(user: string, authToken: string) { - let headers = new Headers(); - // headers.append('Accept','application/json') - // headers.append('Content-Type', 'application/json'); - headers.append("X-AUTH-TOKEN", authToken); - let response = await fetch(`${Routes.Admin.getAllMessagesURL}${user}`, { - method: "GET", - headers: headers, - }); - return response.json() as Promise; -} - -async function getAllRegularUsers(authToken: string) { - let headers = new Headers(); - // headers.append('Accept','application/json') - // headers.append('Content-Type', 'application/json'); - headers.append("X-AUTH-TOKEN", authToken); - let response = await fetch(`${Routes.Admin.getAllRegularUsersURL}`, { - method: "GET", - headers: headers, - }); - let data = (await response.json()) as string[]; - return data; -} - -function sendReencryptedMessages( - rrencryptionDTOs: ReencryptionDTO[], - authToken: string -) { - let headers = new Headers(); - // console.log("Token = " + btoa("hmm" + ":" + "hmm")) - // headers.append('Accept','application/json') - headers.append("Content-Type", "application/json"); - headers.append("X-AUTH-TOKEN", authToken); - fetch(Routes.Admin.reencryptURL, { - method: "POST", - headers: headers, - body: JSON.stringify(rrencryptionDTOs), - }).then((response) => console.log(response)); + ns.success("Successfully changed passphrase"); } diff --git a/src/main/frontend/chat/model/ChatModel.ts b/src/main/frontend/chat/model/ChatModel.ts index 8ad923c..e03caa3 100644 --- a/src/main/frontend/chat/model/ChatModel.ts +++ b/src/main/frontend/chat/model/ChatModel.ts @@ -141,7 +141,7 @@ export class ChatModel implements Subject { } } - public someBusinessMethod(chatMessageList: ChatMessageViewModel[]): void { } + public someBusinessMethod(chatMessageList: ChatMessageViewModel[]): void {} public clear(): void { log.info("Clearing model"); diff --git a/src/main/frontend/common/ajax/messages.ts b/src/main/frontend/common/ajax/messages.ts new file mode 100644 index 0000000..b8d3b2c --- /dev/null +++ b/src/main/frontend/common/ajax/messages.ts @@ -0,0 +1,82 @@ +import { Sprintf } from "../global/Sprintf"; +import { Routes } from "../routes/Routes"; +import { ReencryptionDTO } from "../dto/ReencryptionDTO"; +import { ChatMessageDTO } from "../dto/ChatMessageDTO"; +import { JsonAPI } from "../../chat/singleton/JsonAPI"; +import * as log from "loglevel"; + +export async function getAllMessages(user: string, authToken: string) { + let headers = new Headers(); + // headers.append('Accept','application/json') + // headers.append('Content-Type', 'application/json'); + headers.append("X-AUTH-TOKEN", authToken); + let response = await fetch(`${Routes.Admin.getAllMessagesURL}${user}`, { + method: "GET", + headers: headers, + }); + return response.json() as Promise; +} + +async function getAllRegularUsers(authToken: string) { + let headers = new Headers(); + // headers.append('Accept','application/json') + // headers.append('Content-Type', 'application/json'); + headers.append("X-AUTH-TOKEN", authToken); + let response = await fetch(`${Routes.Admin.getAllRegularUsersURL}`, { + method: "GET", + headers: headers, + }); + let data = (await response.json()) as string[]; + return data; +} + +export async function sendReencryptedMessages( + rencryptionDTOs: ReencryptionDTO[], + authToken: string +) { + let headers = new Headers(); + // console.log("Token = " + btoa("hmm" + ":" + "hmm")) + + // headers.append('Accept','application/json') + headers.append("Content-Type", "application/json"); + headers.append("X-AUTH-TOKEN", authToken); + fetch(Routes.Admin.reencryptURL, { + method: "POST", + headers: headers, + body: JSON.stringify(rencryptionDTOs), + }).then((response) => console.log(response)); +} + +export async function getOneMessage( + toUser: string, + page: number +): Promise { + const headers = new Headers(); + if (JsonAPI.authToken == null) { + log.error("authToken null"); + return []; + } + headers.append("X-AUTH-TOKEN", JsonAPI.authToken); + const url = Sprintf(JsonAPI.CHAT_MESSAGE_PAGE_GET, toUser, page, 1); + log.debug(url); + const response = await fetch(url, { + method: "GET", + headers: headers, + }); + log.debug(response.clone()); + // if (fetchErrorHandler(response.clone(), this._notificationService)) { + // return null; + // } + const data: Promise = await response.json(); + function func(data: any) { + const d1 = data.map((d: any) => { + if (d.messageTime == null) return null; + + d.messageTime = new Date(d.messageTime); + return d; + }); + return d1; + } + const data2 = func(data); + return data2; +} diff --git a/src/main/frontend/common/ajax/passphrase.ts b/src/main/frontend/common/ajax/passphrase.ts new file mode 100644 index 0000000..cd02bbd --- /dev/null +++ b/src/main/frontend/common/ajax/passphrase.ts @@ -0,0 +1,20 @@ +import { EncryptionService } from "../service/EncryptionService"; +import { ChatMessageDTO } from "../dto/ChatMessageDTO"; +import * as log from "loglevel"; +import { getOneMessage } from "./messages"; + +export async function isPassphraseValid( + passphrase: string, + userName: string, + es: EncryptionService +): Promise { + const messages: ChatMessageDTO[] = await getOneMessage(userName, 0); + if (messages.length === 0) return true; + try { + es.decrypt(passphrase, messages[0].messageCipher); + } catch (error) { + log.debug("here"); + return false; + } + return true; +}