Skip to content

Commit

Permalink
Merge branch 'main' into N21-2393-fix-oauth-error-msg
Browse files Browse the repository at this point in the history
  • Loading branch information
MarvinOehlerkingCap authored Feb 7, 2025
2 parents 36e704d + cd181d8 commit f47631c
Show file tree
Hide file tree
Showing 28 changed files with 26 additions and 1,412 deletions.
16 changes: 0 additions & 16 deletions config/default.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -494,16 +494,6 @@
"default": true,
"description": "Enables Files tab in the team-view of Teams menu"
},
"FEATURE_CTL_TOOLS_TAB_ENABLED": {
"type": "boolean",
"default": true,
"description": "Enables new CTL-tool tab in a course"
},
"FEATURE_LTI_TOOLS_TAB_ENABLED": {
"type": "boolean",
"default": false,
"description": "Enables old LTI-tool tab in a course"
},
"FEATURE_OAUTH_LOGIN_ENABLED": {
"type": "boolean",
"default": false,
Expand Down Expand Up @@ -539,12 +529,6 @@
"default": "false",
"description": "Enables button on team file pages to open the nextcloud file storage."
},
"FEATURE_LEGACY_HYDRA_ENABLED": {
"type": "boolean",
"default": false,
"description": "Enables the legacy Hydra endpoints."
},

