changed login and logout to adapt to domain and added ToU
This commit is contained in:
@@ -11,7 +11,6 @@ import * as $_apps_mobility_partials_overview from "./routes/(apps)/mobility/par
|
|||||||
import * as $_apps_mobility_partials_students from "./routes/(apps)/mobility/partials/students.tsx";
|
import * as $_apps_mobility_partials_students from "./routes/(apps)/mobility/partials/students.tsx";
|
||||||
import * as $_apps_notes_index from "./routes/(apps)/notes/index.tsx";
|
import * as $_apps_notes_index from "./routes/(apps)/notes/index.tsx";
|
||||||
import * as $_apps_notes_partials_admin_courses from "./routes/(apps)/notes/partials/(admin)/courses.tsx";
|
import * as $_apps_notes_partials_admin_courses from "./routes/(apps)/notes/partials/(admin)/courses.tsx";
|
||||||
import * as $_apps_notes_partials_admin_students from "./routes/(apps)/notes/partials/(admin)/students.tsx";
|
|
||||||
import * as $_apps_notes_partials_index from "./routes/(apps)/notes/partials/index.tsx";
|
import * as $_apps_notes_partials_index from "./routes/(apps)/notes/partials/index.tsx";
|
||||||
import * as $_apps_notes_partials_notes from "./routes/(apps)/notes/partials/notes.tsx";
|
import * as $_apps_notes_partials_notes from "./routes/(apps)/notes/partials/notes.tsx";
|
||||||
import * as $_apps_students_api_example from "./routes/(apps)/students/api/example.ts";
|
import * as $_apps_students_api_example from "./routes/(apps)/students/api/example.ts";
|
||||||
@@ -52,8 +51,6 @@ const manifest = {
|
|||||||
"./routes/(apps)/notes/index.tsx": $_apps_notes_index,
|
"./routes/(apps)/notes/index.tsx": $_apps_notes_index,
|
||||||
"./routes/(apps)/notes/partials/(admin)/courses.tsx":
|
"./routes/(apps)/notes/partials/(admin)/courses.tsx":
|
||||||
$_apps_notes_partials_admin_courses,
|
$_apps_notes_partials_admin_courses,
|
||||||
"./routes/(apps)/notes/partials/(admin)/students.tsx":
|
|
||||||
$_apps_notes_partials_admin_students,
|
|
||||||
"./routes/(apps)/notes/partials/index.tsx": $_apps_notes_partials_index,
|
"./routes/(apps)/notes/partials/index.tsx": $_apps_notes_partials_index,
|
||||||
"./routes/(apps)/notes/partials/notes.tsx": $_apps_notes_partials_notes,
|
"./routes/(apps)/notes/partials/notes.tsx": $_apps_notes_partials_notes,
|
||||||
"./routes/(apps)/students/api/example.ts": $_apps_students_api_example,
|
"./routes/(apps)/students/api/example.ts": $_apps_students_api_example,
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ const properties: AppProperties = {
|
|||||||
index: "Homepage",
|
index: "Homepage",
|
||||||
notes: "Notes",
|
notes: "Notes",
|
||||||
courses: "Courses management",
|
courses: "Courses management",
|
||||||
students: "Students management",
|
|
||||||
},
|
},
|
||||||
adminOnly: ["courses", "students"],
|
adminOnly: ["courses", "students"],
|
||||||
hint: "Student grading management",
|
hint: "Student grading management",
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
import { Partial } from "$fresh/runtime.ts";
|
import {
|
||||||
import { RouteConfig } from "$fresh/server.ts";
|
getPartialsConfig,
|
||||||
|
makePartials,
|
||||||
|
} from "$root/defaults/makePartials.tsx";
|
||||||
|
import { FreshContext } from "$fresh/server.ts";
|
||||||
|
import { State } from "$root/routes/_middleware.ts";
|
||||||
|
|
||||||
type ModulesProps = Record<string | number | symbol, never>;
|
// deno-lint-ignore require-await
|
||||||
|
async function Courses(_request: Request, context: FreshContext<State>) {
|
||||||
export const config: RouteConfig = {
|
return <h2>Welcome to {context.state.session?.displayName}.</h2>;
|
||||||
skipAppWrapper: true,
|
|
||||||
skipInheritedLayouts: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Modules(_props: ModulesProps) {
|
|
||||||
return (
|
|
||||||
<Partial name="body">
|
|
||||||
<a href="notes" f-partial={"notes/partials"}>notes</a>
|
|
||||||
</Partial>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const config = getPartialsConfig();
|
||||||
|
export default makePartials(Courses);
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
import { Partial } from "$fresh/runtime.ts";
|
|
||||||
import { RouteConfig } from "$fresh/server.ts";
|
|
||||||
|
|
||||||
type ModulesProps = Record<string | number | symbol, never>;
|
|
||||||
|
|
||||||
export const config: RouteConfig = {
|
|
||||||
skipAppWrapper: true,
|
|
||||||
skipInheritedLayouts: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Modules(_props: ModulesProps) {
|
|
||||||
return (
|
|
||||||
<Partial name="body">
|
|
||||||
<a href="notes" f-partial={"notes/partials"}>notes</a>
|
|
||||||
</Partial>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -2,11 +2,12 @@ import {
|
|||||||
getPartialsConfig,
|
getPartialsConfig,
|
||||||
makePartials,
|
makePartials,
|
||||||
} from "$root/defaults/makePartials.tsx";
|
} from "$root/defaults/makePartials.tsx";
|
||||||
|
import { FreshContext } from "$fresh/server.ts";
|
||||||
|
import { State } from "$root/routes/_middleware.ts";
|
||||||
|
|
||||||
type NotesIndexProps = Record<string | number | symbol, never>;
|
// deno-lint-ignore require-await
|
||||||
|
export async function Index(_request: Request, context: FreshContext<State>) {
|
||||||
export function Index(_props: NotesIndexProps) {
|
return <h2>Welcome to {context.state.session?.displayName}.</h2>;
|
||||||
return <a href="notes" f-partial={"notes/partials"}>bip boup</a>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const config = getPartialsConfig();
|
export const config = getPartialsConfig();
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
import { Partial } from "$fresh/runtime.ts";
|
import {
|
||||||
import { RouteConfig } from "$fresh/server.ts";
|
getPartialsConfig,
|
||||||
|
makePartials,
|
||||||
|
} from "$root/defaults/makePartials.tsx";
|
||||||
|
import { FreshContext } from "$fresh/server.ts";
|
||||||
|
import { State } from "$root/routes/_middleware.ts";
|
||||||
|
|
||||||
type ModulesProps = Record<string | number | symbol, never>;
|
// deno-lint-ignore require-await
|
||||||
|
async function Notes(_request: Request, context: FreshContext<State>) {
|
||||||
export const config: RouteConfig = {
|
return <h2>Welcome to {context.state.session?.displayName}.</h2>;
|
||||||
skipAppWrapper: true,
|
|
||||||
skipInheritedLayouts: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Modules(_props: ModulesProps) {
|
|
||||||
return (
|
|
||||||
<Partial name="body">
|
|
||||||
<a href="notes" f-partial={"notes/partials"}>notes</a>
|
|
||||||
</Partial>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const config = getPartialsConfig();
|
||||||
|
export default makePartials(Notes);
|
||||||
|
|||||||
+163
-1
@@ -9,7 +9,169 @@ export default async function About(_request: Request, _context: FreshContext) {
|
|||||||
PolyMPR is born from the will to enhance Polytech INFO department's HR
|
PolyMPR is born from the will to enhance Polytech INFO department's HR
|
||||||
infrastructure.
|
infrastructure.
|
||||||
</p>
|
</p>
|
||||||
<h3>Terms of Use</h3>
|
<h2>Terms of Use</h2>
|
||||||
|
<p>
|
||||||
|
<em>
|
||||||
|
Last updated: 21<sup>th</sup> Jan. 2025
|
||||||
|
</em>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
By accessing and using this website through the Aix-Marseille University
|
||||||
|
(AMU) Single Sign-On (SSO) authentication system, you agree to comply
|
||||||
|
with these Terms and Conditions. Please read them carefully before
|
||||||
|
proceeding.
|
||||||
|
</p>
|
||||||
|
<h3>1. Acceptance of Terms</h3>
|
||||||
|
<p>By logging in with your AMU SSO credentials, you confirm that:</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
You are an authorized user of Aix-Marseille University's SSO system.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
You agree to be bound by these Terms and Conditions, as well as any
|
||||||
|
additional rules, policies, or guidelines applicable to the use of
|
||||||
|
this website.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
If you do not agree with these terms, you are not authorized to access
|
||||||
|
or use this website.
|
||||||
|
</p>
|
||||||
|
<h3>2. Eligibility</h3>
|
||||||
|
<p>
|
||||||
|
Access to this website is restricted to authorized individuals
|
||||||
|
affiliated with Aix-Marseille University, such as students, faculty,
|
||||||
|
staff, or others explicitly granted access. Unauthorized use is strictly
|
||||||
|
prohibited and may result in suspension or termination of access.
|
||||||
|
</p>
|
||||||
|
<h3>3. Authentication Through AMU SSO</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Authentication through AMU's SSO system is required to access this
|
||||||
|
website.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
You are responsible for safeguarding your AMU SSO login credentials
|
||||||
|
and ensuring they are not shared with others.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
If you suspect unauthorized use of your AMU SSO credentials, you must
|
||||||
|
immediately notify Aix-Marseille University's IT services at{" "}
|
||||||
|
<a href="https://dirnum.univ-amu.fr/fr">
|
||||||
|
https://dirnum.univ-amu.fr/fr
|
||||||
|
</a>.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h3>4. Permitted Use</h3>
|
||||||
|
<p>By accessing the website, you agree to:</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Use the website only for its intended academic, administrative, or
|
||||||
|
research purposes.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Refrain from engaging in any of the following prohibited activities:
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Sharing your access credentials with unauthorized individuals.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Misusing, modifying, or attempting to exploit the website's
|
||||||
|
services.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Uploading or distributing malware, offensive content, or any
|
||||||
|
material that violates university policies or applicable laws.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<h3>5. Privacy and Data Protection</h3>
|
||||||
|
<p>By using this website:</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
You acknowledge that your personal data, including your AMU SSO login
|
||||||
|
and activity on the website, may be collected, processed, and stored
|
||||||
|
in accordance with Aix-Marseille University’s privacy policy and
|
||||||
|
applicable data protection laws (e.g., GDPR).
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
This data is used for authentication, and improving the website's
|
||||||
|
services.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h3>6. Intellectual Property</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
All content and materials provided on this website are the
|
||||||
|
intellectual property of Aix-Marseille University or its licensors.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
You are granted a limited, non-transferable license to use the content
|
||||||
|
for personal, academic, or research purposes. Any unauthorized use,
|
||||||
|
reproduction, or distribution is strictly prohibited.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h3>7. Termination of Access</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Aix-Marseille University reserves the right to suspend or terminate
|
||||||
|
your access without notice if:
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
You violate these Terms and Conditions or university policies.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Your AMU affiliation is revoked or your SSO account is deactivated.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
Unauthorized access attempts may be reported to the appropriate
|
||||||
|
authorities.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h3>8. Disclaimers and Limitations of Liability</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
The website and its content are provided "as is" and "as available"
|
||||||
|
without any warranties, express or implied.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Aix-Marseille University and the website administrators are not liable
|
||||||
|
for:
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>Interruptions in service, data loss, or technical issues.</li>
|
||||||
|
<li>
|
||||||
|
Any unauthorized use of your AMU SSO credentials resulting from your
|
||||||
|
negligence.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<h3>9. Modifications to the Terms</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Aix-Marseille University may update these Terms and Conditions
|
||||||
|
periodically to reflect changes in laws, policies, or services.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Your continued use of the website following any changes constitutes
|
||||||
|
your acceptance of the updated terms.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h3>10. Governing Law</h3>
|
||||||
|
<p>
|
||||||
|
These Terms and Conditions are governed by and construed in accordance
|
||||||
|
with the laws of France and applicable EU regulations.
|
||||||
|
</p>
|
||||||
|
<h3>11. Contact Information</h3>
|
||||||
|
<p>
|
||||||
|
For questions or support, please contact:{" "}
|
||||||
|
<a href="https://dirnum.univ-amu.fr/fr">
|
||||||
|
Aix-Marseille University IT Services
|
||||||
|
</a>.
|
||||||
|
</p>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -4,7 +4,8 @@ import { FreshContext } from "$fresh/server.ts";
|
|||||||
export default async function Home(_request: Request, _context: FreshContext) {
|
export default async function Home(_request: Request, _context: FreshContext) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<h2>Welcome to PolyMPR!</h2>
|
<h2>PolyMPR</h2>
|
||||||
|
<h3>The <em>ultimate</em> HR platform</h3>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -11,7 +11,6 @@ import { createJwt } from "@popov/jwt";
|
|||||||
import { setCookie } from "$std/http/cookie.ts";
|
import { setCookie } from "$std/http/cookie.ts";
|
||||||
import { getKey } from "$root/routes/_middleware.ts";
|
import { getKey } from "$root/routes/_middleware.ts";
|
||||||
|
|
||||||
const SERVICE = "https://localhost/login";
|
|
||||||
const CAS = "https://ident.univ-amu.fr/cas";
|
const CAS = "https://ident.univ-amu.fr/cas";
|
||||||
|
|
||||||
function getTag(tag: CasTagNode): [string, string] {
|
function getTag(tag: CasTagNode): [string, string] {
|
||||||
@@ -57,10 +56,11 @@ export const handler: Handlers<any, State> = {
|
|||||||
async GET(request, context) {
|
async GET(request, context) {
|
||||||
const url = new URL(request.url);
|
const url = new URL(request.url);
|
||||||
const ticket = url.searchParams.get("ticket");
|
const ticket = url.searchParams.get("ticket");
|
||||||
|
const service = `${context.url.origin}/login`;
|
||||||
|
|
||||||
if (ticket) {
|
if (ticket) {
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
`${CAS}/serviceValidate?service=${SERVICE}&ticket=${ticket}`,
|
`${CAS}/serviceValidate?service=${service}&ticket=${ticket}`,
|
||||||
);
|
);
|
||||||
const body = parse(await response.text()) as [RegularTagNode];
|
const body = parse(await response.text()) as [RegularTagNode];
|
||||||
const casResponse = body[0].children[0] as CasResponse;
|
const casResponse = body[0].children[0] as CasResponse;
|
||||||
@@ -69,7 +69,7 @@ export const handler: Handlers<any, State> = {
|
|||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 302,
|
status: 302,
|
||||||
headers: {
|
headers: {
|
||||||
Location: `${CAS}/login?service=${SERVICE}`,
|
Location: `${CAS}/login?service=${service}`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ export const handler: Handlers<any, State> = {
|
|||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 302,
|
status: 302,
|
||||||
headers: {
|
headers: {
|
||||||
Location: `${CAS}/login?service=${SERVICE}`,
|
Location: `${CAS}/login?service=${service}`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -2,7 +2,6 @@ import { Handlers } from "$fresh/server.ts";
|
|||||||
import { State } from "$root/routes/_middleware.ts";
|
import { State } from "$root/routes/_middleware.ts";
|
||||||
import { deleteCookie } from "$std/http/cookie.ts";
|
import { deleteCookie } from "$std/http/cookie.ts";
|
||||||
|
|
||||||
const SERVICE = "https://localhost/";
|
|
||||||
const CAS = "https://ident.univ-amu.fr/cas";
|
const CAS = "https://ident.univ-amu.fr/cas";
|
||||||
|
|
||||||
// deno-lint-ignore no-explicit-any
|
// deno-lint-ignore no-explicit-any
|
||||||
@@ -12,7 +11,7 @@ export const handler: Handlers<any, State> = {
|
|||||||
const headers = new Headers();
|
const headers = new Headers();
|
||||||
|
|
||||||
deleteCookie(headers, "sessionToken", { path: "/" });
|
deleteCookie(headers, "sessionToken", { path: "/" });
|
||||||
headers.set("Location", `${CAS}/logout?service=${SERVICE}`);
|
headers.set("Location", `${CAS}/logout?service=${context.url.origin}`);
|
||||||
|
|
||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 302,
|
status: 302,
|
||||||
|
|||||||
Reference in New Issue
Block a user