Skip to content

Commit

Permalink
Merge branch 'main' into BC-8345
Browse files Browse the repository at this point in the history
  • Loading branch information
bischofmax authored Feb 11, 2025
2 parents 86a81f5 + a9c4e02 commit 6cd37e3
Show file tree
Hide file tree
Showing 41 changed files with 265 additions and 1,879 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,9 @@ data:
defaultSrc: 'https://www10-fms.hpi.uni-potsdam.de https://cloud-instances.s3.hidrive.strato.com',
},
'^/courses': {
defaultSrc: 'https://nexboard.nexenio.com https://lti.tools {{ BETTERMARKS_SCHOOL_URL | default("") }}',
defaultSrc: 'https://lti.tools {{ BETTERMARKS_SCHOOL_URL | default("") }}',
fontSrc: 'https://vjs.zencdn.net https://cdn.jsdelivr.net',
styleSrc: 'https://vjs.zencdn.net',
frameSrc: 'https://nexboard.nexenio.com',
},
'^/teams': {
fontSrc: 'https://vjs.zencdn.net',
Expand Down
3 changes: 0 additions & 3 deletions ansible/roles/schulcloud-client-core/templates/secret.yml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ metadata:
namespace: {{ NAMESPACE }}
type: Opaque
data:
# Nexboard
NEXBOARD_API_KEY: "{{ NEXBOARD_API_KEY | b64encode }"
NEXBOARD_USER_ID: "{{ NEXBOARD_USER_ID | b64encode }}"
REDIS_URI: "{{ REDIS_URI|default("redis://redis-svc", true) | b64encode }}"
{% if FEATURE_TSP_ENABLED %}
FEATURE_TSP_ENABLED: "true"
Expand Down
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
6 changes: 0 additions & 6 deletions config/global.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ const {
NOTIFICATION_SERVICE_ENABLED,
FEATURE_TEAMS_ENABLED = 'true',
LIBRE_OFFICE_CLIENT_URL,
NEXBOARD_USER_ID,
NEXBOARD_API_KEY,
FEATURE_EXTENSIONS_ENABLED,
SHOW_VERSION,
SW_ENABLED,
Expand All @@ -29,7 +27,6 @@ const {
FEATURE_JWT_EXTENDED_TIMEOUT_ENABLED,
FEATURE_CONTACT_FORM_ATTACHMENTS_ENABLED,
FEATURE_MINT_PAGES_ENABLED,
FEATURE_NEXBOARD_ENABLED,
SC_DEMO_USER_PASSWORD = 'Schulcloud1!',
SC_DEMO_USER_NAME = '[email protected]',
SC_SUPERHERO_USER_PASSWORD = 'Schulcloud1!',
Expand Down Expand Up @@ -58,8 +55,6 @@ const exp = {
NOTIFICATION_SERVICE_ENABLED,
FEATURE_TEAMS_ENABLED,
LIBRE_OFFICE_CLIENT_URL,
NEXBOARD_USER_ID,
NEXBOARD_API_KEY,
FEATURE_EXTENSIONS_ENABLED,
SHOW_VERSION,
SW_ENABLED,
Expand All @@ -69,7 +64,6 @@ const exp = {
FEATURE_JWT_EXTENDED_TIMEOUT_ENABLED,
FEATURE_CONTACT_FORM_ATTACHMENTS_ENABLED,
FEATURE_MINT_PAGES_ENABLED,
FEATURE_NEXBOARD_ENABLED,
SC_DEMO_USER_PASSWORD,
SC_DEMO_USER_NAME,
SC_SUPERHERO_USER_PASSWORD,
Expand Down
2 changes: 1 addition & 1 deletion config/http-headers.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ const config = {
defaultSrc: 'https://www10-fms.hpi.uni-potsdam.de https://cloud-instances.s3.hidrive.strato.com',
},
'^/courses': {
defaultSrc: 'https://nexboard.nexenio.com https://www.geogebra.org https://lti.tools https://acc.bettermarks.com',
defaultSrc: 'https://www.geogebra.org https://lti.tools https://acc.bettermarks.com',
fontSrc: 'https://vjs.zencdn.net https://cdn.jsdelivr.net',
styleSrc: 'https://vjs.zencdn.net',
},
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
77 changes: 18 additions & 59 deletions controllers/oauth2.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,7 @@ 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 })
router.get('/login', csrfProtection, (req, res, next) => api(req, { version: 'v3' })
.get(`/oauth2/loginRequest/${req.query.login_challenge}`)
.then((loginRequest) => {
req.session.login_challenge = req.query.login_challenge;
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 6cd37e3

Please sign in to comment.