Skip to content

Commit 4e2a573

Browse files
committed
Revoking all permissions on prepare uninstallation
1 parent 8659247 commit 4e2a573

File tree

3 files changed

+68
-16
lines changed

3 files changed

+68
-16
lines changed

packages/contracts/src/personal/PersonalAdminSetup.sol

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import {PersonalMemberAddHelper} from "./PersonalMemberAddHelper.sol";
1313
import {ExecuteSelectorCondition} from "../conditions/ExecuteSelectorCondition.sol";
1414
import {EDITOR_PERMISSION_ID} from "../constants.sol";
1515

16-
uint64 constant MEMBER_ADD_PROPOSAL_DURATION = 7 days;
17-
1816
/// @title PersonalAdminSetup
1917
/// @author Aragon - 2023
2018
/// @notice The setup contract of the `PersonalAdminPlugin` plugin.
@@ -41,7 +39,7 @@ contract PersonalAdminSetup is PluginSetup {
4139
bytes calldata _data
4240
) external returns (address plugin, PreparedSetupData memory preparedSetupData) {
4341
// Decode `_data` to extract the params needed for cloning and initializing the `PersonalAdminPlugin` plugin.
44-
address editor = decodeInstallationParams(_data);
42+
(address editor, uint64 _memberAddProposalDuration) = decodeInstallationParams(_data);
4543

4644
if (editor == address(0)) {
4745
revert EditorAddressInvalid({editor: editor});
@@ -55,7 +53,7 @@ contract PersonalAdminSetup is PluginSetup {
5553
PersonalAdminPlugin(plugin).initialize(IDAO(_dao), editor, helper);
5654

5755
PersonalMemberAddHelper.Settings memory _helperSettings = PersonalMemberAddHelper.Settings({
58-
proposalDuration: MEMBER_ADD_PROPOSAL_DURATION
56+
proposalDuration: _memberAddProposalDuration
5957
});
6058
PersonalMemberAddHelper(helper).initialize(IDAO(_dao), _helperSettings);
6159

@@ -131,24 +129,49 @@ contract PersonalAdminSetup is PluginSetup {
131129
SetupPayload calldata _payload
132130
) external view returns (PermissionLib.MultiTargetPermission[] memory permissions) {
133131
// Prepare permissions
134-
permissions = new PermissionLib.MultiTargetPermission[](2);
132+
permissions = new PermissionLib.MultiTargetPermission[](5);
135133

136-
// Revoke EXECUTE on the DAO
134+
// Revoke `EXECUTE_PERMISSION` to the plugin
137135
permissions[0] = PermissionLib.MultiTargetPermission(
138136
PermissionLib.Operation.Revoke,
139137
_dao,
140138
_payload.plugin,
141139
PermissionLib.NO_CONDITION,
142140
DAO(payable(_dao)).EXECUTE_PERMISSION_ID()
143141
);
144-
// Revoke conditional EXECUTE on the DAO
142+
// Revoke `PROPOSER_PERMISSION` to the plugin
145143
permissions[1] = PermissionLib.MultiTargetPermission(
144+
PermissionLib.Operation.Revoke,
145+
_payload.currentHelpers[0],
146+
_payload.plugin,
147+
PermissionLib.NO_CONDITION,
148+
PersonalMemberAddHelper(helperImplementation).PROPOSER_PERMISSION_ID()
149+
);
150+
// Revoke `EXECUTE_PERMISSION` to the helper
151+
permissions[2] = PermissionLib.MultiTargetPermission(
146152
PermissionLib.Operation.Revoke,
147153
_dao,
148154
_payload.currentHelpers[0],
149-
address(0),
155+
// Conditional execution
156+
PermissionLib.NO_CONDITION,
150157
DAO(payable(_dao)).EXECUTE_PERMISSION_ID()
151158
);
159+
// Revoke `ADD_MEMBER_PERMISSION` to the DAO
160+
permissions[3] = PermissionLib.MultiTargetPermission(
161+
PermissionLib.Operation.Revoke,
162+
_payload.plugin,
163+
_dao,
164+
PermissionLib.NO_CONDITION,
165+
PersonalAdminPlugin(pluginImplementation).ADD_MEMBER_PERMISSION_ID()
166+
);
167+
// Revoke `UPDATE_SETTINGS_PERMISSION_ID` to the DAO
168+
permissions[4] = PermissionLib.MultiTargetPermission(
169+
PermissionLib.Operation.Revoke,
170+
_payload.currentHelpers[0],
171+
_dao,
172+
PermissionLib.NO_CONDITION,
173+
PersonalMemberAddHelper(helperImplementation).UPDATE_SETTINGS_PERMISSION_ID()
174+
);
152175
}
153176

154177
/// @inheritdoc IPluginSetup
@@ -157,14 +180,17 @@ contract PersonalAdminSetup is PluginSetup {
157180
}
158181

159182
/// @notice Encodes the given installation parameters into a byte array
160-
function encodeInstallationParams(address _initialEditor) public pure returns (bytes memory) {
161-
return abi.encode(_initialEditor);
183+
function encodeInstallationParams(
184+
address _initialEditor,
185+
uint64 _proposalDuration
186+
) public pure returns (bytes memory) {
187+
return abi.encode(_initialEditor, _proposalDuration);
162188
}
163189

164190
/// @notice Decodes the given byte array into the original installation parameters
165191
function decodeInstallationParams(
166192
bytes memory _data
167-
) public pure returns (address initialEditor) {
168-
(initialEditor) = abi.decode(_data, (address));
193+
) public pure returns (address initialEditor, uint64 proposalDuration) {
194+
(initialEditor, proposalDuration) = abi.decode(_data, (address, uint64));
169195
}
170196
}

packages/contracts/test/integration-testing/personal-admin-setup.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ describe('PersonalSpaceAdmin processing', function () {
102102
const initialEditor = alice.address;
103103

104104
// Install build 1.
105-
const installData = await setup.encodeInstallationParams(initialEditor);
105+
const installData = await setup.encodeInstallationParams(
106+
initialEditor,
107+
60 * 60 * 24
108+
);
106109
const results = await installPlugin(
107110
psp,
108111
dao,

packages/contracts/test/unit-testing/personal-admin-setup.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ describe('Personal Admin Plugin Setup', function () {
5454
implementationAddress = await adminSetup.implementation();
5555

5656
prepareInstallationData = await adminSetup.encodeInstallationParams(
57-
ownerAddress
57+
ownerAddress,
58+
60 * 60 * 24
5859
);
5960
});
6061

@@ -99,7 +100,8 @@ describe('Personal Admin Plugin Setup', function () {
99100

100101
it('reverts if encoded address in `_data` is zero', async () => {
101102
const dataWithAddressZero = await adminSetup.encodeInstallationParams(
102-
AddressZero
103+
AddressZero,
104+
60 * 60 * 24
103105
);
104106

105107
await expect(
@@ -217,7 +219,7 @@ describe('Personal Admin Plugin Setup', function () {
217219
}
218220
);
219221

220-
expect(permissions.length).to.be.equal(2);
222+
expect(permissions.length).to.be.equal(5);
221223
expect(permissions).to.deep.equal([
222224
[
223225
Operation.Revoke,
@@ -226,13 +228,34 @@ describe('Personal Admin Plugin Setup', function () {
226228
AddressZero,
227229
EXECUTE_PERMISSION_ID,
228230
],
231+
[
232+
Operation.Revoke,
233+
'0x1234567890123456789012345678901234567890',
234+
plugin,
235+
AddressZero,
236+
PROPOSER_PERMISSION_ID,
237+
],
229238
[
230239
Operation.Revoke,
231240
targetDao.address,
232241
'0x1234567890123456789012345678901234567890',
233242
AddressZero,
234243
EXECUTE_PERMISSION_ID,
235244
],
245+
[
246+
Operation.Revoke,
247+
plugin,
248+
targetDao.address,
249+
AddressZero,
250+
ADD_MEMBER_PERMISSION_ID,
251+
],
252+
[
253+
Operation.Revoke,
254+
'0x1234567890123456789012345678901234567890',
255+
targetDao.address,
256+
AddressZero,
257+
UPDATE_SETTINGS_PERMISSION_ID,
258+
],
236259
]);
237260
});
238261
});

0 commit comments

Comments
 (0)