From a736b41e06fabcfdb9c9a8dc4b49f2ebbd9f46c3 Mon Sep 17 00:00:00 2001 From: Miguel Cantillana Date: Sat, 27 Sep 2014 22:53:10 -0300 Subject: [PATCH 1/3] add generator password field and filter password by uploader --- passManager/admin.py | 36 ++++++++++++++++++++++++++++++--- passManager/static/functions.js | 34 ++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/passManager/admin.py b/passManager/admin.py index 0d02567..1c8a792 100644 --- a/passManager/admin.py +++ b/passManager/admin.py @@ -3,7 +3,8 @@ from django.forms import TextInput, Textarea from django.contrib.admin import SimpleListFilter -from passManager.models import passDb +from passManager.models import passDb, SignedCharField +from django import forms class LoginsFilter(SimpleListFilter): @@ -90,7 +91,16 @@ def queryset(self, request, queryset): if self.value() == val: return queryset.filter(server=val) +class PassManagerForm(forms.ModelForm): + model = passDb + class Meta: + + widgets = { 'password': forms.TextInput(attrs={'id': 'field_password'}), } + + + class PassManagerAdmin(admin.ModelAdmin): + form = PassManagerForm class Media: js = ("jquery-1.7.1.min.js", "jquery-ui-1.8.18.custom.min.js", "functions.js",) css = { @@ -99,7 +109,7 @@ class Media: formfield_overrides = { models.CharField: {'widget': TextInput(attrs={'size':'40'})}, - #models.TextField: {'widget': Textarea(attrs={'rows':10, 'cols':60})}, + # models.TextField: {'widget': Textarea(attrs={'rows':10, 'cols':60})}, } ordering = ['creation_date'] @@ -119,12 +129,32 @@ class Media: ] list_filter = (LoginsFilter, ServersFilter, 'uploader','creation_date') + + fieldsets = [ (None, {'fields': ['name',('login','password'),'server','notes']}), ] search_fields = ['name','login','server','notes'] - + + def queryset(self, request): + qs = super(PassManagerAdmin, self).queryset(request) + if request.user.is_superuser: + return qs + else: + return qs.filter(uploader = request.user) + + + def has_change_permission(self, request, obj=None): + if not obj: + return True # So they can see the change list page + if request.user.is_superuser or obj.uploader == request.user: + return True + else: + return False + + has_delete_permission = has_change_permission + def save_model(self, request, obj, form, change): #obj.password = passEncr('encrypt', obj.password) obj.uploader = request.user diff --git a/passManager/static/functions.js b/passManager/static/functions.js index fdcb904..e82f582 100644 --- a/passManager/static/functions.js +++ b/passManager/static/functions.js @@ -14,7 +14,8 @@ $(function() { }); (function($) { - $(document).ready(function(){ + $(document).ready(function(){ + var windowWidth = 760 var windowHeight = 430 var centerWidth = (window.screen.width - windowWidth) / 2; @@ -32,6 +33,11 @@ $(function() { event.preventDefault(); }); + + $( "#field_password" ).after( '' ); + $('#generate').click(loadGeneratedPassword); + + }); })(django.jQuery); @@ -41,4 +47,30 @@ function cambiar(id, texto) { document.getElementById(id).innerHTML = texto.replace(/\&/g, "&").replace(//g, ">"); document.getElementById(id).style.color = "black"; } +} + +function loadGeneratedPassword() { + var length = 8; + $('#field_password').val(password(length,true)); +} + +function password(length, special) { + var iteration = 0; + var password = ""; + var randomNumber; + if(special == undefined){ + var special = false; + } + while(iteration < length){ + randomNumber = (Math.floor((Math.random() * 100)) % 94) + 33; + if(!special){ + if ((randomNumber >=33) && (randomNumber <=47)) { continue; } + if ((randomNumber >=58) && (randomNumber <=64)) { continue; } + if ((randomNumber >=91) && (randomNumber <=96)) { continue; } + if ((randomNumber >=123) && (randomNumber <=126)) { continue; } + } + iteration++; + password += String.fromCharCode(randomNumber); + } + return password; } \ No newline at end of file From 90fcbc4278ab0bc4bde70953c30c06803de9eebc Mon Sep 17 00:00:00 2001 From: Miguel Cantillana Date: Sun, 28 Sep 2014 00:51:42 -0300 Subject: [PATCH 2/3] add rules in filter for display password for user --- passManager/admin.py | 91 ++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 25 deletions(-) diff --git a/passManager/admin.py b/passManager/admin.py index 1c8a792..9c28f5c 100644 --- a/passManager/admin.py +++ b/passManager/admin.py @@ -55,42 +55,84 @@ class ServersFilter(SimpleListFilter): Make facet of server names number with 3 or more name ocurrences """ + # print self.request title = 'TOP Servers' parameter_name = 'servers' - # Get all objects - rows = passDb.objects.all() - # Server list - servers = [] - for row in rows: - servers.append(row.server) - # Duplicate clean - # servers = set(servers) - # Get tuple with servers and ocurences - lista = {} - for l in set(servers): - numrows = passDb.objects.filter(server=l).count() - if numrows >= 1: - lista[str(l)] = numrows + slist = [] - # Import module for order dictionary - from operator import itemgetter - slist = sorted(lista.items(), key=itemgetter(1), reverse=True) + def lookups(self, request, model_admin): - # Generate facets - facet = [] - for n in range(0 ,(len(slist))): - facet.append(((slist[n][0]),(slist[n][0]+' ('+str(slist[n][1]))+')')) + if request.user.is_superuser: - def lookups(self, request, model_admin): - return (self.facet) + # Get all objects + rows = passDb.objects.all() + else: + rows = passDb.objects.filter(uploader = request.user) + + # Server list + servers = [] + for row in rows: + servers.append(row.server) + # Duplicate clean + # servers = set(servers) + + # Get tuple with servers and ocurences + lista = {} + for l in set(servers): + numrows = passDb.objects.filter(server=l).count() + if numrows >= 1: + lista[str(l)] = numrows + + + + # Import module for order dictionary + from operator import itemgetter + slist = sorted(lista.items(), key=itemgetter(1), reverse=True) + + self.slist = slist + + # Generate facets + facet = [] + for n in range(0 ,(len(slist))): + facet.append(((slist[n][0]),(slist[n][0]+' ('+str(slist[n][1]))+')')) + + + + return (facet) def queryset(self, request, queryset): + for n in range(0 ,(len(self.slist))): val = self.slist[n][0] if self.value() == val: return queryset.filter(server=val) +class UploaderFilter(SimpleListFilter): + """ Filter based on uploader. """ + + title = 'Uploader' + parameter_name = 'uploader' + + + def lookups(self, request, model_admin): + + facet = [] + if request.user.is_superuser: + rows = passDb.objects.values('uploader__id','uploader__username').distinct() + for row in rows: + facet.append((row['uploader__id'],row['uploader__username'])) + + return (facet) + + def queryset(self, request, queryset): + + if self.value() is None: + return queryset.all() + else: + return queryset.filter(uploader__id = self.value()) + + class PassManagerForm(forms.ModelForm): model = passDb class Meta: @@ -109,7 +151,6 @@ class Media: formfield_overrides = { models.CharField: {'widget': TextInput(attrs={'size':'40'})}, - # models.TextField: {'widget': Textarea(attrs={'rows':10, 'cols':60})}, } ordering = ['creation_date'] @@ -128,7 +169,7 @@ class Media: "uploader" ] - list_filter = (LoginsFilter, ServersFilter, 'uploader','creation_date') + list_filter = (LoginsFilter, ServersFilter, UploaderFilter,'creation_date') fieldsets = [ From 1a6aaad3a3f05ee64e8a17bee2ee1b64b52236ae Mon Sep 17 00:00:00 2001 From: Miguel Cantillana Date: Sun, 28 Sep 2014 01:36:13 -0300 Subject: [PATCH 3/3] new pic for generated password --- passManager/static/functions.js | 2 +- passManager/static/reload-16.png | Bin 0 -> 257 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 passManager/static/reload-16.png diff --git a/passManager/static/functions.js b/passManager/static/functions.js index e82f582..737596b 100644 --- a/passManager/static/functions.js +++ b/passManager/static/functions.js @@ -34,7 +34,7 @@ $(function() { }); - $( "#field_password" ).after( '' ); + $( "#field_password" ).after( '' ); $('#generate').click(loadGeneratedPassword); diff --git a/passManager/static/reload-16.png b/passManager/static/reload-16.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e3bd7f36fbcf1f1914c19701ced9b0144af731 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Cp=voLnI`(9yHW*W@KP{u>K4W zkCMJyr}T>#OqZBDj-{!FE%vmYsiHQqMD!Iy{)Py_=7W+Ep}(YUuTD{a`Q1=;^Nj;` zd>4;x;*{E#^N7_^fJNTo@E*ge8wcf@9!RQN91^`JXp?ZUL&(wK2xD5!_AYmp>uysx zniS6k{#bcHyJ=Y$NQRZ`aj8H_$P|uu7fd3#9phd3b4~uNYhAE@(Zlz?+vT?`$Jfqr7}boFyt=akR{ E0B}uUFaQ7m literal 0 HcmV?d00001