From 146e38ac4f7368ac35c9699e5892e0d116383d15 Mon Sep 17 00:00:00 2001 From: yousefmarey12 Date: Mon, 24 Nov 2025 15:49:11 +0300 Subject: [PATCH 1/3] style(login): nothing --- build/web/jobseeker_home.jsp | 13 ++++++++++++- build/web/recruiter_home.jsp | 13 ++++++++++++- nbproject/private/private.xml | 33 ++++++++++++++++++++++++++------- web/jobseeker_home.jsp | 13 ++++++++++++- web/recruiter_home.jsp | 13 ++++++++++++- 5 files changed, 74 insertions(+), 11 deletions(-) diff --git a/build/web/jobseeker_home.jsp b/build/web/jobseeker_home.jsp index d6ba254..1e92c93 100644 --- a/build/web/jobseeker_home.jsp +++ b/build/web/jobseeker_home.jsp @@ -3,6 +3,7 @@ Created on : Nov 17, 2025, 9:26:55 AM Author : user --%> +<%@page import="com.rms.model.JobSeeker"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> @@ -12,7 +13,17 @@ JSP Page -

Hello Job Seeker

+ <% + JobSeeker recruiter = (JobSeeker)session.getAttribute("user"); + if (recruiter == null) { + response.sendRedirect("login.jsp"); + } + else { + %> +

Hi, <%= recruiter.getUsername() %>!

+ <% + } + %> diff --git a/build/web/recruiter_home.jsp b/build/web/recruiter_home.jsp index 669d39f..c0689b6 100644 --- a/build/web/recruiter_home.jsp +++ b/build/web/recruiter_home.jsp @@ -3,6 +3,7 @@ Created on : Nov 17, 2025, 9:27:50 AM Author : user --%> +<%@page import="com.rms.model.Recruiter"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> @@ -12,6 +13,16 @@ JSP Page -

Hello World!

+ <% + Recruiter recruiter = (Recruiter)session.getAttribute("user"); + if (recruiter == null) { + response.sendRedirect("login.jsp"); + } + else { + %> +

Hi, <%= recruiter.getUsername() %>!

+ <% + } + %> diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 6807a2b..81a97c7 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -1,7 +1,26 @@ - - - - - - - + + + + + + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/LoginController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/login.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/register.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/DBConnect.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/database/rms_testing_complete.sql + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/JobController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/User.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/Recruiter.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/SearchController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/SignupController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/JobSeeker.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/SearchSystemService.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/jobseeker_home.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/JobPosting.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/RecruiterService.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/JobSeekerService.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/recruiter_home.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/post_job.jsp + + + diff --git a/web/jobseeker_home.jsp b/web/jobseeker_home.jsp index d6ba254..1e92c93 100644 --- a/web/jobseeker_home.jsp +++ b/web/jobseeker_home.jsp @@ -3,6 +3,7 @@ Created on : Nov 17, 2025, 9:26:55 AM Author : user --%> +<%@page import="com.rms.model.JobSeeker"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> @@ -12,7 +13,17 @@ JSP Page -

Hello Job Seeker

+ <% + JobSeeker recruiter = (JobSeeker)session.getAttribute("user"); + if (recruiter == null) { + response.sendRedirect("login.jsp"); + } + else { + %> +

Hi, <%= recruiter.getUsername() %>!

+ <% + } + %> diff --git a/web/recruiter_home.jsp b/web/recruiter_home.jsp index 669d39f..c0689b6 100644 --- a/web/recruiter_home.jsp +++ b/web/recruiter_home.jsp @@ -3,6 +3,7 @@ Created on : Nov 17, 2025, 9:27:50 AM Author : user --%> +<%@page import="com.rms.model.Recruiter"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> @@ -12,6 +13,16 @@ JSP Page -

Hello World!

