Reviewed-on: sh-edraft.de/kd_discord_bot#228 Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de> Closes #210
This commit is contained in:
commit
c841f39a03
@ -1,16 +1,13 @@
|
||||
import traceback
|
||||
|
||||
from cpl_core.console import Console
|
||||
|
||||
from bot_api.abc.dto_abc import DtoABC
|
||||
|
||||
|
||||
class TokenDTO(DtoABC):
|
||||
def __init__(self, token: str, refresh_token: str):
|
||||
def __init__(self, token: str, refresh_token: str, first_login: bool = False):
|
||||
DtoABC.__init__(self)
|
||||
|
||||
self._token = token
|
||||
self._refresh_token = refresh_token
|
||||
self._first_login = first_login
|
||||
|
||||
@property
|
||||
def token(self) -> str:
|
||||
@ -20,9 +17,14 @@ class TokenDTO(DtoABC):
|
||||
def refresh_token(self) -> str:
|
||||
return self._refresh_token
|
||||
|
||||
@property
|
||||
def first_login(self) -> bool:
|
||||
return self._first_login
|
||||
|
||||
def from_dict(self, values: dict):
|
||||
self._token = values["token"]
|
||||
self._refresh_token = values["refreshToken"]
|
||||
self._first_login = values["firstLogin"]
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {"token": self._token, "refreshToken": self._refresh_token}
|
||||
return {"token": self._token, "refreshToken": self._refresh_token, "firstLogin": self._first_login}
|
||||
|
@ -480,9 +480,11 @@ class AuthService(AuthServiceABC):
|
||||
if user_dto is None:
|
||||
raise ServiceException(ServiceErrorCode.InvalidData, "User not set")
|
||||
|
||||
added_user = False
|
||||
db_user = self._auth_users.find_auth_user_by_email(user_dto.email)
|
||||
if db_user is None:
|
||||
self.add_auth_user(user_dto)
|
||||
added_user = True
|
||||
# raise ServiceException(ServiceErrorCode.InvalidUser, f'User not found')
|
||||
|
||||
db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
|
||||
@ -491,7 +493,7 @@ class AuthService(AuthServiceABC):
|
||||
lambda x: self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, x))
|
||||
)
|
||||
|
||||
if db_user.confirmation_id is not None:
|
||||
if db_user.confirmation_id is not None and not added_user:
|
||||
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")
|
||||
|
||||
token = self.generate_token(db_user)
|
||||
@ -500,7 +502,7 @@ class AuthService(AuthServiceABC):
|
||||
db_user.forgot_password_id = None
|
||||
|
||||
self._db.save_changes()
|
||||
return TokenDTO(token, refresh_token)
|
||||
return TokenDTO(token, refresh_token, first_login=added_user)
|
||||
|
||||
async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO:
|
||||
if token_dto is None:
|
||||
|
@ -1,4 +1,5 @@
|
||||
export interface TokenDTO {
|
||||
token: string;
|
||||
refreshToken: string;
|
||||
}
|
||||
firstLogin?: boolean;
|
||||
}
|
||||
|
@ -11,6 +11,8 @@ import { AuthUserAtrErrors } from "src/app/models/auth/auth-user-atr-errors";
|
||||
import { SpinnerService } from "src/app/services/spinner/spinner.service";
|
||||
import { ThemeService } from "src/app/services/theme/theme.service";
|
||||
import { throwError } from "rxjs";
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
import { ConfirmationDialogService } from "../../../../services/confirmation-dialog/confirmation-dialog.service";
|
||||
|
||||
@Component({
|
||||
selector: "app-login",
|
||||
@ -37,11 +39,14 @@ export class LoginComponent implements OnInit {
|
||||
private router: Router,
|
||||
private spinnerService: SpinnerService,
|
||||
private themeService: ThemeService,
|
||||
private route: ActivatedRoute
|
||||
private route: ActivatedRoute,
|
||||
private confirmDialog: ConfirmationDialogService,
|
||||
private translate: TranslateService
|
||||
) {
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.initLoginForm();
|
||||
this.spinnerService.showSpinner();
|
||||
this.authService.isUserLoggedInAsync().then(result => {
|
||||
if (result) {
|
||||
@ -50,7 +55,6 @@ export class LoginComponent implements OnInit {
|
||||
}
|
||||
|
||||
this.checkDiscordLogin();
|
||||
this.initLoginForm();
|
||||
this.resetStateFlags();
|
||||
this.spinnerService.hideSpinner();
|
||||
});
|
||||
@ -78,6 +82,18 @@ export class LoginComponent implements OnInit {
|
||||
this.code = "";
|
||||
return throwError(() => err);
|
||||
})).subscribe(token => {
|
||||
if (token.firstLogin) {
|
||||
console.log(1, this.authService.getEMailFromDecodedToken(this.authService.getDecodedToken(token)))
|
||||
this.confirmDialog.confirmDialog(
|
||||
this.translate.instant(
|
||||
"auth.login.message.confirm_email"),
|
||||
this.translate.instant(
|
||||
"auth.login.message.confirm_email_d",
|
||||
{ email: this.authService.getEMailFromDecodedToken(this.authService.getDecodedToken(token)) }
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
this.authService.saveToken(token);
|
||||
this.themeService.loadTheme();
|
||||
this.themeService.loadMenu();
|
||||
|
@ -19,7 +19,7 @@ import { DiscordAuthURL } from "../../models/auth/discord-auth-url.dto";
|
||||
import { OAuthDTO } from "../../models/auth/oauth.dto";
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
providedIn: "root"
|
||||
})
|
||||
export class AuthService {
|
||||
|
||||
@ -42,14 +42,15 @@ export class AuthService {
|
||||
getAllUsers(): Observable<Array<AuthUserDTO>> {
|
||||
return this.http.get<Array<AuthUserDTO>>(`${this.appsettings.getApiURL()}/api/auth/users`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
getFilteredUsers(selectCriterions: AuthUserSelectCriterion): Observable<GetFilteredAuthUsersResultDTO> {
|
||||
return this.http.post<GetFilteredAuthUsersResultDTO>(`${this.appsettings.getApiURL()}/api/auth/users/get/filtered`, selectCriterions, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -57,7 +58,7 @@ export class AuthService {
|
||||
getUserByEMail(email: string): Observable<AuthUserDTO> {
|
||||
return this.http.get<AuthUserDTO>(`${this.appsettings.getApiURL()}/api/auth/users/get/${email}`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -65,7 +66,7 @@ export class AuthService {
|
||||
findUserByEMail(email: string): Observable<AuthUserDTO> {
|
||||
return this.http.get<AuthUserDTO>(`${this.appsettings.getApiURL()}/api/auth/users/find/${email}`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -74,7 +75,7 @@ export class AuthService {
|
||||
register(user: AuthUserDTO): Observable<unknown> {
|
||||
return this.http.post<TokenDTO>(`${this.appsettings.getApiURL()}/api/auth/register`, user, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -82,7 +83,7 @@ export class AuthService {
|
||||
confirmEMail(id: string): Observable<boolean> {
|
||||
return this.http.post<boolean>(`${this.appsettings.getApiURL()}/api/auth/register-by-id/${id}`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -90,7 +91,7 @@ export class AuthService {
|
||||
login(user: AuthUserDTO): Observable<TokenDTO> {
|
||||
return this.http.post<TokenDTO>(`${this.appsettings.getApiURL()}/api/auth/login`, user, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -98,7 +99,7 @@ export class AuthService {
|
||||
verifyLogin(): Observable<boolean> {
|
||||
return this.http.get<boolean>(`${this.appsettings.getApiURL()}/api/auth/verify-login`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -106,7 +107,7 @@ export class AuthService {
|
||||
forgotPassword(email: string): Observable<unknown> {
|
||||
return this.http.post(`${this.appsettings.getApiURL()}/api/auth/forgot-password/${email}`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -114,7 +115,7 @@ export class AuthService {
|
||||
getEMailFromforgotPasswordId(id: string): Observable<EMailStringDTO> {
|
||||
return this.http.post<EMailStringDTO>(`${this.appsettings.getApiURL()}/api/auth/confirm-forgot-password/${id}`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -122,7 +123,7 @@ export class AuthService {
|
||||
resetPassword(resetPasswordDTO: ResetPasswordDTO): Observable<unknown> {
|
||||
return this.http.post(`${this.appsettings.getApiURL()}/api/auth/reset-password`, resetPasswordDTO, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -130,7 +131,7 @@ export class AuthService {
|
||||
updateUser(updateUserDTO: UpdateUserDTO): Observable<unknown> {
|
||||
return this.http.post(`${this.appsettings.getApiURL()}/api/auth/update-user`, updateUserDTO, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -138,7 +139,7 @@ export class AuthService {
|
||||
updateUserAsAdmin(updateUserDTO: AdminUpdateUserDTO): Observable<unknown> {
|
||||
return this.http.post(`${this.appsettings.getApiURL()}/api/auth/update-user-as-admin`, updateUserDTO, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -146,7 +147,7 @@ export class AuthService {
|
||||
refresh(token: TokenDTO): Observable<TokenDTO> {
|
||||
return this.http.post<TokenDTO>(`${this.appsettings.getApiURL()}/api/auth/refresh`, token, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -154,7 +155,7 @@ export class AuthService {
|
||||
deleteUserByMail(mail: string) {
|
||||
return this.http.post(`${this.appsettings.getApiURL()}/api/auth/delete-user-by-mail/${mail}`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -163,7 +164,7 @@ export class AuthService {
|
||||
getDiscordAuthURL() {
|
||||
return this.http.get<DiscordAuthURL>(`${this.appsettings.getApiURL()}/api/auth/discord/get-url`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -171,7 +172,7 @@ export class AuthService {
|
||||
discordLogin(code: string, state: string): Observable<TokenDTO> {
|
||||
return this.http.get<TokenDTO>(`${this.appsettings.getApiURL()}/api/auth/discord/login?code=${code}&state=${state}`, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -180,7 +181,7 @@ export class AuthService {
|
||||
discordRegister(oAuthDTO: OAuthDTO) {
|
||||
return this.http.post(`${this.appsettings.getApiURL()}/api/auth/discord/register`, oAuthDTO, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -195,21 +196,25 @@ export class AuthService {
|
||||
|
||||
/* utils */
|
||||
saveToken(token: TokenDTO): void {
|
||||
localStorage.setItem('jwt', token.token);
|
||||
localStorage.setItem('rjwt', token.refreshToken);
|
||||
if (this.router.url.startsWith('/auth')) {
|
||||
this.router.navigate(['/dashboard']);
|
||||
localStorage.setItem("jwt", token.token);
|
||||
localStorage.setItem("rjwt", token.refreshToken);
|
||||
if (this.router.url.startsWith("/auth")) {
|
||||
this.router.navigate(["/dashboard"]);
|
||||
}
|
||||
}
|
||||
|
||||
getToken(): TokenDTO {
|
||||
return {
|
||||
token: localStorage.getItem('jwt') ?? '',
|
||||
refreshToken: localStorage.getItem('rjwt') ?? ''
|
||||
token: localStorage.getItem("jwt") ?? "",
|
||||
refreshToken: localStorage.getItem("rjwt") ?? ""
|
||||
};
|
||||
}
|
||||
|
||||
getDecodedToken(): { [key: string]: any } | null{
|
||||
getDecodedToken(token: TokenDTO | undefined = undefined): { [key: string]: any } | null {
|
||||
if (token) {
|
||||
return this.jwtHelper.decodeToken(token.token);
|
||||
}
|
||||
|
||||
return this.jwtHelper.decodeToken(this.getToken().token);
|
||||
}
|
||||
|
||||
@ -219,26 +224,26 @@ export class AuthService {
|
||||
if (token && token.token && token.refreshToken) {
|
||||
return this.http.post<TokenDTO>(`${this.appsettings.getApiURL()}/api/auth/revoke`, token, {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
"Content-Type": "application/json"
|
||||
})
|
||||
}).pipe(catchError((error: any) => {
|
||||
error.error = null;
|
||||
this.isLoggedIn$.next(false);
|
||||
localStorage.removeItem('rjwt');
|
||||
this.router.navigate(['/auth/login']);
|
||||
localStorage.removeItem("rjwt");
|
||||
this.router.navigate(["/auth/login"]);
|
||||
throw error;
|
||||
})).subscribe(() => {
|
||||
this.isLoggedIn$.next(false);
|
||||
localStorage.removeItem('jwt');
|
||||
localStorage.removeItem('rjwt');
|
||||
this.router.navigate(['/auth/login']);
|
||||
localStorage.removeItem("jwt");
|
||||
localStorage.removeItem("rjwt");
|
||||
this.router.navigate(["/auth/login"]);
|
||||
});
|
||||
}
|
||||
this.isLoggedIn$.next(false);
|
||||
localStorage.removeItem('rjwt');
|
||||
this.router.navigate(['/auth/login']);
|
||||
localStorage.removeItem("rjwt");
|
||||
this.router.navigate(["/auth/login"]);
|
||||
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
|
||||
async getLoggedInUser(): Promise<AuthUserDTO | null> {
|
||||
@ -295,13 +300,13 @@ export class AuthService {
|
||||
}
|
||||
const token = this.getDecodedToken();
|
||||
if (!token) return false;
|
||||
return AuthRoles[token['role']] === AuthRoles[role];
|
||||
return AuthRoles[token["role"]] === AuthRoles[role];
|
||||
}
|
||||
|
||||
getEMailFromDecodedToken(token: { [key: string]: any } | null): string | null {
|
||||
if (!token) {
|
||||
return null;
|
||||
}
|
||||
return token['email'];
|
||||
return token["email"];
|
||||
}
|
||||
}
|
||||
|
@ -106,7 +106,11 @@
|
||||
"user_not_found": "Benutzer nicht gefunden",
|
||||
"e_mail_not_confirmed": "E-Mail nicht bestätigt",
|
||||
"password_required": "Passwort benötigt",
|
||||
"wrong_password": "Falsches passwort"
|
||||
"wrong_password": "Falsches passwort",
|
||||
"message": {
|
||||
"confirm_email": "E-Mail Bestätigen",
|
||||
"confirm_email_d": "Du musst deine E-Mail {{email}} Bestätigen, in dem du den Link öffnest, den wir dir geschickt haben."
|
||||
}
|
||||
},
|
||||
"register": {
|
||||
"first_name": "Vorname",
|
||||
|
Loading…
Reference in New Issue
Block a user