Files
CyberPanel/premiumPlugin/views.py

407 lines
18 KiB
Python

# -*- coding: utf-8 -*-
"""
Premium Plugin Views - Unified Verification (same as contaboAutoSnapshot)
Supports: Plugin Grants, Activation Key, Patreon, PayPal, AES encryption
"""
from django.shortcuts import render, redirect
from django.http import JsonResponse, HttpResponse
from django.views.decorators.http import require_http_methods
from plogical.mailUtilities import mailUtilities
from plogical.httpProc import httpProc
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from functools import wraps
import urllib.request
import urllib.error
import json
from .models import PremiumPluginConfig
from . import api_encryption
PLUGIN_NAME = 'premiumPlugin'
PLUGIN_VERSION = '1.0.2'
REMOTE_VERIFICATION_PATREON_URL = 'https://api.newstargeted.com/api/verify-patreon-membership.php'
REMOTE_VERIFICATION_PAYPAL_URL = 'https://api.newstargeted.com/api/verify-paypal-payment.php'
REMOTE_VERIFICATION_PLUGIN_GRANT_URL = 'https://api.newstargeted.com/api/verify-plugin-grant.php'
REMOTE_ACTIVATION_KEY_URL = 'https://api.newstargeted.com/api/activate-plugin-key.php'
PATREON_TIER = 'CyberPanel Paid Plugin'
PATREON_URL = 'https://www.patreon.com/membership/27789984'
PAYPAL_ME_URL = 'https://paypal.me/KimBS?locale.x=en_US&country.x=NO'
PAYPAL_PAYMENT_LINK = ''
def cyberpanel_login_required(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
try:
if not request.session.get('userID'):
from loginSystem.views import loadLoginPage
return redirect(loadLoginPage)
return view_func(request, *args, **kwargs)
except KeyError:
from loginSystem.views import loadLoginPage
return redirect(loadLoginPage)
return _wrapped_view
def _api_request(url, data, timeout=10):
"""Send encrypted API request and return decoded response dict."""
try:
body, extra_headers = api_encryption.encrypt_payload(data)
headers = {
'User-Agent': f'CyberPanel-Plugin/{PLUGIN_VERSION}',
'X-Plugin-Name': PLUGIN_NAME
}
headers.update(extra_headers)
req = urllib.request.Request(url, data=body, headers=headers)
with urllib.request.urlopen(req, timeout=timeout) as response:
raw = response.read()
ct = response.headers.get('Content-Type', '')
expect_enc = extra_headers.get('X-Encrypted') == '1'
return api_encryption.decrypt_response(raw, ct, expect_encrypted=expect_enc)
except Exception as e:
logging.writeToFile(f"Premium Plugin: API request error to {url}: {str(e)}")
return {}
def check_plugin_grant(user_email, user_ip='', domain=''):
try:
request_data = {
'user_email': user_email or '',
'plugin_name': PLUGIN_NAME,
'user_ip': user_ip,
'domain': domain,
}
data = _api_request(REMOTE_VERIFICATION_PLUGIN_GRANT_URL, request_data)
if data.get('success') and data.get('has_access'):
return {'has_access': True, 'message': data.get('message', 'Access granted via Plugin Grants')}
return {'has_access': False, 'message': data.get('message', '')}
except Exception as e:
logging.writeToFile(f"Premium Plugin: Plugin grant check error: {str(e)}")
return {'has_access': False, 'message': ''}
def check_patreon_membership(user_email, user_ip='', domain=''):
try:
request_data = {
'user_email': user_email,
'plugin_name': PLUGIN_NAME,
'plugin_version': PLUGIN_VERSION,
'user_ip': user_ip,
'domain': domain,
'tier_id': '27789984'
}
response_data = _api_request(REMOTE_VERIFICATION_PATREON_URL, request_data)
if response_data.get('success', False):
return {
'has_access': response_data.get('has_access', False),
'patreon_tier': response_data.get('patreon_tier', PATREON_TIER),
'patreon_url': response_data.get('patreon_url', PATREON_URL),
'message': response_data.get('message', 'Access granted'),
'error': None
}
return {
'has_access': False,
'patreon_tier': PATREON_TIER,
'patreon_url': PATREON_URL,
'message': response_data.get('message', 'Patreon subscription required'),
'error': response_data.get('error')
}
except Exception as e:
logging.writeToFile(f"Premium Plugin: Patreon check error: {str(e)}")
return {
'has_access': False,
'patreon_tier': PATREON_TIER,
'patreon_url': PATREON_URL,
'message': 'Unable to verify Patreon membership.',
'error': str(e)
}
def check_paypal_payment(user_email, user_ip='', domain=''):
try:
request_data = {
'user_email': user_email,
'plugin_name': PLUGIN_NAME,
'plugin_version': PLUGIN_VERSION,
'user_ip': user_ip,
'domain': domain,
'timestamp': 0,
}
import time
request_data['timestamp'] = int(time.time())
response_data = _api_request(REMOTE_VERIFICATION_PAYPAL_URL, request_data)
if response_data.get('success', False):
return {
'has_access': response_data.get('has_access', False),
'paypal_me_url': response_data.get('paypal_me_url', PAYPAL_ME_URL),
'paypal_payment_link': response_data.get('paypal_payment_link', PAYPAL_PAYMENT_LINK),
'message': response_data.get('message', 'Access granted'),
'error': None
}
return {
'has_access': False,
'paypal_me_url': PAYPAL_ME_URL,
'paypal_payment_link': PAYPAL_PAYMENT_LINK,
'message': response_data.get('message', 'PayPal payment required'),
'error': response_data.get('error')
}
except Exception as e:
logging.writeToFile(f"Premium Plugin: PayPal check error: {str(e)}")
return {
'has_access': False,
'paypal_me_url': PAYPAL_ME_URL,
'paypal_payment_link': PAYPAL_PAYMENT_LINK,
'message': 'Unable to verify PayPal payment.',
'error': str(e)
}
def unified_verification_required(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
try:
if not request.session.get('userID'):
from loginSystem.views import loadLoginPage
return redirect(loadLoginPage)
user_email = request.session.get('email', '') or (getattr(request.user, 'email', '') if hasattr(request, 'user') and request.user else '') or getattr(request.user, 'username', '')
try:
config = PremiumPluginConfig.get_config()
payment_method = config.payment_method
except Exception:
payment_method = 'both'
has_access = False
verification_result = {}
activation_key = request.GET.get('activation_key') or request.POST.get('activation_key')
if not activation_key:
try:
config = PremiumPluginConfig.get_config()
activation_key = getattr(config, 'activation_key', '') or ''
except Exception:
activation_key = ''
if activation_key:
try:
request_data = {
'activation_key': activation_key.strip(),
'plugin_name': PLUGIN_NAME,
'user_email': user_email
}
response_data = _api_request(REMOTE_ACTIVATION_KEY_URL, request_data)
if response_data.get('success', False) and response_data.get('has_access', False):
has_access = True
verification_result = {'method': 'activation_key', 'has_access': True, 'message': response_data.get('message', 'Access activated via key')}
try:
config = PremiumPluginConfig.get_config()
config.activation_key = activation_key.strip()
config.save(update_fields=['activation_key', 'updated_at'])
except Exception as e:
logging.writeToFile(f"Premium Plugin: Could not persist activation key: {str(e)}")
elif not response_data.get('success') and activation_key:
try:
config = PremiumPluginConfig.get_config()
if getattr(config, 'activation_key', '') == activation_key.strip():
config.activation_key = ''
config.save(update_fields=['activation_key', 'updated_at'])
except Exception:
pass
except Exception as e:
logging.writeToFile(f"Premium Plugin: Activation key check error: {str(e)}")
if not has_access:
grant_result = check_plugin_grant(user_email, request.META.get('REMOTE_ADDR', ''), request.get_host())
if grant_result.get('has_access'):
has_access = True
verification_result = {'method': 'plugin_grant', 'has_access': True, 'message': grant_result.get('message', 'Access granted via Plugin Grants')}
if not has_access:
try:
if payment_method == 'patreon':
result = check_patreon_membership(user_email, request.META.get('REMOTE_ADDR', ''), request.get_host())
has_access = result.get('has_access', False)
verification_result = {
'method': 'patreon', 'has_access': has_access,
'patreon_tier': result.get('patreon_tier', PATREON_TIER),
'patreon_url': result.get('patreon_url', PATREON_URL),
'paypal_me_url': PAYPAL_ME_URL, 'paypal_payment_link': PAYPAL_PAYMENT_LINK,
'message': result.get('message', 'Patreon subscription required'),
'error': result.get('error')
}
elif payment_method == 'paypal':
result = check_paypal_payment(user_email, request.META.get('REMOTE_ADDR', ''), request.get_host())
has_access = result.get('has_access', False)
verification_result = {
'method': 'paypal', 'has_access': has_access,
'patreon_tier': PATREON_TIER, 'patreon_url': PATREON_URL,
'paypal_me_url': result.get('paypal_me_url', PAYPAL_ME_URL),
'paypal_payment_link': result.get('paypal_payment_link', PAYPAL_PAYMENT_LINK),
'message': result.get('message', 'PayPal payment required'),
'error': result.get('error')
}
else:
patreon_result = check_patreon_membership(user_email, request.META.get('REMOTE_ADDR', ''), request.get_host())
paypal_result = check_paypal_payment(user_email, request.META.get('REMOTE_ADDR', ''), request.get_host())
has_access = patreon_result.get('has_access', False) or paypal_result.get('has_access', False)
verification_result = {
'method': 'both', 'has_access': has_access,
'patreon_tier': patreon_result.get('patreon_tier', PATREON_TIER),
'patreon_url': patreon_result.get('patreon_url', PATREON_URL),
'paypal_me_url': paypal_result.get('paypal_me_url', PAYPAL_ME_URL),
'paypal_payment_link': paypal_result.get('paypal_payment_link', PAYPAL_PAYMENT_LINK),
'message': 'Payment or subscription required' if not has_access else 'Access granted'
}
except Exception as e:
logging.writeToFile(f"Premium Plugin: Verification error: {str(e)}")
has_access = False
verification_result = {
'method': payment_method, 'has_access': False,
'patreon_tier': PATREON_TIER, 'patreon_url': PATREON_URL,
'paypal_me_url': PAYPAL_ME_URL, 'paypal_payment_link': PAYPAL_PAYMENT_LINK,
'message': 'Unable to verify access.',
'error': str(e)
}
if not has_access:
context = {
'plugin_name': 'Premium Plugin Example',
'is_paid': True,
'payment_method': payment_method,
'verification_result': verification_result,
'patreon_tier': verification_result.get('patreon_tier', PATREON_TIER),
'patreon_url': verification_result.get('patreon_url', PATREON_URL),
'paypal_me_url': verification_result.get('paypal_me_url', PAYPAL_ME_URL),
'paypal_payment_link': verification_result.get('paypal_payment_link', PAYPAL_PAYMENT_LINK),
'message': verification_result.get('message', 'Payment or subscription required'),
'error': verification_result.get('error')
}
proc = httpProc(request, 'premiumPlugin/subscription_required.html', context, 'admin')
return proc.render()
if has_access and verification_result:
request.session['premium_plugin_access_via'] = verification_result.get('method', '')
return view_func(request, *args, **kwargs)
except Exception as e:
logging.writeToFile(f"Premium Plugin: Decorator error: {str(e)}")
return HttpResponse(f"<div style='padding: 20px;'><h2>Plugin Error</h2><p>{str(e)}</p></div>")
return _wrapped_view
@cyberpanel_login_required
def main_view(request):
mailUtilities.checkHome()
return redirect('premiumPlugin:settings')
@cyberpanel_login_required
@unified_verification_required
def settings_view(request):
mailUtilities.checkHome()
try:
config = PremiumPluginConfig.get_config()
except Exception:
from django.core.management import call_command
try:
call_command('migrate', 'premiumPlugin', verbosity=0, interactive=False)
config = PremiumPluginConfig.get_config()
except Exception as e:
return HttpResponse(f"<div style='padding: 20px;'><h2>Database Error</h2><p>{str(e)}</p></div>")
access_via = request.session.get('premium_plugin_access_via', '')
show_payment_ui = access_via not in ('plugin_grant', 'activation_key')
context = {
'plugin_name': 'Premium Plugin Example',
'version': PLUGIN_VERSION,
'status': 'Active',
'config': config,
'has_access': True,
'show_payment_ui': show_payment_ui,
'access_via_grant_or_key': not show_payment_ui,
'patreon_tier': PATREON_TIER,
'patreon_url': PATREON_URL,
'paypal_me_url': PAYPAL_ME_URL,
'paypal_payment_link': PAYPAL_PAYMENT_LINK,
'description': 'Configure your premium plugin settings.',
}
proc = httpProc(request, 'premiumPlugin/settings.html', context, 'admin')
return proc.render()
@cyberpanel_login_required
@require_http_methods(["POST"])
def activate_key(request):
try:
if request.content_type == 'application/json':
data = json.loads(request.body)
else:
data = request.POST
activation_key = data.get('activation_key', '').strip()
user_email = data.get('user_email', '').strip()
if not user_email:
user_email = request.session.get('email', '') or (getattr(request.user, 'email', '') if hasattr(request, 'user') and request.user else '')
if not activation_key:
return JsonResponse({'success': False, 'message': 'Activation key is required'}, status=400)
request_data = {'activation_key': activation_key, 'plugin_name': PLUGIN_NAME, 'user_email': user_email}
response_data = _api_request(REMOTE_ACTIVATION_KEY_URL, request_data)
if response_data.get('success', False) and response_data.get('has_access', False):
try:
config = PremiumPluginConfig.get_config()
config.activation_key = activation_key
config.save(update_fields=['activation_key', 'updated_at'])
except Exception as e:
logging.writeToFile(f"Premium Plugin: Could not persist activation key: {str(e)}")
return JsonResponse({
'success': True,
'has_access': True,
'message': response_data.get('message', 'Access activated successfully')
})
return JsonResponse({
'success': False,
'has_access': False,
'message': response_data.get('message', 'Invalid activation key')
})
except Exception as e:
logging.writeToFile(f"Premium Plugin: activate_key error: {str(e)}")
return JsonResponse({'success': False, 'message': str(e)}, status=500)
@cyberpanel_login_required
@require_http_methods(["POST"])
def save_payment_method(request):
try:
payment_method = request.POST.get('payment_method', 'both')
if payment_method not in ('patreon', 'paypal', 'both'):
payment_method = 'both'
config = PremiumPluginConfig.get_config()
config.payment_method = payment_method
config.save(update_fields=['payment_method', 'updated_at'])
return JsonResponse({'success': True, 'message': 'Payment method saved'})
except Exception as e:
return JsonResponse({'success': False, 'message': str(e)}, status=500)
@cyberpanel_login_required
@unified_verification_required
def api_status_view(request):
return JsonResponse({
'plugin_name': 'Premium Plugin Example',
'version': PLUGIN_VERSION,
'status': 'active',
'subscription': 'active',
'verification_method': 'unified'
})