discourse-legacysite-perl/site/slowtwitch.com/cgi-bin/articles/admin/admin.cgi

298 lines
8.8 KiB
Plaintext
Raw Normal View History

2024-06-17 11:49:12 +00:00
#!/usr/local/bin/perl
# ==================================================================
# Gossamer Links - enhanced directory management system
#
# Website : http://gossamer-threads.com/
# Support : http://gossamer-threads.com/scripts/support/
# CVS Info : 087,071,086,086,085
# Revision : $Id: admin.cgi,v 1.94 2009/05/12 01:09:13 brewt Exp $
#
# Copyright (c) 2005 Gossamer Threads Inc. All Rights Reserved.
# Redistribution in part or in whole strictly prohibited. Please
# see LICENSE file for full details.
# ==================================================================
use strict;
use lib '/var/home/slowtwitch/slowtwitch.com/cgi-bin/articles/admin';
use Links qw/:objects/;
$| = 1;
local $SIG{__DIE__} = \&Links::fatal;
Links::init('/var/home/slowtwitch/slowtwitch.com/cgi-bin/articles/admin');
Links::init_admin();
main();
sub main {
# ------------------------------------------------------------------
# Main admin loop, displays html pages and other admin tasks.
#
if (! $CFG->{setup}) {
$IN->param('do', 'page');
$IN->param('page', 'setup_first.html');
}
my $do = $IN->param('do') || '';
my $action = $IN->param('action') || '';
# Default to home page.
unless ($do or $action) {
if ($IN->param('page')) {
$do = 'page';
}
else {
$IN->param('page', 'home.html');
$do = 'page';
}
}
# Otherwise, try some common cases.
CASE: {
($do eq 'page') and Links::admin_page(), last CASE;
($do eq 'help') and help(), last CASE;
($do eq 'plugin') and plugin(), last CASE;
($do eq 'fileman') and fileman(), last CASE;
($do eq 'fileman_diff') and fileman_diff(), last CASE;
# Database Browser
$do and db_request() and last CASE;
# Category Browser.
$action and brow_request() and last CASE;
# Mass Mailer
$action and mailer_request() and last CASE;
# Invalid method.
die "Invalid Request: '$do' '$action'";
}
}
sub db_request {
# ------------------------------------------------------------------
# Handles a GT::SQL::Admin request.
#
require Links::Admin;
my $admin = new Links::Admin;
if ($admin->for_me($IN)) {
$admin->debug_level( $CFG->{debug_level} );
$admin->process ( db => $DB, cgi => $IN );
return 1;
}
else {
return;
}
}
sub brow_request {
# ------------------------------------------------------------------
# Handle the browser request.
#
$IN->delete('anticache');
# Get a controller to manage access.
require Links::Browser;
my $crtl = new Links::Browser::Controller;
# Load the tree if it is under 200 categories.
$crtl->{load_tree} = 1;
$crtl->{admin} = 1;
$crtl->{admin_templates} = 1;
# Begin the script.
my $method = $crtl->can_run;
if ($method) {
my $browser = new Links::Browser(ctrl => $crtl);
$PLG->dispatch("browser_$method", sub { $browser->$method(); }, $browser);
return 1;
}
else {
return;
}
}
sub mailer_request {
# ------------------------------------------------------------------
# Determine if this is for the Links::MassMailer.
#
require Links::MassMailer;
my $action;
my @actions = $IN->param('action');
if (@actions > 1) {
@actions = grep ! /^(?:Send|selected_(?:users|links)_send)$/, @actions;
}
$action = $actions[0];
$action = "SaveAs" if $action eq "Save as..."; # No spaces or .'s allowed in subroutine names!
if (exists $ACTIONS::{$action} and ref *{$ACTIONS::{$action}}{CODE} eq 'CODE') {
*{$ACTIONS::{$action}}{CODE}->();
return 1;
}
else {
return;
}
}
sub help {
# ------------------------------------------------------------------
# Print the help pages.
#
my $help_path = "$CFG->{admin_root_path}/templates/admin/help";
my $topic = $IN->param('topic');
if (! $topic) {
my $url = $IN->param('topic_url');
my ($do) = $url =~ /do=([^&]+)/;
my ($page) = $url =~ /page=([^&]+)/;
my ($cgi) = $url =~ /([^\/]+)\.cgi/;
if ($do and $do eq 'plugin') {
my ($plugin) = $url =~ /plugin=([^&]+)/;
my ($func) = $url =~ /func=([^&]+)/;
if ($topic = _plugin_help($plugin, $func)) {
$help_path .= "/$plugin";
}
}
else {
$topic = _parse_topic($page || '');
$topic ||= _parse_topic($do || '');
$topic ||= _parse_topic($cgi || '');
}
}
$topic ||= 'help_toc.html';
$topic =~ s,^/|/$,,;
# Check the topic file.
unless ($topic =~ /^[\w\/]+\.[\w]+$/) {
die "Invalid topic: $topic";
}
if ($topic =~ /\.(gif|jpg)$/ and -e "$help_path/$topic") {
print $IN->header("image/$1");
open IMG, "< $help_path/$topic" or die "Unable to open image help: $help_path/$topic ($!)";
binmode IMG;
binmode STDOUT;
while (read (IMG, my $buffer, 65356)) {
print $buffer;
}
close IMG;
}
else {
print $IN->header;
GT::Template->parse($topic, $IN, { root => $help_path, print => 1 });
}
}
sub plugin {
# ------------------------------------------------------------------
# Run a plugin function.
#
my $plugin = $IN->param('plugin');
if ($IN->param('download') and ($plugin =~ /^[\w\-]+$/)) {
my $path = "$CFG->{admin_root_path}/Plugins/Uninstalled/$plugin.tar";
-e $path or die "No plugin ($path) found.";
open FH, $path or die "Could not open $path for reading";
print $IN->header($IN->file_headers(
filename => "$plugin.tar",
mimetype => 'application/x-tar',
inline => 0,
size => -s $path
));
print while <FH>;
close FH;
return 1;
}
my $func = $IN->param('func');
{
eval { require "Plugins/$plugin.pm"; };
if ($@) {
die "Unable to load plugin: $plugin ($@)";
}
}
no strict 'refs';
my $code = ${"Plugins::" . $plugin . "::"}{$func};
use strict 'refs';
if (!defined $code) {
die "Invalid plugin function: $func";
}
$code->();
}
sub fileman {
# ------------------------------------------------------------------
# Load our file manager.
#
require GT::FileMan;
my $fileman = GT::FileMan->new(
cfg => {
template_root => "$CFG->{admin_root_path}/templates/admin/fileman",
tmp_path => "$CFG->{admin_root_path}/tmp",
root_path => $CFG->{fileman_root_dir} || $CFG->{admin_root_path},
cgi_url => "$CFG->{admin_root_url}/admin.cgi",
static_url => "$CFG->{build_static_url}/fileman",
debug_level => $CFG->{debug_level},
},
url_opts => 'do=fileman'
);
$fileman->process;
}
sub fileman_diff {
# ------------------------------------------------------------------
# Load fileman, but just for the purposes of displaying a diff.
#
my $template = $IN->param('template');
my $file = $IN->param('file');
require GT::FileMan::Diff;
my $diff = GT::FileMan::Diff::html_diff("$CFG->{admin_root_path}/templates/$template/$file", "$CFG->{admin_root_path}/templates/$template/local/$file", 3);
print $IN->header();
print '<html><title>' . $IN->html_escape($template) . ' template diffs: ' . $IN->html_escape($file) . '</title><body>';
if (ref $diff) {
print $$diff;
}
else {
print "File(s) not found.";
}
print '</body></html>';
}
sub _parse_topic {
# ------------------------------------------------------------------
# Takes a keyword and tries to find a help page for it.
#
local $_ = shift;
CASE: {
/browse/ and return 'help_browse.html';
/build/ and return 'help_build.html';
/email/ and return 'help_email.html';
/mailer/ and return 'help_email.html';
/payment/ and return 'help_payments.html';
/plugin_editor/ and return 'help_plugin_guide.html';
/plugin_list/ and return 'help_plugin_manager.html';
/plugin/ and return 'help_plugins.html';
/db/ and return 'help_database.html';
}
return;
}
sub _plugin_help {
# ------------------------------------------------------------------
my ( $plugin, $func ) = @_;
my $help_path = "$CFG->{admin_root_path}/templates/help/$plugin";
-e $help_path or return;
if ( -e "$help_path/$func.html" ) {
return "$func.html";
}
elsif ( -e "$help_path/help.html" ) {
return "help.html";
}
return;
}