views.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. from django.shortcuts import render
  2. #from supporto import managepassword
  3. from .forms import *
  4. from configurazione.views import *
  5. from sicurezza.views import *
  6. import crypt
  7. import random
  8. import string
  9. import uuid
  10. from datetime import date,datetime
  11. from comunicazioni.views import *
  12. from configurazione.views import *
  13. from supporto import managepassword
  14. import django as dd
  15. from mqtt.views import mqtt
  16. # Create your views here.
  17. from django.http import HttpResponseRedirect
  18. from django.urls import reverse
  19. def login(request):
  20. request.session.flush()
  21. c={}
  22. c['login']=LoginUser()
  23. if getConfigurazione('OffLine')=='1':
  24. return render(request,'offline.html')
  25. if request.method=="POST":
  26. result = LoginUser(request.POST)
  27. if result.is_valid():
  28. username = result.cleaned_data['username']
  29. password = result.cleaned_data['password']
  30. mq = mqtt()
  31. mq.topic('messaggio')
  32. mq.richiesta('login')
  33. mq.stampa(False)
  34. mq.demo(False)
  35. #mq.build('topic','messaggio')
  36. #mq.build('richiesta','login')
  37. tmp = dict()
  38. tmp['login'] = username
  39. tmp['remote'] = request.META.get('REMOTE_ADDRESS')
  40. tmp['forwarder' ] = request.META.get('HTTP_X_FORWARDER_FOR','')
  41. tmp['host'] = request.META.get('REMOTE_ADDR','')
  42. mq.data(tmp)
  43. mq.pubblica()
  44. tmp=None
  45. #ottenuti i dati dalla form, provvediamo a:
  46. # 1: verificare il login
  47. # 2: inviare mail di notifica a chi ha fatto l'accesso
  48. # 3: attivare o impostare le voci di menu' valide per il livello dell'utente.
  49. # 1.1 lo username deve essere diviso in due per estrapolare dominio e mail
  50. try:
  51. (mail,domain) = username.split('@')
  52. except ValueError as ve:
  53. (mail,domain) = ('','')
  54. print('dati inseriti',mail,domain)
  55. # 1.2 ricerchiamo l'utente/dominio
  56. record = User.objects.filter(mail=mail,domain__nome=domain,enabled=1,domain__enabled=1)
  57. print('numero di record:',len(record))
  58. if record:
  59. # 1.2.1: verifica la password
  60. print(record[0].crypt)
  61. codedpassword = crypt.crypt(password,record[0].crypt)
  62. if codedpassword == record[0].crypt:
  63. print("accepted:",record[0].id) #primo controllo superato.
  64. request.session['_userauth_'] = record[0].id
  65. record[0].accesso = datetime.now()
  66. print('ultimo_accesso',record[0].accesso)
  67. print('tipo record',type(record[0]))
  68. record[0].save()
  69. print('session timeleft',request.session.get_expiry_age())
  70. request.session.set_expiry(3600)
  71. # invia la notifica all'utente che si e' collegato.
  72. sm = ServizioMail()
  73. sm.set_rcptto(record[0].mail+"@"+record[0].domain.nome)
  74. template=Template.objects.get(pk=getConfigurazione("AccessoPannello"))
  75. sm.set_oggetto(template.oggetto)
  76. sm.set_soggetto(template.soggetto)
  77. dictdict={}
  78. dictdict['utente'] = record[0]
  79. dictdict['data'] = datetime.now()
  80. dictdict['connessione'] = request.META #consente di acquisire dati di connessione.
  81. sm.set_data(dictdict)
  82. sm.send()
  83. #invia la notifica all'amministratore.
  84. # le email sono le stesse, cambia il template in modo da inviare notifiche diversificate
  85. #sm = ServizioMail()
  86. #sm.set_rcptto([getConfigurazione('mail:notifica'),])
  87. #template=Template.objects.get(pk=getConfigurazione("AccessoPannello:admin"))
  88. #sm.set_oggetto(template.oggetto)
  89. #sm.set_soggetto(template.soggetto)
  90. #dictdict={}
  91. #dictdict['utente'] = record[0]
  92. #dictdict['data'] = datetime.now()
  93. #dictdict['connessione'] = request.META #consente di acquisire dati di connessione.
  94. #print("::",dictdict['connessione'])
  95. #sm.set_data(dictdict)
  96. #sm.send()
  97. return HttpResponseRedirect(reverse('Login:welcome',args={}))
  98. else:
  99. print('login failed',username)
  100. else:
  101. print('record non trovato',username)
  102. return render(request,'login.html',c)
  103. def welcome(request):
  104. print('session timeleft',request.session.get_expiry_age())
  105. session = getSessionParms(request)
  106. try:
  107. userauth = session['_userauth_']
  108. except KeyError:
  109. return HttpResponseRedirect(reverse("Login:login",args={}))
  110. request.session['_from_']="Login:welcome"
  111. try:
  112. record = User.objects.get(pk=userauth)
  113. except User.DoesNotExist as dnf:
  114. return HttpResponseRedirect(reverse('Login:login',args={}))
  115. securitylevel = getSecurityLevel(record.securitylevel_id)
  116. value={}
  117. value['utenteautorizzato'] = record
  118. value['securitylevel'] = securitylevel
  119. value['versione'] = dd.get_version()
  120. print("id",record.securitylevel_id)
  121. securitylevel = getSecurityLevel(record.securitylevel_id)
  122. securityrow = getSecurityRow(securitylevel.id)
  123. value['securityrow'] = securityrow
  124. #print(securityrow)
  125. #for i in securityrow:
  126. # try:
  127. # print("-{}-".format(i.securityoptions.id),)
  128. # except SecurityOptions.DoesNotExist as dne:
  129. # print("-{}-".format('-!-'))
  130. value['securityparms'] = {'utente':record.id,'dominio':record.domain.id }
  131. value['securityrowLen'] = len(securityrow)
  132. value['navbar']=True
  133. note = Note.objects.all().filter(livello__gte=securitylevel).filter(timestamp__gte=record.accesso).order_by('timestamp')
  134. if len(note) > 3: note = note[:3]
  135. value['note'] = note
  136. return render(request,'welcome.html',value)
  137. def recupero(request):
  138. if request.method == 'POST':
  139. tasto = request.session['button_recover']
  140. if tasto in request.POST:
  141. campo = request.session['campo_recover']
  142. if campo in request.POST:
  143. richiesta = request.POST.get(campo)
  144. if richiesta: #possiamo provvedere al resto
  145. try:
  146. (mail,dominio) = richiesta.split('@')
  147. except ValueError as ve:
  148. return HttpResponseRedirect(reverse('Login:login',args={}))
  149. utente = User.objects.filter(mail=mail).filter(domain__nome=dominio)
  150. if utente:
  151. #possiamo inviare mail
  152. print("spedizione: {}".format(utente[0].mail_di_recupero))
  153. if utente[0].mail_di_recupero:
  154. uuidvalue = uuid.uuid1()
  155. print(uuidvalue)
  156. utente[0].chiave_temporanea=uuidvalue
  157. utente[0].save()
  158. sm = ServizioMail()
  159. mail_utente = [] #vediamo la lista utente
  160. mail_utente.append('{}'.format(utente[0].mail_di_recupero))
  161. sm.set_rcptto(mail_utente)
  162. #recuperiamo il template
  163. template = Template.objects.get(pk=getConfigurazione('mail_password_recover'))
  164. template_soggetto = template.soggetto
  165. sm.set_soggetto(template_soggetto)
  166. template_oggetto = template.oggetto
  167. sm.set_oggetto(template_oggetto)
  168. template_dati = {}
  169. template_dati['utente'] = utente[0]
  170. sm.set_data(template_dati)
  171. sm.send_mail()
  172. value = {}
  173. return render(request,'recupero.done.html',value)
  174. key=str(random.randint(0,9999999999))
  175. value={}
  176. value['button'] = "t{}".format(key)
  177. value['campo'] = "c{}".format(str(random.randint(0,999999999999)))
  178. request.session['button_recover'] = value['button']
  179. request.session['campo_recover'] = value['campo']
  180. return render(request,'recupero.html',value)
  181. def change(request,code=None):
  182. if not code:
  183. return HttpResponseRedirect(reverse('Login:login',args={}))
  184. '''
  185. il codice viene indicato nella mail indicata al cliente.
  186. ricevuto il codice, si cerca il record mail corretto
  187. una volta trovato, si chiedono le nuove credenziali
  188. si salvano e si resetta il codice a null
  189. '''
  190. try:
  191. record = User.objects.get(chiave_temporanea=code)
  192. except User.DoesNotExist as dne:
  193. return HttpResponseRedirect(reverse('Login:login',args={}))
  194. nc = NuoveCredenziali()
  195. if request.method == 'POST':
  196. nc = NuoveCredenziali(request.POST)
  197. if nc.is_valid():
  198. record.clear = nc.cleaned_data.get('password1')
  199. record.crypt = managepassword.GeneraPassword(record.clear)
  200. t = date.today()
  201. record.last_password_update = t.strftime("%Y-%m-%d")
  202. record.chiave_temporanea=''
  203. record.save()
  204. return render(request,'change.done.html')
  205. else:
  206. nc = NuoveCredenziali(request.POST)
  207. else:
  208. nc = NuoveCredenziali(request.POST)
  209. value={}
  210. value['mail_password_length'] = getConfigurazione('mail_password_length')
  211. value['nc']=nc
  212. return render(request,'change.html',value)