Skip to content

Commit

Permalink
Warn if user is using the default credentials
Browse files Browse the repository at this point in the history
  • Loading branch information
Cyberboss committed Jul 24, 2023
1 parent 17af442 commit a1fda6d
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 54 deletions.
20 changes: 15 additions & 5 deletions src/ApiClient/ServerClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,11 +321,12 @@ export default new (class ServerClient extends ApiClient<IEvents> {
// check if there's a token stored
const bearer = localStorage.getItem("SessionToken");
const expiresAt = localStorage.getItem("SessionTokenExpiry");
const defaultToken = localStorage.getItem("SessionTokenDefault") == "true";
if (bearer && expiresAt) {
console.log("Found session token");
if (Date.parse(expiresAt) >= Date.now()) {
const storedToken: TokenResponse = { bearer, expiresAt };
this.setToken(storedToken);
this.setToken(storedToken, defaultToken);
} else {
console.log("But it was expired");
}
Expand Down Expand Up @@ -403,15 +404,22 @@ export default new (class ServerClient extends ApiClient<IEvents> {
this.loggingIn = true;

let response;
let defaulted;
try {
if (CredentialsProvider.credentials.type == CredentialsType.Password)
if (CredentialsProvider.credentials.type == CredentialsType.Password) {
defaulted =
CredentialsProvider.credentials.userName.toLowerCase() ==
CredentialsProvider.default.userName.toLowerCase() &&
CredentialsProvider.credentials.password ==
CredentialsProvider.default.password;
response = await this.apiClient!.homeControllerCreateToken({
auth: {
username: CredentialsProvider.credentials.userName,
password: CredentialsProvider.credentials.password
}
});
else {
} else {
defaulted = false;
response = await this.apiClient!.homeControllerCreateToken({
headers: {
OAuthProvider: CredentialsProvider.credentials.provider,
Expand All @@ -434,7 +442,7 @@ export default new (class ServerClient extends ApiClient<IEvents> {
console.log("Login success");
const token = response.data as TokenResponse;

this.setToken(token);
this.setToken(token, defaulted);
const res = new InternalStatus<TokenResponse, ErrorCode.OK>({
code: StatusCode.OK,
payload: token
Expand Down Expand Up @@ -594,13 +602,15 @@ export default new (class ServerClient extends ApiClient<IEvents> {
}
}

private setToken(token: TokenResponse): void {
private setToken(token: TokenResponse, defaulted: boolean): void {
// CredentialsProvider.token is added to all requests in the form of Authorization: Bearer <token>

localStorage.setItem("SessionToken", token.bearer);
localStorage.setItem("SessionTokenExpiry", token.expiresAt);
localStorage.setItem("SessionTokenDefault", defaulted ? "true" : "false");

CredentialsProvider.token = token;
CredentialsProvider.defaulted = defaulted;
this.emit("tokenAvailable", token);

//LoginHooks are a way of running several async tasks at the same time whenever the user is authenticated,
Expand Down
8 changes: 7 additions & 1 deletion src/ApiClient/util/CredentialsProvider.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
import { MODE } from "../../definitions/constants";
import type { TokenResponse } from "../generatedcode/generated";
import { ICredentials } from "../models/ICredentials";
import { CredentialsType, ICredentials, IPasswordCredentials } from "../models/ICredentials";

//Data structure meant to help against circular dependencies within the ApiClient
//Its rather dumb and only holds username, password and the token.
//Also contains a function to determine if theres a token here
export default new (class CredentialsProvider {
//token
public token?: TokenResponse;
public defaulted?: boolean;

//credentials
public credentials?: ICredentials;
public default: IPasswordCredentials = {
type: CredentialsType.Password,
userName: "admin",
password: "ISolemlySwearToDeleteTheDataDirectory"
};

public isTokenValid() {
return (
Expand Down
8 changes: 1 addition & 7 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { FormattedMessage, IntlProvider } from "react-intl";
import { BrowserRouter } from "react-router-dom";

import Pkg from "./../package.json";
import { CredentialsType } from "./ApiClient/models/ICredentials";
import InternalError, {
ErrorCode,
GenericErrors
Expand Down Expand Up @@ -69,13 +68,8 @@ class InnerApp extends React.Component<InnerProps, InnerState> {
// I can't be assed to remember the default admin password
document.addEventListener("keydown", event => {
if (event.key === "L" && event.ctrlKey && event.shiftKey) {
// alert("ISolemlySwearToDeleteTheDataDirectory");
ServerClient.logout();
void ServerClient.login({
type: CredentialsType.Password,
userName: "admin",
password: "ISolemlySwearToDeleteTheDataDirectory"
});
void ServerClient.login(CredentialsProvider.default);
}
});
}
Expand Down
98 changes: 62 additions & 36 deletions src/components/views/Home.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as React from "react";
import { Alert } from "react-bootstrap";
import Card from "react-bootstrap/Card";
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import { FormattedMessage } from "react-intl";
import { Link } from "react-router-dom";

import ServerClient from "../../ApiClient/ServerClient";
import CredentialsProvider from "../../ApiClient/util/CredentialsProvider";
import RouteController from "../../utils/RouteController";
import { AppRoute, AppRoutes } from "../../utils/routes";

interface IProps {}
interface IState {
routes: Array<AppRoute>;
usingDefaultCreds: boolean;
}

export default class Home extends React.Component<IProps, IState> {
Expand All @@ -22,19 +26,34 @@ export default class Home extends React.Component<IProps, IState> {
this.setRoutes = this.setRoutes.bind(this);

this.state = {
routes: []
routes: [],
usingDefaultCreds: false
};
}

private setRoutes(routes: AppRoute[]) {
this.setState({ routes });
this.setState(prevState => {
return {
routes: routes,
usingDefaultCreds: prevState.usingDefaultCreds
};
});
}

public async componentDidMount(): Promise<void> {
this.setState({
routes: await RouteController.getRoutes(false)
});
RouteController.on("refreshAll", this.setRoutes);

await ServerClient.wait4Token();
const usingDefaultCreds = CredentialsProvider.defaulted || false;
this.setState(prevState => {
return {
routes: prevState.routes,
usingDefaultCreds: usingDefaultCreds
};
});
}

public componentWillUnmount(): void {
Expand All @@ -43,43 +62,50 @@ export default class Home extends React.Component<IProps, IState> {

public render(): React.ReactNode {
return (
<Row xs={1} sm={2} md={3} lg={4} className="justify-content-center">
{this.state.routes.map(val => {
//this means it shouldnt be displayed on the home screen
if (!val.homeIcon) return;
<React.Fragment>
<Alert className="clearfix" variant="warning" show={this.state.usingDefaultCreds}>
<FormattedMessage id="error.app.default_creds" />
</Alert>
<Row xs={1} sm={2} md={3} lg={4} className="justify-content-center">
{this.state.routes.map(val => {
//this means it shouldnt be displayed on the home screen
if (!val.homeIcon) return;

if (val === AppRoutes.home) return;
if (val === AppRoutes.home) return;

return (
<Col key={val.link ?? val.route} className="mb-1 home">
<Card
as={val.cachedAuth ? Link : "div"}
//@ts-expect-error //dont really know how to fix this so uhhhhhhh, this will do for now
to={val.link ?? val.route}
className={`text-decoration-none m-1 h-75 ${
val.cachedAuth ? "text-primary" : "text-danger d-sm-flex d-none"
}`}>
<Card.Body
style={{
height: "245px"
}}>
<FontAwesomeIcon
fixedWidth={true}
icon={val.homeIcon}
className="d-block w-100 h-100 m-auto"
/>
</Card.Body>
<Card.Footer
className={`text-center font-weight-bold ${
val.cachedAuth ? "" : "text-danger font-italic"
return (
<Col key={val.link ?? val.route} className="mb-1 home">
<Card
as={val.cachedAuth ? Link : "div"}
//@ts-expect-error //dont really know how to fix this so uhhhhhhh, this will do for now
to={val.link ?? val.route}
className={`text-decoration-none m-1 h-75 ${
val.cachedAuth
? "text-primary"
: "text-danger d-sm-flex d-none"
}`}>
<FormattedMessage id={val.name} />
</Card.Footer>
</Card>
</Col>
);
})}
</Row>
<Card.Body
style={{
height: "245px"
}}>
<FontAwesomeIcon
fixedWidth={true}
icon={val.homeIcon}
className="d-block w-100 h-100 m-auto"
/>
</Card.Body>
<Card.Footer
className={`text-center font-weight-bold ${
val.cachedAuth ? "" : "text-danger font-italic"
}`}>
<FormattedMessage id={val.name} />
</Card.Footer>
</Card>
</Col>
);
})}
</Row>
</React.Fragment>
);
}
}
6 changes: 1 addition & 5 deletions src/components/views/Login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,7 @@ class Login extends React.Component<IProps, IState> {
return;
}

const response = await ServerClient.login({
type: CredentialsType.Password,
userName: "admin",
password: "ISolemlySwearToDeleteTheDataDirectory"
});
const response = await ServerClient.login(CredentialsProvider.default);

if (response.code === StatusCode.OK) {
this.setState({
Expand Down
1 change: 1 addition & 0 deletions src/translations/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
"error.github": "An error occured while interacting with the Github API",
"error.app": "An error occured in the application",
"error.app.undefined": "A \"Ghost\" error occured in the application",
"error.app.default_creds": "You are using the default TGS credentials. Please click 'Change Password' at earliest convenience!",
"error.job.not_found": "The specified job could not be found",
"error.job.complete": "Unable to delete the job, perhaps it already completed",
"error.transfer.not_available": "Unable to transfer file as it is no longer or never was valid",
Expand Down

0 comments on commit a1fda6d

Please sign in to comment.