"NEXTCLOUD_REDIRECT_URL": {
"type": "string",
"default": "",
Expand Down
20 changes: 1 addition & 19 deletions controllers/courses.js
Original file line number Diff line number Diff line change
Expand Up @@ -660,9 +660,7 @@ router.get('/:courseId/', async (req, res, next) => {
return;
}

const FEATURE_CTL_TOOLS_TAB_ENABLED = Configuration.get('FEATURE_CTL_TOOLS_TAB_ENABLED');

if (FEATURE_CTL_TOOLS_TAB_ENABLED && activeTab === 'tools') {
if (activeTab === 'tools') {
res.redirect(`/rooms/${req.params.courseId}?tab=tools`);
return;
}
Expand Down Expand Up @@ -728,21 +726,6 @@ router.get('/:courseId/', async (req, res, next) => {

const isNewEdtrioActivated = editorBackendIsAlive && (courseHasNewEditorLessons || userHasEditorEnabled);
// ################################ end new Editor check ##################################
let ltiTools = [];
if (course.ltiToolIds && course.ltiToolIds.length > 0) {
ltiTools = await api(req).get('/ltiTools', {
qs: {
_id: { $in: course.ltiToolIds },
},
});
}
ltiTools = (ltiTools.data || []).filter(
(ltiTool) => ltiTool.isTemplate !== 'true',
).map((tool) => {
tool.isBBB = tool.name === 'Video-Konferenz mit BigBlueButton';
tool.isBettermarks = (tool.name && tool.name.includes('bettermarks'));
return tool;
});

const lessons = (_lessons.data || []).map((lesson) => Object.assign(lesson, {
url: `/courses/${req.params.courseId}/topics/${lesson._id}/`,
Expand Down Expand Up @@ -804,7 +787,6 @@ router.get('/:courseId/', async (req, res, next) => {
? homeworks.filter((task) => !task.private && task.stats.submissionCount)
: homeworks.filter((task) => !task.private && task.submissions)),
privateHomeworks: homeworks.filter((task) => task.private),
ltiTools,
courseGroups,
baseUrl,
breadcrumbs: [
Expand Down
3 changes: 0 additions & 3 deletions controllers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,10 @@ router.use('/account/', require('./account'));
router.use('/calendar/', require('./calendar'));
router.use('/courses/', require('./courses'));
router.use('/courses/:courseId/topics/', require('./topics'));
router.use('/courses/:courseId/tools/', require('./tools'));
router.use('/tools/', require('./tools'));
router.use('/courses/:courseId/groups/', require('./coursegroups'));
router.use('/teams/', require('./teams'));
router.use('/teams/:targetId/news', require('./news'));
router.use('/teams/:teamId/topics/', require('./topics'));
router.use('/teams/:teamId/tools/', require('./tools'));
router.use('/dashboard/', require('./dashboard'));
router.use('/files/', require('./files'));
router.use('/homework/', require('./homework'));
Expand Down
75 changes: 17 additions & 58 deletions controllers/oauth2.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,6 @@ const api = require('../api');

const csrfProtection = csrf({ cookie: true });

const getVersion = () => {
if (Configuration.has('FEATURE_LEGACY_HYDRA_ENABLED')) {
return Configuration.get('FEATURE_LEGACY_HYDRA_ENABLED') ? 'v1' : 'v3';
}
return 'v3';
};

const VERSION = getVersion();

router.get('/login', csrfProtection, (req, res, next) => api(req, { version: VERSION })
.get(`/oauth2/loginRequest/${req.query.login_challenge}`)
.then((loginRequest) => {
Expand All @@ -36,7 +27,7 @@ router.get('/login/success', csrfProtection, auth.authChecker, (req, res, next)
remember_for: 0,
};

return api(req, { version: VERSION })
return api(req, { version: 'v3' })
.patch(
`/oauth2/loginRequest/${req.session.login_challenge}/?accept=1`,
{ body },
Expand All @@ -49,7 +40,7 @@ router.get('/login/success', csrfProtection, auth.authChecker, (req, res, next)
});

router.all('/logout', csrfProtection, auth.authChecker, (req) => {
api(req, { version: VERSION })
api(req, { version: 'v3' })
.get('/oauth2/logoutRequest');
});

Expand All @@ -58,7 +49,7 @@ router.all('/logout/redirect', csrfProtection, auth.authChecker, (req, res, next
redirect_to: '',
};

return api(req, { version: VERSION })
return api(req, { version: 'v3' })
.patch(`/oauth2/logoutRequest/${req.query.logout_challenge}`, { body })
.then((logoutRequest) => res.redirect(logoutRequest.redirect_to))
.catch(next);
Expand All @@ -71,7 +62,7 @@ const acceptConsent = (r, w, challenge, grantScopes, remember = false) => {
remember_for: 60 * 60 * 24 * 30,
};

return api(r, { version: VERSION })
return api(r, { version: 'v3' })
.patch(`/oauth2/consentRequest/${challenge}/?accept=1`, { body })
.then((consentRequest) => w.redirect(consentRequest.redirect_to));
};
Expand All @@ -95,28 +86,10 @@ router.get('/consent', csrfProtection, auth.authChecker, (req, res, next) => {
// An error occurred (at hydra)
return res.send(`${req.query.error}<br />${req.query.error_description}`);
}
return api(req, { version: VERSION })
return api(req, { version: 'v3' })
.get(`/oauth2/consentRequest/${req.query.consent_challenge}`)
.then(async (consentRequest) => {
let skipConsent = consentRequest.context?.skipConsent;

// Cannot skip consent for CTL-Tools with legacy hydra endpoints.
// Legacy endpoints are not supported by CTL-Tools.
if (VERSION === 'v1') {
const tools = await api(req)
.get(`/ltiTools/?oAuthClientId=${consentRequest.client.client_id}&isLocal=true`);

if (tools.data && Array.isArray(tools.data) && tools.data.length === 1) {
({ skipConsent } = tools.data[0]);
} else {
throw new Error(
`Unable to find a singular LtiTool with client_id
${consentRequest.client.client_id} for consent request`,
);
}
}

if (consentRequest.skip || skipConsent) {
if (consentRequest.skip || consentRequest.context?.skipConsent) {
return acceptConsent(req, res, req.query.consent_challenge, consentRequest.requested_scope);
}

Expand Down Expand Up @@ -146,32 +119,18 @@ router.get('/username/:pseudonym', async (req, res, next) => {
let shortName = '???';
let completeName = '???';

if (Configuration.get('FEATURE_CTL_TOOLS_TAB_ENABLED')) {
const pseudonymResponse = await api(req, { version: 'v3' })
.get(`/pseudonyms/${req.params.pseudonym}`);
const userResponse = await api(req)
.get('/users', {
qs: { _id: pseudonymResponse.userId },
$limit: 1,
});
if (userResponse.data.length) {
completeName = `${userResponse.data[0].firstName} ${userResponse.data[0].lastName}`;
shortName = `${userResponse.data[0].firstName} ${userResponse.data[0].lastName.charAt(0)}.`;
}
} else {
const feathersPseudonymResponse = await api(req)
.get('/pseudonym', {
qs: {
pseudonym: req.params.pseudonym,
},
});
if (feathersPseudonymResponse.data.length) {
// eslint-disable-next-line max-len
completeName = `${feathersPseudonymResponse.data[0].user.firstName} ${feathersPseudonymResponse.data[0].user.lastName}`;
// eslint-disable-next-line max-len
shortName = `${feathersPseudonymResponse.data[0].user.firstName} ${feathersPseudonymResponse.data[0].user.lastName.charAt(0)}.`;
}
const pseudonymResponse = await api(req, { version: 'v3' })
.get(`/pseudonyms/${req.params.pseudonym}`);
const userResponse = await api(req)
.get('/users', {
qs: { _id: pseudonymResponse.userId },
$limit: 1,
});
if (userResponse.data.length) {
completeName = `${userResponse.data[0].firstName} ${userResponse.data[0].lastName}`;
shortName = `${userResponse.data[0].firstName} ${userResponse.data[0].lastName.charAt(0)}.`;
}

return res.render('oauth2/username', {
depseudonymized: true,
completeName,
Expand Down
20 changes: 3 additions & 17 deletions controllers/teams.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,6 @@ const copyCourseHandler = (req, res, next) => {
coursePromise = api(req).get(`/teams/${req.params.teamId}`, {
qs: {
$populate: [
'ltiToolIds',
'classIds',
'teacherIds',
'userIds',
Expand Down Expand Up @@ -419,11 +418,7 @@ router.get('/:teamId/json', (req, res, next) => {
},
},
}),
api(req).get(`/teams/${req.params.teamId}`, {
qs: {
$populate: ['ltiToolIds'],
},
}),
api(req).get(`/teams/${req.params.teamId}`),
])
.then(([result, team]) => {
const { data: roles } = result;
Expand Down Expand Up @@ -477,7 +472,6 @@ router.get('/:teamId', async (req, res, next) => {
const course = await api(req).get(`/teams/${req.params.teamId}`, {
qs: {
$populate: [
'ltiToolIds',
{ path: 'schoolIds' },
],
},
Expand Down Expand Up @@ -1283,16 +1277,12 @@ router.get('/invitation/accept/:teamId', async (req, res, next) => {
});

/*
* Single Team Topics, Tools & Lessons
* Single Team Topics & Lessons
*/

router.get('/:teamId/topics', async (req, res, next) => {
Promise.all([
api(req).get(`/teams/${req.params.teamId}`, {
qs: {
$populate: ['ltiToolIds'],
},
}),
api(req).get(`/teams/${req.params.teamId}`),
api(req).get('/lessons/', {
qs: {
teamId: req.params.teamId,
Expand All @@ -1314,9 +1304,6 @@ router.get('/:teamId/topics', async (req, res, next) => {
}),
])
.then(([course, lessons, homeworks, courseGroups]) => {
const ltiToolIds = (course.ltiToolIds || []).filter(
(ltiTool) => ltiTool.isTemplate !== 'true',
);
const lessonsData = (lessons.data || []).map((lesson) => Object.assign(lesson, {
url: `/teams/${req.params.teamId}/topics/${lesson._id}/`,
}));
Expand Down Expand Up @@ -1350,7 +1337,6 @@ router.get('/:teamId/topics', async (req, res, next) => {
lessons: lessonsData,
homeworks: homeworksData.filter((task) => !task.private),
myhomeworks: homeworksData.filter((task) => task.private),
ltiToolIds,
courseGroups: courseGroupsData,
breadcrumbs: [
{
Expand Down
Loading

0 comments on commit f47631c

Please sign in to comment.