Merge branch 'william' into 'master'
Add view to check if the vm belongs to a user (for ungleich-cli) See merge request ungleich-public/dynamicweb!705
This commit is contained in:
		
				commit
				
					
						c469948901
					
				
			
		
					 5 changed files with 67 additions and 3 deletions
				
			
		|  | @ -1,5 +1,8 @@ | ||||||
| import logging | import logging | ||||||
|  | import pyotp | ||||||
|  | import requests | ||||||
| from django.contrib.sites.models import Site | from django.contrib.sites.models import Site | ||||||
|  | from django.conf import settings | ||||||
| 
 | 
 | ||||||
| from datacenterlight.tasks import create_vm_task | from datacenterlight.tasks import create_vm_task | ||||||
| from hosting.models import HostingOrder, HostingBill, OrderDetail | from hosting.models import HostingOrder, HostingBill, OrderDetail | ||||||
|  | @ -11,7 +14,6 @@ from .models import VMPricing, VMTemplate | ||||||
| 
 | 
 | ||||||
| logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| def get_cms_integration(name): | def get_cms_integration(name): | ||||||
|     current_site = Site.objects.get_current() |     current_site = Site.objects.get_current() | ||||||
|     try: |     try: | ||||||
|  | @ -100,3 +102,22 @@ def clear_all_session_vars(request): | ||||||
|                             'generic_payment_details', 'product_id']: |                             'generic_payment_details', 'product_id']: | ||||||
|             if session_var in request.session: |             if session_var in request.session: | ||||||
|                 del request.session[session_var] |                 del request.session[session_var] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def check_otp(name, realm, token): | ||||||
|  |     data = { | ||||||
|  |         "auth_name": settings.AUTH_NAME, | ||||||
|  |         "auth_token": pyotp.TOTP(settings.AUTH_SEED).now(), | ||||||
|  |         "auth_realm": settings.AUTH_REALM, | ||||||
|  |         "name": name, | ||||||
|  |         "realm": realm, | ||||||
|  |         "token": token | ||||||
|  |     } | ||||||
|  |     response = requests.post( | ||||||
|  |         "https://{OTP_SERVER}{OTP_VERIFY_ENDPOINT}".format( | ||||||
|  |             OTP_SERVER=settings.OTP_SERVER, | ||||||
|  |             OTP_VERIFY_ENDPOINT=settings.OTP_VERIFY_ENDPOINT | ||||||
|  |         ), | ||||||
|  |         data=data | ||||||
|  |     ) | ||||||
|  |     return response.status_code | ||||||
|  |  | ||||||
|  | @ -721,6 +721,14 @@ X_FRAME_OPTIONS = ('SAMEORIGIN' if X_FRAME_OPTIONS_ALLOW_FROM_URI is None else | ||||||
| 
 | 
 | ||||||
| DEBUG = bool_env('DEBUG') | DEBUG = bool_env('DEBUG') | ||||||
| 
 | 
 | ||||||
|  | ACCOUNT_NAME = env('ACCOUNT_NAME') | ||||||
|  | AUTH_NAME = env('AUTH_NAME') | ||||||
|  | AUTH_SEED = env('AUTH_SEED') | ||||||
|  | AUTH_REALM = env('AUTH_REALM') | ||||||
|  | OTP_SERVER = env('OTP_SERVER') | ||||||
|  | OTP_VERIFY_ENDPOINT = env('OTP_VERIFY_ENDPOINT') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| if DEBUG: | if DEBUG: | ||||||
|     from .local import *  # flake8: noqa |     from .local import *  # flake8: noqa | ||||||
| else: | else: | ||||||
|  |  | ||||||
|  | @ -9,13 +9,14 @@ from .views import ( | ||||||
|     HostingPricingView, CreateVirtualMachinesView, HostingBillListView, |     HostingPricingView, CreateVirtualMachinesView, HostingBillListView, | ||||||
|     HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, |     HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, | ||||||
|     SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView, |     SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView, | ||||||
|     InvoiceListView, InvoiceDetailView |     InvoiceListView, InvoiceDetailView, CheckUserVM | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|     url(r'index/?$', IndexView.as_view(), name='index'), |     url(r'index/?$', IndexView.as_view(), name='index'), | ||||||
|     url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'), |     url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'), | ||||||
|  |     url(r'checkvm/?$', CheckUserVM.as_view(), name='check_vm'), | ||||||
|     url(r'dashboard/?$', DashboardView.as_view(), name='dashboard'), |     url(r'dashboard/?$', DashboardView.as_view(), name='dashboard'), | ||||||
|     url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'), |     url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'), | ||||||
|     url(r'rails/?$', RailsHostingView.as_view(), name='railshosting'), |     url(r'rails/?$', RailsHostingView.as_view(), name='railshosting'), | ||||||
|  |  | ||||||
|  | @ -26,6 +26,9 @@ from django.views.generic import ( | ||||||
|     View, CreateView, FormView, ListView, DetailView, DeleteView, |     View, CreateView, FormView, ListView, DetailView, DeleteView, | ||||||
|     TemplateView, UpdateView |     TemplateView, UpdateView | ||||||
| ) | ) | ||||||
|  | from rest_framework.views import APIView | ||||||
|  | from rest_framework.response import Response | ||||||
|  | from rest_framework.renderers import JSONRenderer | ||||||
| from guardian.mixins import PermissionRequiredMixin | from guardian.mixins import PermissionRequiredMixin | ||||||
| from oca.pool import WrongIdError | from oca.pool import WrongIdError | ||||||
| from stored_messages.api import mark_read | from stored_messages.api import mark_read | ||||||
|  | @ -34,7 +37,7 @@ from stored_messages.settings import stored_messages_settings | ||||||
| 
 | 
 | ||||||