+ <% + Recruiter recruiter = (Recruiter)session.getAttribute("user"); + if (recruiter == null) { + response.sendRedirect("login.jsp"); + } + else { + %> +

Hi, <%= recruiter.getUsername() %>!

+ <% + } + %> From 082dff6669b72033799659de33b10af5184e8093 Mon Sep 17 00:00:00 2001 From: yousefmarey12 Date: Mon, 24 Nov 2025 20:51:59 +0300 Subject: [PATCH 2/3] refactor(LoginController): integrated recruiter_home.jsp & job_posting.jsp with auth also seperated between model and controller logic --- .../controller/ApplicationController.class | Bin 4509 -> 3361 bytes .../controller/DocumentUploadServlet.class | Bin 0 -> 6533 bytes .../com/rms/controller/JobController.class | Bin 3185 -> 4038 bytes .../controller/LoginController$Creds.class | Bin 455 -> 0 bytes .../com/rms/controller/LoginController.class | Bin 7478 -> 7577 bytes .../com/rms/controller/SignupController.class | Bin 10511 -> 9296 bytes .../classes/com/rms/model/Application.class | Bin 1989 -> 2104 bytes .../classes/com/rms/model/AuthService.class | Bin 286 -> 8553 bytes .../classes/com/rms/model/Document.class | Bin 1836 -> 1944 bytes .../classes/com/rms/model/DocumentDAO.class | Bin 0 -> 4143 bytes .../classes/com/rms/model/JobPosting.class | Bin 2028 -> 2308 bytes .../classes/com/rms/model/JobSeeker.class | Bin 2360 -> 2507 bytes .../com/rms/model/JobSeekerService.class | Bin 301 -> 4424 bytes .../com/rms/model/RecruiterService.class | Bin 1888 -> 8413 bytes build/web/gfv4ee7.dpf | 26 -- build/web/index.jsp | 369 ++++++++++++++++- build/web/post_job.jsp | 103 ++--- build/web/recruiter_home.jsp | 159 +++++++- .../com/rms/controller/LoginController.java | 358 ++++++++-------- .../com/rms/controller/SignupController.java | 42 +- src/java/com/rms/model/AuthService.java | 384 +++++++++--------- web/recruiter_home.jsp | 3 +- 22 files changed, 923 insertions(+), 521 deletions(-) create mode 100644 build/web/WEB-INF/classes/com/rms/controller/DocumentUploadServlet.class delete mode 100644 build/web/WEB-INF/classes/com/rms/controller/LoginController$Creds.class create mode 100644 build/web/WEB-INF/classes/com/rms/model/DocumentDAO.class delete mode 100644 build/web/gfv4ee7.dpf diff --git a/build/web/WEB-INF/classes/com/rms/controller/ApplicationController.class b/build/web/WEB-INF/classes/com/rms/controller/ApplicationController.class index e540c4602f566c0aebf61cc39303bc94293d7028..15d64769395b5151f7530ec8781aa372ff2b2b97 100644 GIT binary patch literal 3361 zcmcgu+j7%Z6kW%;$Wa6s69NGW<`PKk#HKCuLZBriTtZC(NuY(&i)^1H3bN!#ass{1 z^bh*dnSKG!%yh`4%#^o2^qV@Jt|KY7b8Vj(&**Zr&fa_Nz4ku->!08M0B`|6>PVnX zL%V?vbP60_G?&e%1z&p0whRgjK~O8);$*Hl6vx zblnN8s=WTRENg+~I!WjPKizlAZnb9FX33VBvRjdv;Y`_d95=|!SxzP6KdY8pThGJ~ zmok}5**1MYGg_8ph4QESbKd=s2>hqRz~jmMtqf zQaGsG_X=dUao-Zq?1Ja6s6;WQBn~s*W@xD!M{rcbF#~VmxIq8zWtx^tb?FBJ#=H#f znx0vef%F8SA)60+J2=GR=ukJ6lH zqUyDZ8OWKy4C=lL`MiNVhLU(kpxw57=3xLA3|v$kQfi?kEI*0&30t=0ih_M;;F5yv zQwuGyBrcQGmTu6%ZaUG->twxJlHLv1tC~TJ#I6c-NY8VhC?o!oUEmCfdzqnrhKCv+8TedH%4k?@#IQtV z+x4Y}FK8t!sRGR0D>e$L<1xN6@U=3rug2*UP;=!cvz}RIdG?wcMxH==YjLQwF%D5~ zFItX_)H16^hC*{d+7C?6Qt$C%d$3@!JF~_A+j%4OpoYAFpv^cL;e2nfAY@M%_Z_nq zyU`mT>Fl)Y&F38%l%(nS`5CwFm1R*bOM6s}{cxfa)zeCDnPRgll9oFw?p;?+FU?z@ zW9LF-Qy81irS+N%Bt01wn4{)DH^oxenC5s0YFJ(`vgH;grW*9v|951t;8q%gl~g(^ z?oG*%Pqt9nwvowCt8g}Z?lXZy5qh&mh)G^9+wnoGN9nu4lZ2;C%RHer*H1kqHJqfL z6Fk)u{87~5lZg`VIv623c`fs;z`NkRBfARmB7{|VRiA-wNM4NyfH}G$l-WDOqb|#TOH7+qR2Z5NTH4u^(n!<;4W;U@^m*UZ?{r;S5bMdmC6U3sSGlN9H|VE z$}mafN#Xn(qLNTYI}@R*@^f63{!kwyN*|NC^vCJZHH@_(m%h1%3F3#=aHkC~!i*}p zT#4(_OPxk?8KXePDVpmfbF)FD8-0|`GoryiB#}JT(|UFK>|V?GB^guAe%Tg$Vg7@I0?9}ZLkfl00*!WJ58F^YJtVluDrVf z(>86>^pW(PKGLS|xBG70rm<;en&0|Er+-qX)9>D0q!nf$ok>PByLazB_nhyX^PO`q z{OiAe{|A5*cr$@VVW=o-FcXMjLBnDKORzL7Yq+7Ilt3AF3y#52QBiSIgPTAbJPlK= z@KM#UlE5l%B`C6{;aTzin1+vw_a`*GDBhpcFqgom@M-aQNy8NlpHcC$hRjvWBl{_-ZS@hOeu5ErDTtL&G;!d`rc*6(kJDwoSvg99uzm zepz49bKcETZmc#vs-Ru3R7#ei3#sw5GYb0hhEvYDWiMBDie@Qywqcz+dL4H$Yny(- z)NL<2zg98ltVLV*tFFo2vpei=K4saKe_BD)k-@79;$t+Tpd)YD=5)1OFx`2*P~uD~ z?-+XNs_t6iJDiOBOO~f#s0NW9`mR$dnQjy(9Smm)H!kccP^dGEK}ok4bLVdvW<@wn zk+wNsH*QSn6={ZPWbA6|v^UV;@tjk24Kr`9n5DC}?f5cul?tLR)b>FNVswNSSF2z3;+E<1%e z)4XB2lSKuc5hZztD!7>fV(CC+DWJp!$1UrAEh9AdGBuPeFKU4q=vcAL)dr(&5q1mR z$!evj`zG`4SGl3ZHdi;sYLT&boizmy1^`5<%srKlnthGIJ7ttY1}6e0T(AURdn0!1 z{L6}>OX3MUNeNkik{+{F+qcSQO|^pj6`O@qu}XsNX-`rtZLl`d!|C&`>)57K_0qm; znrWXEH^Q}YmPMMCMVgHmXAuj7-&L?z$duRUN7h)*E*A?%cHFhdOcie=@jZNBLBE(C zkuoE>TuGGN63IGp{P?kxq6e^iT*qNXwTkX}tBzY#@q;9Oh#w{K0UTGbyY5uPn?5mH zCwj>5h(PbS?&}5JGwH`hk4i7-jAT)O|FMdnB=J-HjI;}=M202tbNnKSSxhAHEG7s| zFd&I%;8HGwj?Wg%~s&J3LcuY zSM-uqOh*bK?YQD|l3xE7zat@~Y&~{@mH}}*#?TCizc65uRdq|<4m#KK5N472_yAWBJ`E+gp*j~0DV5Is_`?7aMzr|eEg7|+zkYTA5k zuoc!h7&PRKy0o0!XOx`Te7lT9e>-QpDKs4Ex~{_tE`aNKFV%*J+Tt38nxEjO@z z@2LeiXfji}O}EMWHqwn9v33)g+CpJOUkK~|nZbHnuB)Trq3!j}FS*XD=&JI(JhXi* z!y}jn1wmidT}HqcK0LC8jSx>XmSi`NW4*)xHiUYnu*`ed=-_qUx9Xu5=N?PGqPw0M zj2kv>(BbTCf!=p3lv7&vR#f7TRlpWpzZ6ux>Xqfmex*7UBZg~~m zH(lA{xN3<^%l@#9Ev%(I%$5zah;CXRsip}SDt zM(kRu=`P~$NZC<7o8@XNPH~(JB=JF<=9hvGQA?B5@)F{-2Mnfm-9z)!Ln$?-rCRPG z@i(;AmFC|@+qG1C<}Nzkk*fA%Kb1B?7}|qfe5Pn{H-BAR=|&%Ch2cF^-iKD4!CAR) zFobZ9YXtb5iZP6H9Or5q&Ihx&AZIROA_Vz5-*L`mGO5mWJP^ZlDmDBTcE5q-Q0C}e zblpZO)g8>V$eBHNC?3G;r6CYh3;GE%jeU&t!#Ic`J_W>~Ky?U=Mlgv>5^M$^MxG9| zPC*n2l)AEeC;u^%P&VWQ3w z^Rf2}drVwm=#!w>zv;5b?RX}&PsaTo9=eD9)0tFXp(B&Fwb56 zEP*Q=#VOZAPF>|3(bZBnUQ6A0n7WW>mWrnvvK15evd~MDS_Hd#HhC$%I^0lG;%{t_ z6CGqjojW}>06jGTJt2S&LJq(Sns1OLCa!|_n?DkX>a;XJxP|$vH2=*1Vg9;|U88y4 zP($-C(tDBPflR8wd?qy{(S+G$=|_4?yA1pb1fnw$h6HmWP*aP=KrI#nwODi^0Mo;$ ze1tKKHzbAEVbUO=o=3WfSoaLQiPnFz&iPu$Q3bc5V2q!PI#QX z$xh^AFaImC(TBQd?hKxnJlsf`;D?5$&T}e08gHm!4KEN(&}t7#cY%b=NiGb9BCQ5( MR`f5Ox?(8&4-MpOVE_OC diff --git a/build/web/WEB-INF/classes/com/rms/controller/DocumentUploadServlet.class b/build/web/WEB-INF/classes/com/rms/controller/DocumentUploadServlet.class new file mode 100644 index 0000000000000000000000000000000000000000..1ada60e2cdc58a1fc980efd43fc33bf65e04975a GIT binary patch literal 6533 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 literal 0 HcmV?d00001 diff --git a/build/web/WEB-INF/classes/com/rms/controller/JobController.class b/build/web/WEB-INF/classes/com/rms/controller/JobController.class index 754b31e7c89f4a94877ae28e3d56b547d9ae2208..8c46533e928199396cd512931cad9f0f5fbcac73 100644 GIT binary patch literal 4038 zcma)8`Fj)B6+KUqJ+eG8Mqoe`jDQ&1*jPyjG_i?;V=#!AB{rDEB!!Xmu*Z=!%FM{% zG;P|3Zt1=ky01z1(j=yi+ce!sOSiAT^_Tu9G+)n~(Pr6B@>!mF^WMGhF6Z3)-mN!Z zeGS09_*Vo01T}>?gLhmIDk5r~&n(pKKJt!!4>iDOo3 zxbh{?YS-;UtvXI~n?T1~$1*0LDoV!{h)hX$Tsn?vv%WrBm4@2+PrXzco|tIIhD6;IczwqIX)RiKV!~XQ)a$z#wj%803OgV zsN+Eu_O4aI^(a3kor0BDn=|HoW=v*GGSLlVNFY38rB0h}Rw|+m>o|nN6k}Yc4BN;_ za{lchErlD#5rG!&cSt&E+bp;wpGrYe$1#90C|0(EK_4ep2OoBp3w0goEO-(H22Ho8RkXHzGT>>??K;S zwHK*=!k$!88mKGM%Bm0FfND;Lz^0{D!!(^@+^n+*F8H;R(IIis?*f(DVRK6=iD@0C zDy$Y&E9Hii%&4U&bz~Kv!d&t)uO{<4EH$a*Yd{F&DR$1Gv}?|?A6|f?!&PEU6dQL9 zx9F%YIjiFmE|chKTN{%7<+L|m`U_ZPf(45E_d1FeFQjBH}AJOqq zWiISmKIg;uxWL{K!_3M|+_mD4F)QPgjw>b-k$9#k)w~hU7_O0GfyX_9_i6Zqz&bCy zqHAUoL$+f0BWM-#S#b~oe zwkS_>iwzYAyhdM=pby_+TW5Fi&&%`ER!*vFq={i3r2=b4&AdEO%%!A#+DNHR9UZmO zMs~umP4!)x47t-L!`xA!$ZDtR0C!fWH_3kZa$0&#$I`*>$k-=O1SY#`2B5I{|gVcI6;=d#6j@(2`TWN5ogR;3LR`+_4en)&h zjj%H?8w{y>5$sc`5r~bkFwLBtFddV`UqZT$x=b4tMkdb6REf&863X+8W|Efd&#;Pi zmVJ<0N>+NErSZ* z=Tr9u@B{piUji?1HRvh#^R49c-HXs3yMd-x5UK8=?&RPdwi#_T`{<>8UgVl`0Iv5$4=&)L0Qwtxq9gvOG1hPs z?J;h9bRG|1!@5}GO|--s{qL*T+7mq)ePjXSLG(mVFJK~op56sa262567wA>0UyEtV zSb82)9C4=^zPLdyrbP?$uy?=>bG(Jw+KP3&tZu_D6s@qgheY}VO&9a@gM3a4av0|_%&&0(e46Ajnuk`S3w@p1JHNv zHuh?W-A22H_VEAI$G!Y<;#JMqb~`@cC9q??Im2HA0ZFC zL9Z&05WFNy?HCK@VHV5@0(goS=SP_SF+6}X7{OWIp&#YnBvORY#S?gr7gANCNBy|U zFyKlV298QF;F%H(JE-l$FoHq+9)BPV$34*h#DxBtyQzZr*KTr6!LbIx+i0u8@lLa^ fYE`wAzu>QYZ{WVS`1Lmjf5$)0A>iPj4zBzk+YL0Y literal 3185 zcmcIm*>@9F9R6;aX3}&h5TKH(P-SaLY1pjTAcAEp7K$kr1yLu-rJ0({#F2_N-tILymIOwFB8=RfyhqNGQC{_ZGHWdort1CLrg~} zbb)o3R?f)#D$?}?x~8NT7(8lt1%c&#{bNcuRWz)r)P(1l)>Jx*F1j;vo@rak(Gnd? z5f{*@ebjJ_lJuk_u)c4h>IJODupBEibnCbRD+QLcx)X>N47V_1=cS+9XcRp>OOSkdfyJUcCOUb_E86uknSsghwCQ^fm*r~edyP)QAZL30;}iau|QrxJ8e5> z3@0zJyXvrEJpd?BO8Z5=z*DzuTdqv^Pew5)5LWqiU^BL8*s5b2whQ#;>{7}pxv89O zd5&EyN+)&5&W_Y~M8lCer(zOM<<-m)g5I&3T8WSpQ<)ZtbPPkdUc(L@H(;2=y|lQ% zG8TGIu~@gm5D4LX<^>oke0J)%5u~~9Qq3bHvlWkFZMXm~P5i5ofYsP7(C&JM=c+(& z)-j@J*U2F0c%pi~5BoJ7&~Xr>0!tf=9JM?-rC6ZN7{!VlKP}MRH`+|d*q1&V6GCM1VF|#GSEc>O^>2D$;2r>X6KBW>?s|0DcMfSHqM7|j}8M_G9u?l z!;_7m1+MOEp+w`MPd}14)@Zs;oW_)ff(}#pSwFuOTIX6uR(b5>ZRImEZ?dRf6!)^- zE9E>xiJ~MBGV?L)gRP^C`&g>7;kc4uT%=T^sw}P!PhsCq>_@3Sgc%)Y{3NTE8+ovS zssm{8m}$u)l~PtZ$Bb-|#EYvc6(=jIs_}Y45F4kgcy3gAOBm>Q~Hu}O^ z_+z@Y;}?q6Tc1RAYO{Sq%b-}OR<+LJIrXAnKBT}G3&au0H%7dv=>lR3EMi~f?mcXj zgYv}ooy|#~p00-H7QEbo30D`=@B+t#--f208Xd1cARP}&uVClvuN@YBjqOYgTGGo( z!*T~F?2406QMGcO57ByX!`)yPW`nBGYuMsD zmQ|f+pDkN)ihONzSX(Zx;j9nwOMlp)rkTUnS?D2^>kr7tLXD2*cq`!|kD=NTPif%RZ+7 z|8C$f^xKz9KI47heEVNrykC`Qk0)kv<@@Mv8;X2_CETy}_mS{WWJN@&o>Y4LslNn& zDz0QQe$5=#gpeGV!-h6|f^Et8rj1`CHH+)!kZwaVep7Y3=UeOzP7XDzs8rkhRM(?} z>lI9-o8K=hIXHUoD6Yg4SdG`wi;r2uFR|7y#dcPX=?0}xt4HyeAJSKNoEjlo`2tVk zDcW9&kI=*08+#&x981Jxl)}6wgpFLL<-OdA!JVM~L=8 z%fL(iBY~HB595_O1b@;~j8$3oKSJ<5eYQey>U)gc@ePg)YY8nGANOIO#jR>{Td+B< zHYbA3oeGYGHjBFl;<-7<5J5BI(}}PT_wi)B=nH-eYbaVX-I3^+g>yX7(d>Ymh68Tq zJD@_P=AZ#_h98GOKf&2ZSOy4jiqLOny|>^^Y{iFcjZfJe=Q#Vn#xQ=sPW;5ri=VLz zzu+ePirx4fdxXG<;Oj-iG3wJH!|#y$k;bcdjkbTn0hCCYsIT`1&qyq>tVR~D0KEax%u2TuK0x`ddc0`M)o&3iZL`VM#Rx_A%opG3$-kBi=a0a=PB Ak^lez diff --git a/build/web/WEB-INF/classes/com/rms/controller/LoginController$Creds.class b/build/web/WEB-INF/classes/com/rms/controller/LoginController$Creds.class deleted file mode 100644 index 43e27b2d7f7d6e581ce81c0365ad8500d37445d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455 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 diff --git a/build/web/WEB-INF/classes/com/rms/controller/SignupController.class b/build/web/WEB-INF/classes/com/rms/controller/SignupController.class index 57d973df0b4d8197578ab09b295b1fd6b2e78c7a..c9fe60b2fdda640634b39739d3943851012e44a4 100644 GIT binary patch delta 4496 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 CZ)idQ literal 10511 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 lL%H~m-9Ri1aVUg1f@AKyFpgNb6O|jR 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 literal 2028 zcmcIk+fEZv6kVruS}s$dP%h=7AQ#(msRDut1RpS(Dk=fO`%oq@r0w8zF!7Ik@IezB z6CeBlKgziFnbN{Aee_{wpV{4O?b|y2^Y_&+JO^jeC0F)_tdTt`IAo zDX5YF`b`XAP{HsWzhWy4?YFZW`5wc!C2YvVu!QxU+4ZvLT=|Y$6aR>bQSm40zU5!n z#WijsE3WQ}TefcECQVFfyk~#BcD$-x^Xm%nJ(i|0uO%d@Js zZ+mQ@@7(tHo3l~K;&Ib zC{Hobp0*U1wiJoB6qUAA5^X{tV1-!z8@gTcOT*`!9)rf(oeCFd8S%M8V~ua86?0Ai-u1Ah)E^+7us&x8J&Dm zGA~Qo70H=pC7D9jh{!k0d>Qm$gxN-Um&SNW#+fUt^Bo49&3t6n15%Plk4VNgBR3FT z`ZUK=T%Tk>hCWIC34M~`C9%Nsbdp3M1qcS__+nz1qUko!;di42(C3khzWqQB4M6m->~i)lj-Ng+es# zM0WVJtyn?iV$xySP10_4pcS#TXhl2=ik5o0pLA+K8qA)a!6aq zAgfSr2c1UP=`}jRnf4ps_H?L_edu+){+_~2t$vb6UZLSe6BI`o|YK^mMnazte8m zlYehnxGoE_z2~0q8`ljBH^o)(x_uq$Uf+0cS-36U`2mG%cKcy)HfRf{?6PLz4r<(m z(+3@`kb1JOkUpT&Jod=z>f=G@REOWVr#?O9qoD2jCvND;c;rm?pL#t7`)G;2>pp`Y zrJ4kg8Q7F0h`H0XrW|mY(_69pxKgW6UV~G)MSSXFf^xELk=q`QQiUU~ycm`F@6nqX z!_aZcgtH)UCV!YUa{9=&=x3@#Nu*%$*K5NC{*@|xJ((01IBC*5+X@C@TOWF&W@%hB zn^Kd^)=Ml^AkQx=gH}pv&Gf7W)3X3f&tx|}Gu-sdY11=(+0V1_v4BFI);;!0JkBeq zUumS^@GI{EP(qs1*J)YNB;3UYM~po-IYT!1i?+pn+o`T^lyk38aO}(wmQx*~?AX~M zD$ZhV2-~sqLsT8RFvN;u&knKb*u^2%vqF}*T zqM^`j%OijybptkvJPuDsiSQGTocPBv~6dJlKfKmI8mo+T&KN6rcaV}s>Yf2$#gJAqepUAWlXF5z|I!I<(i8DPW(-%{iq-MuVQhy4cCNizYnT`{g9wjra#+kk*Q)>#7 RydGmFc@Gp0`Ay-oe*jPM$DYLi$NFXBsh z&?-|@dGG;zAFr1Go{a=IlM9DTcY0>KfAjC2Uw?l5B%%d+mZDxN8nn!I#iR_a^74?E zHC`U^@|c$=ysY!Gk))?d+SDk0=@cgL;@jrzr>BM~^ltB5zk4r&_dwGWQ#!Z97ME&@@j!yjnW zP{gYT{(hqpX4bLQ;1sd9>-cKb@tpdaMm_oIU5(-!{yt~lc094usP2j2mA&U8lHK+z zw!3Qw4*zcjt_y|TO=kU!@;FS6AcI$z|RiQcaBRSlNL zlVZjkv>_p?w&OyAz~>A19f&$E(ryz3l8uUl68VC&4^A?&{H7@r{=>Wrq! zej})ek|U)%9e`OL;tb_z3}bmZ^c*Njjo#TZjsKuQZvX@M#&Xr%?Pv|xrEzz^3ZjmF{4 z!)mYz>x8s#aAGupH3ds36vy#P@G{{cnxxD4hlfQ|SUJION?@0$Xid!A$;M8o$I2y| z6t^atNSf1|q+27&CMB($(ImslnN2dST&hVaE0=Ckx?R*lS%TyyD-OYjq4yZ%o`Tvp z!G0TM=MY&!VTL*m3%8(v0F?$MXpycW17D#?*AVNG-gS6!>9KMN>9KaY^tfhHdaR!z zJyy_^9&5;SMeaPMQRN1hLJ116p@!cn@dbxM4RsluRO)w&@~w~8aGF7NYaD{L#Rxla z6`0p#hSBiU>1A~}23&ZWtX8hGAn~sekef=78K@fGq75>G_C-M~fXs9OVKo`#juJ$V zg3KyGX4N2i6l4w{^Ibr=nG8};wk8>E&7uTO$_z5E1Tmu^B_+s$8pMo(JO{{&E+G7p805YZBozhOQGzV0K~hnW SmjEeu0pW+tAP?m8So#aPoNc@S diff --git a/build/web/WEB-INF/classes/com/rms/model/JobSeekerService.class b/build/web/WEB-INF/classes/com/rms/model/JobSeekerService.class index 66fd47efde647dc8fec35557b986e2875a6af312..bbe9b0f753a26e023557847ea754f8741982e66f 100644 GIT binary patch literal 4424 zcmbVPU2s#!75-L8x{`eTr|=W;dqWAa!B`MNlgj)U+X7_#hiwd)P;)IUAagC*S65&| zNCIh_mXZ?sla#h;XxfIC%%q_$j@y~^Ef4KW-#XLjL!UC!=|i6~({_f?Z|{|58yjYd zJ#+W$?m4^Xoc+$Xt3Q76yH5Z-huabOutbAjM*u;Ani2Dy8Mn;b>3H|>h)g>I!JXM$ z*4Ztvq^^D-f)K(QB04Id3#>@zN8|QrAwHVVNGsmf(wfiZT&v2{(kXSa`5ZOt>O0)E z3*%ONcA_bSDuK`Xk{!v`exuk}EJ%AOn`tPCIdfDhS&o`nO9^(~;=o9uu`njnS<}j1 zFdeS%4xK7m){tjG1vxP$?X1kD<M~A_Z^oNV@Z2AQ%&Qw5e| zg@z|}#IRCeWqG3osyyC;bQrimpe~iFA5f;Nb*#Z!0bNeWbkUKAiqf7GSU&d%du5?$ zIepUMW(JPGIB1 zL!O(35E|ΞfT)xsSp}2wMfJ<^v>zXSqQcAt5}+Og{(_<;<6LJdYQc7CPgmW!Yk$ zq(Vrj)VXj9VJFuv<0%BzO6>wbMbM1B8d`L;qD^4!{K{$15BIsy>XY`lY+4E|r32;B zwtTwiVPR#-od?P&Re!ui!@dO-SzaN6Bo3$|PYJxeNJy!L5PQ6l$6V-mOZ`BYDLSa5 z1D(umNB92y$zFojbED{Ft+jn{ zp@`;$%1%ayRH+H}B?m}HA<&<7N!w;TDm3QOSP-;|FROwZ5omo(-}}$l`Sa$mCFyDX=Xmd?lSg-FitX= zF;j^u=x|WvAj_v^(vbzlTMP5da#8s?uVX^xM?12&w=31PKZFYc8|Ejd?1nITA*<;XBWe* zR|3R#E3aNU(2>o_uHxvhwEI=!NyHubv}p~Pc2@OEgMQ~smd+U+kEWj{vg2I-X_-uA z1XkCj>K|rEi|E2MtHa@~?B$_)mT!-#8(Bb*jA~S2k!i~}uYm7(3z0tV-8w!w!P54Y zR-`uR|cmG&M0r7)w9zJ?n1R1Uj)3?cxJPD2cz$l&Y66s$FvC*K1i69iZaGh84Wj>!kuZW z^aP9a<%@P&?qi)W)N<*TE{#S7LOewl_3?2>>Qq!p$xoTDJAS{;UYxC98`v}j@eu_d zzQM1W1|oQ!U)@u{H}Ng@1g_%S)S|J!2bFxhKwJ==qDv(FA`$o)T4%H}5p0MBr%~-g z*B1Y(X)IfUEz?-V>h{O{(^w~P6E|c2=+o19#)pJPakD3eC{k68hAGB9F+y>hCst70 zK8+ndUd|N1;*C~PZ1Th^in~0qdQ-!yDeOtq{2s|;F>O^W6br{9v5IAStTI*=tB%!7 zVSgfU2km#z7445{cQFw2e+q6ljTZ%OBajGg`4nM#WR|)O>^4keSaq)?g12!g5p)+w zM^D9qcX392&i+5E>{P2fpQwG%COUuT=-izHiD<0$53#_ncmjXIU+`Db>fi7g{=xR2 z_#FRc8{y1742fE?Mi^|@iv|&AyG=BS-QK)t<%!;-23wI7heSW;2gFH{W-CQr*lb%l zqx6<2WQYh_C@&)dmJ>=Vz=tJwT7@dCMHEj{+Q_HhGuX^$+zx)5(SU>4f&pxWiEXg( zEY4#)uJHH98`StAUcfCh;S=nozbX6~?Tn|B5p^)4Zu}iRjH{24^)j-<_!n3D9LE^p zQT&(p(mk}{K9WM`d#9G~ndN8~Yxrg`&>_~NTWmy+XdtV{(JQv`V&8!Q(S&2nz){hR zK}L2!Bx%=9yF;|=r`-VU25EPac4^v4+GS~%r=3kZhj!=jqFWtz8Fe!&Vk53G7YFew z_&&*h#61IoXakDOEEw zn=y_XyuqWG#&Vc(A(W)%B1n!NF1?pNmds9!%1Qm*~Ysdhs%A>lONPh2C6d9lgdK9j;$=JsPL( z1a&X+{}OdCQ}=c1UZr%6y4Q)|8`OAFj!ITtk)x9&twXQQJAAVaxZ~%8o2o7;=RS_P7_hRW6ygy37{rMc& z5}QLSXK}~wyZ5*)o7q9}A8w%_7xr;)a97aJU%0m)VTTQ_H@pF(&3AF}V_g0<+SMH? P=G>9$cKjvBe0cwVDd0LB delta 115 zcmX@1w3dnM)W2Q(7#J8#7z8GA=`*u4a7=DsR-SyCJ!0|>PPG7b1}2~+0|O%vvNEs% yNlqY7AIxW9VAa~rz_<}8z{J1>Btg;)4BSA-z`z4$vjS;eAdiuO4@fdG@B;vnnhhZU diff --git a/build/web/WEB-INF/classes/com/rms/model/RecruiterService.class b/build/web/WEB-INF/classes/com/rms/model/RecruiterService.class index 2d2c23f5baa72945c6118c35f178367e3685877f..9ee727523ba00da6dd45e8400785609ea6ca5964 100644 GIT binary patch literal 8413 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 NFu63AV|i-a{{gM)CKCVv literal 1888 zcmZ`(ZF3V<7(F*HY`b0B&^9g9Qle-{(n1t#QBsPf6+RkyrlfoM8YQZOJe=7U$uT z24@6@dy}y)qe}W@I#AJ7dp@%}h!^pag0mW4#w$Jc6dyD_v&LwrMU#?2u;t{oT&wOC zJ=Zj9c?IVLCXX!THsxJwS$5TQRm>tffULl&(2&b1){v?&)HAE8-@o}bB{B0F&f@}& zFd7ZBPNnC&l?IggOqckcEO}|#s~TRzMS+1m)7!Q@o7Rt~{~JQ=EEY7p;bT1~AX0G& zZz_08!)4^3HNUq|0i_|!w(EU9K2zuS;EIN2TxHjr)>l-(htZ2A~Rjw&chU?wJ zfxwPJ8LKyfzTmvWwO!rvcYE(Ox>ubL28`AYn z0(&Ec_}dOlMU7%W>BHngGnPRyN&jqbwUZT5u|cT{2utuEWikchBNLrTRGgCy%^|;Fxs}&FOSs z*wLSU714dCEHL$a5Lwqv@19fLGF+o(a?<5+2j(7eagr^8<3-P?e7WXc5 zloHS2-cuU(RA7i;0!ZNzq!yi)TQRR&(w1b0A?)x4IewhtAzpOgcU0a@5GeYqZGUHs z?{V(&3gqu?u5KX8Hz1ikfXF_9vU7mJ$56Ae$4LC-hnDy|Oc;3c#V|-x6?eGOfZtO0}+8ED1f;xAIsR-`;jMNj%GFf^w)5hFf8#zAO zc)g9qqqL(;D3g!yGlc{eal%hM5zvRJnFt@@V@mjh=(ylQ>iM*z=PA`o{iW!YX{q55 zO9J0Rm+#Yucsqh$k!)j)`PaU~yuVGIH=;c{-wSlEwXq)R{5m3j_~)UN8-;Xfh7JMa z6r1D)Gl7ek#0Ky1P43<1981?y#75YZyBPC}D0PY`g+&-dX^8%Xi1-tQKj>voS!GmM zoV0n7RI+!PY?~B)fUSpIM|?4|!@!xYR%xA9RdF@sSm0CQ)Q&Gd_A#98Vo*B_rjPpU EU+^2O%>V!Z diff --git a/build/web/gfv4ee7.dpf b/build/web/gfv4ee7.dpf deleted file mode 100644 index 37d26ad..0000000 --- a/build/web/gfv4ee7.dpf +++ /dev/null @@ -1,26 +0,0 @@ - - - - - /SE_Phase_3 - - - - Keep a copy of the generated servlet class' java code. - - - diff --git a/build/web/index.jsp b/build/web/index.jsp index ea05db7..fb49a5e 100644 --- a/build/web/index.jsp +++ b/build/web/index.jsp @@ -1,17 +1,368 @@ -<%-- - Document : index - Created on : Nov 14, 2025, 5:38:19 PM - Author : user ---%> - <%@page contentType="text/html" pageEncoding="UTF-8"%> - JSP Page + + RMS - Recruitment Management System + -

