home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / browser / ns405lyc / nav40.z / java40.jar / netscape / softupdate / SoftwareUpdate.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-03-24  |  11.5 KB  |  625 lines

  1. package netscape.softupdate;
  2.  
  3. import java.util.Enumeration;
  4. import java.util.Vector;
  5. import netscape.javascript.JSObject;
  6. import netscape.security.AppletSecurity;
  7. import netscape.security.ForbiddenTargetException;
  8. import netscape.security.Principal;
  9. import netscape.security.PrivilegeManager;
  10. import netscape.security.Target;
  11. import netscape.security.UserDialogHelper;
  12. import netscape.security.UserTarget;
  13.  
  14. public final class SoftwareUpdate {
  15.    static final int nTargets = 3;
  16.    static String[] targetNames = new String[]{"LimitedInstall", "FullInstall", "SilentInstall"};
  17.    public static final int LIMITED_INSTALL = 0;
  18.    public static final int FULL_INSTALL = 1;
  19.    public static final int SILENT_INSTALL = 2;
  20.    protected static final String IMPERSONATOR = "Impersonator";
  21.    public static final int BAD_PACKAGE_NAME = -200;
  22.    public static final int UNEXPECTED_ERROR = -201;
  23.    public static final int ACCESS_DENIED = -202;
  24.    public static final int TOO_MANY_CERTIFICATES = -203;
  25.    public static final int NO_INSTALLER_CERTIFICATE = -204;
  26.    public static final int NO_CERTIFICATE = -205;
  27.    public static final int NO_MATCHING_CERTIFICATE = -206;
  28.    public static final int UNKNOWN_JAR_FILE = -207;
  29.    public static final int INVALID_ARGUMENTS = -208;
  30.    public static final int ILLEGAL_RELATIVE_PATH = -209;
  31.    public static final int USER_CANCELLED = -210;
  32.    public static final int INSTALL_NOT_STARTED = -211;
  33.    public static final int SILENT_MODE_DENIED = -212;
  34.    public static final int SUCCESS = 0;
  35.    public static final int REBOOT_NEEDED = 999;
  36.    protected String packageName;
  37.    protected Vector installedFiles;
  38.    protected VersionInfo versionInfo;
  39.    protected String userPackageName;
  40.    private ProgressMediator progress;
  41.    private int userChoice;
  42.    private boolean silent;
  43.    private int lastError;
  44.    private String installerJarName;
  45.    private String jarName;
  46.    private int zigPtr;
  47.    private Principal installPrincipal;
  48.  
  49.    public SoftwareUpdate(JSObject var1, String var2) {
  50.       this.userPackageName = var2;
  51.       this.installPrincipal = null;
  52.       this.packageName = null;
  53.       this.progress = null;
  54.       this.zigPtr = 0;
  55.       this.userChoice = -1;
  56.       this.lastError = 0;
  57.       this.VerifyJSObject(var1);
  58.       this.jarName = (String)var1.getMember("src");
  59.       this.silent = false;
  60.  
  61.       try {
  62.          var1.getMember("silent");
  63.          this.silent = (Boolean)var1.getMember("silent");
  64.       } catch (Throwable var3) {
  65.          System.out.println("Unexpected throw on silent");
  66.          this.silent = false;
  67.       }
  68.    }
  69.  
  70.    protected void finalize() throws Throwable {
  71.       super.finalize();
  72.       this.CleanUp();
  73.    }
  74.  
  75.    private native void VerifyJSObject(JSObject var1);
  76.  
  77.    private void InitializeInstallerCertificate() throws SoftUpdateException {
  78.       Object var1 = null;
  79.       var1 = this.getCertificates(this.zigPtr, this.installerJarName);
  80.       if (var1 != null && ((Object[])var1).length != 0) {
  81.          if (((Object[])var1).length > 1) {
  82.             throw new SoftUpdateException(Strings.error_TooManyCertificates(), -203);
  83.          } else {
  84.             this.installPrincipal = new Principal(14, (byte[])((Object[])var1)[0]);
  85.          }
  86.       } else {
  87.          throw new SoftUpdateException(Strings.error_NoCertificate(), -204);
  88.       }
  89.    }
  90.  
  91.    private void CheckSilentPrivileges() {
  92.       if (this.silent) {
  93.          try {
  94.             PrivilegeManager var1 = AppletSecurity.getPrivilegeManager();
  95.             Target var2 = Target.findTarget("Impersonator");
  96.             var1.enablePrivilege(var2);
  97.             Target var3 = Target.findTarget(targetNames[2]);
  98.             var1.enablePrivilege(var3, this.GetPrincipal());
  99.          } catch (Throwable var4) {
  100.             System.out.println(Strings.error_SilentModeDenied());
  101.             this.silent = false;
  102.          }
  103.       }
  104.    }
  105.  
  106.    private void RequestSecurityPrivileges(int var1) {
  107.       if (var1 != 0 && var1 != 1) {
  108.          var1 = 1;
  109.       }
  110.  
  111.       PrivilegeManager var2 = AppletSecurity.getPrivilegeManager();
  112.       Target var3 = Target.findTarget("Impersonator");
  113.       var2.enablePrivilege(var3);
  114.       Target var4 = Target.findTarget(targetNames[var1]);
  115.       var2.enablePrivilege(var4, this.GetPrincipal());
  116.    }
  117.  
  118.    protected final Principal GetPrincipal() {
  119.       return this.installPrincipal;
  120.    }
  121.  
  122.    protected final String GetUserPackageName() {
  123.       return this.userPackageName;
  124.    }
  125.  
  126.    protected final boolean GetSilent() {
  127.       return this.silent;
  128.    }
  129.  
  130.    protected final Enumeration GetInstallQueue() {
  131.       return this.installedFiles != null ? this.installedFiles.elements() : null;
  132.    }
  133.  
  134.    public int GetLastError() {
  135.       return this.lastError;
  136.    }
  137.  
  138.    public void ResetError() {
  139.       this.lastError = 0;
  140.    }
  141.  
  142.    private int saveError(int var1) {
  143.       if (var1 != 0) {
  144.          this.lastError = var1;
  145.       }
  146.  
  147.       return var1;
  148.    }
  149.  
  150.    public Object GetFolder(String var1) {
  151.       FolderSpec var2 = null;
  152.  
  153.       try {
  154.          if (var1.compareTo("Installed") != 0) {
  155.             var2 = new FolderSpec(var1, this.packageName, this.userPackageName);
  156.             if (var1 == "User Pick") {
  157.                var2.GetDirectoryPath();
  158.             }
  159.          }
  160.  
  161.          return var2;
  162.       } catch (Throwable var3) {
  163.          return null;
  164.       }
  165.    }
  166.  
  167.    public Object GetComponentFolder(String var1) {
  168.       FolderSpec var3 = null;
  169.       String var2 = VersionRegistry.getDefaultDirectory(var1);
  170.       if (var2 == null) {
  171.          var2 = VersionRegistry.componentPath(var1);
  172.          int var4;
  173.          if (var2 != null && (var4 = var2.lastIndexOf(System.getProperty("file.separator"))) > 0) {
  174.             char[] var5 = new char[var4];
  175.             var2.getChars(0, var4, var5, 0);
  176.             var2 = new String(var5);
  177.          }
  178.       }
  179.  
  180.       if (var2 != null) {
  181.          var3 = new FolderSpec("Installed", var2, this.userPackageName);
  182.       }
  183.  
  184.       return var3;
  185.    }
  186.  
  187.    public Object GetWinProfile(Object var1, String var2) {
  188.       WinProfile var3 = null;
  189.       String var4 = System.getProperty("os.name");
  190.  
  191.       try {
  192.          if (this.packageName == null) {
  193.             throw new SoftUpdateException(Strings.error_WinProfileMustCallStart(), -211);
  194.          }
  195.  
  196.          if (var4.indexOf("Windows") >= 0 || var4.equals("Win32s")) {
  197.             var3 = new WinProfile(this, (FolderSpec)var1, var2);
  198.          }
  199.       } catch (SoftUpdateException var5) {
  200.          var3 = null;
  201.       }
  202.  
  203.       return var3;
  204.    }
  205.  
  206.    public Object GetWinRegistry() {
  207.       WinReg var1 = null;
  208.       String var2 = System.getProperty("os.name");
  209.  
  210.       try {
  211.          if (this.packageName == null) {
  212.             throw new SoftUpdateException(Strings.error_WinProfileMustCallStart(), -211);
  213.          }
  214.  
  215.          if (var2.indexOf("Windows") >= 0 || var2.equals("Win32s")) {
  216.             var1 = new WinReg(this);
  217.          }
  218.       } catch (Throwable var3) {
  219.          var1 = null;
  220.       }
  221.  
  222.       return var1;
  223.    }
  224.  
  225.    private native void OpenJARFile() throws SoftUpdateException;
  226.  
  227.    private native void CloseJARFile();
  228.  
  229.    private native Object[] getCertificates(int var1, String var2);
  230.  
  231.    protected String ExtractJARFile(String var1, String var2) throws SoftUpdateException {
  232.       if (this.zigPtr == 0) {
  233.          throw new SoftUpdateException("JAR file\thas\tnot\tbeen opened", -207);
  234.       } else {
  235.          PrivilegeManager var4 = AppletSecurity.getPrivilegeManager();
  236.          Target var3 = Target.findTarget(targetNames[0]);
  237.          var4.checkPrivilegeEnabled(var3);
  238.          boolean var6 = false;
  239.          Object var7 = null;
  240.          var7 = this.getCertificates(this.zigPtr, var1);
  241.          if (var7 != null && ((Object[])var7).length != 0) {
  242.             for(int var5 = 0; var5 < ((Object[])var7).length; ++var5) {
  243.                Principal var8 = new Principal(14, (byte[])((Object[])var7)[var5]);
  244.                if (this.installPrincipal.equals(var8)) {
  245.                   var6 = true;
  246.                   break;
  247.                }
  248.             }
  249.  
  250.             if (!var6) {
  251.                throw new SoftUpdateException(Strings.error_MismatchedCertificate() + var1, -206);
  252.             } else {
  253.                String var10 = this.NativeExtractJARFile(var1, var2);
  254.                return var10;
  255.             }
  256.          } else {
  257.             throw new SoftUpdateException("Missing certificate for " + var1, -205);
  258.          }
  259.       }
  260.    }
  261.  
  262.    private native String NativeExtractJARFile(String var1, String var2) throws SoftUpdateException;
  263.  
  264.    public int StartInstall(String var1, VersionInfo var2, int var3) {
  265.       int var4 = 0;
  266.       this.ResetError();
  267.  
  268.       try {
  269.          if (var1 == null) {
  270.             throw new SoftUpdateException(Strings.error_BadPackageName(), -208);
  271.          }
  272.  
  273.          char[] var5;
  274.          for(this.packageName = var1; this.packageName.endsWith("/"); this.packageName = new String(var5)) {
  275.             var5 = new char[this.packageName.length() - 1];
  276.             this.packageName.getChars(0, this.packageName.length() - 1, var5, 0);
  277.          }
  278.  
  279.          this.versionInfo = var2;
  280.          this.installedFiles = new Vector();
  281.          this.OpenJARFile();
  282.          this.InitializeInstallerCertificate();
  283.          this.CheckSilentPrivileges();
  284.          this.RequestSecurityPrivileges(var3);
  285.          this.progress = new ProgressMediator(this);
  286.          this.progress.StartInstall();
  287.       } catch (SoftUpdateException var6) {
  288.          var4 = var6.GetError();
  289.       } catch (ForbiddenTargetException var7) {
  290.          var4 = -202;
  291.       } catch (Exception var8) {
  292.          ((Throwable)var8).printStackTrace();
  293.          var4 = -201;
  294.       }
  295.  
  296.       this.saveError(var4);
  297.       return var4;
  298.    }
  299.  
  300.    protected void UserCancelled() {
  301.       this.userChoice = 0;
  302.       this.AbortInstall();
  303.    }
  304.  
  305.    protected void UserApproved() {
  306.       this.userChoice = 1;
  307.    }
  308.  
  309.    public int FinalizeInstall() {
  310.       boolean var1 = false;
  311.       int var2 = 0;
  312.  
  313.       try {
  314.          if (this.packageName == null) {
  315.             throw new SoftUpdateException(Strings.error_WinProfileMustCallStart(), -211);
  316.          }
  317.  
  318.          this.progress.ConfirmWithUser();
  319.  
  320.          while(this.userChoice == -1) {
  321.             Thread.sleep(10L);
  322.          }
  323.  
  324.          if (this.userChoice != 1) {
  325.             this.AbortInstall();
  326.             this.lastError = -210;
  327.             short var3 = -210;
  328.             return var3;
  329.          }
  330.  
  331.          Enumeration var6 = this.GetInstallQueue();
  332.          InstallObject var7 = null;
  333.  
  334.          try {
  335.             while(var6.hasMoreElements()) {
  336.                var7 = (InstallObject)var6.nextElement();
  337.  
  338.                try {
  339.                   var7.Complete();
  340.                } catch (SoftUpdateException var17) {
  341.                   if ((short)var17.GetError() != 999) {
  342.                      throw var17;
  343.                   }
  344.  
  345.                   var1 = true;
  346.                }
  347.             }
  348.          } catch (Throwable var18) {
  349.             if (var7 != null) {
  350.                var7.Abort();
  351.             }
  352.  
  353.             while(var6.hasMoreElements()) {
  354.                try {
  355.                   var7 = (InstallObject)var6.nextElement();
  356.                   var7.Abort();
  357.                } catch (Throwable var16) {
  358.                }
  359.             }
  360.  
  361.             throw var18;
  362.          }
  363.  
  364.          if (this.versionInfo != null) {
  365.             var2 = VersionRegistry.installComponent(this.packageName, (String)null, this.versionInfo);
  366.          }
  367.       } catch (SoftUpdateException var19) {
  368.          var2 = var19.GetError();
  369.       } catch (ForbiddenTargetException var20) {
  370.          var2 = -202;
  371.       } catch (Throwable var21) {
  372.          var21.printStackTrace();
  373.          System.out.println(Strings.error_Unexpected() + " FinalizeInstall");
  374.          var2 = -201;
  375.       } finally {
  376.          if (this.installedFiles != null) {
  377.             this.installedFiles.removeAllElements();
  378.          }
  379.  
  380.          this.CleanUp();
  381.       }
  382.  
  383.       if (var2 == 0 && var1) {
  384.          var2 = 999;
  385.       }
  386.  
  387.       this.saveError(var2);
  388.       return var2;
  389.    }
  390.  
  391.    public synchronized void AbortInstall() {
  392.       try {
  393.          if (this.installedFiles != null) {
  394.             Enumeration var3 = this.GetInstallQueue();
  395.  
  396.             while(var3.hasMoreElements()) {
  397.                InstallObject var4 = (InstallObject)var3.nextElement();
  398.  
  399.                try {
  400.                   var4.Abort();
  401.                } catch (Throwable var11) {
  402.                }
  403.             }
  404.  
  405.             this.installedFiles.removeAllElements();
  406.             this.installedFiles = null;
  407.          }
  408.  
  409.          this.CloseJARFile();
  410.       } catch (Throwable var12) {
  411.          System.out.println(Strings.error_Unexpected() + " AbortInstall");
  412.          var12.printStackTrace();
  413.       } finally {
  414.          try {
  415.             this.CleanUp();
  416.          } catch (Throwable var10) {
  417.             var10.printStackTrace();
  418.          }
  419.  
  420.       }
  421.  
  422.    }
  423.  
  424.    private synchronized void CleanUp() {
  425.       if (this.progress != null) {
  426.          this.progress.Complete();
  427.       }
  428.  
  429.       this.CloseJARFile();
  430.       this.progress = null;
  431.       this.zigPtr = 0;
  432.       if (this.installedFiles != null) {
  433.          Enumeration var1 = this.GetInstallQueue();
  434.  
  435.          while(var1.hasMoreElements()) {
  436.             InstallObject var2 = (InstallObject)var1.nextElement();
  437.             var2.Abort();
  438.          }
  439.  
  440.          this.installedFiles.removeAllElements();
  441.       }
  442.  
  443.       this.installedFiles = null;
  444.       this.packageName = null;
  445.    }
  446.  
  447.    protected void ScheduleForInstall(InstallObject var1) {
  448.       if (this.progress != null) {
  449.          this.progress.ScheduleForInstall(var1);
  450.       }
  451.  
  452.       this.installedFiles.addElement(var1);
  453.    }
  454.  
  455.    private String GetQualifiedRegName(String var1) {
  456.       String var2 = this.packageName.length() == 0 ? "" : this.packageName + "/";
  457.       if (var1.toUpperCase().startsWith("=COMM=/")) {
  458.          var1 = (var1.substring(7) + "===").substring(0, var1.length() - 7);
  459.       } else if (var1.charAt(0) != '/') {
  460.          var1 = var2 + var1;
  461.       }
  462.  
  463.       return var1;
  464.    }
  465.  
  466.    public int AddSubcomponent(String var1, VersionInfo var2, String var3, Object var4, String var5, boolean var6) {
  467.       int var8 = 0;
  468.  
  469.       try {
  470.          if (var3 == null || var3.length() == 0 || var4 == null) {
  471.             throw new SoftUpdateException("", -208);
  472.          }
  473.  
  474.          if (this.packageName == null) {
  475.             throw new SoftUpdateException(Strings.error_BadPackageNameAS(), -200);
  476.          }
  477.  
  478.          this.packageName.length();
  479.          if (var1 != null && var1.length() != 0) {
  480.             var1 = this.GetQualifiedRegName(var1);
  481.          } else {
  482.             var1 = this.GetQualifiedRegName(var3);
  483.          }
  484.  
  485.          if (var5 == null || var5.length() == 0) {
  486.             var5 = var3;
  487.          }
  488.  
  489.          boolean var9 = false;
  490.          if (!var6 && var2 != null && VersionRegistry.validateComponent(var1) == 0) {
  491.             VersionInfo var10 = VersionRegistry.componentVersion(var1);
  492.             if (var2.compareTo(var10) > 0) {
  493.                var9 = true;
  494.             }
  495.          } else {
  496.             var9 = true;
  497.          }
  498.  
  499.          if (var9) {
  500.             InstallFile var7 = new InstallFile(this, var1, var2, var3, (FolderSpec)var4, var5, var6);
  501.             var7.ExtractFile();
  502.             this.ScheduleForInstall(var7);
  503.          }
  504.       } catch (SoftUpdateException var11) {
  505.          var8 = var11.GetError();
  506.       } catch (ForbiddenTargetException var12) {
  507.          var8 = -202;
  508.       } catch (Throwable var13) {
  509.          System.out.println(Strings.error_Unexpected() + "AddSubcomponent");
  510.          var8 = -201;
  511.       }
  512.  
  513.       this.saveError(var8);
  514.       return var8;
  515.    }
  516.  
  517.    public int Execute(String var1) {
  518.       int var2 = 0;
  519.  
  520.       try {
  521.          InstallExecute var3 = new InstallExecute(this, var1);
  522.          var3.ExtractFile();
  523.          this.ScheduleForInstall(var3);
  524.       } catch (SoftUpdateException var4) {
  525.          var2 = var4.GetError();
  526.       } catch (ForbiddenTargetException var5) {
  527.          var2 = -202;
  528.       } catch (Throwable var6) {
  529.          var6.printStackTrace();
  530.          System.out.println(Strings.error_Unexpected() + "Execute");
  531.          var2 = -201;
  532.       }
  533.  
  534.       this.saveError(var2);
  535.       return var2;
  536.    }
  537.  
  538.    public int[] Gestalt(String var1) {
  539.       int[] var2 = new int[]{0, 0};
  540.  
  541.       try {
  542.          var2[1] = this.NativeGestalt(var1);
  543.       } catch (SoftUpdateException var4) {
  544.          var2[0] = var4.GetError();
  545.       } catch (Throwable var5) {
  546.          var2[0] = -1;
  547.          System.out.println(Strings.error_Unexpected() + "Gestalt");
  548.       }
  549.  
  550.       return var2;
  551.    }
  552.  
  553.    private native int NativeGestalt(String var1) throws SoftUpdateException;
  554.  
  555.    private native String[] ExtractDirEntries(String var1);
  556.  
  557.    public int AddDirectory(String var1, VersionInfo var2, String var3, FolderSpec var4, String var5, boolean var6) {
  558.       int var8 = 0;
  559.  
  560.       try {
  561.          if (var3 == null || var3.length() == 0 || var4 == null) {
  562.             throw new SoftUpdateException("", -208);
  563.          }
  564.  
  565.          if (this.packageName == null) {
  566.             throw new SoftUpdateException(Strings.error_BadPackageNameAS(), -200);
  567.          }
  568.  
  569.          if (var1 != null && var1.length() != 0) {
  570.             var1 = this.GetQualifiedRegName(var1);
  571.          } else {
  572.             var1 = this.GetQualifiedRegName(var3);
  573.          }
  574.  
  575.          if (var5 == null) {
  576.             var5 = "";
  577.          } else if (var5.length() != 0) {
  578.             var5 = var5 + "/";
  579.          }
  580.  
  581.          System.out.println("AddDirectory " + var1 + " from " + var3 + " into " + var4.MakeFullPath(var5));
  582.          String[] var9 = this.ExtractDirEntries(var3);
  583.  
  584.          for(int var10 = 0; var10 < var9.length; ++var10) {
  585.             String var13 = var1 + "/" + var9[var10];
  586.             boolean var11;
  587.             if (!var6 && var2 != null && VersionRegistry.validateComponent(var13) == 0) {
  588.                VersionInfo var12 = VersionRegistry.componentVersion(var13);
  589.                var11 = var2.compareTo(var12) > 0;
  590.             } else {
  591.                var11 = true;
  592.             }
  593.  
  594.             if (var11) {
  595.                InstallFile var7 = new InstallFile(this, var13, var2, var3 + "/" + var9[var10], var4, var5 + var9[var10], var6);
  596.                var7.ExtractFile();
  597.                this.ScheduleForInstall(var7);
  598.             }
  599.          }
  600.       } catch (SoftUpdateException var14) {
  601.          var8 = var14.GetError();
  602.       } catch (ForbiddenTargetException var15) {
  603.          var8 = -202;
  604.       } catch (Throwable var16) {
  605.          System.out.println(Strings.error_Unexpected() + "AddDirectory");
  606.          var8 = -201;
  607.       }
  608.  
  609.       this.saveError(var8);
  610.       return var8;
  611.    }
  612.  
  613.    static {
  614.       Principal var3 = PrivilegeManager.getSystemPrincipal();
  615.       UserTarget var0 = new UserTarget(targetNames[0], var3, UserDialogHelper.targetRiskMedium(), UserDialogHelper.targetRiskColorMedium(), Strings.targetDesc_LimitedInstall(), Strings.getString("s37"), Strings.targetUrl_LimitedInstall());
  616.       var0 = (UserTarget)((Target)var0).registerTarget();
  617.       Target[] var4 = new Target[]{var0};
  618.       UserTarget var1 = new UserTarget(targetNames[1], var3, UserDialogHelper.targetRiskHigh(), UserDialogHelper.targetRiskColorHigh(), Strings.targetDesc_FullInstall(), Strings.getString("s38"), Strings.targetUrl_FullInstall(), var4);
  619.       var1 = (UserTarget)((Target)var1).registerTarget();
  620.       var4[0] = var1;
  621.       UserTarget var2 = new UserTarget(targetNames[2], var3, UserDialogHelper.targetRiskHigh(), UserDialogHelper.targetRiskColorHigh(), Strings.targetDesc_SilentInstall(), Strings.getString("s39"), Strings.targetUrl_SilentInstall(), var4);
  622.       var2 = (UserTarget)((Target)var2).registerTarget();
  623.    }
  624. }
  625.