From 543b99834dd9ec8c609955801476d4eec1ca2a56 Mon Sep 17 00:00:00 2001
From: ftimme <ft@falkotimme.com>
Date: Wed, 13 Feb 2013 09:33:36 -0500
Subject: [PATCH] - App Installer: make sure that package URLs get inserted in aps_packages table even when process of updating the packagelist is aborted or reloaded. - Added an explanation page before package lists are updated.

---
 interface/web/sites/lib/module.conf.php                    |    2 
 interface/lib/classes/aps_crawler.inc.php                  |   65 ++++++++++++++++-----
 interface/web/sites/aps_update_packagelist.php             |   57 +++++++++++++++++++
 interface/web/sites/lib/lang/en_aps_update_packagelist.lng |    7 ++
 interface/web/sites/lib/lang/de_aps_update_packagelist.lng |    7 ++
 interface/web/sites/templates/aps_update_packagelist.htm   |   20 ++++++
 interface/web/sites/aps_cron_apscrawler_if.php             |    4 +
 7 files changed, 144 insertions(+), 18 deletions(-)

diff --git a/interface/lib/classes/aps_crawler.inc.php b/interface/lib/classes/aps_crawler.inc.php
index ca3402e..98cf769 100644
--- a/interface/lib/classes/aps_crawler.inc.php
+++ b/interface/lib/classes/aps_crawler.inc.php
@@ -35,7 +35,7 @@
 class ApsCrawler extends ApsBase
 {
    
-   public $app_download_url_list = array();
+   //public $app_download_url_list = array();
    
    /**
     * Constructor
@@ -216,7 +216,7 @@
     public function startCrawler() 
     {
         global $app;
-        
+
         try
         {
             // Make sure the requirements are given so that this script can execute
@@ -297,13 +297,8 @@
                         $local_intf_folder = $this->interface_pkg_dir.'/'.$app_name.'-'.$new_ver.'.app.zip/';
 
                         // Proceed if a newer or at least equal version has been found with server mode or 
-                        // interface mode is activated and there's no valid APP-META.xml existing yet
-                        if((!$this->interface_mode && version_compare($new_ver, $ex_ver) >= 0)
-                         || ($this->interface_mode 
-                              && (!file_exists($local_intf_folder.'APP-META.xml') || filesize($local_intf_folder.'APP-META.xml') == 0)
-                            )
-                        )
-                        {
+                        // interface mode is activated and there are no valid APP-META.xml and PKG_URL existing yet
+                        if((!$this->interface_mode && version_compare($new_ver, $ex_ver) >= 0) || ($this->interface_mode && (!file_exists($local_intf_folder.'APP-META.xml') || filesize($local_intf_folder.'APP-META.xml') == 0 || !file_exists($local_intf_folder.'PKG_URL') || filesize($local_intf_folder.'PKG_URL') == 0))){
                             // Check if we already have an old version of this app
                             if(!empty($ex_ver) && version_compare($new_ver, $ex_ver) == 1) $apps_updated++; 
 
@@ -311,8 +306,7 @@
                             $app_filesize = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='aps']/@length");
                             $app_metafile = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='meta']/@href");
 							
-							$this->app_download_url_list[$app_name.'-'.$new_ver.'.app.zip'] = $app_dl;
-
+							//$this->app_download_url_list[$app_name.'-'.$new_ver.'.app.zip'] = $app_dl;
                             // Skip ASP.net packages because they can't be used at all
                             $asp_handler = parent::getXPathValue($sxe, '//aspnet:handler');
                             $asp_permissions = parent::getXPathValue($sxe, '//aspnet:permissions');
@@ -342,6 +336,9 @@
                                 
                                 // Create the local folder if not yet existing
                                 if(!file_exists($local_intf_folder)) @mkdir($local_intf_folder, 0777, true);
+								
+								// Save the package URL in an extra file because it's not part of the APP-META.xml file
+								@file_put_contents($local_intf_folder.'PKG_URL', $app_dl);
                                 
                                 // Download the meta file
                                 $local_metafile = $local_intf_folder.'APP-META.xml';
@@ -480,7 +477,7 @@
         
         try
         {
-            // This method must be used in server mode
+            // This method must be used in interface mode
             if(!$this->interface_mode) return false; 
             
             $pkg_list = array();
@@ -531,6 +528,8 @@
                 $pkg_category = parent::getXPathValue($sxe, '//category');
                 $pkg_version = parent::getXPathValue($sxe, 'version');
                 $pkg_release = parent::getXPathValue($sxe, 'release');
+				//$pkg_url = $this->app_download_url_list[$pkg];
+				$pkg_url = @file_get_contents($this->interface_pkg_dir.'/'.$pkg.'/PKG_URL');
                 
 				/*
                 $app->db->query("INSERT INTO `aps_packages` 
@@ -539,13 +538,17 @@
                     '".$app->db->quote($pkg_category)."', '".$app->db->quote($pkg_version)."',
                     ".$app->db->quote($pkg_release).", ".PACKAGE_ENABLED.");");
 				*/
-				
-				$insert_data = "(`path`, `name`, `category`, `version`, `release`, `package_url`, `package_status`) VALUES 
+				// Insert only if data is complete
+				if($pkg != '' && $pkg_name != '' && $pkg_category != '' && $pkg_version != '' && $pkg_release != '' && $pkg_url){
+					$insert_data = "(`path`, `name`, `category`, `version`, `release`, `package_url`, `package_status`) VALUES 
                     ('".$app->db->quote($pkg)."', '".$app->db->quote($pkg_name)."',
                     '".$app->db->quote($pkg_category)."', '".$app->db->quote($pkg_version)."',
-                    ".$app->db->quote($pkg_release).", '".$app->db->quote($this->app_download_url_list[$pkg])."', ".PACKAGE_ENABLED.");";
+                    ".$app->db->quote($pkg_release).", '".$app->db->quote($pkg_url)."', ".PACKAGE_ENABLED.");";
 				
-				$app->db->datalogInsert('aps_packages', $insert_data, 'id');
+					$app->db->datalogInsert('aps_packages', $insert_data, 'id');
+				} else {
+					if(file_exists($this->interface_pkg_dir.'/'.$pkg)) $this->removeDirectory($this->interface_pkg_dir.'/'.$pkg);
+				}
             }
         }
         catch(Exception $e)
