298 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/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;
 | 
						|
}
 | 
						|
 | 
						|
 |