Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

URL install is here! :) #7

Merged
merged 15 commits into from
Nov 25, 2017
Merged
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
# REDAXO ZIP-Upload AddOn und Plugin Install!
Mit diesem AddOn kannst du gezippte AddOns oder Plugins einfach im Backend hochladen und installieren.
Mit diesem AddOn kannst du gezippte AddOns oder Plugins einfach im Backend oder über die URL zu einer ZIP-Datei hochladen.

![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/zip_install/assets/screen.png)

Benutzung
------------
Das AddOn registriert eine neue Subpage im Installer (neben "Eigene hochladen"). Dort kannst du einfach eine ZIP-Datei eines gültigen AddOns uploaden (wird geprüft). Plugins lassen sich auch installieren. Diese werden automatisch in das richtige AddOn kopiert. (Benennung erfolgt ebenfalls automatisch)
Das AddOn registriert zwei neue Subpages im Installer (neben "Eigene hochladen"). Dort kannst du

* eine ZIP-Datei eines gültigen AddOns uploaden (wird geprüft).
* eine URL zu einer ZIP-Datei eines gültigen AddOns angeben.

Plugins lassen sich auch installieren. Diese werden automatisch in das richtige AddOn kopiert. (Benennung erfolgt ebenfalls automatisch)

Installation
------------
Expand All @@ -31,7 +36,8 @@ Voraussetzungen

Changelog
------------
Bug #1 gefixed
* Bug #1 gefixed
* Version 1.1 URL install

Known Issues
------------
Expand Down
14 changes: 13 additions & 1 deletion lang/de_de.lang
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
# URL
zip_install_url_title = Von URL installieren
zip_install_url = URL zu ZIP-Datei
zip_install_url_choose_info = AddOns und Plugins möglich. Sollte der Ordner bereits existieren, wird dieser überschrieben.<br>Bitte ggf. vor dem Upload ein Backup anlegen.<br><br><strong>Hinweis: Der Ordner wird automatisch auf den Package-Name umbenannt, es muss nichts manuell gemacht werden.</strong>
zip_install_url_file_not_loaded = Fehler beim Herunterladen der Datei.
zip_install_url_no_zip = Die heruntergeladene Datei ist keine ZIP-Datei.
zip_install_url_tmp_not_written = Fehler beim Herunterladen der Datei. Temporäre Datei nicht vorhanden.

# Upload
zip_install_title = ZIP Upload
zip_install_choose_file = Zip-Datei auswählen
zip_install_upload_file = Datei hochladen
zip_install_choose_info = AddOns und Plugins möglich. Sollte der Ordner bereits existieren, wird dieser überschrieben.<br>Bitte ggf. vor dem Upload ein Backup anlegen.<br><br><strong>Hinweis: Der Ordner wird automatisch auf den Package-Name umbenannt, es muss nichts manuell gemacht werden.</strong>
zip_install_upload_failed = Upload fehlgeschlagen.

# General
zip_install_invalid_addon = Das Paket wurde nicht entpackt, da es ungültig war.
zip_install_plugin_parent_missing = Das Plugin konnte nicht installiert werden, da das zugehörige AddOn fehlt!
zip_install_install_succeed = Das AddOn %%addon%% wurde erfolgreich entpackt. <a href="index.php?page=packages">Zu den AddOns</a>
zip_install_plugin_install_succeed = Das Plugin %%plugin%% wurde erfolgreich entpackt. <a href="index.php?page=packages">Zu den AddOns</a>
# Benennung für die Addonrechte, sichtbar innerhalb der REDAXO-Administration unter Benutzer > Rollen > Allgemein

# Benennung für die Addonrechte, sichtbar innerhalb der REDAXO-Administration unter Benutzer > Rollen > Allgemein
perm_general_zip_install[] = Rechte für den Zip-Upload
14 changes: 13 additions & 1 deletion lang/en_gb.lang
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
# URL
zip_install_url_title = Install from URL
zip_install_url = URL of ZIP file
zip_install_url_choose_info = AddOns and PlugIns possible. If the folder already exists it will be overwritten.<br />Please create backups before uploading.<br /><br /><strong>Notice: the folder will automatically be renamed to the package name, no need to alter things manually</strong>
zip_install_url_file_not_loaded = Download failed.
zip_install_url_no_zip = Downloaded file is not a ZIP file.
zip_install_url_tmp_not_written = Download failed. Temporary file not present.

