mirror of
https://github.com/strapi/strapi.git
synced 2025-11-15 01:28:07 +00:00
Update transfer services, fix api tests
This commit is contained in:
parent
2c0fa4897a
commit
386579ff66
2
packages/core/admin/server/bootstrap.js
vendored
2
packages/core/admin/server/bootstrap.js
vendored
@ -96,6 +96,4 @@ module.exports = async () => {
|
|||||||
apiTokenService.checkSaltIsDefined();
|
apiTokenService.checkSaltIsDefined();
|
||||||
transferService.token.checkSaltIsDefined();
|
transferService.token.checkSaltIsDefined();
|
||||||
tokenService.checkSecretIsDefined();
|
tokenService.checkSecretIsDefined();
|
||||||
|
|
||||||
transferService.permission.init();
|
|
||||||
};
|
};
|
||||||
|
|||||||
@ -18,7 +18,8 @@ module.exports = [
|
|||||||
return next();
|
return next();
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
auth: { strategies: [dataTransferAuthStrategy] },
|
// TODO: Allow not passing any scope <> Add a way to prevent assigning one by default
|
||||||
|
auth: { strategies: [dataTransferAuthStrategy], scope: ['push'] },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// Transfer Tokens
|
// Transfer Tokens
|
||||||
|
|||||||
@ -5,44 +5,18 @@ const { providerFactory } = require('@strapi/utils');
|
|||||||
|
|
||||||
const DEFAULT_TRANSFER_ACTIONS = ['push'];
|
const DEFAULT_TRANSFER_ACTIONS = ['push'];
|
||||||
|
|
||||||
const createPermissionService = () => {
|
const providers = {
|
||||||
const state = {
|
action: providerFactory(),
|
||||||
engine: null,
|
condition: providerFactory(),
|
||||||
|
|
||||||
providers: {
|
|
||||||
action: null,
|
|
||||||
condition: null,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const registerTransferActions = () => {
|
|
||||||
if (!state.providers.action) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFAULT_TRANSFER_ACTIONS.forEach((action) => {
|
|
||||||
state.providers.action.register(action, { action });
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
get engine() {
|
|
||||||
return state.engine;
|
|
||||||
},
|
|
||||||
|
|
||||||
get providers() {
|
|
||||||
return state.providers;
|
|
||||||
},
|
|
||||||
|
|
||||||
init() {
|
|
||||||
state.providers.action = providerFactory();
|
|
||||||
state.providers.condition = providerFactory();
|
|
||||||
|
|
||||||
registerTransferActions();
|
|
||||||
|
|
||||||
state.engine = permissions.engine.new({ providers: state.providers });
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = createPermissionService();
|
DEFAULT_TRANSFER_ACTIONS.forEach((action) => {
|
||||||
|
providers.action.register(action, { action });
|
||||||
|
});
|
||||||
|
|
||||||
|
const engine = permissions.engine.new({ providers });
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
engine,
|
||||||
|
providers,
|
||||||
|
};
|
||||||
|
|||||||
@ -139,7 +139,7 @@ const update = async (id, attributes) => {
|
|||||||
assertTokenPermissionsValidity(attributes);
|
assertTokenPermissionsValidity(attributes);
|
||||||
assertValidLifespan(attributes);
|
assertValidLifespan(attributes);
|
||||||
|
|
||||||
const updatedToken = await strapi.db.transaction(async () => {
|
return strapi.db.transaction(async () => {
|
||||||
const updatedToken = await strapi.query(TRANSFER_TOKEN_UID).update({
|
const updatedToken = await strapi.query(TRANSFER_TOKEN_UID).update({
|
||||||
select: SELECT_FIELDS,
|
select: SELECT_FIELDS,
|
||||||
where: { id },
|
where: { id },
|
||||||
@ -148,24 +148,50 @@ const update = async (id, attributes) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await strapi.query(TRANSFER_TOKEN_PERMISSION_UID).delete({
|
const currentPermissionsResult = await strapi.entityService.load(
|
||||||
where: { token: id },
|
TRANSFER_TOKEN_UID,
|
||||||
});
|
updatedToken,
|
||||||
|
'permissions'
|
||||||
|
);
|
||||||
|
|
||||||
return updatedToken;
|
const currentPermissions = map('action', currentPermissionsResult || []);
|
||||||
|
const newPermissions = uniq(attributes.permissions);
|
||||||
|
|
||||||
|
const actionsToDelete = difference(currentPermissions, newPermissions);
|
||||||
|
const actionsToAdd = difference(newPermissions, currentPermissions);
|
||||||
|
|
||||||
|
// TODO: improve efficiency here
|
||||||
|
// method using a loop -- works but very inefficient
|
||||||
|
await Promise.all(
|
||||||
|
actionsToDelete.map((action) =>
|
||||||
|
strapi.query(TRANSFER_TOKEN_PERMISSION_UID).delete({
|
||||||
|
where: { action, token: id },
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO: improve efficiency here
|
||||||
|
// using a loop -- works but very inefficient
|
||||||
|
await Promise.all(
|
||||||
|
actionsToAdd.map((action) =>
|
||||||
|
strapi.query(TRANSFER_TOKEN_PERMISSION_UID).create({
|
||||||
|
data: { action, token: id },
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// retrieve permissions
|
||||||
|
const permissionsFromDb = await strapi.entityService.load(
|
||||||
|
TRANSFER_TOKEN_UID,
|
||||||
|
updatedToken,
|
||||||
|
'permissions'
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...updatedToken,
|
||||||
|
permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
// retrieve permissions
|
|
||||||
const permissionsFromDb = await strapi.entityService.load(
|
|
||||||
'admin::transfer-token',
|
|
||||||
updatedToken,
|
|
||||||
'permissions'
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
...updatedToken,
|
|
||||||
permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -341,7 +367,7 @@ const flattenTokenPermissions = (token) => {
|
|||||||
* @param {TransferToken} token
|
* @param {TransferToken} token
|
||||||
*/
|
*/
|
||||||
const assertTokenPermissionsValidity = (attributes) => {
|
const assertTokenPermissionsValidity = (attributes) => {
|
||||||
const { permission: permissionService } = strapi.admin.services.transfer;
|
const permissionService = strapi.admin.services.transfer.permission;
|
||||||
const validPermissions = permissionService.providers.action.keys();
|
const validPermissions = permissionService.providers.action.keys();
|
||||||
const invalidPermissions = difference(attributes.permissions, validPermissions);
|
const invalidPermissions = difference(attributes.permissions, validPermissions);
|
||||||
|
|
||||||
|
|||||||
@ -59,7 +59,7 @@ const authenticate = async (ctx) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Generate an ability based on the token permissions
|
// Generate an ability based on the token permissions
|
||||||
const ability = getService('transfer').permission.engine.generateAbility(
|
const ability = await getService('transfer').permission.engine.generateAbility(
|
||||||
transferToken.permissions.map((action) => ({ action }))
|
transferToken.permissions.map((action) => ({ action }))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import { set } from 'lodash/fp';
|
|
||||||
import { v4 } from 'uuid';
|
import { v4 } from 'uuid';
|
||||||
import { RawData, WebSocket } from 'ws';
|
import { RawData, WebSocket } from 'ws';
|
||||||
|
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
export const TRANSFER_PATH = '/transfer';
|
export const TRANSFER_PATH = '/transfer/runner/connect';
|
||||||
export const TRANSFER_METHODS = ['push', 'pull'];
|
export const TRANSFER_METHODS = ['push', 'pull'];
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user