Hello World!

+
+
+
🎯
+

RMS

+

Recruitment Management System

+
+ + + +
+ QUICK ACCESS +
+ +
+

Development Tools

+ + +
+
+ 1000+ + Active Jobs +
+
+ 5000+ + Candidates +
+
+ 500+ + Companies +
+
+
+
- + \ No newline at end of file diff --git a/build/web/post_job.jsp b/build/web/post_job.jsp index d9f7e2c..adf1c4e 100644 --- a/build/web/post_job.jsp +++ b/build/web/post_job.jsp @@ -1,54 +1,57 @@ -<%-- - Document : post_job - Created on : Nov 17, 2025, 9:28:09 AM - Author : user ---%> - <%@page contentType="text/html;charset=UTF-8" language="java" %> - - Post Job - - - - - -

Post a New Job

- -
- -
- - - - - - - - - -
- -
- -← Back to Dashboard - - + + Post Job + + + +

Post a New Job

+ + <% + String error = (String) request.getAttribute("error"); + if (error != null) { + %> +
<%= error %>
+ <% } %> + +
+
+ + + + + + + + + + + + +
+
+ ← Back to Dashboard + \ No newline at end of file diff --git a/build/web/recruiter_home.jsp b/build/web/recruiter_home.jsp index 669d39f..73a5e77 100644 --- a/build/web/recruiter_home.jsp +++ b/build/web/recruiter_home.jsp @@ -1,17 +1,164 @@ <%-- Document : recruiter_home - Created on : Nov 17, 2025, 9:27:50 AM + Created on : Nov 17, 2025, 9:27:50 AM Author : user --%> - -<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@page import="com.rms.model.Recruiter"%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page import="java.util.List" %> +<%@ page import="com.rms.model.JobPosting" %> +<%@ page import="com.rms.model.User" %> + - JSP Page + Recruiter Dashboard | RMS + + -