# Upload
zip_install_title = ZIP Upload
zip_install_choose_file = Specify ZIP file
zip_install_upload_file = Upload file
zip_install_choose_info = AddOns and PlugIns possible. If the folder already exists it will be overwritten.<br />Please create backups before uploading.<br /><br /><strong>Notice: the folder will automatically be renamed to the package name, no need to alter things manually</strong>

# General
zip_install_invalid_addon = The package was not unpacked, because it was invalid.
zip_install_plugin_parent_missing = The PlugIn could not be installed, because the corresponding AddOn is missing!
zip_install_install_succeed = The AddOn %%addon%% has successfully been unpacked. <a href="index.php?page=packages">AddOns</a>
zip_install_plugin_install_succeed = The PlugIn %%plugin%% has successfully been unpacked. <a href="index.php?page=packages">AddOns</a>
# Benennung für die Addonrechte, sichtbar innerhalb der REDAXO-Administration unter Benutzer > Rollen > Allgemein
zip_install_upload_failed = Upload failed.

# Benennung für die Addonrechte, sichtbar innerhalb der REDAXO-Administration unter Benutzer > Rollen > Allgemein
perm_general_zip_install[] = Permissions for ZIP Upload
6 changes: 6 additions & 0 deletions lang/pt_br.lang
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
# URL


# Upload
zip_install_title = ZIP Upload
zip_install_choose_file = Especificar arquivo ZIP
zip_install_upload_file = Fazer o upload do arquivo
zip_install_choose_info = AddOns e PlugIns possíveis. Se a pasta já existir, será sobregravada.<br /> Por favor, faça backups antes de realizar o Upload.<br /><br /><strong>Atenção: a pasta será automaticamente renomeada com o nome do package, não há necessidade para fazer uma alteração manual.</strong>

#
zip_install_invalid_addon = O package não foi aberto porque era inválido.
zip_install_plugin_parent_missing = O PlugIn não foi instalado porque o AddOn correspondente está faltando.
zip_install_install_succeed = O AddOn %%addon%% foi corretamente aberto. <a href="index.php?page=packages">AddOns</a>
Expand Down
127 changes: 127 additions & 0 deletions lib/zip_install.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<?php
/**
* zip_install Addon.
*
* @author Friends Of REDAXO
*
* @var rex_addon
*/

use Alchemy\Zippy\Zippy;


class zip_install {
protected static function installZip($tmp_file) {
$error = false;
$isPlugin = false;
$foldername = '';
$packageFile = false;
$zippy = Zippy::load();

try {
$archive = $zippy->open($tmp_file);

$i = 1;
foreach ($archive as $member) {
if(!$member->isDir() && $i == 1)
{
$error = true;
break;
}
else if($member->isDir() && $i == 1)
{
$foldername = $member->getLocation();
}

// search for first package.yml
if(strpos($member->getLocation(), 'package.yml') && !$packageFile)
{
$packageFile = $member->getLocation();
}

$i++;
}

if($packageFile && !$error)
{
// extract into tmp folder
$archive->extract(rex_path::addon('zip_install','tmp'));

// delete garbage
rex_dir::delete(rex_path::addon('zip_install','tmp/__MACOSX'));
rex_dir::delete(rex_path::addon('zip_install','tmp/.git'));
rex_dir::delete(rex_path::addon('zip_install','tmp/.gitignore'));
rex_dir::delete(rex_path::addon('zip_install','tmp/thumbs.db'));


$config = rex_file::getConfig(rex_path::addon('zip_install','tmp/'.$foldername).'package.yml');
if($config['package'])
{
$pluginCheck = explode('/', $config['package']);

if(count($pluginCheck) > 1) {
$isPlugin = true;
// check if parent exists
if(rex_dir::isWritable(rex_path::addon($pluginCheck[0])))
{
// its a plugin, it should have a parent
if(!rex_dir::copy(rex_path::addon('zip_install','tmp/'.$foldername), rex_path::addon($pluginCheck[0], 'plugins/'.$pluginCheck[1])))
{
$error = true;
}
}
else
{
$parentIsMissing = true;
$error = true;
}

}
else
{
// its an addon
// copy over, no matter what!
if(!rex_dir::copy(rex_path::addon('zip_install','tmp/'.$foldername), rex_path::addon($config['package'])))
{
$error = true;
}
}


rex_dir::delete(rex_path::addon('zip_install','tmp/'.$foldername));
}

}
else
{
$error = true;
}

} catch (Exception $e) {}

// delete tmp uploaded zip-file
@unlink($tmp_file);

if (!$error)
{
if($isPlugin)
{
echo rex_view::info(str_replace('%%plugin%%', $config['package'], rex_i18n::rawMsg('zip_install_plugin_install_succeed')));
}
else
{
echo rex_view::info(str_replace('%%addon%%', $config['package'], rex_i18n::rawMsg('zip_install_install_succeed')));
}
}
else
{
echo rex_view::warning(rex_i18n::rawMsg('zip_install_invalid_addon'));
if($parentIsMissing)
{
echo rex_view::warning(rex_i18n::rawMsg('zip_install_plugin_parent_missing'));
}

}
}

}
117 changes: 5 additions & 112 deletions lib/zip_upload.php
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
<?php
/**
* media_manager_autorewrite Addon.
* zip_install Addon.
*
* @author Friends Of REDAXO
*
* @var rex_addon
*/