@@ -555,5 +558,35 @@
             return false;
         }
     }
+	
+	/**
+     * Add missing package URLs to database
+     */
+    public function fixURLs()
+    {
+        global $app;
+        
+        try
+        {
+            // This method must be used in interface mode
+            if(!$this->interface_mode) return false; 
+            
+            $incomplete_pkgs = $app->db->queryAllRecords("SELECT * FROM aps_packages WHERE package_url = ''");
+			if(is_array($incomplete_pkgs) && !empty($incomplete_pkgs)){
+				foreach($incomplete_pkgs as $incomplete_pkg){
+					$pkg_url = @file_get_contents($this->interface_pkg_dir.'/'.$incomplete_pkg['path'].'/PKG_URL');
+					if($pkg_url != ''){
+						$app->db->datalogUpdate('aps_packages', "package_url = '".$pkg_url."'", 'id', $incomplete_pkg['id']);
+					}
+				}
+			}
+        }
+        catch(Exception $e)
+        {
+            $app->log($this->log_prefix.$e->getMessage(), LOGLEVEL_ERROR);
+			$app->error($e->getMessage());
+            return false;
+        }
+    }
 }
 ?>
\ No newline at end of file
diff --git a/interface/web/sites/aps_cron_apscrawler_if.php b/interface/web/sites/aps_cron_apscrawler_if.php
index b34b836..d1e15cc 100644
--- a/interface/web/sites/aps_cron_apscrawler_if.php
+++ b/interface/web/sites/aps_cron_apscrawler_if.php
@@ -28,7 +28,8 @@
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 require_once('../../lib/config.inc.php');
-require_once('../../lib/app.inc.php'); 
+require_once('../../lib/app.inc.php');
+
 //require_once('classes/class.crawler.php');
 $app->load('aps_crawler');
 
@@ -44,6 +45,7 @@
 $time_start = microtime(true);
 $aps->startCrawler();
 $aps->parseFolderToDB();