Hello World!

+
+ <% + // Optional: Get user info from session for personalized welcome + Recruiter user = (Recruiter) session.getAttribute("user"); + String username = (user != null) ? user.getUsername() : "Recruiter"; + %> + +

Welcome, <%= username%> | Recruiter Dashboard

+ + + +
+ +

Your Active Job Listings

+ + <% + // Retrieve the list of JobPosting objects set by JobController.doGet + List jobList = (List) request.getAttribute("jobList"); + Integer jobCount = (Integer) request.getAttribute("jobCount"); + + if (jobList != null && !jobList.isEmpty()) { + %> +

Total Active Jobs: <%= jobCount%>

+ + + + + + + + + + + + + + + <% + for (JobPosting job : jobList) { + %> + + + + + + + + + + <% + } + %> + +
IDJob TitleLocationSalaryStatusDate PostedActions
<%= job.getId()%><%= job.getTitle()%><%= job.getLocation()%>$<%= String.format("%.2f", job.getSalary())%>;"><%= job.getStatus()%><%= job.getDatePosted()%> + Edit | + View Applicants +
+ <% } else { %> +

You currently have no active job listings. Click "Post New Job" above to begin hiring.

+ <% }%> + +
- + \ No newline at end of file diff --git a/src/java/com/rms/controller/LoginController.java b/src/java/com/rms/controller/LoginController.java index a1e2ad8..32c96be 100644 --- a/src/java/com/rms/controller/LoginController.java +++ b/src/java/com/rms/controller/LoginController.java @@ -1,220 +1,188 @@ package com.rms.controller; -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template - */ - +import com.rms.model.AuthService; import com.rms.model.DBConnect; import com.rms.model.JobSeeker; import com.rms.model.Recruiter; -import java.io.IOException; -import java.io.PrintWriter; + import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.*; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.servlet.annotation.MultipartConfig; -/** - * - * @author user - */ -@MultipartConfig +import java.sql.*; + @WebServlet(urlPatterns = {"/LoginController"}) +@MultipartConfig public class LoginController extends HttpServlet { - /** - * Processes requests for both HTTP GET and POST - * methods. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - - public static class Creds { - public String email; - public String password; - }; - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - response.setContentType("text/html;charset=UTF-8"); - PrintWriter out = response.getWriter(); - try { - - } finally { - out.close(); + // ------------------------------------------------------------------- + // Utility: SHA-256 hashing + // ------------------------------------------------------------------- + + + + // ------------------------------------------------------------------- + // Query: Validate user credentials + // ------------------------------------------------------------------- + private ResultSet fetchUser(Connection conn, String email, String hashedPassword) throws SQLException { + + String sql = "SELECT * FROM user WHERE email = ? AND password = ?"; + PreparedStatement stmt = conn.prepareStatement(sql); + stmt.setString(1, email); + stmt.setString(2, hashedPassword); + return stmt.executeQuery(); + } + + + // ------------------------------------------------------------------- + // Query: Fetch Job Seeker details + // ------------------------------------------------------------------- + private JobSeeker loadJobSeeker(Connection conn, String userId, String username, String email, String role) + throws SQLException { + + String sql = "SELECT * FROM `job seeker` WHERE jobseeker_id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, userId); + try (ResultSet rs = stmt.executeQuery()) { + if (!rs.next()) return null; + + String specialization = rs.getString("specialization"); + String fullName = rs.getString("full_name"); + int experienceYears = Integer.parseInt(rs.getString("experience_years")); + String skills = rs.getString("skills"); + String interests = rs.getString("interests"); + String intro = rs.getString("User_Introduction"); + + byte[] resume = loadUserResume(conn, userId); + + return new JobSeeker( + username, + Integer.parseInt(userId), + email, + role, + specialization, + fullName, + experienceYears, + skills, + interests, + intro, + resume + ); + } } } - // - /** - * Handles the HTTP GET method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); + + // ------------------------------------------------------------------- + // Query: Fetch Recruiter details + // ------------------------------------------------------------------- + private Recruiter loadRecruiter(Connection conn, String userId, String username, String email) + throws SQLException { + + String sql = "SELECT * FROM recruiter WHERE recruiter_id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, userId); + + try (ResultSet rs = stmt.executeQuery()) { + if (!rs.next()) return null; + + String companyId = rs.getString("company_id"); + String companyName = rs.getString("company_name"); + + return new Recruiter( + Integer.parseInt(userId), + username, + email, + companyId, + companyName + ); + } + } } - /** - * Handles the HTTP POST method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - - private static String bytesToHex(byte[] hash) { - StringBuilder hexString = new StringBuilder(2 * hash.length); - for (int i = 0; i < hash.length; i++) { - String hex = Integer.toHexString(0xff & hash[i]); - if(hex.length() == 1) { - hexString.append('0'); + + // ------------------------------------------------------------------- + // Query: Load Resume Document + // ------------------------------------------------------------------- + private byte[] loadUserResume(Connection conn, String userId) throws SQLException { + + String sql = + "SELECT filedata FROM document WHERE jobseeker_id = ? LIMIT 1"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, userId); + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next() ? rs.getBytes("filedata") : null; + } } - hexString.append(hex); } - return hexString.toString(); -} - + + + // ------------------------------------------------------------------- + // HTTP: POST (Login) + // ------------------------------------------------------------------- + @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - -// processRequest(request, response); - - String email = request.getParameter("email"); - String password = request.getParameter("password"); - - - - - String db_user = "admin"; - String db_password = "ManarNoorYousefRawan"; - - try { - try { - Class.forName("com.mysql.cj.jdbc.Driver"); // optional - Connection conn = DBConnect.getConnection(); - MessageDigest digest = MessageDigest.getInstance("SHA-256"); - byte[] encodedhash = digest.digest( - password.getBytes(StandardCharsets.UTF_8)); - System.out.println(password); - System.out.println(bytesToHex(encodedhash)); - Statement statement =conn.createStatement(); - String query = "SELECT * FROM user WHERE password= ? AND email = ?"; - PreparedStatement stmt = conn.prepareStatement(query); - stmt.setString(1, bytesToHex(encodedhash)); - stmt.setString(2, email); - ResultSet result = stmt.executeQuery(); - System.out.println("Fetching Data"); - if (!result.next()) { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid Credienitals"); - } - else { - do { - String role = result.getString("role"); - String user_id = result.getString("user_id"); - String username = result.getString("username"); - if (role.equals("jobseeker")) { - String queryJobSeeker = "SELECT * FROM `job seeker` WHERE jobseeker_id=?"; - - PreparedStatement stmt1 = conn.prepareStatement(queryJobSeeker); - stmt1.setString(1, user_id); - ResultSet result1 = stmt1.executeQuery(); - System.out.println("Running here!"); - while (result1.next()) { - String specialization = result1.getString("specialization"); - String full_name = result1.getString("full_name"); - String experience_years = result1.getString("experience_years"); - String interests = result1.getString("interests"); - String skills = result1.getString("skills"); - String user_introduction = result1.getString("User_Introduction"); - String queryDocument = - "SELECT d.fileData " + - "FROM document d " + - "JOIN `job seeker` js ON js.jobseeker_id = d.jobseeker_id " + - "WHERE d.jobseeker_id = ?"; - -PreparedStatement stmt2 = conn.prepareStatement(queryDocument); -stmt2.setString(1, user_id); -ResultSet result3 = stmt2.executeQuery(); - System.out.println("Got Job Details"); - while (result3.next()) { - byte[] fileData= result3.getBytes("fileData"); - int userid = Integer.parseInt(user_id); - int years = Integer.parseInt(experience_years); - JobSeeker job_seeker = new JobSeeker(username, userid, email, role, specialization, full_name, years, skills, interests, user_introduction, fileData); - request.getSession().setAttribute("user", job_seeker); - System.out.println("Got Document"); - response.sendRedirect("jobseeker_home.jsp"); - - - } - - } - - } - else { - String queryRecruiter = "SELECT * FROM recruiter WHERE recruiter_id=?"; - PreparedStatement stmt1 = conn.prepareStatement(queryRecruiter); - stmt1.setString(1, user_id); - ResultSet result1 = stmt1.executeQuery(); - System.out.println("Running here!"); - while (result1.next()) { - String company_id = result1.getString("company_id"); - String company_name = result1.getString("company_name"); - Recruiter recruiter = new Recruiter(Integer.parseInt(user_id), username, email, company_id, company_name); - request.getSession().setAttribute("user", recruiter); - response.sendRedirect("recruiter_home.jsp"); - - - } - } - - - } while (result.next()); - } - - } catch (ClassNotFoundException ex) { - Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex); + throws IOException, ServletException { + + String email = request.getParameter("email"); + String password = request.getParameter("password"); + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (Exception ignored) {} + + try (Connection conn = DBConnect.getConnection()) { + + // Hash password + AuthService auth = new AuthService(); + String hashedPassword = auth.hashPassword(password); + + // Validate user + ResultSet rs = fetchUser(conn, email, hashedPassword); + if (!rs.next()) { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid email or password"); + return; + } + + // Extract common fields + String userId = rs.getString("user_id"); + String username = rs.getString("username"); + String role = rs.getString("role"); + + HttpSession session = request.getSession(); + + // Load role-specific data + if ("jobseeker".equals(role)) { + JobSeeker jobSeeker = loadJobSeeker(conn, userId, username, email, role); + if (jobSeeker == null) { + response.sendError(500, "JobSeeker profile missing"); + return; } - - - } catch (SQLException | NoSuchAlgorithmException ex) { - Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex); - } - System.out.println("Connected successfully!"); - - } - /** - * Returns a short description of the servlet. - * - * @return a String containing servlet description - */ - @Override - public String getServletInfo() { - return "Short description"; - }// + session.setAttribute("user", jobSeeker); + response.sendRedirect("jobseeker_home.jsp"); + } -} + else if ("recruiter".equals(role)) { + Recruiter recruiter = loadRecruiter(conn, userId, username, email); + if (recruiter == null) { + response.sendError(500, "Recruiter profile missing"); + return; + } + + session.setAttribute("user", recruiter); + response.sendRedirect("recruiter_home.jsp"); + } + } catch (SQLException | NoSuchAlgorithmException e) { + e.printStackTrace(); + response.sendError(500, "Server Error: " + e.getMessage()); + } + } +} diff --git a/src/java/com/rms/controller/SignupController.java b/src/java/com/rms/controller/SignupController.java index 45c2fda..a8a102d 100644 --- a/src/java/com/rms/controller/SignupController.java +++ b/src/java/com/rms/controller/SignupController.java @@ -5,6 +5,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template */ +import com.rms.model.AuthService; import com.rms.model.DBConnect; import com.rms.model.JobSeeker; import com.rms.model.Recruiter; @@ -75,41 +76,12 @@ private byte[] readUploadedFile(Part filePart) throws IOException { // ------------------------------------------------------------------- // DB Utility: Get user_id after insert // ------------------------------------------------------------------- - private String getUserId(Connection conn, String email, String hashedPassword) throws SQLException { - String sql = "SELECT user_id FROM user WHERE email = ? AND password = ?"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, email); - stmt.setString(2, hashedPassword); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) return rs.getString("user_id"); - } - return null; - } + // ------------------------------------------------------------------- // Insert: Generic user // ------------------------------------------------------------------- - private User insertUser(Connection conn, String username, String email, String hashedPassword, String role, HttpServletResponse response) - throws SQLException, IOException { - - String sql = "INSERT INTO user (username, email, password, role) VALUES (?, ?, ?, ?)"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, username); - stmt.setString(2, email); - stmt.setString(3, hashedPassword); - stmt.setString(4, role); - int num = stmt.executeUpdate(); - if (num == 0) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Username/email already used"); - } - } - catch (Exception e) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Username/email already used"); - - } - String id = getUserId(conn, email, hashedPassword); - return new User(Integer.parseInt(id), username, email, role); - } + // ------------------------------------------------------------------- // Insert: Recruiter @@ -207,10 +179,10 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) try (Connection conn = DBConnect.getConnection()) { String hashedPassword = hashPassword(password); + AuthService auth = new AuthService(); + User user = auth.insertUser(conn, username, email, hashedPassword, role, response); - User user = insertUser(conn, username, email, hashedPassword, role, response); - - String userId = getUserId(conn, email, hashedPassword); + String userId = auth.getUserId(conn, email, hashedPassword); if (userId == null) { System.err.println("Error: User ID not found."); return; @@ -219,7 +191,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) if ("recruiter".equals(role)) { Recruiter recruiter = insertRecruiter(conn, user, request); request.getSession().setAttribute("user", recruiter); - response.sendRedirect("recruiter_home.jsp"); + response.sendRedirect("recruiter_home.jsp"); } else { if (pdfBytes != null) { JobSeeker jobSeeker= insertJobSeeker(conn, user, pdfBytes, request); diff --git a/src/java/com/rms/model/AuthService.java b/src/java/com/rms/model/AuthService.java index 68a4006..4018b28 100644 --- a/src/java/com/rms/model/AuthService.java +++ b/src/java/com/rms/model/AuthService.java @@ -1,199 +1,185 @@ -//package com.rms.model; -// -//import java.sql.Connection; -//import java.sql.PreparedStatement; -//import java.sql.ResultSet; -//import java.sql.SQLException; -//import java.nio.charset.StandardCharsets; -//import java.security.MessageDigest; -//import java.security.NoSuchAlgorithmException; -//import java.util.logging.Level; -//import java.util.logging.Logger; -// -//public class AuthService { -// -// private static final Logger LOGGER = Logger.getLogger(AuthService.class.getName()); -// -// /** -// * Converts byte array to hexadecimal string (for password hashing). -// */ -// private static String bytesToHex(byte[] hash) { -// StringBuilder hexString = new StringBuilder(2 * hash.length); -// for (int i = 0; i < hash.length; i++) { -// String hex = Integer.toHexString(0xff & hash[i]); -// if (hex.length() == 1) { -// hexString.append('0'); -// } -// hexString.append(hex); -// } -// return hexString.toString(); -// } -// -// /** -// * Authenticates user and returns User object with role, or null if login -// * fails. -// * -// * @param email User's email address -// * @param rawPassword Plain text password from login form -// * @return User object if authentication succeeds, null otherwise -// */ -// public User authenticateUser(String email, String rawPassword) { -// Connection conn = null; -// PreparedStatement stmt = null; -// ResultSet result = null; -// User user = null; -// -// try { -// // HASH THE INPUT PASSWORD using SHA-256 -// MessageDigest digest = MessageDigest.getInstance("SHA-256"); -// byte[] encodedhash = digest.digest(rawPassword.getBytes(StandardCharsets.UTF_8)); -// String hashedPassword = bytesToHex(encodedhash); -// -// // DEBUG: Print to console for troubleshooting -// System.out.println("=== LOGIN DEBUG ==="); -// System.out.println("Input Email: " + email); -// System.out.println("Input Password (raw): " + rawPassword); -// System.out.println("Hashed Password: " + hashedPassword); -// -// // Get database connection -// conn = DBConnect.getConnection(); -// -// if (conn == null) { -// System.out.println("ERROR: Database connection is NULL!"); -// return null; -// } -// -// System.out.println("Database connection successful"); -// -// // Query to find user by email and password -// String query = "SELECT user_id, username, email, password, role FROM User WHERE email = ?"; -// stmt = conn.prepareStatement(query); -// stmt.setString(1, email.trim()); -// -// result = stmt.executeQuery(); -// -// if (result.next()) { -// // User found, now check password -// String storedPassword = result.getString("password"); -// -// System.out.println("User found in database"); -// System.out.println("Stored Password: " + storedPassword); -// System.out.println("Passwords Match: " + hashedPassword.equals(storedPassword)); -// -// // Compare hashed passwords -// if (hashedPassword.equals(storedPassword)) { -// // Password matches - create User object -// user = new User(); -// user.setUser_id(result.getInt("user_id")); -// user.setUsername(result.getString("username")); -// user.setEmail(result.getString("email")); -// user.setRole(result.getString("role")); -// -// System.out.println("✅ Login SUCCESS for user: " + user.getUsername() + " (Role: " + user.getRole() + ")"); -// LOGGER.log(Level.INFO, "User logged in successfully: {0}", user.getUsername()); -// } else { -// System.out.println("❌ Password mismatch!"); -// LOGGER.log(Level.WARNING, "Failed login attempt for email: {0} (wrong password)", email); -// } -// } else { -// System.out.println("❌ No user found with email: " + email); -// LOGGER.log(Level.WARNING, "Failed login attempt - email not found: {0}", email); -// } -// -// } catch (SQLException ex) { -// System.out.println("❌ SQL ERROR: " + ex.getMessage()); -// LOGGER.log(Level.SEVERE, "Database error during authentication", ex); -// ex.printStackTrace(); -// } catch (NoSuchAlgorithmException ex) { -// System.out.println("❌ HASHING ERROR: " + ex.getMessage()); -// LOGGER.log(Level.SEVERE, "Password hashing algorithm not found", ex); -// ex.printStackTrace(); -// } finally { -// // Close all database resources -// try { -// if (result != null) { -// result.close(); -// } -// } catch (SQLException e) { -// LOGGER.log(Level.WARNING, "Error closing ResultSet", e); -// } -// try { -// if (stmt != null) { -// stmt.close(); -// } -// } catch (SQLException e) { -// LOGGER.log(Level.WARNING, "Error closing PreparedStatement", e); -// } -// try { -// if (conn != null) { -// conn.close(); -// } -// } catch (SQLException e) { -// LOGGER.log(Level.WARNING, "Error closing Connection", e); -// } -// } -// -// System.out.println("==================="); -// return user; -// } -// -// /** -// * Registers a new user in the system. -// * -// * @param user User object containing registration details -// * @return true if registration succeeds, false otherwise -// */ -// public boolean registerUser(User user) { -// Connection conn = null; -// PreparedStatement stmt = null; -// boolean success = false; -// -// try { -// // Hash the password before storing -// MessageDigest digest = MessageDigest.getInstance("SHA-256"); -// byte[] encodedhash = digest.digest(user.getPassword().getBytes(StandardCharsets.UTF_8)); -// String hashedPassword = bytesToHex(encodedhash); -// -// conn = DBConnect.getConnection(); -// -// String query = "INSERT INTO User (username, email, password, role) VALUES (?, ?, ?, ?)"; -// stmt = conn.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS); -// -// stmt.setString(1, user.getUsername()); -// stmt.setString(2, user.getEmail()); -// stmt.setString(3, hashedPassword); -// stmt.setString(4, user.getRole()); -// -// int rowsAffected = stmt.executeUpdate(); -// success = (rowsAffected > 0); -// -// if (success) { -// // Get the generated user_id -// ResultSet generatedKeys = stmt.getGeneratedKeys(); -// if (generatedKeys.next()) { -// user.setUser_id(generatedKeys.getInt(1)); -// } -// LOGGER.log(Level.INFO, "User registered successfully: {0}", user.getUsername()); -// } -// -// } catch (SQLException | NoSuchAlgorithmException ex) { -// LOGGER.log(Level.SEVERE, "Error during user registration", ex); -// ex.printStackTrace(); -// } finally { -// try { -// if (stmt != null) { -// stmt.close(); -// } -// } catch (SQLException e) { -// } -// try { -// if (conn != null) { -// conn.close(); -// } -// } catch (SQLException e) { -// } -// } -// -// return success; -// } -//} +package com.rms.model; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.servlet.http.HttpServletResponse; + +public class AuthService { + + private static final Logger LOGGER = Logger.getLogger(AuthService.class.getName()); + public String getUserId(Connection conn, String email, String hashedPassword) throws SQLException { + String sql = "SELECT user_id FROM user WHERE email = ? AND password = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, email); + stmt.setString(2, hashedPassword); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) return rs.getString("user_id"); + } + return null; + } + public String hashPassword(String password) throws NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] encoded = digest.digest(password.getBytes(StandardCharsets.UTF_8)); + + StringBuilder hexString = new StringBuilder(); + for (byte b : encoded) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } + /** + * Converts byte array to hexadecimal string (for password hashing). + */ + private static String bytesToHex(byte[] hash) { + StringBuilder hexString = new StringBuilder(2 * hash.length); + for (int i = 0; i < hash.length; i++) { + String hex = Integer.toHexString(0xff & hash[i]); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } + + /** + * Authenticates user and returns User object with role, or null if login + * fails. + * + * @param email User's email address + * @param rawPassword Plain text password from login form + * @return User object if authentication succeeds, null otherwise + */ + public User authenticateUser(String email, String rawPassword) { + Connection conn = null; + PreparedStatement stmt = null; + ResultSet result = null; + User user = null; + + try { + // HASH THE INPUT PASSWORD using SHA-256 + + String hashedPassword = hashPassword(rawPassword); + + // DEBUG: Print to console for troubleshooting + System.out.println("=== LOGIN DEBUG ==="); + System.out.println("Input Email: " + email); + System.out.println("Input Password (raw): " + rawPassword); + System.out.println("Hashed Password: " + hashedPassword); + + // Get database connection + conn = DBConnect.getConnection(); + + if (conn == null) { + System.out.println("ERROR: Database connection is NULL!"); + return null; + } + + System.out.println("Database connection successful"); + + // Query to find user by email and password + String query = "SELECT user_id, username, email, password, role FROM User WHERE email = ?"; + stmt = conn.prepareStatement(query); + stmt.setString(1, email.trim()); + + result = stmt.executeQuery(); + + if (result.next()) { + // User found, now check password + String storedPassword = result.getString("password"); + + System.out.println("User found in database"); + System.out.println("Stored Password: " + storedPassword); + System.out.println("Passwords Match: " + hashedPassword.equals(storedPassword)); + + // Compare hashed passwords + if (hashedPassword.equals(storedPassword)) { + // Password matches - create User object + user = new User(); + user.setUser_id(result.getInt("user_id")); + user.setUsername(result.getString("username")); + user.setEmail(result.getString("email")); + user.setRole(result.getString("role")); + + System.out.println("✅ Login SUCCESS for user: " + user.getUsername() + " (Role: " + user.getRole() + ")"); + LOGGER.log(Level.INFO, "User logged in successfully: {0}", user.getUsername()); + } else { + System.out.println("❌ Password mismatch!"); + LOGGER.log(Level.WARNING, "Failed login attempt for email: {0} (wrong password)", email); + } + } else { + System.out.println("❌ No user found with email: " + email); + LOGGER.log(Level.WARNING, "Failed login attempt - email not found: {0}", email); + } + + } catch (SQLException ex) { + System.out.println("❌ SQL ERROR: " + ex.getMessage()); + LOGGER.log(Level.SEVERE, "Database error during authentication", ex); + ex.printStackTrace(); + } catch (NoSuchAlgorithmException ex) { + System.out.println("❌ HASHING ERROR: " + ex.getMessage()); + LOGGER.log(Level.SEVERE, "Password hashing algorithm not found", ex); + ex.printStackTrace(); + } finally { + // Close all database resources + try { + if (result != null) { + result.close(); + } + } catch (SQLException e) { + LOGGER.log(Level.WARNING, "Error closing ResultSet", e); + } + try { + if (stmt != null) { + stmt.close(); + } + } catch (SQLException e) { + LOGGER.log(Level.WARNING, "Error closing PreparedStatement", e); + } + try { + if (conn != null) { + conn.close(); + } + } catch (SQLException e) { + LOGGER.log(Level.WARNING, "Error closing Connection", e); + } + } + + System.out.println("==================="); + return user; + } + + + + public User insertUser(Connection conn, String username, String email, String hashedPassword, String role, HttpServletResponse response) + throws SQLException, IOException { + + String sql = "INSERT INTO user (username, email, password, role) VALUES (?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, username); + stmt.setString(2, email); + stmt.setString(3, hashedPassword); + stmt.setString(4, role); + int num = stmt.executeUpdate(); + if (num == 0) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Username/email already used"); + } + } + catch (Exception e) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Username/email already used"); + + } + String id = getUserId(conn, email, hashedPassword); + return new User(Integer.parseInt(id), username, email, role); + } +} diff --git a/web/recruiter_home.jsp b/web/recruiter_home.jsp index 8823716..73a5e77 100644 --- a/web/recruiter_home.jsp +++ b/web/recruiter_home.jsp @@ -3,6 +3,7 @@ Created on : Nov 17, 2025, 9:27:50 AM Author : user --%> +<%@page import="com.rms.model.Recruiter"%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.util.List" %> <%@ page import="com.rms.model.JobPosting" %> @@ -94,7 +95,7 @@
<% // Optional: Get user info from session for personalized welcome - User user = (User) session.getAttribute("user"); + Recruiter user = (Recruiter) session.getAttribute("user"); String username = (user != null) ? user.getUsername() : "Recruiter"; %> From 3417ff0f47df913e91638ef11809eceb85600154 Mon Sep 17 00:00:00 2001 From: yousefmarey12 Date: Mon, 24 Nov 2025 21:07:17 +0300 Subject: [PATCH 3/3] refactor(LoginController): integrated recruiter_home.jsp & job_posting.jsp with auth also seperated between model and controller logic --- build/web/gfv4ee7.dpf | 26 ++++++++++++++++++++++++++ build/web/jobseeker_home.jsp | 2 +- build/web/recruiter_home.jsp | 2 +- nbproject/private/private.xml | 33 ++++++++++++++++++++++++++------- web/jobseeker_home.jsp | 2 +- web/recruiter_home.jsp | 2 +- 6 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 build/web/gfv4ee7.dpf diff --git a/build/web/gfv4ee7.dpf b/build/web/gfv4ee7.dpf new file mode 100644 index 0000000..37d26ad --- /dev/null +++ b/build/web/gfv4ee7.dpf @@ -0,0 +1,26 @@ + + + + + /SE_Phase_3 + + + + Keep a copy of the generated servlet class' java code. + + + diff --git a/build/web/jobseeker_home.jsp b/build/web/jobseeker_home.jsp index d2b8874..6d7d3c8 100644 --- a/build/web/jobseeker_home.jsp +++ b/build/web/jobseeker_home.jsp @@ -155,4 +155,4 @@
- \ No newline at end of file + diff --git a/build/web/recruiter_home.jsp b/build/web/recruiter_home.jsp index 73a5e77..294571e 100644 --- a/build/web/recruiter_home.jsp +++ b/build/web/recruiter_home.jsp @@ -161,4 +161,4 @@ - \ No newline at end of file + diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 6807a2b..81a97c7 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -1,7 +1,26 @@ - - - - - - - + + + + + + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/LoginController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/login.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/register.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/DBConnect.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/database/rms_testing_complete.sql + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/JobController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/User.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/Recruiter.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/SearchController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/controller/SignupController.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/JobSeeker.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/SearchSystemService.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/jobseeker_home.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/JobPosting.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/RecruiterService.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/src/java/com/rms/model/JobSeekerService.java + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/recruiter_home.jsp + file:/C:/Users/mfmma/Downloads/yousef_m_fork/web/post_job.jsp + + + diff --git a/web/jobseeker_home.jsp b/web/jobseeker_home.jsp index d2b8874..6d7d3c8 100644 --- a/web/jobseeker_home.jsp +++ b/web/jobseeker_home.jsp @@ -155,4 +155,4 @@ - \ No newline at end of file + diff --git a/web/recruiter_home.jsp b/web/recruiter_home.jsp index 73a5e77..294571e 100644 --- a/web/recruiter_home.jsp +++ b/web/recruiter_home.jsp @@ -161,4 +161,4 @@ - \ No newline at end of file +