File: /home/posscale/.trash/old/1app/Http/Controllers/SourceController.php
<?php
namespace App\Http\Controllers;
use App\Actions\SmtpAction;
use App\Http\Requests\Settings\AddSettings;
use App\Models\connectionSettings;
use App\Models\Printer;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use Illuminate\View\View;
use League\Flysystem\Filesystem;
use League\Flysystem\FilesystemException;
use League\Flysystem\Ftp\ConnectivityChecker;
use League\Flysystem\Ftp\FtpAdapter;
use League\Flysystem\Ftp\FtpConnectionException;
use League\Flysystem\Ftp\FtpConnectionOptions;
use League\Flysystem\PhpseclibV3\SftpAdapter;
use League\Flysystem\PhpseclibV3\SftpConnectionProvider;
use League\Flysystem\UnableToCheckExistence;
use League\Flysystem\UnixVisibility\PortableVisibilityConverter;
class SourceController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request): View
{
$search = $request->input('search');
$connections = connectionSettings::paginate(15);
return view('tenant.settings.list', ['connections' => $connections, 'search' => $search]);
}
/**
* Show the form for creating a new resource.
*/
public function create(Request $request): View
{
return view('tenant.settings.connection');
}
/**
* Store a newly created resource in storage.
*/
public function store(AddSettings $request)
{
$connection_details = $request->validated();
$connection_settings = new connectionSettings();
$connection_settings->type = $connection_details['type'];
$data = array();
$connection_settings->connection_status = 0;
if ($connection_details['type'] == 'SMTP') {
$data['type_for_monitoring'] = $connection_details['type_for_monitoring'];
$data['host'] = $connection_details['host'];
$data['port'] = $connection_details['port'];
$data['user_name'] = $connection_details['user_name'];
$data['user_password'] = $connection_details['user_password'];
$data['from'] = $connection_details['from'];
$data['from_name'] = $connection_details['from_name'];
$smtp_details['client'] = [
'host' => $data['host'],
'port' => $data['port'],
'encryption' => 'ssl',
'username' => $data['user_name'],
'password' => $data['user_password'],
'protocol' => $data['type_for_monitoring']
];
$connection_settings->connection_status = $this->validate_smtp($smtp_details);
if ($connection_settings->connection_status) {
$connection_settings->last_connection_date = date('Y-m-d h:i:s');
}
} elseif ($connection_details['type'] == 'FTP') {
$data['ftp_protocol'] = $connection_details['ftp_protocol'];
$data['ftp_host'] = $connection_details['ftp_host'];
$data['ftp_port'] = $connection_details['ftp_port'];
$data['ftp_user_name'] = $connection_details['ftp_user_name'];
$data['ftp_password'] = $connection_details['ftp_password'];
$data['ftp_folder'] = $connection_details['ftp_folder'];
$status = $this->validate_ftp($data);
if ($status == 1) {
$connection_settings->connection_status = 1;
$connection_settings->last_connection_date = date('Y-m-d h:i:s');
} else {
$connection_settings->connection_status = 0;
}
}
$connection_settings->data = json_encode($data);
$connection_settings->save();
return Redirect::route('settings.index')->with('status', 'record-inserted');
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(int $id): View
{
$row = connectionSettings::find($id);
return view('tenant.settings.edit-connection', ['connection' => $row]);
}
/**
* Update the specified resource in storage.
*/
public function update(AddSettings $request, string $id)
{
$connection_settings = connectionSettings::find($id);
$connection_details = $request->validated();
$connection_settings->type = $connection_details['type'];
$data = array();
$connection_settings->connection_status = 0;
if ($connection_details['type'] == 'SMTP') {
$data['type_for_monitoring'] = $connection_details['type_for_monitoring'];
$data['host'] = $connection_details['host'];
$data['port'] = $connection_details['port'];
$data['user_name'] = $connection_details['user_name'];
$data['user_password'] = $connection_details['user_password'];
$data['from'] = $connection_details['from'];
$data['from_name'] = $connection_details['from_name'];
$smtp_details['client'] = [
'host' => $data['host'],
'port' => $data['port'],
'encryption' => 'ssl',
'username' => $data['user_name'],
'password' => $data['user_password'],
'protocol' => $data['type_for_monitoring']
];
$connection_settings->connection_status = $this->validate_smtp($smtp_details);
if ($connection_settings->connection_status) {
$connection_settings->last_connection_date = date('Y-m-d h:i:s');
}
} elseif ($connection_details['type'] == 'FTP') {
$data['ftp_protocol'] = $connection_details['ftp_protocol'];
$data['ftp_host'] = $connection_details['ftp_host'];
$data['ftp_port'] = $connection_details['ftp_port'];
$data['ftp_user_name'] = $connection_details['ftp_user_name'];
$data['ftp_password'] = $connection_details['ftp_password'];
$data['ftp_folder'] = $connection_details['ftp_folder'];
$status = $this->validate_ftp($data);
if ($status == 1) {
$connection_settings->connection_status = 1;
$connection_settings->last_connection_date = date('Y-m-d h:i:s');
} else {
$connection_settings->connection_status = 0;
$data['error'] = $status;
}
}
$connection_settings->data = json_encode($data);
$connection_settings->save();
// Add code here to test connection.
return Redirect::route('settings.index')->with('status', 'record-inserted');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(int $id)
{
$connection_settings = connectionSettings::find($id);
$connection_settings->delete();
return Redirect::route('settings.index')->with('message', 'User delete successfully.');
}
/**
* Validate SMTP details and set status according to it
*/
public function validate_smtp(array $smtp_details): Int
{
$smtp_connection = new SmtpAction($smtp_details);
$connection_info = $smtp_connection->testConnection();
if ($connection_info['status']) {
return 1;
}
return 0;
}
/**
* Validate SMTP details and set status according to it
*/
public function validate_ftp(array $ftp_details)
{
// The internal adapter
if ($ftp_details['ftp_protocol'] == 'ftp') {
$adapter = new FtpAdapter(
// Connection options
FtpConnectionOptions::fromArray([
'host' => $ftp_details['ftp_host'], // required
'root' => $ftp_details['ftp_folder'], // required
'username' => $ftp_details['ftp_user_name'], // required
'password' => $ftp_details['ftp_password'], // required
'port' => (int)$ftp_details['ftp_port'],
'ssl' => false,
'timeout' => 90,
'utf8' => false,
'passive' => true,
'transferMode' => FTP_BINARY,
'systemType' => null, // 'windows' or 'unix'
'ignorePassiveAddress' => null, // true or false
'timestampsOnUnixListingsEnabled' => false, // true or false
'recurseManually' => true // true
])
);
$filesystem = new Filesystem($adapter);
try {
// Perform a basic operation (e.g., checking if root exists)
$filesystem->fileExists('test.txt'); // Adjust with any existing file
return 1;
} catch (UnableToCheckExistence $e) {
return $e->getMessage();
} catch (\Exception $e) {
return $e->getMessage();
}
}
if ($ftp_details['ftp_protocol'] == 'sftp') {
$filesystem = new Filesystem(new SftpAdapter(
new SftpConnectionProvider(
$ftp_details['ftp_host'],
$ftp_details['ftp_user_name'],
$ftp_details['ftp_password'], // password (optional, default: null) set to null if privateKey is used
null, // private key (optional, default: null) can be used instead of password, set to null if password is set
null, // passphrase (optional, default: null), set to null if privateKey is not used or has no passphrase
(int)$ftp_details['ftp_port'], // port (optional, default: 22)
false, // use agent (optional, default: false)
30, // timeout (optional, default: 10)
10, // max tries (optional, default: 4)
null, // host fingerprint (optional, default: null),
null, // connectivity checker (must be an implementation of 'League\Flysystem\PhpseclibV2\ConnectivityChecker' to check if a connection can be established (optional, omit if you don't need some special handling for setting reliable connections)
),
$ftp_details['ftp_folder'],
PortableVisibilityConverter::fromArray([
'file' => [
'public' => 0640,
'private' => 0604,
],
'dir' => [
'public' => 0740,
'private' => 7604,
],
])
));
try {
// Perform a basic operation (e.g., checking if root exists)
$filesystem->fileExists('test.txt'); // Adjust with any existing file
return 1;
} catch (UnableToCheckExistence $e) {
return $e->getMessage();
} catch (\Exception $e) {
return $e->getMessage();
}
}
}
}