Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Install/Upgrade/2000270-202.php
<?php

namespace XF\Install\Upgrade;

use
XF\Db\Schema\Alter;
use
XF\Util\Arr;

class
Version2000270 extends AbstractUpgrade
{
    public function
getVersionName()
    {
        return
'2.0.2';
    }

    public function
step1()
    {
       
$this->schemaManager()->alterTable('xf_payment_provider_log', function(Alter $table)
        {
           
$table->addKey('purchase_request_key');
        });
    }

    public function
step2()
    {
       
// if a paypal payment profile exists and was used before the upgrade to 2.0 then
        // we need to ensure it is still marked as legacy as this could have been lost
        // due to that value not being maintained on edit.

       
$db = $this->db();

       
$paymentProfiles = $db->fetchAll('
            SELECT *
            FROM xf_payment_profile
            WHERE provider_id = \'paypal\'
        '
);

        if (!
$paymentProfiles)
        {
            return;
        }

       
$haveLegacy = false;
        foreach (
$paymentProfiles AS $paymentProfile)
        {
           
$options = @json_decode($paymentProfile['options'], true);
            if (
$options && !empty($options['legacy']))
            {
               
$haveLegacy = true;
                break;
            }
        }
        if (
$haveLegacy)
        {
            return;
        }

       
$xf2upgradeDate = $db->fetchOne('
            SELECT completion_date
            FROM xf_upgrade_log
            WHERE version_id = 2000070
            AND log_type = \'upgrade\'
        '
);

        if (!
$xf2upgradeDate)
        {
            return;
        }

       
$paymentLog = $db->fetchRow('
            SELECT *
            FROM xf_payment_provider_log
            WHERE provider_id = \'paypal\'
            AND log_type = \'payment\'
            AND log_date < ?
            ORDER BY log_date DESC
            LIMIT 1
        '
, $xf2upgradeDate);

        if (!
$paymentLog)
        {
            return;
        }

       
$logDetails = @unserialize($paymentLog['log_details']);

        if (!isset(
$logDetails['receiver_email']) || !isset($logDetails['business']))
        {
            return;
        }

       
$receiverEmail = $logDetails['receiver_email'];
       
$business = $logDetails['business'];

       
// we know we have no legacy entries by this point
       
foreach ($paymentProfiles AS $paymentProfile)
        {
           
$options = @json_decode($paymentProfile['options'], true);
            if (!
$options)
            {
                continue;
            }

           
$matched = false;

            try
            {
               
$accounts = Arr::stringToArray($options['alternate_accounts'], '#\r?\n#');
               
$accounts[] = $options['primary_account'];

                foreach (
$accounts AS $account)
                {
                   
$account = trim(strtolower($account));
                    if (
$account && ($business == $account || $receiverEmail == $account))
                    {
                       
// account matches business/receiver email and this profile is not marked as legacy so update

                       
$options['legacy'] = true;
                       
$db->query('
                            UPDATE xf_payment_profile
                            SET options = ?
                            WHERE payment_profile_id = ?
                        '
, [json_encode($options), $paymentProfile['payment_profile_id']]);

                       
// there should only be a single legacy profile so we can finish.
                       
$matched = true;
                        break;
                    }
                }
            }
            catch (\
Exception $e)
            {
               
// swallow errors so as to not block the upgrade but log and we can deal with tis if we have to
               
\XF::logException($e, false, '2.0.2 upgrade error:', true);
            }

            if (
$matched)
            {
                break;
            }
        }
    }

    public function
step3()
    {
       
// adding this index prevents a regular full table scan on the conversation_master table
       
$this->schemaManager()->alterTable('xf_conversation_master', function(Alter $table)
        {
           
$table->addKey('start_date');
        });
    }

    public function
step4()
    {
       
// Prior to 2.0.2, the XF 1 to XF 2 upgrade ignored thread prefixes where prefix_css = ''
        // but what it should have done is updated them to prefix_css = 'label label--hidden'
        // so this fixes that.

       
if ($this->db()->update('xf_thread_prefix', ['css_class' => 'label label--hidden'], 'css_class = ?', ''))
        {
           
/** @var \XF\Repository\ThreadPrefix $threadPrefixRepo */
           
$threadPrefixRepo = $this->app->repository('XF:ThreadPrefix');

           
$threadPrefixRepo->rebuildPrefixCache();
        }
    }
}