Mozilla/mozilla/modules/softupdt/src/nsInstallExecute.cpp
dveditz%netscape.com 1ff29abbe0 merging in changes from Classic branch. Not part of SeaMonkey build (yet)
git-svn-id: svn://10.0.0.236/trunk@17772 18797224-902f-48f8-a5cc-f745e15eee43
1999-01-14 23:08:21 +00:00

245 lines
6.3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "prmem.h"
#include "prmon.h"
#include "prlog.h"
#include "prprf.h"
#include "xp.h"
#include "su_instl.h"
#include "nsInstallExecute.h"
#include "nsSUError.h"
#include "nsPrivilegeManager.h"
#include "nsTarget.h"
extern int SU_ERROR_UNEXPECTED;
extern int SU_DETAILS_EXECUTE_PROGRESS;
extern int SU_DETAILS_EXECUTE_PROGRESS2;
PR_BEGIN_EXTERN_C
/* Public Methods */
/* Constructor
* inJarLocation - location inside the JAR file
* inZigPtr - pointer to the ZIG *
*/
nsInstallExecute::nsInstallExecute(nsSoftwareUpdate* inSoftUpdate,
char* inJarLocation,
char* *errorMsg,
char* inArgs) : nsInstallObject(inSoftUpdate)
{
jarLocation = NULL;
tempFile = NULL;
args = NULL;
cmdline = NULL;
if ((inArgs == NULL) || (inJarLocation == NULL) ||
(inSoftUpdate == NULL)) {
*errorMsg = SU_GetErrorMsg3("Invalid arguments to the constructor",
SUERR_INVALID_ARGUMENTS);
return;
}
/* Request impersonation privileges */
nsTarget* target = NULL;
/* Request impersonation privileges */
nsPrivilegeManager* privMgr = nsPrivilegeManager::getPrivilegeManager();
nsTarget* impersonation = nsTarget::findTarget(IMPERSONATOR);
if ((privMgr != NULL) && (impersonation != NULL)) {
privMgr->enablePrivilege(impersonation, 1);
/* check the security permissions */
target = nsTarget::findTarget(INSTALL_PRIV);
if (target != NULL) {
/* XXX: we need a way to indicate that a dialog box should appear.*/
if (!privMgr->enablePrivilege( target, softUpdate->GetPrincipal(), 1 )) {
*errorMsg = SU_GetErrorMsg3("Permssion was denied", SUERR_ACCESS_DENIED);
return;
}
}
}
jarLocation = XP_STRDUP(inJarLocation);
args = XP_STRDUP(inArgs);
}
nsInstallExecute::~nsInstallExecute()
{
XP_FREEIF(jarLocation);
XP_FREEIF(args);
XP_FREEIF(cmdline);
XP_FREEIF(tempFile);
}
/* Prepare
* Extracts file out of the JAR archive into the temp directory
*/
char* nsInstallExecute::Prepare(void)
{
char *errorMsg = NULL;
nsTarget* execTarget = NULL;
if (softUpdate == NULL) {
return SU_GetErrorMsg3("Invalid arguments to the constructor",
SUERR_INVALID_ARGUMENTS);
}
nsPrivilegeManager* privMgr = nsPrivilegeManager::getPrivilegeManager();
nsTarget* impersonation = nsTarget::findTarget(IMPERSONATOR);
if ((privMgr != NULL) && (impersonation != NULL)) {
privMgr->enablePrivilege(impersonation, 1);
execTarget = nsTarget::findTarget(INSTALL_PRIV);
if (execTarget != NULL) {
if (!privMgr->enablePrivilege( execTarget, softUpdate->GetPrincipal(), 1 )) {
return SU_GetErrorMsg3("Permssion was denied", SUERR_ACCESS_DENIED);
}
}
}
tempFile = softUpdate->ExtractJARFile( jarLocation, NULL, &errorMsg );
if (errorMsg != NULL) {
PR_ASSERT(tempFile == NULL);
return errorMsg;
}
if (tempFile == NULL) {
return SU_GetErrorMsg3("Extraction of JAR file failed", SUERR_ACCESS_DENIED);
}
#ifdef XP_MAC
cmdline = XP_STRDUP(tempFile);
#else
if ( args == NULL )
cmdline = XP_STRDUP(tempFile);
else
cmdline = XP_Cat(tempFile, " ", args);
#endif /* XP_MAC */
XP_FREE(tempFile);
return NULL;
}
/* Complete
* Completes the install by executing the file
* Security hazard: make sure we request the right permissions
*/
char* nsInstallExecute::Complete(void)
{
char* errorMsg = NULL;
nsTarget* execTarget = NULL;
if (softUpdate == NULL) {
return SU_GetErrorMsg3("Invalid arguments to the constructor",
SUERR_INVALID_ARGUMENTS);
}
nsPrivilegeManager* privMgr = nsPrivilegeManager::getPrivilegeManager();
nsTarget* impersonation = nsTarget::findTarget(IMPERSONATOR);
if ((privMgr != NULL) && (impersonation != NULL)) {
privMgr->enablePrivilege(impersonation, 1);
execTarget = nsTarget::findTarget(INSTALL_PRIV);
if (execTarget != NULL) {
if (!privMgr->enablePrivilege( execTarget, softUpdate->GetPrincipal(), 1 )) {
return SU_GetErrorMsg3("Permssion was denied", SUERR_ACCESS_DENIED);
}
}
}
errorMsg = NativeComplete();
if (execTarget != NULL) {
privMgr->revertPrivilege( execTarget, 1 );
}
//
// System.out.println("File executed: " + tempFile);
return errorMsg;
}
void nsInstallExecute::Abort(void)
{
NativeAbort();
}
char* nsInstallExecute::toString()
{
char *ret_val;
char *msg = XP_Cat(jarLocation, tempFile);
if (tempFile == NULL) {
ret_val = SU_GetString1(SU_DETAILS_EXECUTE_PROGRESS, msg);
} else {
ret_val = SU_GetString1(SU_DETAILS_EXECUTE_PROGRESS2, msg);
}
XP_FREE(msg);
return ret_val;
}
/* Private Methods */
char* nsInstallExecute::NativeComplete(void)
{
char* errorMsg = NULL;
int32 err;
err = FE_ExecuteFile( tempFile, cmdline );
XP_ASSERT( err == 0 );
if ( err != 0 ) {
errorMsg = SU_GetErrorMsg4(SU_ERROR_UNEXPECTED, err);
}
return errorMsg;
}
void nsInstallExecute::NativeAbort(void)
{
char * currentName;
int result;
if (tempFile == NULL)
return;
/* Get the names */
currentName = (char*)tempFile;
result = XP_FileRemove(currentName, xpURL);
XP_ASSERT(result == 0);
}
/* CanUninstall
* InstallExecute() installs files which cannot be uninstalled,
* since they are executed, hence this function returns false.
*/
PRBool
nsInstallExecute::CanUninstall()
{
return FALSE;
}
/* RegisterPackageNode
* InstallExecute() installs files which need to be registered,
* hence this function returns true.
*/
PRBool
nsInstallExecute::RegisterPackageNode()
{
return TRUE;
}
PR_END_EXTERN_C