@@ -1191,6 +1191,59 @@ private Function<byte[], String> checksumAndString(final MessageDigest digest, f
11911191 return bytes -> MessageDigests .toHexString (digest .digest (bytes )) + s ;
11921192 }
11931193
1194+ // checks the plugin requires a policy confirmation, and does not install when that is rejected by the user
1195+ // the plugin is installed after this method completes
1196+ private void assertPolicyConfirmation (Tuple <Path , Environment > env , String pluginZip , String ... warnings ) throws Exception {
1197+ for (int i = 0 ; i < warnings .length ; ++i ) {
1198+ String warning = warnings [i ];
1199+ for (int j = 0 ; j < i ; ++j ) {
1200+ terminal .addTextInput ("y" ); // accept warnings we have already tested
1201+ }
1202+ // default answer, does not install
1203+ terminal .addTextInput ("" );
1204+ UserException e = expectThrows (UserException .class , () -> installPlugin (pluginZip , env .v1 ()));
1205+ assertEquals ("installation aborted by user" , e .getMessage ());
1206+
1207+ assertThat (terminal .getOutput (), containsString ("WARNING: " + warning ));
1208+ try (Stream <Path > fileStream = Files .list (env .v2 ().pluginsFile ())) {
1209+ assertThat (fileStream .collect (Collectors .toList ()), empty ());
1210+ }
1211+
1212+ // explicitly do not install
1213+ terminal .reset ();
1214+ for (int j = 0 ; j < i ; ++j ) {
1215+ terminal .addTextInput ("y" ); // accept warnings we have already tested
1216+ }
1217+ terminal .addTextInput ("n" );
1218+ e = expectThrows (UserException .class , () -> installPlugin (pluginZip , env .v1 ()));
1219+ assertEquals ("installation aborted by user" , e .getMessage ());
1220+ assertThat (terminal .getOutput (), containsString ("WARNING: " + warning ));
1221+ try (Stream <Path > fileStream = Files .list (env .v2 ().pluginsFile ())) {
1222+ assertThat (fileStream .collect (Collectors .toList ()), empty ());
1223+ }
1224+ }
1225+
1226+ // allow installation
1227+ terminal .reset ();
1228+ for (int j = 0 ; j < warnings .length ; ++j ) {
1229+ terminal .addTextInput ("y" );
1230+ }
1231+ installPlugin (pluginZip , env .v1 ());
1232+ for (String warning : warnings ) {
1233+ assertThat (terminal .getOutput (), containsString ("WARNING: " + warning ));
1234+ }
1235+ }
1236+
1237+ public void testPolicyConfirmation () throws Exception {
1238+ Tuple <Path , Environment > env = createEnv (fs , temp );
1239+ Path pluginDir = createPluginDir (temp );
1240+ writePluginSecurityPolicy (pluginDir , "setAccessible" , "setFactory" );
1241+ String pluginZip = createPluginUrl ("fake" , pluginDir );
1242+
1243+ assertPolicyConfirmation (env , pluginZip , "plugin requires additional permissions" );
1244+ assertPlugin ("fake" , pluginDir , env .v2 ());
1245+ }
1246+
11941247 public void testMetaPluginPolicyConfirmation () throws Exception {
11951248 Tuple <Path , Environment > env = createEnv (fs , temp );
11961249 Path metaDir = createPluginDir (temp );
@@ -1204,32 +1257,60 @@ public void testMetaPluginPolicyConfirmation() throws Exception {
12041257 writePlugin ("fake2" , fake2Dir );
12051258 String pluginZip = createMetaPluginUrl ("meta-plugin" , metaDir );
12061259
1207- // default answer, does not install
1208- terminal .addTextInput ("" );
1209- UserException e = expectThrows (UserException .class , () -> installPlugin (pluginZip , env .v1 ()));
1210- assertEquals ("installation aborted by user" , e .getMessage ());
1211- assertThat (terminal .getOutput (), containsString ("WARNING: plugin requires additional permissions" ));
1212- try (Stream <Path > fileStream = Files .list (env .v2 ().pluginsFile ())) {
1213- assertThat (fileStream .collect (Collectors .toList ()), empty ());
1214- }
1260+ assertPolicyConfirmation (env , pluginZip , "plugin requires additional permissions" );
1261+ assertMetaPlugin ("meta-plugin" , "fake1" , metaDir , env .v2 ());
1262+ assertMetaPlugin ("meta-plugin" , "fake2" , metaDir , env .v2 ());
1263+ }
12151264
1216- // explicitly do not install
1217- terminal .reset ();
1218- terminal .addTextInput ("n" );
1219- e = expectThrows (UserException .class , () -> installPlugin (pluginZip , env .v1 ()));
1220- assertEquals ("installation aborted by user" , e .getMessage ());
1221- assertThat (terminal .getOutput (), containsString ("WARNING: plugin requires additional permissions" ));
1222- try (Stream <Path > fileStream = Files .list (env .v2 ().pluginsFile ())) {
1223- assertThat (fileStream .collect (Collectors .toList ()), empty ());
1224- }
1265+ public void testNativeControllerConfirmation () throws Exception {
1266+ Tuple <Path , Environment > env = createEnv (fs , temp );
1267+ Path pluginDir = createPluginDir (temp );
1268+ String pluginZip = createPluginUrl ("fake" , pluginDir , "has.native.controller" , "true" );
12251269
1226- // allow installation
1227- terminal .reset ();
1228- terminal .addTextInput ("y" );
1229- installPlugin (pluginZip , env .v1 ());
1230- assertThat (terminal .getOutput (), containsString ("WARNING: plugin requires additional permissions" ));
1270+ assertPolicyConfirmation (env , pluginZip , "plugin forks a native controller" );
1271+ assertPlugin ("fake" , pluginDir , env .v2 ());
1272+ }
1273+
1274+ public void testMetaPluginNativeControllerConfirmation () throws Exception {
1275+ Tuple <Path , Environment > env = createEnv (fs , temp );
1276+ Path metaDir = createPluginDir (temp );
1277+ Path fake1Dir = metaDir .resolve ("fake1" );
1278+ Files .createDirectory (fake1Dir );
1279+ writePlugin ("fake1" , fake1Dir , "has.native.controller" , "true" );
1280+ Path fake2Dir = metaDir .resolve ("fake2" );
1281+ Files .createDirectory (fake2Dir );
1282+ writePlugin ("fake2" , fake2Dir );
1283+ String pluginZip = createMetaPluginUrl ("meta-plugin" , metaDir );
1284+
1285+ assertPolicyConfirmation (env , pluginZip , "plugin forks a native controller" );
12311286 assertMetaPlugin ("meta-plugin" , "fake1" , metaDir , env .v2 ());
12321287 assertMetaPlugin ("meta-plugin" , "fake2" , metaDir , env .v2 ());
12331288 }
12341289
1290+ public void testNativeControllerAndPolicyConfirmation () throws Exception {
1291+ Tuple <Path , Environment > env = createEnv (fs , temp );
1292+ Path pluginDir = createPluginDir (temp );
1293+ writePluginSecurityPolicy (pluginDir , "setAccessible" , "setFactory" );
1294+ String pluginZip = createPluginUrl ("fake" , pluginDir , "has.native.controller" , "true" );
1295+
1296+ assertPolicyConfirmation (env , pluginZip , "plugin requires additional permissions" , "plugin forks a native controller" );
1297+ assertPlugin ("fake" , pluginDir , env .v2 ());
1298+ }
1299+
1300+ public void testMetaPluginNativeControllerAndPolicyConfirmation () throws Exception {
1301+ Tuple <Path , Environment > env = createEnv (fs , temp );
1302+ Path metaDir = createPluginDir (temp );
1303+ Path fake1Dir = metaDir .resolve ("fake1" );
1304+ Files .createDirectory (fake1Dir );
1305+ writePluginSecurityPolicy (fake1Dir , "setAccessible" , "setFactory" );
1306+ writePlugin ("fake1" , fake1Dir );
1307+ Path fake2Dir = metaDir .resolve ("fake2" );
1308+ Files .createDirectory (fake2Dir );
1309+ writePlugin ("fake2" , fake2Dir , "has.native.controller" , "true" );
1310+ String pluginZip = createMetaPluginUrl ("meta-plugin" , metaDir );
1311+
1312+ assertPolicyConfirmation (env , pluginZip , "plugin requires additional permissions" , "plugin forks a native controller" );
1313+ assertMetaPlugin ("meta-plugin" , "fake1" , metaDir , env .v2 ());
1314+ assertMetaPlugin ("meta-plugin" , "fake2" , metaDir , env .v2 ());
1315+ }
12351316}
0 commit comments