#!/bin/sh
eval 'if [ -x /usr/local/cpanel/3rdparty/bin/perl ]; then exec /usr/local/cpanel/3rdparty/bin/perl -x -- $0 ${1+"$@"}; else exec /usr/bin/perl -x $0 ${1+"$@"}; fi;'
  if 0;

#!/usr/bin/perl
#WHMADDON:addonupdates:Addon Script Manager
# cpanel - addon_addonupdates.cgi                 Copyright(c) 2011 cPanel, Inc.
#                                                           All rights Reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cpanel license. Unauthorized copying is prohibited

BEGIN {
    unshift @INC, '/usr/local/cpanel', '/usr/local/cpanel/whostmgr/docroot/cgi';
}

use whmlib;
use Cpanel::PwCache qw(pwcheckos getpwent endpwent);
use Sys::Hostname qw(hostname);
use Cpanel;
use Cpanel::Carp;
Cpanel::PwCache::pwcheckos();

require 'parseform.pl';

our %ACL;

my %FORM = parseform();

print "Content-type: text/html\r\n\r\n";

defheader("Addon Script Manager");

my $hasaddons = 0;
eval {
    use Cpanel::Addons;
    $hasaddons = 1;
};

if ( !$hasaddons ) {
    print "Sorry, you need a newer version of cPanel to use this module.";
    exit();
}

my $adc     = 0;
my $tdshade = 'tdshade1';
if ( $FORM{'action'} eq "" ) {
    my (%ADDONCONFIG) = Cpanel::Addons::loadaddondata();
    print "<table>";
    print "<tr class=scellheader>
      <td><b>Script</b></td>
      <td><b>Installer Version</b></td>
      <td><b></b></td>
      <td><b></b></td>
      </tr>";

    my (%OUTDATED);

    if ( $FORM{show} eq "outdated" ) {
        foreach my $addon ( keys %ADDONCONFIG ) {
            $OUTDATED{$addon} = 0;
            while ( my @PW = Cpanel::PwCache::getpwent() ) {
                next if ( !-e "/var/cpanel/users/$PW[0]" );
                if ( !$ACL{all} && !checkowner( $ENV{REMOTE_USER}, $PW[0] ) ) { next(); }
                if ( -e "$PW[7]/.addonscgi-${addon}" ) {
                    open( AF, "<", "$PW[7]/.addonscgi-${addon}" );
                    while (<AF>) {
                        chomp();
                        my ( $name, $version );
                        ( $name, undef, $version ) = split( / /, $_ );
                        if ( $version eq "" ) { $version = 'unknown'; }
                        next if ( $name eq "" );
                        next if ( !-d "$PW[7]/public_html/${name}" );

                        if ( $ADDONCONFIG{$addon}{'current-version'} ne $version ) {
                            $OUTDATED{$addon} = 1;
                            last;
                        }
                    }
                    close(AF);
                    if ( $OUTDATED{$addon} ) { last(); }
                }
            }
            Cpanel::PwCache::endpwent();
        }
    }
    foreach my $addon ( sort keys %ADDONCONFIG ) {
        $adc++;
        if   ( $adc % 2 == 0 ) { $tdshade = 'tdshade1' }
        else                   { $tdshade = 'tdshade2'; }
        if ( $OUTDATED{$addon} ) { $tdshade = 'tdshadered'; }
        print "<tr class=${tdshade}>";
        print "<td>$addon</td><td>$ADDONCONFIG{$addon}{'current-version'}</td>";
        print "<td><form action=addon_addonupdates.cgi><input type=hidden name=action value=find><input type=hidden name=addon value=${addon}><input type=submit value=\"Find Installed\" class=submit></form></td>";
        print "<td><form action=addon_addonupdates.cgi><input type=hidden name=action value=update><input type=hidden name=what value=all><input type=hidden name=addon value=${addon}><input type=submit value=\"Update All Installs\" class=submit></form></td>";
        print "</tr>\n";
    }
    print "</table>";
    if ( $FORM{show} ne "outdated" ) {
        print "<form action=addon_addonupdates.cgi><input type=hidden name=show value=outdated><input type=submit value=\"Highlight Packages that have outdated installations (may take a few minutes)\" class=submit></form>";
    }
    else {
        print "Addons which have outdated installations have been highlighted in red\n";
    }
}
elsif ( $FORM{'action'} eq 'update' ) {
    my $user  = ( getpwnam( $FORM{user} ) )[0];
    my $what  = $FORM{what};
    my $addon = $FORM{addon};
    $what =~ s/\</&lt;/g;
    $what =~ s/\>/&gt;/g;
    if ( !-f "/usr/local/cpanel/addons/${addon}/cpanel-pkg" ) {
        $addon = '';
    }
    print "<h1>Updating ${addon} ";
    if ( $FORM{confirm} ne "1" ) {
        if ( $what eq "all" ) {
            print "for all users.<br>";
        }
        else {
            print "for ${user} located at /${what}.";
        }
        print "</h1>\n";
        print "Warning: Updating an addon will overwrite all custom modifications done to the addon source code.\n";
        print "<table><tr><td align=center>";
        print "<form action=addon_addonupdates.cgi><input type=submit value=\"Stop\" class=submit></form>";
        print "</td><td align=center>";
        print "<form action=addon_addonupdates.cgi><input type=hidden name=action value=update>
         <input type=hidden name=confirm value=\"1\">
         <input type=hidden name=user value=\"${user}\">
         <input type=hidden name=what value=${what}>
         <input type=hidden name=addon value=${addon}>
         <input type=submit value=\"Update\" class=submit></form>";
        print "</td></tr></table>";
    }
    else {
        print "</h1>\n";
        if ( $what eq "all" ) {
            my (%ADDONCONFIG) = Cpanel::Addons::loadaddondata();
            while ( my @PW = Cpanel::PwCache::getpwent() ) {
                next if ( !-e "/var/cpanel/users/$PW[0]" );
                if ( !$ACL{all} && !checkowner( $ENV{REMOTE_USER}, $PW[0] ) ) { next(); }
                if ( -e "$PW[7]/.addonscgi-${addon}" ) {
                    my $user = $PW[0];
                    open( AF, "<", "$PW[7]/.addonscgi-${addon}" );
                    while (<AF>) {
                        chomp();
                        my ( $name, $version );
                        ( $name, undef, $version ) = split( / /, $_ );
                        if ( $version eq "" ) { $version = 'unknown'; }
                        next if ( $name eq "" );
                        next if ( !-d "$PW[7]/public_html/${name}" );

                        if ( $ADDONCONFIG{$addon}{'current-version'} ne $version ) {
                            if ( my $upid = fork() ) {
                                waitpid( $upid, 0 );
                            }
                            else {
                                print "Processing $name for user ${user}!";
                                print "<blockquote><table border=1><tr><td>";
                                set_uids($user);
                                my ($cp) = Cpanel->new;
                                $cp->initcp($user);
                                installpage( $addon, $name, undef, undef, 1 );
                                print "</td></tr></table></blockquote><br>";
                                exit();
                            }
                        }
                    }
                    close(AF);
                }
            }
            Cpanel::PwCache::endpwent();
        }
        else {
            if ( !$ACL{all} && !checkowner( $ENV{REMOTE_USER}, $user ) ) {
                print "Sorry, you do not have access to update this user's account.";
                exit();
            }
            if ( my $upid = fork() ) {
                waitpid( $upid, 0 );
            }
            else {
                print "Processing $what for user ${user}!";
                print "<blockquote><table border=1><tr><td>";
                set_uids($user);
                my ($cp) = Cpanel->new;
                $cp->initcp($user);
                installpage( $addon, $what, undef, undef, 1 );
                print "</td></tr></table></blockquote><br>";
                exit();
            }
        }
        print "<h1><b><form action=addon_addonupdates.cgi>All Updates are Complete: <input type=submit value=\"Return\" class=submit></form></b></h1>";
    }

}
elsif ( $FORM{'action'} eq 'find' ) {
    my $addon = $FORM{addon};
    my (%ADDONCONFIG) = Cpanel::Addons::loadaddondata();

    if ( !-f "/usr/local/cpanel/addons/${addon}/cpanel-pkg" ) {
        print "Sorry, you did not specify a valid addon package!\n";
        exit();
    }

    my (%USERS) = loaduserdnslist();

    my $adc = 0;

    print "<h1>${addon} Installations</h1>";
    print "<h2>Installer Version: $ADDONCONFIG{$addon}{'current-version'}</h2>";
    print "<table>";
    print "<tr class=scellheader>
      <td><b>Installtion Location</b></td>
      <td><b>Installed Version</b></td>
      <td><b></b></td>
      </tr>";

    while ( my @PW = Cpanel::PwCache::getpwent() ) {
        next if ( !-e "/var/cpanel/users/$PW[0]" );
        if ( !$ACL{all} && !checkowner( $ENV{REMOTE_USER}, $PW[0] ) ) { next(); }
        if ( -e "$PW[7]/.addonscgi-${addon}" ) {
            open( AF, "<", "$PW[7]/.addonscgi-${addon}" );
            while (<AF>) {
                chomp();
                my ( $name, $version );
                ( $name, undef, $version ) = split( / /, $_ );
                if ( $version eq "" ) { $version = 'unknown'; }
                next if ( $name eq "" );
                next if ( !-d "$PW[7]/public_html/${name}" );

                $adc++;
                if   ( $adc % 2 == 0 ) { $tdshade = 'tdshade1' }
                else                   { $tdshade = 'tdshade2'; }

                print "<tr class=${tdshade}>\n";
                print "<td><a href=\"http://www\.$USERS{$PW[0]}/${name}\" target=_blank>$USERS{$PW[0]}:/${name}</a></td>";
                print "<td>${version}</td>";
                if ( $ADDONCONFIG{$addon}{'current-version'} ne $version ) {
                    print "<td><form action=addon_addonupdates.cgi><input type=hidden name=action value=update><input type=hidden name=user value=\"$PW[0]\"><input type=hidden name=what value=${name}><input type=hidden name=addon value=${addon}><input type=submit value=\"Update\" class=submit></form></td>";
                }
                else {
                    print "<td align=center>up to date</td>";
                }
                print "</tr>";

            }
            close(AF);
        }
    }
    Cpanel::PwCache::endpwent();
    print "</table>";
}

sub loaduserdnslist {
    my ($all) = @_;
    my (%USERS);
    open( TUD, "/etc/trueuserdomains" );
    while (<TUD>) {
        chomp();
        my ( $domain, $user ) = split( /: /, $_ );
        $USERS{$user} = $domain;
    }
    close(TUD);
    return (%USERS);
}

sub set_uids {
    my ($user) = $_[0];
    my ( $uid, $gid );
    if ( $user !~ /^\d+$/ ) {
        ( undef, undef, $uid, $gid ) = getpwnam($user);
    }
    else {
        $uid = $user;
        $gid = ( getpwuid($uid) )[3];
    }
    if ( !( $( = int($gid) ) ) {
        print "error setting gid\n";
        exit;
    }

    if ( !( $) = "$gid $gid" ) ) {
        print "error setting gid\n";
        exit;
    }
    if ( !( ( $< = $uid ) && ( $> = $uid ) ) ) {
        print "error setting uid ($uid) [$user]\n";
        exit;
    }
    return $<;
}

sub hasfeature {
    return (1);
}
1;
