lots of progress

This commit is contained in:
2025-03-31 23:49:32 +03:00
parent 5b26f832cd
commit 213f0ea8f1
17 changed files with 1067 additions and 68 deletions
@@ -0,0 +1,161 @@
@extends('layouts.app')
@section('content')
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">IP Geolocation Lookup</h5>
</div>
<div class="card-body">
<form id="ipLookupForm">
@csrf
<div class="mb-3">
<label for="ip" class="form-label">IP Address</label>
<div class="input-group">
<input type="text" class="form-control" id="ip" name="ip" required placeholder="e.g., 8.8.8.8">
<button type="submit" class="btn btn-primary">
<i class="bi bi-search me-2"></i>Lookup
</button>
</div>
</div>
</form>
<div id="results" class="mt-4" style="display: none;">
<h6 class="mb-3">Location Information</h6>
<div class="card">
<div class="card-body">
<div id="resultContent"></div>
</div>
</div>
</div>
<div id="loading" class="mt-4 text-center" style="display: none;">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<p class="mt-2">Looking up IP address...</p>
</div>
</div>
</div>
</div>
</div>
</div>
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
const form = document.getElementById('ipLookupForm');
const results = document.getElementById('results');
const resultContent = document.getElementById('resultContent');
const loading = document.getElementById('loading');
form.addEventListener('submit', async function(e) {
e.preventDefault();
// Show loading, hide results
loading.style.display = 'block';
results.style.display = 'none';
try {
console.log('Submitting form with IP:', form.ip.value);
const response = await fetch('{{ route("ip-geolocation.lookup") }}', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
},
body: JSON.stringify({
ip: form.ip.value
})
});
console.log('Response status:', response.status);
const data = await response.json();
console.log('Response data:', data);
// Hide loading
loading.style.display = 'none';
// Show results
results.style.display = 'block';
if (data.success) {
resultContent.innerHTML = `
<div class="alert alert-success">
<i class="bi bi-check-circle-fill me-2"></i>Location information found
</div>
<div class="table-responsive">
<table class="table table-sm">
<tbody>
<tr>
<th>Country:</th>
<td>${data.data.country}</td>
</tr>
<tr>
<th>City:</th>
<td>${data.data.city}</td>
</tr>
<tr>
<th>Region:</th>
<td>${data.data.region}</td>
</tr>
<tr>
<th>Timezone:</th>
<td>${data.data.timezone}</td>
</tr>
<tr>
<th>ISP:</th>
<td>${data.data.isp}</td>
</tr>
<tr>
<th>Organization:</th>
<td>${data.data.org}</td>
</tr>
<tr>
<th>AS:</th>
<td>${data.data.as}</td>
</tr>
<tr>
<th>Coordinates:</th>
<td>${data.data.latitude}, ${data.data.longitude}</td>
</tr>
<tr>
<th>ZIP Code:</th>
<td>${data.data.zip}</td>
</tr>
</tbody>
</table>
</div>
<div class="mt-3">
<a href="https://www.google.com/maps?q=${data.data.latitude},${data.data.longitude}"
target="_blank"
class="btn btn-outline-primary btn-sm">
<i class="bi bi-geo-alt me-2"></i>View on Google Maps
</a>
</div>
`;
} else {
resultContent.innerHTML = `
<div class="alert alert-danger">
<i class="bi bi-x-circle-fill me-2"></i>${data.message}
</div>
`;
}
} catch (error) {
console.error('Error:', error);
loading.style.display = 'none';
results.style.display = 'block';
resultContent.innerHTML = `
<div class="alert alert-danger">
<i class="bi bi-x-circle-fill me-2"></i>An error occurred while looking up the IP address: ${error.message}
</div>
`;
}
});
});
</script>
@endpush
@endsection
@@ -29,6 +29,21 @@
{{ __('Port Scanner') }}
</a>
</li>
<li class="nav-item">
<a class="nav-link {{ request()->routeIs('proxy-checker.index') ? 'active' : '' }}" href="{{ route('proxy-checker.index') }}">
{{ __('Proxy Checker') }}
</a>
</li>
<li class="nav-item">
<a class="nav-link {{ request()->routeIs('ip-geolocation.index') ? 'active' : '' }}" href="{{ route('ip-geolocation.index') }}">
{{ __('IP Lookup') }}
</a>
</li>
<li class="nav-item">
<a class="nav-link {{ request()->routeIs('pac.file') ? 'active' : '' }}" href="{{ route('pac.file') }}">
{{ __('PAC File') }}
</a>
</li>
<li class="nav-item">
<a class="nav-link {{ request()->routeIs('subscriptions.index') ? 'active' : '' }}" href="{{ route('subscriptions.index') }}">
{{ __('Subscriptions') }}
+151
View File
@@ -0,0 +1,151 @@
@extends('layouts.app')
@section('content')
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card shadow-sm">
<div class="card-body p-4">
<div class="text-center mb-4">
<i class="bi bi-gear-wide-connected display-4 text-primary mb-3"></i>
<h1 class="h3 mb-2">Proxy Auto-Configuration (PAC) File</h1>
<p class="text-muted">Configure your browser to automatically use our proxy servers</p>
</div>
<div class="mb-4">
<h2 class="h5 mb-3">What is a PAC File?</h2>
<p>A Proxy Auto-Configuration (PAC) file is a JavaScript file that defines how web browsers and other user agents can automatically choose the appropriate proxy server (access method) for fetching a given URL.</p>
<p>Our PAC file automatically selects the best proxy server from our database based on their performance scores.</p>
</div>
<div class="mb-4">
<h2 class="h5 mb-3">Your PAC File URL</h2>
<div class="card mb-4">
<div class="card-body">
<p class="mb-3">Use this URL in any browser to configure automatic proxy settings:</p>
<div class="input-group">
<input type="text" class="form-control" id="pacUrl" value="{{ route('pac.generate') }}" readonly>
<button class="btn btn-outline-primary" type="button" onclick="copyToClipboard('pacUrl')">
<i class="bi bi-clipboard"></i>
</button>
</div>
</div>
</div>
<h2 class="h5 mb-3">How to Configure Your Browser</h2>
<!-- Firefox Instructions -->
<div class="card mb-3">
<div class="card-header bg-light">
<i class="bi bi-firefox me-2"></i>Firefox
</div>
<div class="card-body">
<ol class="list-group list-group-numbered mb-3">
<li class="list-group-item">Open Firefox Settings (Menu → Settings)</li>
<li class="list-group-item">Scroll down to "Network Settings"</li>
<li class="list-group-item">Click "Settings..."</li>
<li class="list-group-item">Select "Automatic proxy configuration URL"</li>
<li class="list-group-item">Paste the PAC URL from above</li>
</ol>
</div>
</div>
<!-- Chrome Instructions -->
<div class="card mb-3">
<div class="card-header bg-light">
<i class="bi bi-google-chrome me-2"></i>Chrome
</div>
<div class="card-body">
<ol class="list-group list-group-numbered mb-3">
<li class="list-group-item">Open Chrome Settings (Menu → Settings)</li>
<li class="list-group-item">Click on "Advanced" to expand settings</li>
<li class="list-group-item">Under "System", click "Open your computer's proxy settings"</li>
<li class="list-group-item">In Windows: Select "Automatic proxy setup" and paste the PAC URL</li>
<li class="list-group-item">In macOS: Select "Automatic Proxy Configuration" and paste the PAC URL</li>
</ol>
</div>
</div>
<!-- Safari Instructions -->
<div class="card mb-3">
<div class="card-header bg-light">
<i class="bi bi-safari me-2"></i>Safari
</div>
<div class="card-body">
<ol class="list-group list-group-numbered mb-3">
<li class="list-group-item">Open Safari Preferences (Safari → Preferences)</li>
<li class="list-group-item">Click on "Advanced" tab</li>
<li class="list-group-item">Click "Change Settings..." next to "Proxies"</li>
<li class="list-group-item">Select "Automatic Proxy Configuration"</li>
<li class="list-group-item">Paste the PAC URL in the field</li>
</ol>
</div>
</div>
<!-- Edge Instructions -->
<div class="card mb-3">
<div class="card-header bg-light">
<i class="bi bi-edge me-2"></i>Microsoft Edge
</div>
<div class="card-body">
<ol class="list-group list-group-numbered mb-3">
<li class="list-group-item">Open Edge Settings (Menu → Settings)</li>
<li class="list-group-item">Click on "System and performance"</li>
<li class="list-group-item">Click "Open your computer's proxy settings"</li>
<li class="list-group-item">In Windows: Select "Automatic proxy setup" and paste the PAC URL</li>
</ol>
</div>
</div>
</div>
<div class="mb-4">
<h2 class="h5 mb-3">Features of Our PAC File</h2>
<ul class="list-group">
<li class="list-group-item">
<i class="bi bi-check-circle-fill text-success me-2"></i>
Automatically selects the best performing proxy servers
</li>
<li class="list-group-item">
<i class="bi bi-check-circle-fill text-success me-2"></i>
Bypasses proxy for localhost and local network addresses
</li>
<li class="list-group-item">
<i class="bi bi-check-circle-fill text-success me-2"></i>
Updates automatically as proxy performance changes
</li>
<li class="list-group-item">
<i class="bi bi-check-circle-fill text-success me-2"></i>
Fallback to direct connection if no proxies are available
</li>
</ul>
</div>
<div class="text-center">
<a href="{{ route('pac.generate') }}" class="btn btn-primary">
<i class="bi bi-download me-2"></i>Download PAC File
</a>
</div>
</div>
</div>
</div>
</div>
</div>
@push('scripts')
<script>
function copyToClipboard(elementId) {
const element = document.getElementById(elementId);
element.select();
document.execCommand('copy');
// Show feedback
const button = element.nextElementSibling;
const originalContent = button.innerHTML;
button.innerHTML = '<i class="bi bi-check"></i>';
setTimeout(() => {
button.innerHTML = originalContent;
}, 2000);
}
</script>
@endpush
@endsection
@@ -0,0 +1,146 @@
@extends('layouts.app')
@section('content')
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Proxy Checker</h5>
</div>
<div class="card-body">
<form id="proxyCheckForm">
<div class="mb-3">
<label for="ip" class="form-label">Proxy IP Address</label>
<input type="text" class="form-control" id="ip" name="ip" required placeholder="e.g., 192.168.1.1">
</div>
<div class="mb-3">
<label for="port" class="form-label">Port</label>
<input type="number" class="form-control" id="port" name="port" required placeholder="e.g., 8080" min="1" max="65535">
</div>
<div class="mb-3">
<label for="type" class="form-label">Proxy Type</label>
<select class="form-select" id="type" name="type" required>
<option value="http">HTTP</option>
<option value="https">HTTPS</option>
<option value="socks4">SOCKS4</option>
<option value="socks5">SOCKS5</option>
</select>
</div>
<div class="mb-3">
<label for="test_url" class="form-label">Test URL</label>
<input type="url" class="form-control" id="test_url" name="test_url" required placeholder="e.g., https://example.com" value="https://example.com">
</div>
<button type="submit" class="btn btn-primary">
<i class="bi bi-search me-2"></i>Check Proxy
</button>
</form>
<div id="results" class="mt-4" style="display: none;">
<h6 class="mb-3">Test Results</h6>
<div class="card">
<div class="card-body">
<div id="resultContent"></div>
</div>
</div>
</div>
<div id="loading" class="mt-4 text-center" style="display: none;">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<p class="mt-2">Checking proxy...</p>
</div>
</div>
</div>
</div>
</div>
</div>
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
const form = document.getElementById('proxyCheckForm');
const results = document.getElementById('results');
const resultContent = document.getElementById('resultContent');
const loading = document.getElementById('loading');
form.addEventListener('submit', async function(e) {
e.preventDefault();
// Show loading, hide results
loading.style.display = 'block';
results.style.display = 'none';
try {
const response = await fetch('{{ route("proxy-checker.check") }}', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
body: JSON.stringify({
ip: form.ip.value,
port: form.port.value,
type: form.type.value,
test_url: form.test_url.value
})
});
const data = await response.json();
// Hide loading
loading.style.display = 'none';
// Show results
results.style.display = 'block';
if (data.success) {
resultContent.innerHTML = `
<div class="alert alert-success">
<i class="bi bi-check-circle-fill me-2"></i>${data.message}
</div>
<div class="table-responsive">
<table class="table table-sm">
<tbody>
<tr>
<th>Status Code:</th>
<td>${data.data.status_code}</td>
</tr>
<tr>
<th>Response Time:</th>
<td>${data.data.speed} ms</td>
</tr>
<tr>
<th>Content Type:</th>
<td>${data.data.content_type}</td>
</tr>
</tbody>
</table>
</div>
`;
} else {
resultContent.innerHTML = `
<div class="alert alert-danger">
<i class="bi bi-x-circle-fill me-2"></i>${data.message}
</div>
`;
}
} catch (error) {
loading.style.display = 'none';
results.style.display = 'block';
resultContent.innerHTML = `
<div class="alert alert-danger">
<i class="bi bi-x-circle-fill me-2"></i>An error occurred while checking the proxy.
</div>
`;
}
});
});
</script>
@endpush
@endsection
+87 -13
View File
@@ -1,18 +1,92 @@
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('Subscriptions') }}
</h2>
</x-slot>
@extends('layouts.app')
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6 text-gray-900">
<h3 class="text-lg font-medium mb-4">Available Subscriptions</h3>
<p class="text-gray-600">This page will display available subscription plans. Content coming soon.</p>
@section('content')
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-lg-10">
<div class="text-center mb-5">
<h1 class="h2 mb-3">Choose Your Subscription Plan</h1>
<p class="text-muted">Select the plan that best fits your needs</p>
</div>
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
{{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
@if(session('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
{{ session('error') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
@if($userSubscription)
<div class="card mb-4">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 class="card-title mb-1">Current Subscription: {{ $userSubscription->subscription->name }}</h5>
<p class="card-text text-muted mb-0">
Expires: {{ $userSubscription->expires_at->format('F j, Y') }}
</p>
</div>
<form action="{{ route('subscriptions.cancel', $userSubscription) }}" method="POST" class="d-inline">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-outline-danger" onclick="return confirm('Are you sure you want to cancel your subscription?')">
Cancel Subscription
</button>
</form>
</div>
</div>
</div>
@endif
<div class="row g-4">
@foreach($subscriptions as $subscription)
<div class="col-md-4">
<div class="card h-100 {{ $subscription->name === 'Pro' ? 'border-primary' : '' }}">
@if($subscription->name === 'Pro')
<div class="card-header bg-primary text-white text-center">
<span class="badge bg-white text-primary">Most Popular</span>
</div>
@endif
<div class="card-body">
<h3 class="card-title text-center mb-4">{{ $subscription->name }}</h3>
<div class="text-center mb-4">
<span class="display-4">${{ number_format($subscription->price, 2) }}</span>
<span class="text-muted">/month</span>
</div>
<p class="card-text text-center mb-4">{{ $subscription->description }}</p>
<ul class="list-unstyled mb-4">
@foreach($subscription->features as $feature)
<li class="mb-2">
<i class="bi bi-check-circle-fill text-success me-2"></i>
{{ $feature }}
</li>
@endforeach
</ul>
<div class="text-center">
@if($userSubscription && $userSubscription->subscription_id === $subscription->id)
<button class="btn btn-outline-primary" disabled>Current Plan</button>
@else
<form action="{{ route('subscriptions.subscribe', $subscription) }}" method="POST">
@csrf
<button type="submit" class="btn btn-primary">
Subscribe Now
</button>
</form>
@endif
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
</div>
</x-app-layout>
</div>
@endsection
-53
View File
@@ -1,53 +0,0 @@
@if ($paginator->hasPages())
<nav aria-label="Page navigation">
<ul class="pagination pagination-sm mb-0">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled">
<span class="page-link">
<i class="bi bi-chevron-left"></i>
</span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">
<i class="bi bi-chevron-left"></i>
</a>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="page-item active">
<span class="page-link">{{ $page }}</span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $url }}">{{ $page }}</a>
</li>
@endif
@endforeach
@endif
@endforeach
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">
<i class="bi bi-chevron-right"></i>
</a>
</li>
@else
<li class="page-item disabled">
<span class="page-link">
<i class="bi bi-chevron-right"></i>
</span>
</li>
@endif
</ul>
</nav>
@endif