diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index b7474a9..5ab2665 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -6,7 +6,7 @@ env: DOCKER_IMAGE_NAME: harmony-back DOCKER_REGISTRY_URL: git.harmonylab.ovh DOCKER_REGISTRY_ORG: harmony - RELEASE_VERSION: 1.2 + RELEASE_VERSION: 1.2.0 jobs: build_docker_images: diff --git a/src/extensions/users-permissions/strapi-server.ts b/src/extensions/users-permissions/strapi-server.ts new file mode 100644 index 0000000..0db6276 --- /dev/null +++ b/src/extensions/users-permissions/strapi-server.ts @@ -0,0 +1,98 @@ +"use strict"; +const lod = require("lodash"); +module.exports = (plugin) => { + const rawProviders = plugin.services.providers({ strapi }); + + const getService = (name) => { + return strapi.plugin("users-permissions").service(name); + }; + + const getProfile = async (provider, query) => { + const accessToken = query.access_token || query.code || query.oauth_token; + + const providers = await strapi + .store({ type: "plugin", name: "users-permissions", key: "grant" }) + .get(); + + return getService("providers-registry").run({ + provider, + query, + accessToken, + providers, + }); + }; + + const providers = ({ strapi }) => { + return { + ...rawProviders, + connect: async (provider, query) => { + const accessToken = + query.access_token || query.code || query.oauth_token; + + if (!accessToken) { + throw new Error("No access_token."); + } + + // Get the profile. + const profile = await getProfile(provider, query); + + const email = lod.toLower(profile.email); + + // We need at least the mail. + if (!email) { + throw new Error("Email was not available."); + } + + const users = await strapi.db + .query("plugin::users-permissions.user") + .findMany({ + where: { email }, + }); + + const advancedSettings = await strapi + .store({ type: "plugin", name: "users-permissions", key: "advanced" }) + .get(); + + let user = lod.find(users, { provider }); + if (lod.isEmpty(user)) { + user = lod.find(users); + } + + if (lod.isEmpty(user) && !advancedSettings.allow_register) { + throw new Error("Register action is actually not available."); + } + + if (!lod.isEmpty(user)) { + return user; + } + + if (users.length && advancedSettings.unique_email) { + throw new Error("Email is already taken."); + } + + // Retrieve default role. + const defaultRole = await strapi.db + .query("plugin::users-permissions.role") + .findOne({ where: { type: advancedSettings.default_role } }); + + // Create the new user. + const newUser = { + ...profile, + email, // overwrite with lowercased email + provider, + role: defaultRole.id, + confirmed: true, + }; + + const createdUser = await strapi.db + .query("plugin::users-permissions.user") + .create({ data: newUser }); + + return createdUser; + }, + }; + }; + + plugin.services.providers = providers; + return plugin; +};