use Alchemy\Zippy\Zippy;

class zip_upload
class zip_upload extends zip_install
{
public static function validateAndExtractUpload()
{
if (!empty($_FILES['file']))
{
$error = true;
$tmp_path = rex_path::addon('zip_install');
$parentIsMissing = false;

Expand All @@ -30,118 +28,13 @@ public static function validateAndExtractUpload()
// check if upload status was successful
if ($results['status'] === true)
{
$error = false;
$isPlugin = false;
$foldername = '';
$packageFile = false;
$zippy = Zippy::load();

try {
$archive = $zippy->open($results['full_path']);

$i = 1;
foreach ($archive as $member) {
if(!$member->isDir() && $i == 1)
{
$error = true;
break;
}
else if($member->isDir() && $i == 1)
{
$foldername = $member->getLocation();
}

// search for first package.yml
if(strpos($member->getLocation(), 'package.yml') && !$packageFile)
{
$packageFile = $member->getLocation();
}

$i++;
}

if($packageFile && !$error)
{
// extract into tmp folder
$archive->extract(rex_path::addon('zip_install','tmp'));

// delete garbage
rex_dir::delete(rex_path::addon('zip_install','tmp/__MACOSX'));
rex_dir::delete(rex_path::addon('zip_install','tmp/.git'));
rex_dir::delete(rex_path::addon('zip_install','tmp/.gitignore'));
rex_dir::delete(rex_path::addon('zip_install','tmp/thumbs.db'));


$config = rex_file::getConfig(rex_path::addon('zip_install','tmp/'.$foldername).'package.yml');
if($config['package'])
{
$pluginCheck = explode('/', $config['package']);

if(count($pluginCheck) > 1) {
$isPlugin = true;
// check if parent exists
if(rex_dir::isWritable(rex_path::addon($pluginCheck[0])))
{
// its a plugin, it should have a parent
if(!rex_dir::copy(rex_path::addon('zip_install','tmp/'.$foldername), rex_path::addon($pluginCheck[0], 'plugins/'.$pluginCheck[1])))
{
$error = true;
}
}
else
{
$parentIsMissing = true;
$error = true;
}

}
else
{
// its an addon
// copy over, no matter what!
if(!rex_dir::copy(rex_path::addon('zip_install','tmp/'.$foldername), rex_path::addon($config['package'])))
{
$error = true;
}
}


rex_dir::delete(rex_path::addon('zip_install','tmp/'.$foldername));
}

}
else
{
$error = true;
}

} catch (Exception $e) {}

// delete tmp uploaded zip-file
@unlink($results['full_path']);
self::installZip($results['full_path']);
}


if (!$error)
else
{
if($isPlugin)
{
echo rex_view::info(str_replace('%%plugin%%', $config['package'], rex_i18n::rawMsg('zip_install_plugin_install_succeed')));
}
else
{
echo rex_view::info(str_replace('%%addon%%', $config['package'], rex_i18n::rawMsg('zip_install_install_succeed')));
}
echo rex_view::warning(rex_i18n::rawMsg('zip_install_upload_failed'));
}
else
{
echo rex_view::warning(rex_i18n::rawMsg('zip_install_invalid_addon'));
if($parentIsMissing)
{
echo rex_view::warning(rex_i18n::rawMsg('zip_install_plugin_parent_missing'));
}

}
}
}

Expand Down
Loading