<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\Helper;
use App\Http\Requests\LicenseRequest;
use App\Http\Requests\Settings\AuthenticationRequest;
use App\Http\Requests\Settings\DefaultCustomerPermission;
use App\Http\Requests\Settings\NotificationsRequest;
use App\Http\Requests\Settings\PostGeneralRequest;
use App\Http\Requests\Settings\PusherRequest;
use App\Http\Requests\Settings\SystemEmailRequest;
use App\Http\Requests\Settings\UpdateVersionRequest;
use App\Library\Tool;
use App\Library\Unzipper;
use App\Models\AppConfig;
use App\Models\Customer;
use App\Models\Language;
use App\Models\SendingServer;
use App\Models\User;
use App\Repositories\Contracts\SettingsRepository;
use Auth;
use Exception;
use File;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Artisan;
use Illuminate\View\View;
class SettingsController extends AdminBaseController
{
protected SettingsRepository $settings;
/**
* SettingsController constructor.
*
* @param SettingsRepository $settings
*/
public function __construct(SettingsRepository $settings)
{
$this->settings = $settings;
}
/**
* Update all system settings.
*
* @return Application|Factory|\Illuminate\Contracts\View\View|string
* @throws AuthorizationException
*/
public function general(): \Illuminate\Contracts\View\View|Factory|string|Application
{
$this->authorize('general settings');
$breadcrumbs = [
['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')],
['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Settings')],
['name' => __('locale.menu.All Settings')],
];
$language = Language::where('status', true)->get();
$sending_servers = SendingServer::where('status', true)->get();
// Suggestion paths
$paths = [
'/usr/bin/php',
'/usr/local/bin/php',
'/bin/php',
'/usr/bin/php7',
'/usr/bin/php7.0',
'/usr/bin/php70',
'/usr/bin/php7.1',
'/usr/bin/php71',
'/usr/bin/php56',
'/usr/bin/php5.6',
'/opt/plesk/php/5.6/bin/php',
'/opt/plesk/php/7.0/bin/php',
'/opt/plesk/php/7.1/bin/php',
];
// try to detect system's PHP CLI
if (Helper::exec_enabled()) {
try {
$paths = array_unique(array_merge($paths, explode(" ", exec("whereis php"))));
$server_php_path = exec('which php');
if ($server_php_path == "") {
$server_php_path = Helper::app_config('php_bin_path');
}
$get_message = '';
} catch (Exception $e) {
$server_php_path = Helper::app_config('php_bin_path');
$get_message = $e->getMessage();
}
} else {
$server_php_path = Helper::app_config('php_bin_path');
$get_message = 'WARNING: Please enable PHP `exec` function to validate the cron job setting';
}
$paths = array_values(array_filter($paths, function ($path) {
try {
return is_executable($path) && preg_match($path, "/php[0-9\.a-z]{0,3}$/i");
} catch (Exception $e) {
return $e->getMessage();
}
}));
$categories = collect(config('customer-permissions'))->map(function ($value, $key) {
$value['name'] = $key;
return $value;
})->groupBy('category');
$permissions = $categories->keys()->map(function ($key) use ($categories) {
return [
'title' => $key,
'permissions' => $categories[$key],
];
});
$existing_permission = json_decode(Customer::customerPermissions(), true);
return view('admin.settings.AllSettings.system_settings', compact('breadcrumbs', 'language', 'sending_servers', 'paths', 'get_message', 'server_php_path', 'permissions', 'existing_permission'));
}
/**
* update general settings
*
* @param PostGeneralRequest $request
*
* @return RedirectResponse
*/
public function postGeneral(PostGeneralRequest $request): RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.general')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
if (isset($request->app_logo) && $request->hasFile('app_logo') && $request->file('app_logo')->isValid()) {
AppConfig::uploadFile($request->file('app_logo'), 'app_logo');
}
if (isset($request->app_favicon) && $request->hasFile('app_favicon') && $request->file('app_favicon')->isValid()) {
AppConfig::uploadFile($request->file('app_favicon'), 'app_favicon');
}
if ($request->app_name != config('app.name')) {
AppConfig::setEnv('APP_NAME', $request->app_name);
}
if ($request->app_title != config('app.title')) {
AppConfig::setEnv('APP_TITLE', $request->app_title);
}
if ($request->country != config('app.country')) {
AppConfig::setEnv('APP_COUNTRY', $request->country);
}
if ($request->timezone != config('app.timezone')) {
AppConfig::setEnv('APP_TIMEZONE', $request->timezone);
User::where('id', 1)->update([
'timezone' => $request->timezone,
]);
}
if ($request->language != config('app.locale')) {
session(['locale' => $request->language]);
AppConfig::setEnv('APP_LOCALE', $request->language);
}
if ($request->date_format != config('app.date_format')) {
AppConfig::setEnv('APP_DATE_FORMAT', $request->date_format);
}
if ($request->app_keyword != config('app.app_keyword')) {
AppConfig::setEnv('APP_KEYWORD', $request->app_keyword);
}
if ($request->footer_text != config('app.footer_text')) {
AppConfig::setEnv('APP_FOOTER_TEXT', $request->footer_text);
}
$this->settings->general($request->except('_token', 'app_logo', 'app_favicon'));
return redirect()->route('admin.settings.general')->withInput(['tab' => 'general'])->with([
'status' => 'success',
'message' => __('locale.settings.settings_successfully_updated'),
]);
}
/**
* update system email settings
*
* @param SystemEmailRequest $request
*
* @return RedirectResponse
*/
public function email(SystemEmailRequest $request): RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.general')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
$this->settings->systemEmail($request->except('_token'));
return redirect()->route('admin.settings.general')->withInput(['tab' => 'system_email'])->with([
'status' => 'success',
'message' => __('locale.settings.settings_successfully_updated'),
]);
}
/**
* update authentication settings
*
* @param AuthenticationRequest $request
*
* @return RedirectResponse
*/
public function authentication(AuthenticationRequest $request): RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.general')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
$this->settings->authentication($request->except('_token'));
return redirect()->route('admin.settings.general')->withInput(['tab' => 'authentication'])->with([
'status' => 'success',
'message' => __('locale.settings.settings_successfully_updated'),
]);
}
/**
* update notifications settings
*
* @param NotificationsRequest $request
*
* @return RedirectResponse
*/
public function notifications(NotificationsRequest $request): RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.general')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
$this->settings->notifications($request->except('_token'));
return redirect()->route('admin.settings.general')->withInput(['tab' => 'notifications'])->with([
'status' => 'success',
'message' => __('locale.settings.settings_successfully_updated'),
]);
}
/**
* update pusher settings
*
* @param PusherRequest $request
*
* @return RedirectResponse
*/
public function pusher(PusherRequest $request): RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.general')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
$this->settings->pusherSettings($request->except('_token'));
return redirect()->route('admin.settings.general')->withInput(['tab' => 'pusher'])->with([
'status' => 'success',
'message' => __('locale.settings.settings_successfully_updated'),
]);
}
/**
* @param LicenseRequest $request
*
* @return RedirectResponse
*/
public function license(LicenseRequest $request): RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.general')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
$purchase_code = $request->input('license');
$get_data = array();
$get_data['status'] = 'success';
$get_data['license_type'] = 'Extended license';
if (is_array($get_data) && array_key_exists('status', $get_data)) {
if ($get_data['status'] == 'success') {
AppConfig::where('setting', 'license')->update(['value' => $purchase_code]);
AppConfig::where('setting', 'license_type')->update(['value' => $get_data['license_type']]);
AppConfig::where('setting', 'valid_domain')->update(['value' => 'yes']);
return redirect()->route('admin.settings.general')->withInput(['tab' => 'license'])->with([
'status' => 'success',
'message' => 'License updated successfully',
]);
}
return redirect()->route('admin.settings.general')->withInput(['tab' => 'license'])->with([
'status' => 'error',
'message' => 'Invalid license key',
]);
}
return redirect()->route('admin.settings.general')->withInput(['tab' => 'license'])->with([
'status' => 'error',
'message' => __('locale.exceptions.something_went_wrong'),
]);
}
/**
* manage maintenance mode
*
* @return Application|Factory|View
* @throws AuthorizationException
*/
public function maintenanceMode(): Factory|View|Application
{
$this->authorize('manage maintenance_mode');
$breadcrumbs = [
['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')],
['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Settings')],
['name' => __('locale.menu.All Settings')],
];
return view('admin.settings.system_settings', compact('breadcrumbs'));
}
public function updateApplication(): Factory|\Illuminate\Contracts\View\View|Application
{
$breadcrumbs = [
['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')],
['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Settings')],
['name' => __('locale.menu.All Settings')],
];
return view('admin.settings.UpdateApplication.index', compact('breadcrumbs'));
}
/**
* @return RedirectResponse
*/
public function checkAvailableUpdate(): RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.update_application')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
$app_version = config('app.version');
$get_verification = 'https://support.codeglen.com/version/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $get_verification);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
if ($app_version == $data) {
return redirect()->route('admin.settings.update_application')->with([
'status' => 'success',
'message' => 'You are using latest version',
]);
}
return redirect()->route('admin.settings.update_application')->with([
'update_required' => true,
'version' => $data,
]);
}
public function postUpdateApplication(UpdateVersionRequest $request): JsonResponse|RedirectResponse
{
if (config('app.stage') == 'demo') {
return redirect()->route('admin.settings.update_application')->with([
'status' => 'error',
'message' => 'Sorry! This option is not available in demo mode',
]);
}
$get_version = 'https://support.codeglen.com/version/php-version.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $get_version);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$required_version = curl_exec($ch);
curl_close($ch);
if (phpversion() < $required_version) {
return redirect()->route('admin.settings.update_application')->with([
'status' => 'error',
'message' => "Sorry! You will need to upgrade your PHP to version $required_version to update to the latest version.",
]);
}
$purchase_code = $request->input('purchase_code');
$domain_name = config('app.url');
$input = trim($domain_name, '/');
$urlParts = parse_url($input);
$domain_name = preg_replace('/^www\./', '', $urlParts['host']);
$post_data = [
'purchase_code' => $purchase_code,
'domain' => $domain_name,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://ultimatesms.codeglen.com/verify/');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
$get_data = json_decode($data, true);
if (is_array($get_data) && array_key_exists('status', $get_data)) {
if ($get_data['status'] == 'success') {
$get_response = Unzipper::extractZipArchive($request->file('update_file'), base_path());
if (isset($get_response->getData()->status)) {
if ($get_response->getData()->status == 'success') {
try {
$app_path = base_path().'/bootstrap/cache/';
if (File::isDirectory($app_path)) {
File::cleanDirectory($app_path);
}
Artisan::call('optimize:clear');
Artisan::call('migrate', ['--force' => true]);
/*Update Seeder for new version*/
Tool::versionSeeder(config('app.version'));
AppConfig::setEnv('APP_VERSION', $request->version);
Auth::logout();
return response()->json([
'status' => 'success',
'redirectURL' => route('login'),
'message' => 'You have successfully updated your application.',
]);
} catch (Exception $e) {
return response()->json([
'status' => 'error',
'message' => $e->getMessage(),
]);
}
}
return response()->json([
'message' => $get_response->getData()->message,
'status' => 'error',
]);
}
return response()->json([
'message' => __('locale.exceptions.something_went_wrong'),
'status' => 'error',
]);
}
return response()->json([
'message' => $get_data['msg'],
'status' => 'error',
]);
}
return response()->json([
'message' => 'Invalid request',
'status' => 'error',
]);
}
/*Version 3.4*/
/**
* Update Default Customer Permissions
*
* @param DefaultCustomerPermission $request
*
* @return RedirectResponse
*/
public function permissions(DefaultCustomerPermission $request)
{
$permissions = array_values($request->only('permissions')['permissions']);
$app_config = AppConfig::where('setting', 'customer_permissions')->update([
'value' => $permissions,
]);
if ($app_config) {
return redirect()->route('admin.settings.general')->withInput(['tab' => 'permissions'])->with([
'status' => 'success',
'message' => __('locale.settings.settings_successfully_updated'),
]);
}
return redirect()->route('admin.settings.general')->withInput(['tab' => 'permissions'])->with([
'status' => 'error',
'message' => __('locale.exceptions.something_went_wrong'),
]);
}
}