Version 4.3.0

This commit is contained in:
Neo committed 2025-12-19 05:47:12 -08:00
1 parent 96997ddd8e
commit fe1acf984a
1349 files changed
+116159 -67711

No files matched your search

+397
View File
@@ -0,0 +1,397 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Invision Community Update Extractor</title>
<style type='text/css'>@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.ipsProgressBar{width:50%;margin:auto;height:20px;overflow:hidden;background:#9c9c9c;background:-moz-linear-gradient(top,rgba(156,156,156,1) 0,rgba(180,180,180,1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(156,156,156,1)),color-stop(100%,rgba(180,180,180,1)));background:-webkit-linear-gradient(top,rgba(156,156,156,1) 0,rgba(180,180,180,1) 100%);background:-o-linear-gradient(top,rgba(156,156,156,1) 0,rgba(180,180,180,1) 100%);background:-ms-linear-gradient(top,rgba(156,156,156,1) 0,rgba(180,180,180,1) 100%);background:linear-gradient(to bottom,rgba(156,156,156,1) 0,rgba(180,180,180,1) 100%);border-radius:4px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.ipsProgressBar_animated .ipsProgressBar_progress{background-color:#5490c0;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,.15)),color-stop(.75,rgba(255,255,255,.15)),color-stop(.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px;-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.ipsProgressBar_progress{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background:#5490c0;position:relative;padding-left:6px}.ipsProgressBar_progress[data-progress]:after{position:absolute;right:5px;top:0;line-height:32px;color:#fff;content:attr(data-progress);display:block;font-weight:700}</style>
</head>
<body style="margin:0">
<?php
/**
* @brief Update Extractor
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 31 Jul 2017
*/
// This file deliberately exists outside of the framework
// and MUST NOT call init.php
@ini_set('display_errors', 'off');
@require( "../../system/3rd_party/pclzip/pclzip.lib.php" );
if ( file_exists( "../../constants.php" ) )
{
require "../../constants.php";
}
foreach ( array( 'FOLDER_PERMISSION_NO_WRITE' => 0755, 'FILE_PERMISSION_NO_WRITE' => 0644, 'TEMP_DIRECTORY' => sys_get_temp_dir() ) as $k => $v )
{
if ( !defined( $k ) )
{
define( $k, $v );
}
}
/**
* Extractor Class
*/
class Extractor
{
const NUMBER_PER_GO = 20;
/**
* @brief File
*/
private $file;
/**
* @brief Root Directory
*/
private $container;
/**
* @brief PclZip Object
*/
private $zip;
/**
* @brief Zip Contents
*/
private $contents;
/**
* @brief FTP Connection
*/
private $ftp;
/**
* @brief SSH Connection
*/
private $ssh;
/**
* @brief SFTP Connection
*/
private $sftp;
/**
* @brief SFTP Directory
*/
private $sftpDir;
/**
* Constructor
*
* @param string $file Zip File
* @param string $container Root directory
* @return void
*/
public function __construct( $file, $container )
{
if ( !$file or !$container )
{
throw new Exception;
}
$this->file = $file;
$this->container = $container . '/';
}
/**
* Security Check
*
* @param string $key Security key
* @return void
*/
public function securityCheck( $key )
{
require "../../conf_global.php";
return $key === md5( $INFO['board_start'] . $_GET['file'] . $INFO['sql_pass'] );
}
/**
* Establish FTP/SSH connection
*
* @param array $value FTP/SSH Credentials
* @return void
*/
public function connectToFtp( $value )
{
if ( $value['protocol'] == 'sftp' )
{
$this->ssh = ssh2_connect( $value['server'], $value['port'] );
if ( $this->ssh === FALSE )
{
throw new Exception;
}
if ( !@ssh2_auth_password( $this->ssh, $value['un'], $value['pw'] ) )
{
throw new Exception;
}
$this->sftp = @ssh2_sftp( $this->ssh );
if ( $this->sftp === FALSE )
{
throw new Exception;
}
if ( $value['path'] and !@ssh2_sftp_stat( $this->sftp, $value['path'] ) )
{
throw new Exception;
}
$this->sftpDir = ssh2_sftp_realpath( $this->sftp, $value['path'] ) . '/';
}
else
{
if ( $value['protocol'] == 'ssl_ftp' )
{
$this->ftp = @ftp_ssl_connect( $value['server'], $value['port'], 3 );
}
else
{
$this->ftp = @ftp_connect( $value['server'], $value['port'], 3 );
}
if ( $this->ftp === FALSE )
{
throw new Exception;
}
if ( !@ftp_login( $this->ftp, $value['un'], $value['pw'] ) )
{
throw new Exception;
}
if( ftp_nlist( $this->ftp, '.' ) === FALSE )
{
@ftp_pasv( $this->ftp, true );
}
if ( !@ftp_chdir( $this->ftp, $value['path'] ) )
{
throw new Exception;
}
}
}
/**
* Number of files
*
* @return int
*/
public function numberOfFiles()
{
$properties = $this->zip->properties();
return $properties['nb'];
}
/**
* Extract the files
*
* @param int $offset Offset
* @return int
*/
public function extract( $offset )
{
$this->zip = new PclZip( $this->file );
$this->contents = $this->zip->listContent();
if ( !$this->contents )
{
throw new Exception;
}
$done = 0;
for ( $i = 0; $i < self::NUMBER_PER_GO; $i++ )
{
$index = $offset + $i;
if ( isset( $this->contents[ $index ] ) )
{
$this->_extractFile( $index );
$done++;
}
else
{
return $done;
}
}
return $done;
}
/**
* Extract a particular file
*
* @param int $index File index in zip
* @return void
*/
private function _extractFile( $index )
{
/* Get the file */
$path = mb_substr( $this->contents[ $index ]['filename'], 0, mb_strlen( $this->container ) ) === $this->container ? mb_substr( $this->contents[ $index ]['filename'], mb_strlen( $this->container ) ) : $this->contents[ $index ]['filename'];
if ( !$path or mb_substr( $path, -1 ) === '/' or mb_substr( $path, 0, 1 ) === '.' or mb_substr( $path, 0, 9 ) === '__MACOSX/' )
{
return;
}
/* Create a directory if needed */
$dir = dirname( $path );
$directories = array( $dir );
while ( $dir != '.' )
{
$dir = dirname( $dir );
if ( $dir != '.' )
{
$directories[] = $dir;
}
}
foreach ( array_reverse( $directories ) as $dir )
{
if ( !is_dir( "../../{$dir}" ) )
{
if ( $this->sftp )
{
@ssh2_sftp_mkdir( $this->sftp, $this->sftpDir . $dir );
}
if ( $this->ftp )
{
@ftp_mkdir( $this->ftp, $dir );
}
else
{
@mkdir( "../../{$dir}", FOLDER_PERMISSION_NO_WRITE );
}
}
}
/* Write contents */
$contents = @$this->zip->extractByIndex( $index, \PCLZIP_OPT_EXTRACT_AS_STRING );
$contents = $contents[0]['content'];
if ( $this->sftp or $this->ftp )
{
$tmpFile = tempnam( TEMP_DIRECTORY, 'IPS' );
\file_put_contents( $tmpFile, $contents );
if ( $this->sftp )
{
if ( @ssh2_scp_send( $this->ssh, $tmpFile, $this->sftpDir . $path ) === FALSE )
{
throw new \Exception;
}
}
else
{
if ( @ftp_put( $this->ftp, $path, $tmpFile, FTP_BINARY ) === FALSE )
{
throw new \Exception;
}
}
@unlink( $tmpFile );
}
else
{
/* Determine if the file exists (we'll want to know this later) */
$fileExists = file_exists( "../../{$path}" );
$fh = @\fopen( "../../{$path}", 'w+' );
if ( $fh === FALSE )
{
$lastError = error_get_last();
throw new Exception( $lastError['message'] );
}
if ( @\fwrite( $fh, $contents ) === FALSE )
{
$lastError = error_get_last();
throw new Exception( $lastError['message'] );
}
else
{
/* If the file existed before we started, we should clear it from opcache if opcache is enabled */
if( $fileExists )
{
if ( function_exists( 'opcache_invalidate' ) )
{
@opcache_invalidate( "../../{$path}" );
}
}
/* Otherwise, we should set file permissions on the file if it's brand new in case server defaults to something odd */
else
{
@chmod( "../../{$path}", FILE_PERMISSION_NO_WRITE );
}
}
@\fclose( $fh );
}
}
}
/* ! Controller */
try
{
$extractor = new Extractor( isset( $_GET['file'] ) ? $_GET['file'] : NULL, isset( $_GET['container'] ) ? $_GET['container'] : '' );
/* Check this request came from the ACP */
if ( !$extractor->securityCheck( $_GET['key'] ) )
{
throw new Exception;
}
/* Establish an FTP connection if necessary */
if ( $_GET['ftp'] )
{
$extractor->connectToFtp( $_GET['ftp'] );
}
/* Extract a batch of files */
$i = isset( $_GET['i'] ) ? $_GET['i'] : 0;
$done = $extractor->extract( $i );
/* If we didn't extract anything, are we done? */
if ( !$done and $i >= $extractor->numberOfFiles() )
{
@unlink( $_GET['file'] );
if ( function_exists( 'opcache_reset' ) )
{
@opcache_reset();
}
echo <<<HTML
<div class="ipsProgressBar ipsProgressBar_animated">
<div class="ipsProgressBar_progress" style="width: 100%;"></div>
</div>
<script type='text/javascript'>parent.location = parent.location + '&check=1';</script><noscript><a href='index.php' target='_parent'>Click here to continue</a></noscript>
HTML;
}
/* Nope, redirect to the next batch */
else
{
$newI = $i + $extractor::NUMBER_PER_GO;
$percentComplete = round( 100 / $extractor->numberOfFiles() * $newI );
$properties = array(
'file' => $_GET['file'],
'container' => $_GET['container'],
'key' => $_GET['key'],
'ftp' => $_GET['ftp'],
'i' => $newI,
);
$url = "extract.php?" . http_build_query( $properties );
echo <<<HTML
<div class="ipsProgressBar ipsProgressBar_animated">
<div class="ipsProgressBar_progress" style="width: {$percentComplete}%;"></div>
</div>
<noscript><a href='{$url}' target='_parent'>Click here to continue</a></noscript>
<script type='text/javascript'>window.onload = function(){setTimeout(function(){window.location = '{$url}';}, 50);};</script>
HTML;
}
}
catch ( Exception $e )
{
echo "<script type='text/javascript'>parent.location = parent.location + '&fail=1';</script><noscript>An error occurred. Please visit the <a href='https://remoteservices.invisionpower.com/docs/client_area' target='_blank'>client area</a> to manually download the latest version. After uploading the files, <a href='index.php' target='_parent'>continue to the upgrader</a>.</noscript>";
exit;
}
?>
</body>
</html>
+29 -23
View File
@@ -1,30 +1,36 @@
<ips:template parameters="$forms, $error" />
<ips:template parameters="$error" />
{{if $error !== NULL}}
<div class='ipsMessage ipsMessage_error'>
{lang="$error"}
</div>
<br>
{{endif}}
<div class='ipsColumns ipsColumns_collapsePhone'>
<div class='ipsColumn ipsColumn_fluid ipsPad'>
{{foreach $forms as $k => $form}}
{{if $k === '_standard'}}
{$form|raw}
{{endif}}
{{endforeach}}
</div>
{{if count ( $forms ) > 1}}
<div class='ipsColumn ipsColumn_veryWide ipsPad'>
<h2 class='ipsType_sectionHead'>{lang='sign_in_faster'}</h2>
<p class='ipsType_normal ipsType_reset ipsType_light'>{lang='sign_in_connect'}</p>
<br>
{{foreach $forms as $k => $form}}
{{if $k !== '_standard'}}
{$form|raw}
{{endif}}
{{endforeach}}
</div>
{{endif}}
</div>
<form method="post">
<input type="hidden" name="{$id}_submitted" value="1">
<ul class='ipsForm ipsForm_vertical'>
<li class="ipsFieldRow ipsClearfix">
<label class="ipsFieldRow_label" for="auth">
{lang="auth"}
<span class="ipsFieldRow_required">{lang="required"}</span>
</label>
<div class="ipsFieldRow_content">
<input type="text" placeholder="{lang="email_address"}" name="auth" id="auth" {{if isset( \IPS\Request::i()->auth )}}value="{request="auth"}"{{endif}}>
</div>
</li>
<li class="ipsFieldRow ipsClearfix">
<label class="ipsFieldRow_label" for="password">
{lang="password"}
<span class="ipsFieldRow_required">{lang="required"}</span>
</label>
<div class="ipsFieldRow_content">
<input type="password" placeholder="{lang="password"}" name="password" id="password" {{if isset( \IPS\Request::i()->password )}}value="{request="password"}"{{endif}}>
</div>
</li>
<li class=''>
<button type='submit' class='ipsButton ipsButton_primary ipsButton_medium'>{lang="login"}</button>
&nbsp;&nbsp;&nbsp;
<a href="{url="upgrader_login_help" ips="true"}" target="_blank" class="ipsType_blendLinks">{lang="help"}</a>
</li>
</ul>
</form>
+1 -1
View File
@@ -12,7 +12,7 @@
{{endforeach}}
{{if $uploadField}}
<input type="hidden" name="MAX_FILE_SIZE" value="{$uploadField}">
<input type="hidden" name="plupload" value="{expression="md5( uniqid() )"}">
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
{{endif}}
{{if $error}}
<div class="ipsMessage ipsMessage_error">
@@ -24,7 +24,7 @@
<body class='ipsApp ipsApp_installer'>
<script>
$(document).ready(function(){
$('input[name="diagnostics_reporting_checkbox"]').attr("disabled","disabled");
$('input[name="101079_diagnostics_reporting_checkbox"]').attr("disabled","disabled");
});
</script>
<div id='elInstaller_wrap'>
@@ -77,7 +77,7 @@
<a href='{expression="\IPS\Settings::i()->base_url"}' class='ipsButton ipsButton_large ipsButton_primary'>{lang="go_to_suite"}</a>
<a href='{expression="rtrim( \IPS\Settings::i()->base_url, '/' ) . '/' . \IPS\CP_DIRECTORY"}' class='ipsButton ipsButton_large ipsButton_normal'>{lang="go_to_acp"}</a>
<br><br>
<a href='http://ipbmafia.ru/files/file/1848-russkiy-yazyk-dlya-invision-community-42/' target="_blank" class='ipsButton ipsButton_large ipsButton_normal' style="background: red;">Russian lang pack</a>
<a href='https://ipbmafia.ru/files/file/1848-russkiy-yazyk-dlya-invision-community/' target="_blank" class='ipsButton ipsButton_large ipsButton_normal' style="background: red;">Russian lang pack</a>
<br><br>
<a href="{expression="\IPS\Http\Url::ips('docs/docs')"}" target="_blank">{lang="suite_docs"}</a>
</div>
+23 -1
View File
@@ -1,6 +1,28 @@
<ips:template parameters="$requirements, $designerMode" />
<ips:template parameters="$requirements, $designerMode, $incorrectFiles" />
{{$canProceed = TRUE;}}
<section>
{{if $incorrectFiles !== NULL}}
{{if $incorrectFiles}}
{{$canProceed = FALSE;}}
<h2 class="ipsType_sectionHead">{lang="hc_files"}</h2>
<br><br>
<p class="ipsType_normal">{lang="hc_files_fail"}</p>
<br>
<a class="ipsButton ipsButton_primary" href="{url="client_area" ips="true"}" target="_blank">{lang="hc_files_fail2"}</a>
<br><br>
<p class="ipsType_normal">{lang="hc_files_fail3"}</p>
<ul class="ipsPad ipsType_large ipsList_checks">
{{foreach $incorrectFiles as $file}}
<li class="fail">{$file}</li>
{{endforeach}}
</ul>
{{else}}
<h2 class="ipsType_sectionHead">{lang="hc_files"}</h2>
<ul class="ipsPad ipsType_large ipsList_checks">
<li class="success">{lang="hc_files_ok"}</li>
</ul>
{{endif}}
{{endif}}
{{if $designerMode}}
<h2 class="ipsType_sectionHead">{lang="hc_designers_mode"}</h2>
<ul class="ipsPad ipsType_large ipsList_checks">
@@ -23,5 +23,4 @@
</section>
<div class='ipsPad_double ipsType_center'>
<a href='{url="controller=continueupgrade&key={$_SESSION['uniqueKey']}"}' class='ipsButton ipsButton_large ipsButton_primary ipsButton_positive'>{lang="continue_upgrade"}</a>
<a href='{url="controller=systemcheck&key={$_SESSION['uniqueKey']}&skippreviousupgrade=1"}' class='ipsButton ipsButton_large ipsButton_primary'>{lang="start_fresh_upgrade"}</a>
</div>
+2 -2
View File
@@ -8,12 +8,12 @@
{{if $trace[3]['function'] == 'installDatabaseUpdates'}}
<small>
{expression="\IPS\ROOT_PATH"}/applications/{$trace[4]['args'][0][1]}/setup/upg_{$trace[3]['args'][0]}/queries.json{{if isset($_SESSION['lastJsonIndex'])}} - query #{$_SESSION['lastJsonIndex']}{{endif}}<br>
<pre>{$exception->query}</pre>
<pre>{{if $exception->query}}{$exception->query}{{else}}{$trace[0]['args'][0]}{{endif}}</pre>
</small>
{{else}}
<small>
{$trace[1]['file']}::{$trace[1]['line']}<br>
<pre>{$exception->query}</pre>
<pre>{{if $exception->query}}{$exception->query}{{else}}{$trace[0]['args'][0]}{{endif}}</pre>
</small>
{{endif}}
{{else}}
+1
View File
@@ -9,6 +9,7 @@
*/
define('READ_WRITE_SEPARATION', FALSE);
define('REPORT_EXCEPTIONS', TRUE);
/* Prevent hooks from running during the upgrade */
define('RECOVERY_MODE', TRUE);
+32 -4
View File
@@ -37,6 +37,7 @@ $lang = array(
'create_conf_global' => "Please create a %s directory and make it writeable. If you are not sure how to do this, contact your hosting provider.",
'session_no_good' => "We were unable to start a PHP session. You will need to contact your host to adjust your PHP configuration before you can continue. The error reported was: %s",
'upgrade_group_not_exist' => "You do not have permission to run the upgrader because your group does not exist.",
'help' => "Help",
'sign_in_short' => "Sign In",
'auth' => "Display Name or Email Address",
@@ -46,7 +47,7 @@ $lang = array(
'username' => "Display Name",
'email_address' => "Email Address",
'username_or_email' => "Username or Email Address",
'login_err_no_account' => "The %s you entered does not belong to any account. Make sure that it is typed correctly.",
'login_err_no_account' => "The email address you entered does not belong to any account. Make sure that it is typed correctly.",
'login_err_bad_password' => "The password you entered is incorrect. Please try again (make sure your caps lock is off).",
'login_err_locked_unlock' => "Your account has been locked. Try again in {# [1:minute][?:minutes]}.",
'login_err_locked_nounlock' => "Your account has been locked. Try again later.",
@@ -106,6 +107,8 @@ $lang = array(
'requirements_mysql_utf8_info' => "%s is %s",
'requirements_file_system' => "File System",
'requirements_file_writable' => "%s is writable",
'requirements_mysql_timeout' => "Your MySQL %s system variable is currently set to an extremely low value (%s). The default MySQL value is 28800. It is recommended to increase this MySQL system variable to at least 20 in order to prevent potential problems with queries timing out.",
'dir_not_provided' => "No directory provided. Please check file storage configurations.",
'dir_does_not_exist' => "%s does not exist.",
'dir_is_not_writable' => "%s cannot be written to. Please adjust the permissions on it or contact your hosting provider for assistance.",
'file_storage_test_error_amazon' => "There appears to be a problem with your Amazon (%s) file storage settings which can cause problems with uploads.<br> After attempting to upload a file to the directory, the URL to the file is returning a HTTP %s error. Update your settings and then check and see if the problem has been resolved",
@@ -507,7 +510,7 @@ $lang = array(
/* ! 101000 revert globalTemplate */
'101000_globalTemplate_revert' => "Revert custom themes which contain out of date globalTemplate templates?",
'101000_globalTemplate_revert_desc' => "In Invision Community 4.1, the template 'utilitiesMenu' has been removed. This is used within the globalTemplate. After upgrading, you may see a message about the theme being out of date if you do not revert.<br><strong>Reverting templates will lose any customizations</strong>",
'101000_yes' => "Yes, revert losing customiztions",
'101000_yes' => "Yes, revert losing customizations",
'101000_no' => "No, I will manually adjust the templates after upgrading",
/* ! CMS 101000 Options */
@@ -522,11 +525,14 @@ $lang = array(
/* ! Core 101079 Diagnostic reporting option */
'101079_diagnostics_reporting' => "Send diagnostics data to IPS?",
'101079_diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending usage and diagnostic information. The data sent does not contain any private information about your users or your community.",
'101079_diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending diagnostic information. The data sent does not contain any private information about your users or your community.",
/* ! Core 102000 Letter photo option */
'options_letter_photos' => "Enable letter photos?",
'options_letter_photos_desc' => "Do you wish to start using automatic letter photos instead of the default theme profile photo for users who have not uploaded a profile photo?",
/* ! IPS Connect discontinued warning */
'ipsconnect' => "IPS Connect",
'no_apps_upgrade' => 'There are no applications available to upgrade',
'exit_upgrader' => "Exit upgrader",
@@ -535,7 +541,6 @@ $lang = array(
'convert_charset_info' => "Your community suite data or database configuration is saved in an encoding other than UTF-8. Before your site can be upgraded, we must convert the encoding to UTF-8.",
'start_upgrade' => "Start Upgrade",
'continue_upgrade' => "Continue Upgrade",
'start_fresh_upgrade' => "Start Fresh Upgrade",
'continue_not_set' => "Not set",
'unfinished_upgrade_info' => "You have an unfinished upgrade from %s",
'hc_designers_mode' => "Designers' Mode On",
@@ -556,5 +561,28 @@ $lang = array(
'start_info' => "This process will install your software for you. Be sure you have your license key and MySQL database details to hand.",
'install_docs' => "Install Guide",
'js_confirm_mrerror' => 'The server encountered multiple instances where it has stopped responding.\nPress \'OK\' to reload this page and re-run this installation step.',
'hc_files' => "File Check",
'hc_files_ok' => "Source files are correct for the latest version",
'hc_files_fail' => "Some source files are not correct for the latest version. If you uploaded the files to your server manually, the process may have failed or not completed yet, or a new version may have been released since you downloaded. Download latest version from your client area and upload the files again in order to continue.",
'hc_files_fail2' => "Go To Client Area",
'hc_files_fail3' => "If you are sure the files have been uploaded correctly, make sure the permissions are set correctly on them.",
/* ! Core - 4.3 - Removing HTTPS settings */
'https_settings_changes' => "HTTPS Settings Changes",
'103000_usage_reporting' => "Send usage data to IPS?",
'103000_usage_reporting_desc' => "Help Invision Community improve by automatically sending usage information including a list of features in use and basic statistics. The data sent does not contain any private information about your users or your community.",
'admincp_hide_deprecate' => "Hide AdminCP link",
'recaptcha_v1_removed' => "CAPTCHA Settings",
'103000_ipsconnect_url' => "IPS Connect Master Site URL",
'103000_ipsconnect_client_id' => "IPS Connect Client Identifier",
'103000_ipsconnect_client_secret' => "IPS Connect Client Secret",
'files-1' => "File could not be opened: %s",
'files-2' => "File does not exist: %s",
'files-4' => "File could not be copied: %s",
'files-5' => "File could not be moved: %s",
'files-3' => "File could not be saved: %s",
'files-6' => "Folder could not be created: %s",
'files-7' => "Response returned a 400 response code but no Amazon region was returned: %s",
);