aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs/Module/Admin
diff options
context:
space:
mode:
Diffstat (limited to 'Zotlabs/Module/Admin')
-rw-r--r--Zotlabs/Module/Admin/Plugins.php238
1 files changed, 237 insertions, 1 deletions
diff --git a/Zotlabs/Module/Admin/Plugins.php b/Zotlabs/Module/Admin/Plugins.php
index 38e413680..a8e5eea50 100644
--- a/Zotlabs/Module/Admin/Plugins.php
+++ b/Zotlabs/Module/Admin/Plugins.php
@@ -5,6 +5,242 @@ namespace Zotlabs\Module\Admin;
class Plugins {
+
+ function post() {
+
+ if(argc() > 2 && is_file("addon/" . argv(2) . "/" . argv(2) . ".php")) {
+ @include_once("addon/" . argv(2) . "/" . argv(2) . ".php");
+ if(function_exists(argv(2).'_plugin_admin_post')) {
+ $func = argv(2) . '_plugin_admin_post';
+ $func($a);
+ }
+
+ goaway(z_root() . '/admin/plugins/' . argv(2) );
+
+ }
+ elseif(argc() > 2) {
+ switch(argv(2)) {
+ case 'updaterepo':
+ if (array_key_exists('repoName', $_REQUEST)) {
+ $repoName = $_REQUEST['repoName'];
+ }
+ else {
+ json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
+ }
+ $extendDir = 'store/[data]/git/sys/extend';
+ $addonDir = $extendDir . '/addon';
+ if (!file_exists($extendDir)) {
+ if (!mkdir($extendDir, 0770, true)) {
+ logger('Error creating extend folder: ' . $extendDir);
+ json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
+ }
+ else {
+ if (!symlink('extend/addon', $addonDir)) {
+ logger('Error creating symlink to addon folder: ' . $addonDir);
+ json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
+ }
+ }
+ }
+ $repoDir = 'store/[data]/git/sys/extend/addon/' . $repoName;
+ if (!is_dir($repoDir)) {
+ logger('Repo directory does not exist: ' . $repoDir);
+ json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
+ }
+ if (!is_writable($repoDir)) {
+ logger('Repo directory not writable to web server: ' . $repoDir);
+ json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false));
+ }
+ $git = new GitRepo('sys', null, false, $repoName, $repoDir);
+ try {
+ if ($git->pull()) {
+ $files = array_diff(scandir($repoDir), array('.', '..'));
+ foreach ($files as $file) {
+ if (is_dir($repoDir . '/' . $file) && $file !== '.git') {
+ $source = 'extend/addon/' . $repoName . '/' . $file;
+ $target = realpath('addon/') . '/' . $file;
+ unlink($target);
+ if (!symlink($source, $target)) {
+ logger('Error linking addons to /addon');
+ json_return_and_die(array('message' => 'Error linking addons to /addon', 'success' => false));
+ }
+ }
+ }
+ json_return_and_die(array('message' => 'Repo updated.', 'success' => true));
+ } else {
+ json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false));
+ }
+ } catch (\PHPGit\Exception\GitException $e) {
+ json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false));
+ }
+ case 'removerepo':
+ if (array_key_exists('repoName', $_REQUEST)) {
+ $repoName = $_REQUEST['repoName'];
+ } else {
+ json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
+ }
+ $extendDir = 'store/[data]/git/sys/extend';
+ $addonDir = $extendDir . '/addon';
+ if (!file_exists($extendDir)) {
+ if (!mkdir($extendDir, 0770, true)) {
+ logger('Error creating extend folder: ' . $extendDir);
+ json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
+ } else {
+ if (!symlink('extend/addon', $addonDir)) {
+ logger('Error creating symlink to addon folder: ' . $addonDir);
+ json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
+ }
+ }
+ }
+ $repoDir = 'store/[data]/git/sys/extend/addon/' . $repoName;
+ if (!is_dir($repoDir)) {
+ logger('Repo directory does not exist: ' . $repoDir);
+ json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
+ }
+ if (!is_writable($repoDir)) {
+ logger('Repo directory not writable to web server: ' . $repoDir);
+ json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false));
+ }
+ // TODO: remove directory and unlink /addon/files
+ if (rrmdir($repoDir)) {
+ json_return_and_die(array('message' => 'Repo deleted.', 'success' => true));
+ } else {
+ json_return_and_die(array('message' => 'Error deleting addon repo.', 'success' => false));
+ }
+ case 'installrepo':
+ require_once('library/markdown.php');
+ if (array_key_exists('repoURL', $_REQUEST)) {
+ require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
+ $repoURL = $_REQUEST['repoURL'];
+ $extendDir = 'store/[data]/git/sys/extend';
+ $addonDir = $extendDir . '/addon';
+ if (!file_exists($extendDir)) {
+ if (!mkdir($extendDir, 0770, true)) {
+ logger('Error creating extend folder: ' . $extendDir);
+ json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
+ } else {
+ if (!symlink('extend/addon', $addonDir)) {
+ logger('Error creating symlink to addon folder: ' . $addonDir);
+ json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
+ }
+ }
+ }
+ if (!is_writable($extendDir)) {
+ logger('Directory not writable to web server: ' . $extendDir);
+ json_return_and_die(array('message' => 'Directory not writable to web server.', 'success' => false));
+ }
+ $repoName = null;
+ if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') {
+ $repoName = $_REQUEST['repoName'];
+ } else {
+ $repoName = GitRepo::getRepoNameFromURL($repoURL);
+ }
+ if (!$repoName) {
+ logger('Invalid git repo');
+ json_return_and_die(array('message' => 'Invalid git repo', 'success' => false));
+ }
+ $repoDir = $addonDir . '/' . $repoName;
+ $tempRepoBaseDir = 'store/[data]/git/sys/temp/';
+ $tempAddonDir = $tempRepoBaseDir . $repoName;
+
+ if (!is_writable($addonDir) || !is_writable($tempAddonDir)) {
+ logger('Temp repo directory or /extend/addon not writable to web server: ' . $tempAddonDir);
+ json_return_and_die(array('message' => 'Temp repo directory not writable to web server.', 'success' => false));
+ }
+ rename($tempAddonDir, $repoDir);
+
+ if (!is_writable(realpath('addon/'))) {
+ logger('/addon directory not writable to web server: ' . $tempAddonDir);
+ json_return_and_die(array('message' => '/addon directory not writable to web server.', 'success' => false));
+ }
+ $files = array_diff(scandir($repoDir), array('.', '..'));
+ foreach ($files as $file) {
+ if (is_dir($repoDir . '/' . $file) && $file !== '.git') {
+ $source = 'extend/addon/' . $repoName . '/' . $file;
+ $target = realpath('addon/') . '/' . $file;
+ unlink($target);
+ if (!symlink($source, $target)) {
+ logger('Error linking addons to /addon');
+ json_return_and_die(array('message' => 'Error linking addons to /addon', 'success' => false));
+ }
+ }
+ }
+ $git = new GitRepo('sys', $repoURL, false, $repoName, $repoDir);
+ $repo = $git->probeRepo();
+ json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true));
+ }
+ case 'addrepo':
+ require_once('library/markdown.php');
+ if (array_key_exists('repoURL', $_REQUEST)) {
+ require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
+ $repoURL = $_REQUEST['repoURL'];
+ $extendDir = 'store/[data]/git/sys/extend';
+ $addonDir = $extendDir . '/addon';
+ $tempAddonDir = 'store/[data]/git/sys/temp';
+ if (!file_exists($extendDir)) {
+ if (!mkdir($extendDir, 0770, true)) {
+ logger('Error creating extend folder: ' . $extendDir);
+ json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
+ } else {
+ if (!symlink('extend/addon', $addonDir)) {
+ logger('Error creating symlink to addon folder: ' . $addonDir);
+ json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
+ }
+ }
+ }
+ if (!is_dir($tempAddonDir)) {
+ if (!mkdir($tempAddonDir, 0770, true)) {
+ logger('Error creating temp plugin repo folder: ' . $tempAddonDir);
+ json_return_and_die(array('message' => 'Error creating temp plugin repo folder: ' . $tempAddonDir, 'success' => false));
+ }
+ }
+ $repoName = null;
+ if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') {
+ $repoName = $_REQUEST['repoName'];
+ } else {
+ $repoName = GitRepo::getRepoNameFromURL($repoURL);
+ }
+ if (!$repoName) {
+ logger('Invalid git repo');
+ json_return_and_die(array('message' => 'Invalid git repo: ' . $repoName, 'success' => false));
+ }
+ $repoDir = $tempAddonDir . '/' . $repoName;
+ if (!is_writable($tempAddonDir)) {
+ logger('Temporary directory for new addon repo is not writable to web server: ' . $tempAddonDir);
+ json_return_and_die(array('message' => 'Temporary directory for new addon repo is not writable to web server.', 'success' => false));
+ }
+ // clone the repo if new automatically
+ $git = new GitRepo('sys', $repoURL, true, $repoName, $repoDir);
+
+ $remotes = $git->git->remote();
+ $fetchURL = $remotes['origin']['fetch'];
+ if ($fetchURL !== $git->url) {
+ if (rrmdir($repoDir)) {
+ $git = new GitRepo('sys', $repoURL, true, $repoName, $repoDir);
+ } else {
+ json_return_and_die(array('message' => 'Error deleting existing addon repo.', 'success' => false));
+ }
+ }
+ $repo = $git->probeRepo();
+ $repo['readme'] = $repo['manifest'] = null;
+ foreach ($git->git->tree('master') as $object) {
+ if ($object['type'] == 'blob' && (strtolower($object['file']) === 'readme.md' || strtolower($object['file']) === 'readme')) {
+ $repo['readme'] = Markdown($git->git->cat->blob($object['hash']));
+ } else if ($object['type'] == 'blob' && strtolower($object['file']) === 'manifest.json') {
+ $repo['manifest'] = $git->git->cat->blob($object['hash']);
+ }
+ }
+ json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true));
+ } else {
+ json_return_and_die(array('message' => 'No repo URL provided', 'success' => false));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+
function get() {
/*
@@ -211,7 +447,7 @@ class Plugins {
function listAddonRepos() {
$addonrepos = [];
- $addonDir = __DIR__ . '/../../extend/addon/';
+ $addonDir = 'extend/addon/';
if(is_dir($addonDir)) {
if ($handle = opendir($addonDir)) {
while (false !== ($entry = readdir($handle))) {