| from datacenterlight.cms_models import DCLCalculatorPluginModel | from datacenterlight.cms_models import DCLCalculatorPluginModel | ||||||
| from datacenterlight.models import VMTemplate, VMPricing | from datacenterlight.models import VMTemplate, VMPricing | ||||||
| from datacenterlight.utils import create_vm, get_cms_integration | from datacenterlight.utils import create_vm, get_cms_integration, check_otp | ||||||
| from hosting.models import UserCardDetail | from hosting.models import UserCardDetail | ||||||
| from membership.models import CustomUser, StripeCustomer | from membership.models import CustomUser, StripeCustomer | ||||||
| from opennebula_api.models import OpenNebulaManager | from opennebula_api.models import OpenNebulaManager | ||||||
|  | @ -66,9 +69,12 @@ from .models import ( | ||||||
| 
 | 
 | ||||||
| logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a \ | CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a \ | ||||||
|                     backend connection error. please try again in a few \ |                     backend connection error. please try again in a few \ | ||||||
|                     minutes." |                     minutes." | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| decorators = [never_cache] | decorators = [never_cache] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1755,3 +1761,30 @@ def forbidden_view(request, exception=None, reason=''): | ||||||
|                 'again.') |                 'again.') | ||||||
|     messages.add_message(request, messages.ERROR, err_msg) |     messages.add_message(request, messages.ERROR, err_msg) | ||||||
|     return HttpResponseRedirect(request.get_full_path()) |     return HttpResponseRedirect(request.get_full_path()) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CheckUserVM(APIView): | ||||||
|  |     renderer_classes = (JSONRenderer, ) | ||||||
|  | 
 | ||||||
|  |     def get(self, request): | ||||||
|  |         try: | ||||||
|  |             email = request.data['email'] | ||||||
|  |             ip = request.data['ip'] | ||||||
|  |             user = request.data['user'] | ||||||
|  |             realm = request.data['realm'] | ||||||
|  |             token = request.data['token'] | ||||||
|  |             if user != settings.ACCOUNT_NAME: | ||||||
|  |                 return Response("User not allowed", 403) | ||||||
|  |             response = check_otp(user, realm, token) | ||||||
|  |             if response != 200: | ||||||
|  |                 return Response('Invalid token', 403) | ||||||
|  |             uservms = VMDetail.objects.filter(user__email=email) | ||||||
|  |             if len(uservms) > 0: | ||||||
|  |                 for i in range(len(uservms)): | ||||||
|  |                     if uservms[i].ipv4 == ip or uservms[i].ipv6 == ip: | ||||||
|  |                         return Response('success', 200) | ||||||
|  |                 return Response('No VM found matching the ip address provided', 404) | ||||||
|  |             else: | ||||||
|  |                 return Response('No VM found with the given email address', 404) | ||||||
|  |         except KeyError: | ||||||
|  |             return Response('Not enough data provided', 400) | ||||||
|  |  | ||||||
|  | @ -98,3 +98,4 @@ amqp==2.2.1 | ||||||
| vine==1.1.4 | vine==1.1.4 | ||||||
| cdist==5.0.1 | cdist==5.0.1 | ||||||
| git+https://github.com/ungleich/djangocms-multisite.git#egg=djangocms_multisite | git+https://github.com/ungleich/djangocms-multisite.git#egg=djangocms_multisite | ||||||
|  | pyotp | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue