blob: 8422b9dfa88a8a0f038ae242a8b980b7f96f3dc1 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package ifc.script.framework.security;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Collection;
import drafts.com.sun.star.script.framework.security.XScriptSecurity;
import drafts.com.sun.star.script.framework.storage.XScriptStorageManager;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.ucb.XSimpleFileAccess;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.PropertyValue;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.frame.XModel;
import com.sun.star.container.XNameReplace;
import com.sun.star.util.XChangesBatch;
import com.sun.star.reflection.InvocationTargetException;
import ifc.script.framework.SecurityDialogUtil;
import lib.MultiMethodTest;
import lib.StatusException;
import lib.Parameters;
import util.SOfficeFactory;
public class _XScriptSecurity extends MultiMethodTest {
public XScriptSecurity oObj = null;
private XScriptStorageManager storageManager = null;
/**
* Retrieves object relation.
*/
public void before() throws StatusException {
}
public void after() throws StatusException {
}
public void _checkPermission() {
boolean result = true;
Collection c =
(Collection) tEnv.getObjRelation("_checkPermission");
Iterator tests;
if (c != null) {
tests = c.iterator();
while (tests.hasNext()) {
result &= runCheckPermissionTest((Parameters)tests.next());
}
}
else {
result = false;
}
// set security to always without confirmation dialog and empty path
// list so other tests can run without dialog popping up
setSecurity(2, "false", "false", null);
tRes.tested("checkPermission()", result);
}
private boolean runCheckPermissionTest(Parameters testdata) {
// description of test
String description = testdata.get("description");
// document location
String location = testdata.get("location");
//security settings
String runmacro = testdata.get("runmacro");
String confirm = testdata.get("confirm");
String warning = testdata.get("warning");
String pathlist = testdata.get("pathlist");
//do this test produce a dialog?
String dialog = testdata.get("dialog");
//is checkbox to be ticked?
String checkBoxStr = testdata.get("checkbox");
//name of button in dialog to press
String buttonName = testdata.get("buttonName");
//expected result
String expected = testdata.get("expected");
//do we need to check the pathlist?
String checkpath = testdata.get("checkpath");
String output = null;
log.println(description);
// get the officeBasic setting
int officeBasic = 0;
if( runmacro.equals("never") )
{
officeBasic = 0;
}
else if ( runmacro.equals("pathlist") )
{
officeBasic = 1;
}
else if ( runmacro.equals("always") )
{
officeBasic = 2;
}
// should pathlist include doc?
String secureURLs = null;
if( pathlist.equals("true") )
{
String uri = util.utils.getFullTestURL(location);
secureURLs = uri.substring(0, uri.lastIndexOf('/'));
}
if ( !setSecurity( officeBasic, confirm, warning, secureURLs ) )
{
log.println( "failed to set security" );
return false;
}
if( dialog.equals( "true" ) )
{
// is the checkbox to be ticked?
boolean checkBox = false;
if( checkBoxStr.equals( "true" ) )
{
checkBox = true;
}
new SecurityDialogUtil( tParam.getMSF(), buttonName, checkBox ).start();
}
// need to set up dialog utils thread first
int storageId = getStorageId(location);
try {
String uri = util.utils.getFullTestURL(location);
oObj.checkPermission(uri, "execute" );
output = "true";
}
catch (com.sun.star.security.AccessControlException ace) {
log.println("Couldn't invoke script:" + ace);
output = "com.sun.star.security.AccessControlException";
}
catch (com.sun.star.lang.IllegalArgumentException iae) {
log.println("Couldn't invoke script:" + iae);
output = "com.sun.star.lang.IllegalArgumentException";
}
catch (com.sun.star.uno.RuntimeException re) {
log.println("Couldn't invoke script:" + re);
output = "com.sun.star.uno.RuntimeException";
}
log.println("expected: " + expected + ", output: " + output);
if (output.equals(expected))
{
if( checkpath.equals("true") )
{
String setPath = getPathList();
String expectedPath = "empty";
if( checkBoxStr.equals( "true" ) )
{
String uri = util.utils.getFullTestURL(location);
expectedPath = uri.substring(0, uri.lastIndexOf('/'));
}
log.println("pathlist: expected: " + expectedPath + ", output: " + setPath);
if( setPath.equals( expectedPath ) )
{
return true;
}
else
{
return false;
}
}
return true;
}
else
return false;
}
private String getPathList()
{
String result = "";
try {
Object oProv = tParam.getMSF().createInstance(
"com.sun.star.configuration.ConfigurationProvider" );
XMultiServiceFactory xProv = (XMultiServiceFactory)
UnoRuntime.queryInterface(XMultiServiceFactory.class, oProv);
//the path to the security settings in the registry
PropertyValue aPathArg = new PropertyValue();
aPathArg.Name="nodepath";
aPathArg.Value="org.openoffice.Office.Common/Security/Scripting";
// we don't want to cache the write
PropertyValue aModeArg = new PropertyValue();
aModeArg.Name="lazywrite";
aModeArg.Value=new Boolean(false);
Object[] aArgs = new Object[2];
aArgs[0]=aPathArg;
aArgs[1]=aModeArg;
Object oConfigUpdate = xProv.createInstanceWithArguments(
"com.sun.star.configuration.ConfigurationAccess",
aArgs );
XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, oConfigUpdate );
String[] paths = (String[])xPropertySet.getPropertyValue("SecureURL");
if (paths == null || paths.length == 0)
result = "empty";
else
result = paths[0];
} catch (Exception e)
{
result = e.getClass().getName() + " getting list of secure URLs";
}
return result;
}
private boolean setSecurity( int officeBasic, String confirm,
String warning, String secureURLs )
{
boolean success=false;
try {
Object oProv = tParam.getMSF().createInstance(
"com.sun.star.configuration.ConfigurationProvider" );
XMultiServiceFactory xProv = (XMultiServiceFactory)
UnoRuntime.queryInterface(XMultiServiceFactory.class, oProv);
//the path to the security settings in the registry
PropertyValue aPathArg = new PropertyValue();
aPathArg.Name="nodepath";
aPathArg.Value="org.openoffice.Office.Common/Security/Scripting";
// we don't want to cache the write
PropertyValue aModeArg = new PropertyValue();
aModeArg.Name="lazywrite";
aModeArg.Value=new Boolean(false);
Object[] aArgs = new Object[2];
aArgs[0]=aPathArg;
aArgs[1]=aModeArg;
Object oConfigUpdate = xProv.createInstanceWithArguments(
"com.sun.star.configuration.ConfigurationUpdateAccess",
aArgs );
XNameReplace xNameReplace = (XNameReplace)UnoRuntime.queryInterface(
XNameReplace.class, oConfigUpdate );
XChangesBatch xChangesBatch = (XChangesBatch)UnoRuntime.queryInterface(
XChangesBatch.class, oConfigUpdate );
Object[] aSecureURLs;
if (secureURLs == null) {
aSecureURLs = new Object[0];
}
else {
aSecureURLs = new Object[1];
aSecureURLs[0] = secureURLs;
}
log.println("setting SecureURL");
xNameReplace.replaceByName( "SecureURL", aSecureURLs );
log.println("setting OfficeBasic");
xNameReplace.replaceByName( "OfficeBasic", new Integer(officeBasic) );
Boolean bConfirm = null;
if( ( confirm != null ) && ( confirm.equals("true") ) )
{
bConfirm = new Boolean( true );
}
else
{
bConfirm = new Boolean( false );
}
log.println("setting Confirmation");
xNameReplace.replaceByName( "Confirmation", bConfirm );
Boolean bWarning = null;
if( ( warning != null ) && ( warning.equals("true") ) )
{
bWarning = new Boolean( true );
}
else
{
bWarning = new Boolean( false );
}
log.println("setting Warning");
xNameReplace.replaceByName( "Warning", bWarning );
// and now commit the changes
xChangesBatch.commitChanges();
success=true;
} catch (Exception e) {
log.println("Error updating security settings: " +
e.getMessage() );
}
return success;
}
private int getStorageId(String location) {
XSimpleFileAccess access = null;
String uri = util.utils.getFullTestURL(location);
if (storageManager == null) {
try {
XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, tParam.getMSF());
XComponentContext xContext = (XComponentContext)
UnoRuntime.queryInterface(XComponentContext.class,
xProp.getPropertyValue("DefaultContext"));
XInterface ifc = (XInterface)
xContext.getValueByName("/singletons/drafts.com.sun.star." +
"script.framework.storage.theScriptStorageManager");
storageManager = (XScriptStorageManager)
UnoRuntime.queryInterface(XScriptStorageManager.class, ifc);
}
catch( Exception e ) {
return -1;
}
}
access = getXSimpleFileAccess();
if (access == null)
return -1;
int id = storageManager.createScriptStorageWithURI(access, uri);
return id;
}
private XSimpleFileAccess getXSimpleFileAccess() {
XSimpleFileAccess access = null;
try {
Object fa = tParam.getMSF().createInstance(
"com.sun.star.ucb.SimpleFileAccess");
access = (XSimpleFileAccess)
UnoRuntime.queryInterface(XSimpleFileAccess.class, fa);
}
catch (com.sun.star.uno.Exception e) {
return null;
}
return access;
}
private XModel loadDocument(String name) {
XModel model = null;
SOfficeFactory factory = SOfficeFactory.getFactory(tParam.getMSF());
String fullname = util.utils.getFullTestURL(name);
try {
Object obj = factory.loadDocument(fullname);
model = (XModel) UnoRuntime.queryInterface(XModel.class, obj);
}
catch (com.sun.star.lang.IllegalArgumentException iae) {
return null;
}
catch (Exception e) {
return null;
}
try {
Thread.sleep(5000);
}
catch (InterruptedException ie) {
}
return model;
}
}