From 9af9e2107042b0aabacd99d02e20f7382586f691 Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Sun, 8 May 2022 18:02:48 +0200 Subject: [PATCH] Gives user feedback if username or password is wrong --- .../com/application/DB/Account_handler.java | 2 + .../com/application/GUI/Panes/LogoBar.java | 25 +++++----- .../GUI/PopUpWindows/LoginPopup.java | 45 ++++++++++++++++-- .../com/application/DB/Account_handler.class | Bin 2707 -> 2783 bytes .../com/application/GUI/Panes/LogoBar.class | Bin 2968 -> 2968 bytes .../GUI/PopUpWindows/LoginPopup.class | Bin 5210 -> 5697 bytes 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/application/DB/Account_handler.java b/src/main/java/com/application/DB/Account_handler.java index 7ac1dff..10dd3e7 100644 --- a/src/main/java/com/application/DB/Account_handler.java +++ b/src/main/java/com/application/DB/Account_handler.java @@ -7,6 +7,7 @@ import com.google.cloud.bigquery.TableResult; import static com.application.DB.Constants.*; import static com.application.DB.Settings.*; +import static com.application.GUI.PopUpWindows.LoginPopup.getPasswordTextField; public class Account_handler { @@ -41,6 +42,7 @@ public class Account_handler { } } else { NotificationPopUp.displayNotificationWindow("Wrong username or password!"); + getPasswordTextField().clear(); } } diff --git a/src/main/java/com/application/GUI/Panes/LogoBar.java b/src/main/java/com/application/GUI/Panes/LogoBar.java index 810dc23..4cb813b 100644 --- a/src/main/java/com/application/GUI/Panes/LogoBar.java +++ b/src/main/java/com/application/GUI/Panes/LogoBar.java @@ -12,6 +12,8 @@ import javafx.scene.layout.Region; import java.io.FileInputStream; import java.io.FileNotFoundException; +import static com.application.DB.Constants.isIsAdmin; + public class LogoBar { private static Button login = new Button("Login"); @@ -45,22 +47,19 @@ public class LogoBar { HBox.setHgrow(region2, Priority.ALWAYS); // Login button - - - getLogin().setOnAction(event -> { - if(getLogin().getText().equals("Login")){ - LoginPopup.login(); + getLogin().setOnAction(event -> { + if(getLogin().getText().equals("Login")){ + LoginPopup.login(); + } else { + if(isIsAdmin()){ + LoginPopup.adminPopup(); } else { - System.out.println("Logget inn"); + LoginPopup.userPopup(); } + } + }); - - }); - - - - - return new HBox(imageViewM, region1, imageViewTitle, region2, login); + return new HBox(imageViewM, region1, imageViewTitle, region2, getLogin()); } public static Button getLogin() { diff --git a/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java b/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java index e4b4c57..4db9e17 100644 --- a/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java +++ b/src/main/java/com/application/GUI/PopUpWindows/LoginPopup.java @@ -21,6 +21,8 @@ import static com.application.DB.Account_handler.getAccount; public class LoginPopup { + public static PasswordField PASSWORD_TEXT_FIELD = new PasswordField(); + public static void login(){ Stage window = new Stage(); @@ -31,7 +33,6 @@ public class LoginPopup { Label passwordLabel = new Label("Password:"); TextField userNameTextField = new TextField(); - PasswordField passwordTextField = new PasswordField(); Button closeButton = new Button("Close"); Button loginButton = new Button("Login"); @@ -43,7 +44,7 @@ public class LoginPopup { MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); assert messageDigest != null; - messageDigest.update(passwordTextField.getText().getBytes(StandardCharsets.UTF_8)); + messageDigest.update(getPasswordTextField().getText().getBytes(StandardCharsets.UTF_8)); byte[] hashedPassword = messageDigest.digest(); @@ -72,11 +73,49 @@ public class LoginPopup { VBox layout = new VBox(10); layout.setAlignment(Pos.CENTER); - layout.getChildren().addAll(userNameLabel, userNameTextField, passwordLabel, passwordTextField, loginButton, closeButton); + layout.getChildren().addAll(userNameLabel, userNameTextField, passwordLabel, getPasswordTextField(), loginButton, closeButton); Scene scene = new Scene(layout, 500, 300); scene.getStylesheets().add(InputPopup.class.getResource("/com.application/CSS/styleSheet.css").toExternalForm()); window.setScene(scene); window.showAndWait(); } + + public static void adminPopup(){ + + Stage window = new Stage(); + window.initModality(Modality.APPLICATION_MODAL); + window.setTitle("Login window"); + + + VBox layout = new VBox(10); + layout.setAlignment(Pos.CENTER); + layout.getChildren().addAll(); + + Scene scene = new Scene(layout, 500, 300); + scene.getStylesheets().add(InputPopup.class.getResource("/com.application/CSS/styleSheet.css").toExternalForm()); + window.setScene(scene); + window.showAndWait(); + } + + public static void userPopup(){ + + Stage window = new Stage(); + window.initModality(Modality.APPLICATION_MODAL); + window.setTitle("Login window"); + + + VBox layout = new VBox(10); + layout.setAlignment(Pos.CENTER); + layout.getChildren().addAll(); + + Scene scene = new Scene(layout, 500, 300); + scene.getStylesheets().add(InputPopup.class.getResource("/com.application/CSS/styleSheet.css").toExternalForm()); + window.setScene(scene); + window.showAndWait(); + } + + public static PasswordField getPasswordTextField() { + return PASSWORD_TEXT_FIELD; + } } diff --git a/target/classes/com/application/DB/Account_handler.class b/target/classes/com/application/DB/Account_handler.class index 30fde92804abf4d3e2a3b90d1aa76b3fec8c496d..254fefbc8b16860ea8ebc924d879720d5c4da3fc 100644 GIT binary patch delta 928 zcmbO%dSA5u)W2Q(7#J8#7*??}IC3$lF*va^ICC*DGdOWDxPWL^5aGtb;0~faI2k+{ zyto*=8GN`Hd>Q<>82lLmKtv!nLl8qSH$w<RD2NDSX9(wDh~Q!nVu<8oh+>EanH<B# z5X%t9#SqVsz{QZrki@}|%%#Q<#gGD0kqQz@<6uY!aWX)hOb&)DE{1G|94?03jmxqa z8N(+FGKDa!GiXfCVA`O{&QQX`(8|!p!_dyq!Oqah!_dXh&CXED!_dRf%frye(9g)A zF*%-5qn?q0BeXcRC@(QLm4{&h!$fw5Njwab8Txq`rZ7xpXPCyrFr8rrJHt#KhFJ`a z><qJc80IiEGBR)kWaQ_i#^>epFw6y+IFF&4hhaWQhSf18H#3iiVF5^ZA;Tg@2I=sk z{JeC9Qm8cw`9%r^iN(d``9&#;66_3%c^H;}j9$vau#90jJHrYdhLsE&n>kr{nKqlU zr7|%yGH6fs;ZUsi$xqMB3&<}hEns92Nlz^afEp5#T2bPbnVOTr$e^a7>64XMmY7zd zU!0tpm#UwfpI1_ppQ8^`3sz^%$e=`66(a*{a!zVu5rZOwDuWsW10Mqe0}}%ygF1r- z10#dx<P98R###&v3~UUH3=9lB4BB84#AapCVbEn@VBloXW6)<{V$ft@V9a4)VPIom zVAwtRCx=D7?luNq&M7k)3U#+J@a<&aXJoKqk!0D)Ai&5llOYns5@cjJz#wGBD#<D& zyp2I*8-u9UHU_bo417Bn#I?3DNNDX~kd$N<k^;*~&tedOb7Xcf$V##b$$@3$XELy} z>|jt>{(tdu20kIh9Sll47?kU`F{o^0U|?Wo0C~WPL4bjQL6AX*L5#teL6X6OL7Ksl zL53lTL5`uAL7t(CL4l!;L7AbOL4{!kgF3@f1`URl3|b898FU!7Fz7PuV$cVB-h_db zA&J4A!GOV#ffeLc1|tSz1`ycIV8UR`z{sG((9dAXV9eme#9+bD%wWb~&cMuI!N9;E z%fSAR!H1o}lAXbdox%DKgCRSEjpQ!|fnN+vOk51M3=9k`42%qR42%r+;An6F02sNt A;s5{u delta 819 zcmcaFI$5;-)W2Q(7#J8#7?!a!IB_wkGdQy|xNtErGdOcFxPoXm5aG_j-~pmNIT^ed zytx>B7<{=H{22T>7y`H$0vUopa={>02scA0Ll`$hI70-8h-7Do;$Vp8Vh~}7;bMqo zhy&RW&&80ykjTZ5#E{IT&XB^8%E6EZl1v8?8C(o044E7ZSs+d}h?B#?kjt@gX%-`6 z)MNps5M~Vq&B^IZ8_XCPID=A)OLIz!trXZ9N_ZGr8QORl${E^u7&;g_*%`Wc7`hpH z*cnQB7<w7{co_N_CNMH+Oy0<*GC6@+FkvFYBzA_$JPcD9Ch#y!Wthg!Fr9~C2E$Bt zhFLrevl$xM8RqaX%w=d~WZ($M$j?iS&&%gwm<KXwK0`GR!vc^Dt7A%TW*!g2LXhwx zhQ*8woNlR^ISK`d#l@44GApnx;bB<H(75?GGcOafjE2|b9V{}NIoMK}#26GA)ELwm zK!AyXkwJq&lYx;zYqA`tn6Wkk0|OfaBLf2iH-ioX0|O73&B~z5pvS<#z{#M`V8Fn{ zpvAzz*vG)az{bG9aC34xr$zlH2Cm%<%#qs}ScG`DF|g@wW8mAyz`u=wa~lIUh{HK$ zCPSg_HU@#641$adRxFY%I~jx+8D=s>f>^?g3<nrQtXL&kg+#Y8h;3sK*V@J)F_VFB z2ZN;6HU=rJ9SqWvtU@wiIoVkZ0&tGp4hDHiR-t+Yu$1CV26mPm3`)!YFJ8_du!(_7 zNO>Crw~)#X2GxxW3=GT+An&;`2r@7*2r%d{h%y*6NHAD1NHK&k$S}k*$TQS2C^Gaj zC^1Z9P-d9LpvJJAL7ia>gBHU<25p9;47v=b84MUMGZ-@5U@!#-j|l@SLmh)VLy94T z5d$kIG#HE-Oh5t4aFfB5!GwX4L5E>2gBgPf0~3P<!$Jmg1`7se21^D823ZF7e+(Jy w3|8z6*6a*6e;5qe8EhqgF$nx(U}EB7uw!6gU}0cnuxDUoaA06yU}A6t0Kg)X;Q#;t diff --git a/target/classes/com/application/GUI/Panes/LogoBar.class b/target/classes/com/application/GUI/Panes/LogoBar.class index 6bf148944fe71a3eb8f7a6b784dc3a83196d42f3..654a3b92355770a294d191cc0f302fe5fc700687 100644 GIT binary patch delta 678 zcmbOsK0}=A)W2Q(7#J8#7-mf5inZio5M_wvWKd#=<6=-?i05EP;9^K*NaA8hW=P>; zNM%R^vC=_A20KG0NR0<OLl!$j_QrXQjEp&(6_{)oIdgd!)EM#@8EhxZGn-7F$*jYj z&%;o_P{_kj#85o>0<%1K2@gXlLm3Z4IYY(dU(C`Hl>!V^{A>)>0t~i13^fe3JPdUV z^^6P>lMk|rOm<|EvQlGc;9*c<P~~B0WN2b!VD-sQ&&*?IXy##PVQ6J%Xah;Avoo~w zFmy0<@-TEUsPiy%GpI8%NKZColHR<VC7n^JhoP5|L0rQpE3qswtwKMwEH$r0-xWk! zYld+#C^7U+c47M-Ad{S*tDjg<kdv95Sdy8ar|;sV@0_1kT#}eqQq0J}nOW>v?3j|9 zna9Y$tf3jj$iS5d;sxXvlol{DaF!OQ7J=F94E;O|6BwpUp2Tj&IBoJ-_LnTv85vY3 zJ8+0kzQ~cwC^*@k^PtZT2BF~X4B{IY7#NrsG#MBetQhzh7#L(31R3NQlo%8lv>B8b zOc_)eY#7uS92wLZJQ*|?{28<vA{cZS5*YLtG8yz43K@(TY8dP$`*0Q1OMr}G1RKT1 zz{tSB;3UAsV8dX`z{sG%z`&5pzyuam*})*RjX_dKY8!*}Oa{&!3^L0Zgmy5<g4uG* z8Q69($Zup|U|<HDB*nnSz`$V4z{g<1Ai`kAAjM$Lpuk|spv+*ypvAzzzymRp!H$8? zo`HeEfq{X6m4R7=n`yEox1yZ{$RK1V2{SM=IDvia%rKdOfq{#GkzpdkRE9|mk_;hG O<3bsj8NwLC86p7QqJW+N delta 651 zcmbOsK0}=A)W2Q(7#J8#7-ml7iZ$nCP-2MXVi0AB<6=-?i05EP;9^K*NaA8hW=P>= zNM%UlU`Xd;$Y981XUGDn@L*@iW@pIRxS)}dF?X{PlMN$h9uI>WLp~#e?PNt}lgYE0 zb@&Q+7z!DRco>QqN*EcWCckBr;$>$j<zXmeDCc3QV5pq@hgn**N`Rr7pN*kLfWelB zp_ZYJhoPRKVX_X3p{ojmD#*x29)>1{W<~~9pZxU9Ja&c_9)?ziHg<+~9tIT#b#{gh z9)?baE=C3}pZxUn)DnfvygYV>ZXSjnhCD_F>4|HkH*aD|XJqbW=$kCVCdb%6*_!Qp zxIk87S)zVUVqUs_aAk2xYAz!KbAD+FBZH_9SSB-HKcFZxuOzsnC^a$Hnvp>mi!dVt zdjUvMP98hM1RjQo3{xjJv0E`tpS+j-CCdy(2Gz+19O9D?a^y1dPuAx==(CAIJa{{U z#0CZi1||kg1_lNz20jJ`25AOC1{nq=26+Z;1_cIF24w~t1{DTJ22}=61~mqM22F+t z1}%mJ1|5b>23>|i1|x<V2K&i2Tm|*wAfp(;MzJw4GB7YW3ve;mFxWCMGH5U`FvK!2 zfkkC^FbHj9kQ9>I#vnbDfpZ6g%yI_qO$@R^a@!c>H!?6VFoTT{VqjrlU@&IjV=!S5 zVK8HmVX$J*Vqjq4ff&MI$6(LEz~I2Zz`(-5B*M<XG1;11-cB530J0kd8JHQIz+QA_ hn8Luoz{SAGFo|Ir!(;|Yh7hQ6p$yCnVGQ965dbaydtU$m diff --git a/target/classes/com/application/GUI/PopUpWindows/LoginPopup.class b/target/classes/com/application/GUI/PopUpWindows/LoginPopup.class index 47e7da70b4c4df450224dcea4a42d4e9159832d2..c0bfec4e092c91274be6d9220d72a0f18defb406 100644 GIT binary patch delta 2469 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 Tn99J+FpXh4!we{EHp2`66SCc3 delta 1951 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 E04-&T{Qv*} -- GitLab