From 580cbe6e1abfd611df3aa58349643a0aec0035e8 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Tue, 9 Dec 2014 14:00:03 +0100 Subject: [PATCH 01/11] [ADD] 'auth_generate_password' module to generate randomly user's password --- auth_generate_password/__init__.py | 23 ++++++ auth_generate_password/__openerp__.py | 70 +++++++++++++++++ .../data/email_template.xml | 45 +++++++++++ .../data/ir_config_parameter.yml | 29 +++++++ auth_generate_password/demo/res_groups.yml | 25 ++++++ auth_generate_password/demo/res_users.yml | 26 +++++++ auth_generate_password/i18n/fr.po | 72 ++++++++++++++++++ auth_generate_password/model/__init__.py | 23 ++++++ auth_generate_password/model/res_users.py | 61 +++++++++++++++ .../static/src/img/icon.png | Bin 0 -> 6860 bytes auth_generate_password/tests/__init__.py | 27 +++++++ auth_generate_password/tests/tests.py | 53 +++++++++++++ auth_generate_password/view/view.xml | 48 ++++++++++++ 13 files changed, 502 insertions(+) create mode 100644 auth_generate_password/__init__.py create mode 100644 auth_generate_password/__openerp__.py create mode 100644 auth_generate_password/data/email_template.xml create mode 100644 auth_generate_password/data/ir_config_parameter.yml create mode 100644 auth_generate_password/demo/res_groups.yml create mode 100644 auth_generate_password/demo/res_users.yml create mode 100644 auth_generate_password/i18n/fr.po create mode 100644 auth_generate_password/model/__init__.py create mode 100644 auth_generate_password/model/res_users.py create mode 100644 auth_generate_password/static/src/img/icon.png create mode 100644 auth_generate_password/tests/__init__.py create mode 100644 auth_generate_password/tests/tests.py create mode 100644 auth_generate_password/view/view.xml diff --git a/auth_generate_password/__init__.py b/auth_generate_password/__init__.py new file mode 100644 index 000000000..782a258d8 --- /dev/null +++ b/auth_generate_password/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2013-2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import model diff --git a/auth_generate_password/__openerp__.py b/auth_generate_password/__openerp__.py new file mode 100644 index 000000000..03241dca0 --- /dev/null +++ b/auth_generate_password/__openerp__.py @@ -0,0 +1,70 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': 'Password Secure', + 'version': '2.0', + 'category': 'GRAP - Custom', + 'description': """ +Password Secure +=============== + +Functionnality: +--------------- + * Forbid users to change them password; + * Only members of base.group_system can change password; OK. + * Add a button to the res_users form: + * to change the password (randomly generated); + * send an email to each users; + +Settings: +--------- + * Once the module installed, you have to set two settings: + * password size: the size of the password generated (6 by default); + * password chars: the list of allowed chars (by default ASCII letters + and digits); You can: + * set a list of chars like 'abcdef'; + * use string function like string.ascii_letters; + * Be sure that an Outgoing Email Server is correctly configured; + +Copyright, Author and Licence : +------------------------------- + * Copyright : 2014, Groupement Régional Alimentaire de Proximité; + * Author : Sylvain LE GAL (https://twitter.com/legalsylvain); + * Licence : AGPL-3 (http://www.gnu.org/licenses/) + """, + 'author': 'GRAP', + 'website': 'http://www.grap.coop', + 'license': 'AGPL-3', + 'depends': [ + 'email_template', + ], + 'data': [ + 'data/ir_config_parameter.yml', + 'data/email_template.xml', + 'view/view.xml', + ], + 'demo': [ + 'demo/res_groups.yml', + 'demo/res_users.yml', + ], +} diff --git a/auth_generate_password/data/email_template.xml b/auth_generate_password/data/email_template.xml new file mode 100644 index 000000000..b22920aa9 --- /dev/null +++ b/auth_generate_password/data/email_template.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Generate Password + + ]]> + ${object.email|safe} + OpenERP - Password Changed + +
  • Login : ${object.login}
  • +
  • New Password : ${object.password}
  • + +Please, +
      +
    • remember this password and delete this email;
    • +
    • Communicate the password to your team, if you are many people to use the same credentials;
    • +
    ]]> +
    +
    + +
    +
    diff --git a/auth_generate_password/data/ir_config_parameter.yml b/auth_generate_password/data/ir_config_parameter.yml new file mode 100644 index 000000000..6282a0ff7 --- /dev/null +++ b/auth_generate_password/data/ir_config_parameter.yml @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +- !record {model: ir.config_parameter, id: password_size}: + key: auth_generate_password.password_size + value: 6 + +- !record {model: ir.config_parameter, id: password_chars}: + key: auth_generate_password.password_chars + value: string.ascii_letters + string.digits diff --git a/auth_generate_password/demo/res_groups.yml b/auth_generate_password/demo/res_groups.yml new file mode 100644 index 000000000..e52835925 --- /dev/null +++ b/auth_generate_password/demo/res_groups.yml @@ -0,0 +1,25 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +- !record {model: res.groups, id: base.group_no_one}: + users: + - base.user_root diff --git a/auth_generate_password/demo/res_users.yml b/auth_generate_password/demo/res_users.yml new file mode 100644 index 000000000..00b401abe --- /dev/null +++ b/auth_generate_password/demo/res_users.yml @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +- !record {model: res.users, id: extra_user}: + name: Extra User + login: extra + email: extra@example.com diff --git a/auth_generate_password/i18n/fr.po b/auth_generate_password/i18n/fr.po new file mode 100644 index 000000000..2ffaae6cf --- /dev/null +++ b/auth_generate_password/i18n/fr.po @@ -0,0 +1,72 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * auth_generate_password +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-12-09 12:53+0000\n" +"PO-Revision-Date: 2014-12-09 12:53+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: auth_generate_password +#: model:email.template,body_html:auth_generate_password.generate_password_template +msgid "\n" +"Your OpenERP credentials has been changed:\n" +"
      \n" +"
    • Login : ${object.login}
    • \n" +"
    • New Password : ${object.password}
    • \n" +"
    \n" +"Please,\n" +"
      \n" +"
    • remember this password and delete this email;
    • \n" +"
    • Communicate the password to your team, if you are many people to use the same credentials;
    • \n" +"
    \n" +" " +msgstr "\n" +"Vos identifiants OpenERP ont changés :\n" +"
      \n" +"
    • Login : ${object.login}
    • \n" +"
    • Nouveau Mot de passe : ${object.password}
    • \n" +"
    \n" +"Merci de,\n" +"
      \n" +"
    • vous souvenir de ce mot de passe et de supprimer cet email ;
    • \n" +"
    • de communiquer ce mot de passe Ă  votre Ă©quipe, si plusieurs personnes utilisent les mĂȘme identifiants;
    • \n" +"
    \n" +" " + +#. module: auth_generate_password +#: code:addons/auth_generate_password/model/res_users.py:48 +#, python-format +msgid "Cannot send email: user has no email address." +msgstr "Impossible d'envoyer un email : l'utilisateur n'a pas d'adresse." + +#. module: auth_generate_password +#: view:res.users:0 +msgid "Generate Password and Send Mail" +msgstr "Générer un mot de passe et envoyer un email" + +#. module: auth_generate_password +#: model:email.template,subject:auth_generate_password.generate_password_template +msgid "OpenERP - Password Changed" +msgstr "OpenERP - Mot de passe changé" + +#. module: auth_generate_password +#: code:_description:0 +#: model:ir.model,name:auth_generate_password.model_res_users +#, python-format +msgid "Users" +msgstr "Utilisateurs" + +#. module: auth_generate_password +#: view:res.users:0 +msgid "base.group_system" +msgstr "base.group_system" + diff --git a/auth_generate_password/model/__init__.py b/auth_generate_password/model/__init__.py new file mode 100644 index 000000000..e5a505c75 --- /dev/null +++ b/auth_generate_password/model/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2013-2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import res_users diff --git a/auth_generate_password/model/res_users.py b/auth_generate_password/model/res_users.py new file mode 100644 index 000000000..47d78d4d0 --- /dev/null +++ b/auth_generate_password/model/res_users.py @@ -0,0 +1,61 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2013-2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +# This line is noqa flaged, to allow users to use string functions written +# in ir_config_parameter +import string # flake8: noqa +import random + +from openerp.osv.orm import Model +from openerp.osv.osv import except_osv +from openerp.tools.translate import _ + + +class res_users(Model): + _inherit = 'res.users' + + def generate_password(self, cr, uid, ids, context=None): + mm_obj = self.pool['mail.mail'] + icp_obj = self.pool['ir.config_parameter'] + imd_obj = self.pool['ir.model.data'] + et_obj = self.pool['email.template'] + password_size = eval(icp_obj.get_param( + cr, uid, 'auth_generate_password.password_size')) + password_chars = eval(icp_obj.get_param( + cr, uid, 'auth_generate_password.password_chars')) + for ru in self.browse(cr, uid, ids, context=context): + if not ru.email: + raise osv.except_osv( + _("Cannot send email: user has no email address."), + user.name) + # Generate Password + password = "".join([random.choice( + password_chars) for n in xrange(password_size)]) + self._set_new_password( + cr, uid, ru.id, None, password, None, context=None) + # Send Mail + et = imd_obj.get_object( + cr, uid, 'auth_generate_password', + 'generate_password_template') + mail_id = et_obj.send_mail( + cr, uid, et.id, ru.id, True, context=context) + return {} diff --git a/auth_generate_password/static/src/img/icon.png b/auth_generate_password/static/src/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb11b276e88dc64a26a698e38d44466bd027d95 GIT binary patch literal 6860 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. +# +############################################################################## + +from . import tests + +fast_suite = [ + tests, +] diff --git a/auth_generate_password/tests/tests.py b/auth_generate_password/tests/tests.py new file mode 100644 index 000000000..6a3b67934 --- /dev/null +++ b/auth_generate_password/tests/tests.py @@ -0,0 +1,53 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Authentification - Generate Password module for Odoo +# Copyright (C) 2013-2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.tests.common import TransactionCase + + +class TestAuthGeneratePassword(TransactionCase): + + def setUp(self): + super(TestAuthGeneratePassword, self).setUp() + cr, uid = self.cr, self.uid + self.imd_obj = self.registry('ir.model.data') + self.ru_obj = self.registry('res.users') + self.mm_obj = self.registry('mail.mail') + self.demo_ru_id = self.imd_obj.get_object_reference( + cr, uid, 'base', + 'user_demo')[1] + self.extra_ru_id = self.imd_obj.get_object_reference( + cr, uid, 'auth_generate_password', + 'extra_user')[1] + + # Test Section + def test_01_generate_password(self): + """[Functional Test] Test if generate password generate mails""" + cr, uid = self.cr, self.uid + ru_ids = [self.demo_ru_id, self.extra_ru_id] + mm_qty_before = len(self.mm_obj.search(cr, uid, [])) + self.ru_obj.generate_password(cr, uid, ru_ids) + mm_qty_after = len(self.mm_obj.search(cr, uid, [])) + + self.assertEquals( + mm_qty_before + len(ru_ids), mm_qty_after, + "Generate password for %d user(s) must send %d email(s) !" % ( + len(ru_ids), len(ru_ids))) diff --git a/auth_generate_password/view/view.xml b/auth_generate_password/view/view.xml new file mode 100644 index 000000000..e1dfe3b24 --- /dev/null +++ b/auth_generate_password/view/view.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + res.users + + + + + + + + res.users + + + +