+$aps->fixURLs();
 $time = microtime(true) - $time_start;
 
 $app->log($log_prefix.'Used mem at end: '.$aps->convertSize(memory_get_usage(true)));
diff --git a/interface/web/sites/aps_update_packagelist.php b/interface/web/sites/aps_update_packagelist.php
new file mode 100644
index 0000000..10de873
--- /dev/null
+++ b/interface/web/sites/aps_update_packagelist.php
@@ -0,0 +1,57 @@
+<?php
+/*
+Copyright (c) 2012, Till Brehm, projektfarm Gmbh, ISPConfig UG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('sites');
+
+$app->uses('tpl');
+
+$app->tpl->newTemplate('form.tpl.htm');
+$app->tpl->setInclude('content_tpl', 'templates/aps_update_packagelist.htm');
+$msg = '';
+$error = '';
+
+//* load language file
+$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_aps_update_packagelist.lng';
+include($lng_file);
+$app->tpl->setVar($wb);
+
+
+
+$app->tpl->setVar('msg',$msg);
+$app->tpl->setVar('error',$error);
+
+$app->tpl_defaults();
+$app->tpl->pparse();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/de_aps_update_packagelist.lng b/interface/web/sites/lib/lang/de_aps_update_packagelist.lng
new file mode 100644
index 0000000..655825b
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_aps_update_packagelist.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['head_txt'] = 'Paketliste aktualisieren';
+$wb['list_desc_txt'] = '';
+$wb['btn_start_txt'] = 'Paketliste aktualisieren';
+$wb['btn_cancel_txt'] = 'Abbrechen';
+$wb['legend_txt'] = 'Hier können Sie die Liste der verfügbaren Pakete aktualisieren. Dies kann bis zu fünf Minuten dauern. Wenn Sie möchten, können Sie diese Seite verlassen; der Prozeß läuft im Hintergrund weiter.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/en_aps_update_packagelist.lng b/interface/web/sites/lib/lang/en_aps_update_packagelist.lng
new file mode 100644
index 0000000..1a40a33
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_aps_update_packagelist.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['head_txt'] = 'Update Packagelist';
+$wb['list_desc_txt'] = '';
+$wb['btn_start_txt'] = 'Update Packagelist';
+$wb['btn_cancel_txt'] = 'Cancel';
+$wb['legend_txt'] = 'Here you can update the list of available packages. Please note that this can take up to five minutes. You can leave this page if you like; the process will continue in the background.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/module.conf.php b/interface/web/sites/lib/module.conf.php
index 982cb90..81d627e 100644
--- a/interface/web/sites/lib/module.conf.php
+++ b/interface/web/sites/lib/module.conf.php
@@ -150,7 +150,7 @@
 {
 $items[] = array(   'title'   => 'Update Packagelist',
                     'target'  => 'content',
-                    'link'    => 'sites/aps_cron_apscrawler_if.php',
+                    'link'    => 'sites/aps_update_packagelist.php',
                     'html_id' => 'aps_packagedetails_show');
 }
 
diff --git a/interface/web/sites/templates/aps_update_packagelist.htm b/interface/web/sites/templates/aps_update_packagelist.htm
new file mode 100644
index 0000000..bd8edfd
--- /dev/null
+++ b/interface/web/sites/templates/aps_update_packagelist.htm
@@ -0,0 +1,20 @@
+<h2><tmpl_var name="head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_language_import">
+  
+    <div class="pnl_formsarea">
+        <fieldset class="inlineLabels"><legend>{tmpl_var name="legend_txt"}</legend>
+            
+            <div class="buttonHolder buttons">
+            <button class="positive iconstxt icoPositive" type="button" value="Update Packagelist" onClick="loadContent('sites/aps_cron_apscrawler_if.php')"><span>{tmpl_var name="btn_start_txt"}</span></button>
+            <button class="negative iconstxt icoNegative" type="button" value="Cancel" onClick="loadContent('sites/aps_availablepackages_list.php');"><span>{tmpl_var name="btn_cancel_txt"}</span></button>
+        </div>
+        </fieldset>
+
+
+
+        
+    </div>
+  
+</div>

--
Gitblit v1.9.1