Version 4.5.0

This commit is contained in:
Neo committed 2025-12-19 05:51:58 -08:00
1 parent 1a0c7fd3c2
commit f79dcf067a
3791 files changed
+248032 -76372

No files matched your search

@@ -12,7 +12,7 @@
namespace IPS\nexus;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
@@ -122,7 +122,8 @@ class _Purchase extends \IPS\Node\Model
try
{
$description = call_user_func( array( $this->extension(), 'getPurchaseNameInfo' ), $this );
$extension = $this->extension();
$description = $extension::getPurchaseNameInfo( $this );
if( empty( $description ) )
{
@@ -251,8 +252,9 @@ class _Purchase extends \IPS\Node\Model
$this->nameWithStickyFields = $this->_data['name'];
try
{
$info = call_user_func( array( $this->extension(), 'getPurchaseNameInfo' ), $this );
if ( count( $info ) )
$extension = $this->extension();
$info = $extension::getPurchaseNameInfo( $this );
if ( \count( $info ) )
{
$this->nameWithStickyFields .= ' (' . implode( ' · ', $info ) . ')';
}
@@ -305,10 +307,12 @@ class _Purchase extends \IPS\Node\Model
{
if ( $this->_data['active'] and !$active )
{
$this->_data['active'] = FALSE;
$this->onExpire();
}
elseif ( !$this->_data['active'] and $active )
{
$this->_data['active'] = TRUE;
$this->onReactivate();
}
}
@@ -391,7 +395,7 @@ class _Purchase extends \IPS\Node\Model
else
{
$this->_data['expire'] = $date->getTimestamp();
$this->active = ( !$this->cancelled and $date->add( new \DateInterval( 'PT' . intval( $this->grace_period ) . 'S' ) )->getTimestamp() > time() );
$this->active = ( !$this->cancelled and $date->add( new \DateInterval( 'PT' . \intval( $this->grace_period ) . 'S' ) )->getTimestamp() > time() );
}
if ( $this->id )
{
@@ -628,7 +632,7 @@ class _Purchase extends \IPS\Node\Model
*/
public function set_grouped_renewals( $data )
{
$this->_data['grouped_renewals'] = !is_null( $data ) ? json_encode( $data ) : NULL;
$this->_data['grouped_renewals'] = !\is_null( $data ) ? json_encode( $data ) : NULL;
}
/**
@@ -721,7 +725,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'getIcon' ), $this );
$extension = $this->extension();
return $extension::getIcon( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -738,7 +743,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'getTypeTitle' ), $this );
$extension = $this->extension();
return $extension::getTypeTitle( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -755,7 +761,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'purchaseImage' ), $this );
$extension = $this->extension();
return $extension::purchaseImage( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -772,9 +779,10 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'acpPage' ), $this );
$extension = $this->extension();
return $extension::acpPage( $this );
}
catch ( \OutOfRangeException $e )
catch ( \OutOfRangeException | \BadMethodCallException $e )
{
return '';
}
@@ -791,7 +799,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'acpEdit' ), $this, $form, $renewals );
$extension = $this->extension();
return $extension::acpEdit( $this, $form, $renewals );
}
catch ( \OutOfRangeException $e )
{
@@ -809,7 +818,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'acpEditSave' ), $this, $values );
$extension = $this->extension();
return $extension::acpEditSave( $this, $values );
}
catch ( \OutOfRangeException $e )
{
@@ -826,9 +836,10 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'clientAreaPage' ), $this );
$extension = $this->extension();
return $extension::clientAreaPage( $this );
}
catch ( \OutOfRangeException $e )
catch ( \OutOfRangeException | \BadMethodCallException $e )
{
return array( 'packageInfo' => '', 'purchaseInfo' => '' );
}
@@ -843,7 +854,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'acpAction' ), $this );
$extension = $this->extension();
return $extension::acpAction( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -860,7 +872,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'clientAreaAction' ), $this );
$extension = $this->extension();
return $extension::clientAreaAction( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -877,7 +890,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'acpSupportView' ), $this );
$extension = $this->extension();
return $extension::acpSupportView( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -894,7 +908,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'supportSeverity' ), $this );
$extension = $this->extension();
return $extension::supportSeverity( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -911,7 +926,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'renewalPaymentMethodIds' ), $this );
$extension = $this->extension();
return $extension::renewalPaymentMethodIds( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -932,7 +948,7 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func_array( array( $this->extension(), $method ), array_merge( array( $this ), $params ) );
return \call_user_func_array( array( $this->extension(), $method ), array_merge( array( $this ), $params ) );
}
catch ( \OutOfRangeException $e ) { }
}
@@ -1097,7 +1113,22 @@ class _Purchase extends \IPS\Node\Model
public function canView( $member = NULL )
{
$member = $member ?: \IPS\Member::loggedIn();
/* Show only purchases from active applications */
try
{
$app = \IPS\Application::load( $this->app );
}
catch ( \UnexpectedValueException $e )
{
return FALSE;
}
if( !$app->canAccess() )
{
return FALSE;
}
if ( $this->member->member_id === $member->member_id or array_key_exists( $member->member_id, iterator_to_array( $this->member->alternativeContacts( array( \IPS\Db::i()->findInSet( 'purchases', array( $this->id ) ) ) ) ) ) )
{
return TRUE;
@@ -1120,7 +1151,8 @@ class _Purchase extends \IPS\Node\Model
try
{
return call_user_func( array( $this->extension(), 'canChangeExpireDate' ), $this );
$extension = $this->extension();
return $extension::canChangeExpireDate( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -1163,7 +1195,8 @@ class _Purchase extends \IPS\Node\Model
try
{
$date = call_user_func( array( $this->extension(), 'canRenewUntil' ), $this, $admin );
$extension = $this->extension();
$date = $extension::canRenewUntil( $this, $admin );
if ( $inCycles and $date instanceof \IPS\DateTime )
{
@@ -1195,7 +1228,8 @@ class _Purchase extends \IPS\Node\Model
{
try
{
return call_user_func( array( $this->extension(), 'canBeRenewed' ), $this );
$extension = $this->extension();
return $extension::canBeRenewed( $this );
}
catch ( \OutOfRangeException $e )
{
@@ -1263,15 +1297,24 @@ class _Purchase extends \IPS\Node\Model
/**
* Delete
*
* @param bool $deleteChildren If TRUE, child purchases will also be deleted. If FALSE, they will become unassociated.
* @return void
*/
public function delete()
public function delete( $deleteChildren = TRUE )
{
\IPS\File::unclaimAttachments( 'nexus_Purchases', $this->id, NULL, 'purchase' );
foreach ( $this->children() as $child )
foreach ( $this->children( NULL ) as $child )
{
$child->delete();
if ( $deleteChildren )
{
$child->delete();
}
else
{
$child->parent = NULL;
$child->save();
}
}
try
@@ -1458,7 +1501,8 @@ class _Purchase extends \IPS\Node\Model
try
{
$return = array_merge( $return, call_user_func( array( $this->extension(), 'acpButtons' ), $this, $url ) );
$extension = $this->extension();
$return = array_merge( $return, $extension::acpButtons( $this, $url ) );
}
catch ( \OutOfRangeException $e ) { }
@@ -1481,7 +1525,7 @@ class _Purchase extends \IPS\Node\Model
$return['group'] = array(
'icon' => 'compress',
'title' => 'group_with_parent',
'link' => $url->setQueryString( 'do', 'group' ),
'link' => $url->setQueryString( 'do', 'group' )->csrf(),
'data' => array( 'confirm' => '', 'confirmSubMessage' => \IPS\Member::loggedIn()->language()->addToStack('group_with_parent_info') )
);
}
@@ -1490,7 +1534,7 @@ class _Purchase extends \IPS\Node\Model
$return['group'] = array(
'icon' => 'expand',
'title' => 'ungroup_from_parent',
'link' => $url->setQueryString( 'do', 'ungroup' ),
'link' => $url->setQueryString( 'do', 'ungroup' )->csrf(),
'data' => array( 'confirm' => '', 'confirmSubMessage' => \IPS\Member::loggedIn()->language()->addToStack('ungroup_from_parent_info') )
);
}
@@ -1513,7 +1557,7 @@ class _Purchase extends \IPS\Node\Model
$return['reactivate'] = array(
'icon' => 'check',
'title' => 'reactivate',
'link' => $url->setQueryString( 'do', 'reactivate' ),
'link' => $url->setQueryString( 'do', 'reactivate' )->csrf(),
'data' => array( 'confirm' => '' )
);
}