/**
* Copyright (C) 2014-2025 ServMask Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* Attribution: This code is part of the All-in-One WP Migration plugin, developed by
*
* ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
* ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
* ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
* ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
* ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
* ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
*/
if ( ! defined( 'ABSPATH' ) ) {
die( 'Kangaroos cannot jump here' );
}
class Ai1wm_Export_Plugins {
public static function execute( $params ) {
// Set archive bytes offset
if ( isset( $params['archive_bytes_offset'] ) ) {
$archive_bytes_offset = (int) $params['archive_bytes_offset'];
} else {
$archive_bytes_offset = ai1wm_archive_bytes( $params );
}
// Set file bytes offset
if ( isset( $params['file_bytes_offset'] ) ) {
$file_bytes_offset = (int) $params['file_bytes_offset'];
} else {
$file_bytes_offset = 0;
}
// Set plugins bytes offset
if ( isset( $params['plugins_bytes_offset'] ) ) {
$plugins_bytes_offset = (int) $params['plugins_bytes_offset'];
} else {
$plugins_bytes_offset = 0;
}
// Get processed files size
if ( isset( $params['processed_files_size'] ) ) {
$processed_files_size = (int) $params['processed_files_size'];
} else {
$processed_files_size = 0;
}
// Get total plugins files size
if ( isset( $params['total_plugins_files_size'] ) ) {
$total_plugins_files_size = (int) $params['total_plugins_files_size'];
} else {
$total_plugins_files_size = 1;
}
// Get total plugins files count
if ( isset( $params['total_plugins_files_count'] ) ) {
$total_plugins_files_count = (int) $params['total_plugins_files_count'];
} else {
$total_plugins_files_count = 1;
}
// What percent of files have we processed?
$progress = (int) min( ( $processed_files_size / $total_plugins_files_size ) * 100, 100 );
// Set progress
/* translators: 1: Number of files, 2: Progress. */
Ai1wm_Status::info( sprintf( __( 'Archiving %1$d plugin files... %2$d%% complete', 'all-in-one-wp-migration' ), $total_plugins_files_count, $progress ) );
// Flag to hold if file data has been processed
$completed = true;
// Start time
$start = microtime( true );
// Get plugins list file
$plugins_list = ai1wm_open( ai1wm_plugins_list_path( $params ), 'r' );
// Set the file pointer at the current index
if ( fseek( $plugins_list, $plugins_bytes_offset ) !== -1 ) {
// Open the archive file for writing
$archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
// Set the file pointer to the one that we have saved
$archive->set_file_pointer( $archive_bytes_offset );
// Loop over files
while ( list( $file_abspath, $file_relpath, $file_size, $file_mtime ) = ai1wm_getcsv( $plugins_list ) ) {
$file_bytes_written = 0;
// Add file to archive
if ( ( $completed = $archive->add_file( $file_abspath, 'plugins' . DIRECTORY_SEPARATOR . $file_relpath, $file_bytes_written, $file_bytes_offset ) ) ) {
$file_bytes_offset = 0;
// Get plugins bytes offset
$plugins_bytes_offset = ftell( $plugins_list );
}
// Increment processed files size
$processed_files_size += $file_bytes_written;
// What percent of files have we processed?
$progress = (int) min( ( $processed_files_size / $total_plugins_files_size ) * 100, 100 );
// Set progress
/* translators: 1: Number of files, 2: Progress. */
Ai1wm_Status::info( sprintf( __( 'Archiving %1$d plugin files... %2$d%% complete', 'all-in-one-wp-migration' ), $total_plugins_files_count, $progress ) );
// More than 10 seconds have passed, break and do another request
if ( ( $timeout = apply_filters( 'ai1wm_completed_timeout', 10 ) ) ) {
if ( ( microtime( true ) - $start ) > $timeout ) {
$completed = false;
break;
}
}
}
// Get archive bytes offset
$archive_bytes_offset = $archive->get_file_pointer();
// Truncate the archive file
$archive->truncate();
// Close the archive file
$archive->close();
}
// End of the plugins list?
if ( feof( $plugins_list ) ) {
// Unset archive bytes offset
unset( $params['archive_bytes_offset'] );
// Unset file bytes offset
unset( $params['file_bytes_offset'] );
// Unset plugins bytes offset
unset( $params['plugins_bytes_offset'] );
// Unset processed files size
unset( $params['processed_files_size'] );
// Unset total plugins files size
unset( $params['total_plugins_files_size'] );
// Unset total plugins files count
unset( $params['total_plugins_files_count'] );
// Unset completed flag
unset( $params['completed'] );
} else {
// Set archive bytes offset
$params['archive_bytes_offset'] = $archive_bytes_offset;
// Set file bytes offset
$params['file_bytes_offset'] = $file_bytes_offset;
// Set plugins bytes offset
$params['plugins_bytes_offset'] = $plugins_bytes_offset;
// Set processed files size
$params['processed_files_size'] = $processed_files_size;
// Set total plugins files size
$params['total_plugins_files_size'] = $total_plugins_files_size;
// Set total plugins files count
$params['total_plugins_files_count'] = $total_plugins_files_count;
// Set completed flag
$params['completed'] = $completed;
}
// Close the plugins list file
ai1wm_close( $plugins_list );
return $params;
}
}
Thank you for choosing Group 369 (“we,” “our,” “us”). The privacy of your personal information is important to us. This Privacy Policy explains how we collect, use, disclose, and protect your personal information when you use our online services, including our website and online lending platform (collectively, the “Services”). By using our Services, you agree to the terms of this Privacy Policy.
1. Information We Collect
We may collect various types of personal information from you, including:
Identifying information (e.g., name, address, phone number, email address).
Financial information (e.g., income, credit history, social security number).
Log-in information (e.g., IP address, browser used, access data).
Usage information about the Services.
2. How We Use Your Information
We use your personal information for the following purposes:
To process your loan requests and assess your eligibility.
To personalize your experience and improve our services.
To communicate with you about your account and Service updates.
To inform you about our products, special offers, and relevant news unless you choose not to receive such communications.
To comply with legal and regulatory requirements.
3. Sharing of Information
We may share your personal information with third parties in the following situations:
With our payment processing partners to facilitate financial transactions.
With credit rating agencies to assess your creditworthiness.
With government authorities, regulatory bodies, or as part of a legal investigation when required by law.
4. Information Security
We implement appropriate security measures to protect your personal information against loss, theft, unauthorized access, and disclosure.
5. Your Rights and Choices
You have the right to access, correct, update, or delete your personal information. You can also choose not to receive our marketing communications.
6. Changes to the Privacy Policy
We may update this Privacy Policy from time to time. We will inform you of any significant changes.
7. Contact Us
If you have any questions or concerns about this Privacy Policy, please contact us at info@group369.ca.