import os, stat import re from pathlib import Path from urllib.parse import urljoin, unquote as urlunquote from urllib.request import urlopen from django.conf import settings from django.shortcuts import render from django.http import HttpResponse, Http404 from troggle.core.models_survex import ScansFolder, SingleScan, SurvexBlock, TunnelFile from troggle.flatpages import views as flatviews import parsers.surveys '''Some of these views serve files as binary blobs, and simply set the mime type based on the file extension, as does the urls.py dispatcher which sends them here. Here they should actually have the filetype checked by looking inside the file before being served. need to check if inavlid query string is invalid, or produces multiple replies and render a user-friendly error page. ''' def surveyscansfolder(request, path): #print [ s.walletname for s in ScansFolder.objects.all() ] scansfolder = ScansFolder.objects.get(walletname=urlunquote(path)) # need to check if inavlid query string and produce friendly error return render(request, 'scansfolder.html', { 'scansfolder':scansfolder, 'settings': settings }) def surveyscansingle(request, path, file): '''sends a single binary file to the user, ''' scansfolder = ScansFolder.objects.get(walletname=urlunquote(path)) # need to check if inavlid query string and produce friendly error singlescan = SingleScan.objects.get(scansfolder=scansfolder, name=file) # print(" - surveyscansingle {}:{}:{}:".format(path, file, flatviews.getmimetype(file))) return HttpResponse(content=open(singlescan.ffile,"rb"), content_type=flatviews.getmimetype(file)) # any type of image def surveyscansfolders(request): manyscansfolders = ScansFolder.objects.all() return render(request, 'manyscansfolders.html', { 'manyscansfolders':manyscansfolders, 'settings': settings }) def tunneldata(request): tunnelfiles = TunnelFile.objects.all() return render(request, 'tunnelfiles.html', { 'tunnelfiles':tunnelfiles, 'settings': settings }) def tunnelfilesingle(request, path): '''sends a single binary file to the user, We should have a renderer that syntax-colours this Tunnel xml ''' tunnelfile = TunnelFile.objects.get(tunnelpath=urlunquote(path)) # need to check if inavlid query string and produce friendly error tfile = Path(settings.TUNNEL_DATA, tunnelfile.tunnelpath) return HttpResponse(content=open(tfile), content_type="text/xhtml") # for display not download def tunnelfileupload(request, path): tunnelfile = TunnelFile.objects.get(tunnelpath=urlunquote(path)) # need to check if inavlid query string and produce friendly error tfile = Path(settings.TUNNEL_DATA, tunnelfile.tunnelpath) project, user, password, tunnelversion = request.POST["tunnelproject"], request.POST["tunneluser"], request.POST["tunnelpassword"], request.POST["tunnelversion"] print((project, user, tunnelversion)) assert len(list(request.FILES.values())) == 1, "only one file to upload" uploadedfile = list(request.FILES.values())[0] if uploadedfile.field_name != "sketch": return HttpResponse(content="Error: non-sketch file uploaded", content_type="text/plain") if uploadedfile.content_type != "text/plain": return HttpResponse(content="Error: non-plain content type", content_type="text/plain") # could use this to add new files if os.path.split(path)[1] != uploadedfile.name: return HttpResponse(content="Error: name disagrees", content_type="text/plain") orgsize = tunnelfile.filesize # = os.stat(tfile)[stat.ST_SIZE] ttext = uploadedfile.read() # could check that the user and projects agree here fout = open(tfile, "w") fout.write(ttext) fout.close() # redo its settings of parsers.surveys.SetTunnelfileInfo(tunnelfile) tunnelfile.save() uploadedfile.close() message = "File size %d overwritten with size %d" % (orgsize, tunnelfile.filesize) return HttpResponse(content=message, content_type="text/plain")