HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: /var/www/html/shootinschool/wp-content/plugins/fooevents/classes/themehelper.php
<?php if ( ! defined( 'ABSPATH' ) ) exit;
class FooEvents_Theme_Helper {
    
    public $Config;
    public $MailHelper;
    private $BarcodeHelper;
 
    public function __construct($Config) {
        
        $this->Config = $Config;
        add_action( 'admin_menu',  array( $this, 'add_menu_item' ));
        
        //MailHelper
        require_once($this->Config->classPath.'mailhelper.php');
        $this->MailHelper = new FooEvents_Mail_Helper($this->Config);

    }
    
    /**
     * Add admin ticket themes menu item
     * 
     */
    public function add_menu_item() {
        
        add_submenu_page( 'edit.php?post_type=event_magic_tickets', 'Ticket Themes', 'Ticket Themes', 'edit_posts', 'fooevents-ticket-themes', array( $this, 'display_page' ) );

    }
    
    /**
     * Display ticket themes page
     * 
     */
    public function display_page() {

        if(!empty($_POST['fooevents-theme-viewer-preview-input'])) {
            
            $this->send_preview($_POST);
            
        }
        
        if(!empty($_FILES['fooevents-theme-viewer-upload-file'])) {
            
            $this->upload_themes($_FILES);
            
        }
        
        $themes = $this->get_ticket_themes();
        
        $user = wp_get_current_user();
        $user_email = $user->user_email;
        
        include($this->Config->templatePath.'ticketthemesviewer.php'); 
        
    }
    
    /**
     * Upload new ticket theme 
     * 
     * @param array $form
     */
    public function upload_themes($form) {

        if(!empty($form['fooevents-theme-viewer-upload-file'])) {

            $type = $_FILES["fooevents-theme-viewer-upload-file"]["type"];
            
            $accepted = false;
            
            $acceptedFileTypes = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed');
            foreach($acceptedFileTypes as $fileType) {
                
                if($fileType == $type) {
                        $accepted = true;
                        break;
                } 
                
            }

            if($accepted) {
                
                $filename = explode(".", $_FILES["fooevents-theme-viewer-upload-file"]["name"]);

                $path = $this->Config->themePacksPath.$_FILES["fooevents-theme-viewer-upload-file"]["name"];

                $alreadyExists = false;
                if(file_exists($this->Config->themePacksPath.$filename[0])) {
                    
                    $alreadyExists = true;
                    $this->output_notices(array(__( 'Theme already exists.', 'woocommerce-events' )));
                    
                }
                
                if(!$alreadyExists) {
                
                    move_uploaded_file($_FILES["fooevents-theme-viewer-upload-file"]["tmp_name"], $path);

                    if(file_exists($path)) {

                        $zip = new ZipArchive();
                        $status = $zip->open($path);

                        if ($status === true) {

                            $zip->extractTo($this->Config->themePacksPath); 
                            $zip->close();
                            $theme_path = $this->Config->themePacksPath.$filename[0];
                            
                            if(file_exists($theme_path.'/header.php') && file_exists($theme_path.'/footer.php') && file_exists($theme_path.'/ticket.php')) {

                                $this->output_notices(array(__( 'Theme has been uploaded.', 'woocommerce-events' )));

                            } else {
                                
                                $this->output_notices(array(__( 'File does not contain valid theme files.', 'woocommerce-events' )));
                                //rmdir($theme_path);
                                
                            }
                            
                            unlink($path);

                        }

                    }
                
                }
                
            } else {
                
                $this->output_notices(array(__( 'Please upload valid .zip file', 'woocommerce-events' )));
                
            }
            
            
        }
        
    }
    
    /**
     * Send ticket theme preview
     * 
     * @param array $form
     */
    public function send_preview($form) {
        
        if(!empty($form['fooevents-theme-viewer-preview-input']) && !empty($form['fooevents-theme-viewer-preview-path'])) {

            $theme = $form['fooevents-theme-viewer-preview-path'];
            $sendTo = $form['fooevents-theme-viewer-preview-input'];
            $themeName = $form['fooevents-theme-viewer-preview-theme-name'];
            
            $ticket = $this->get_demo_ticket();
            
            $header = $this->MailHelper->parse_email_template($theme.'/header.php', array(), $ticket); 
            $footer = $this->MailHelper->parse_email_template($theme.'/footer.php', array(), $ticket);
            $body = $this->MailHelper->parse_ticket_template($theme.'/ticket.php', $ticket);
            
            $subject = $themeName.": Preview Ticket";
            
            $mailStatus = $this->MailHelper->send_ticket($sendTo, $subject, $header.$body.$footer);
            
            $this->output_notices(array(__( 'Preview ticket has been sent', 'woocommerce-events' )));

        }
        
    }
    
    /**
     * Get demo details for ticket preview
     * 
     * @return array
     */
    private function get_demo_ticket() {
        
        $ticket = array(
            'WooCommerceEventsDate'     => '24-11-2020',
            'WooCommerceEventsVariations' => '',
            'WooCommerceEventsVariationID' => '',
            'fooevents_custom_attendee_fields_options' => 'Shirt size: L',
            'WooCommerceEventsEvent' => 'Event',
            'WooCommerceEventsHour' => '13',
            'WooCommerceEventsMinutes' => '00',
            'WooCommerceEventsPeriod' => '',
            'WooCommerceEventsHourEnd' => '14',
            'WooCommerceEventsMinutesEnd' => '00',
            'WooCommerceEventsEndPeriod' => '',
            'WooCommerceEventsLocation' => __( 'Local Stadium', 'woocommerce-events' ),
            'WooCommerceEventsTicketLogo' => '',
            'WooCommerceEventsTicketHeaderImage' => '',
            'WooCommerceEventsSupportContact' => '0841111111',
            'WooCommerceEventsTicketBackgroundColor' => '#050505',
            'WooCommerceEventsTicketButtonColor' => '#55AF71',
            'WooCommerceEventsTicketTextColor' => '#FFFFFF',
            'WooCommerceEventsTicketPurchaserDetails' => 'on', 
            'WooCommerceEventsTicketAddCalendar' => 'on',
            'WooCommerceEventsTicketDisplayDateTime' => 'on',
            'WooCommerceEventsTicketDisplayBarcode' => 'on',
            'WooCommerceEventsTicketText' => 'This is preview text',
            'WooCommerceEventsDirections' => 'These are preview directions',
            'WooCommerceEventsTicketDisplayPrice' => 'on',
            'WooCommerceEventsTicketType' => 'Early Bird',
            'WooCommerceEventsProductID' => '',
            'WooCommerceEventsTicketID' => '111111111',
            'WooCommerceEventsOrderID' => '',
            'name' => __( 'Preview Event', 'woocommerce-events' ),
            'cancelLink' => '',
            'WooCommerceEventsAttendeeTelephone' => '',
            'WooCommerceEventsAttendeeCompany' => '',
            'WooCommerceEventsAttendeeDesignation' => '',
            'WooCommerceEventsAttendeeEmail' => '',
            'customerFirstName' => __( 'John', 'woocommerce-events' ),
            'customerLastName' => __( 'Doe', 'woocommerce-events' ),
            'customerEmail' => '',
            'FooEventsTicketFooterText' => '',
            'price' => '$99.00'
        );
        
        return $ticket;
        
    }
    
     /**
     * Gets a list of FooEvents Ticket themes
     * 
     */
    public function get_ticket_themes()  {
        
        $valid_themes = array();
        
        foreach (new DirectoryIterator($this->Config->themePacksPath) as $file) {
            
            if ($file->isDir() && !$file->isDot()) {
                
                $theme_name = $file->getFilename();
                
                $theme_path = $file->getPath();
                $theme_path = $theme_path.'/'.$theme_name;
                
                $theme_name_pretty = str_replace('_', " ", $theme_name);
                $theme_name_prep = ucwords($theme_name_pretty);
                
                if(file_exists($theme_path.'/header.php') && file_exists($theme_path.'/footer.php') && file_exists($theme_path.'/ticket.php')) {
                    
                    $valid_themes[$theme_name_prep]['path'] = $theme_path;
                    $theme_url = $this->Config->themePacksURL.$theme_name;
                    $valid_themes[$theme_name_prep]['url'] = $theme_url;
                    
                    if(file_exists($theme_path.'/preview.jpg')) {   
                        
                        $valid_themes[$theme_name_prep]['preview'] = $theme_url.'/preview.jpg';
                        
                    } else {
                        
                        $valid_themes[$theme_name_prep]['preview'] = $this->Config->eventPluginURL.'images/no-preview.jpg';
                        
                    }
                    
                    $valid_themes[$theme_name_prep]['file_name'] = $file->getFilename();
                    
                }

            }
            
        }

        return $valid_themes;
        
    }
    
    /**
     * Outputs notices to screen.
     * 
     * @param array $notices
     */
    private function output_notices($notices) {

        foreach ($notices as $notice) {

                echo "<div class='updated'><p>$notice</p></div>";

        }

    }
    
}