diff --git a/app/scodoc/ZScoDoc.py b/app/scodoc/ZScoDoc.py
deleted file mode 100644
index 9fd2874136..0000000000
--- a/app/scodoc/ZScoDoc.py
+++ /dev/null
@@ -1,838 +0,0 @@
-# -*- mode: python -*-
-# -*- coding: utf-8 -*-
-
-##############################################################################
-#
-# Gestion scolarite IUT
-#
-# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Emmanuel Viennet emmanuel.viennet@viennet.net
-#
-##############################################################################
-
-"""Site ScoDoc pour plusieurs departements:
- gestion de l'installation et des creation de départements.
-
- Chaque departement est géré par un ZScolar sous ZScoDoc.
-"""
-
-import time
-import datetime
-import string
-import glob
-import re
-import inspect
-import urllib
-import urllib2
-import cgi
-import xml
-
-from cStringIO import StringIO
-from zipfile import ZipFile
-import os.path
-import traceback
-
-from email.MIMEMultipart import ( # pylint: disable=no-name-in-module,import-error
- MIMEMultipart,
-)
-from email.MIMEText import MIMEText # pylint: disable=no-name-in-module,import-error
-from email.MIMEBase import MIMEBase # pylint: disable=no-name-in-module,import-error
-from email.Header import Header # pylint: disable=no-name-in-module,import-error
-from email import Encoders # pylint: disable=no-name-in-module,import-error
-
-from app.scodoc.sco_zope import (
- ObjectManager,
- PropertyManager,
- RoleManager,
- Item,
- Persistent,
- Implicit,
- ClassSecurityInfo,
- DTMLFile,
- Globals,
-)
-
-try:
- import Products.ZPsycopgDA.DA as ZopeDA
-except:
- import ZPsycopgDA.DA as ZopeDA # interp.py
-
-import app.scodoc.sco_utils as scu
-from app.scodoc import VERSION
-import mails
-from app.scodoc.notes_log import log
-from app.scodoc import sco_find_etud
-from app.scodoc import sco_users
-from app.scodoc.sco_permissions import (
- ScoView,
- ScoEnsView,
- ScoImplement,
- ScoChangeFormation,
- ScoObservateur,
- ScoEtudInscrit,
- ScoEtudChangeGroups,
- ScoEtudChangeAdr,
- ScoEtudSupprAnnotations,
- ScoEditAllEvals,
- ScoEditAllNotes,
- ScoEditFormationTags,
- ScoEditApo,
- ScoSuperAdmin,
-)
-from app.scodoc.sco_exceptions import (
- ScoValueError,
- ScoLockedFormError,
- ScoGenError,
- AccessDenied,
-)
-from app.scodoc import html_sco_header
-
-
-class ZScoDoc(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Implicit):
-
- "ZScoDoc object"
-
- meta_type = "ZScoDoc"
- security = ClassSecurityInfo()
- file_path = Globals.package_home(globals())
-
- # This is the list of the methods associated to 'tabs' in the ZMI
- # Be aware that The first in the list is the one shown by default, so if
- # the 'View' tab is the first, you will never see your tabs by cliquing
- # on the object.
- manage_options = (
- ({"label": "Contents", "action": "manage_main"},)
- + PropertyManager.manage_options # add the 'Properties' tab
- + ({"label": "View", "action": "index_html"},)
- + Item.manage_options # add the 'Undo' & 'Owner' tab
- + RoleManager.manage_options # add the 'Security' tab
- )
-
- def __init__(self, id, title):
- "Initialise a new instance of ZScoDoc"
- self.id = id
- self.title = title
- self.manage_addProperty("admin_password_initialized", "0", "string")
-
- security.declareProtected(ScoView, "ScoDocURL")
-
- def ScoDocURL(self):
- "base URL for this instance (top level for ScoDoc site)"
- return self.absolute_url()
-
- def _check_admin_perm(self, REQUEST):
- """Check if user has permission to add/delete departements"""
- authuser = REQUEST.AUTHENTICATED_USER
- if authuser.has_role("manager") or authuser.has_permission(
- Permission.ScoSuperAdmin, self
- ):
- return ""
- else:
- return """
Vous n'avez pas le droit d'accéder à cette page
"""
-
- def _check_users_folder(self, REQUEST=None):
- """Vérifie UserFolder et le crée s'il le faut"""
- try:
- _ = self.UsersDB
- return ""
- except:
- e = self._check_admin_perm(REQUEST)
- if not e: # admin permissions:
- self.create_users_cnx(REQUEST)
- self.create_users_folder(REQUEST)
- return 'Création du connecteur utilisateurs réussie
'
- else:
- return """Installation non terminée: connectez vous avec les droits d'administrateur
"""
-
- security.declareProtected("View", "create_users_folder")
-
- def create_users_folder(self, REQUEST=None):
- """Create Zope user folder"""
- e = self._check_admin_perm(REQUEST)
- if e:
- return e
-
- if REQUEST is None:
- REQUEST = {}
-
- REQUEST.form["pgauth_connection"] = "UsersDB"
- REQUEST.form["pgauth_table"] = "sco_users"
- REQUEST.form["pgauth_usernameColumn"] = "user_name"
- REQUEST.form["pgauth_passwordColumn"] = "passwd"
- REQUEST.form["pgauth_rolesColumn"] = "roles"
-
- add_method = self.manage_addProduct["OFSP"].manage_addexUserFolder
- log("create_users_folder: in %s" % self.id)
- return add_method(
- authId="pgAuthSource",
- propId="nullPropSource",
- memberId="nullMemberSource",
- groupId="nullGroupSource",
- cryptoId="MD51",
- # doAuth='1', doProp='1', doMember='1', doGroup='1', allDone='1',
- cookie_mode=2,
- session_length=500,
- not_session_length=0,
- REQUEST=REQUEST,
- )
-
- def _fix_users_folder(self):
- """removes docLogin and docLogout dtml methods from exUserFolder, so that we use ours.
- (called each time be index_html, to fix old ScoDoc installations.)
- """
- try:
- self.acl_users.manage_delObjects(ids=["docLogin", "docLogout"])
- except:
- pass
- # add missing getAuthFailedMessage (bug in exUserFolder ?)
- try:
- _ = self.getAuthFailedMessage
- except:
- log("adding getAuthFailedMessage to Zope install")
- parent = self.aq_parent
- from OFS.DTMLMethod import addDTMLMethod # pylint: disable=import-error
-
- addDTMLMethod(parent, "getAuthFailedMessage", file="Identification")
-
- security.declareProtected("View", "create_users_cnx")
-
- def create_users_cnx(self, REQUEST=None):
- """Create Zope connector to UsersDB
-
- Note: la connexion est fixée (SCOUSERS) (base crée par l'installeur) !
- Les utilisateurs avancés pourront la changer ensuite.
- """
- # ce connecteur zope - db est encore pour l'instant utilisé par exUserFolder.pgAuthSource
- # (en lecture seule en principe)
- oid = "UsersDB"
- log("create_users_cnx: in %s" % self.id)
- da = ZopeDA.Connection(
- oid,
- "Cnx bd utilisateurs",
- scu.SCO_DEFAULT_SQL_USERS_CNX,
- False,
- check=1,
- tilevel=2,
- encoding="LATIN1",
- )
- self._setObject(oid, da)
-
- security.declareProtected("View", "change_admin_user")
-
- def change_admin_user(self, password, REQUEST=None):
- """Change password of admin user"""
- # note: controle sur le role et non pas sur une permission
- # (non definies au top level)
- if not REQUEST.AUTHENTICATED_USER.has_role("Manager"):
- log("user %s is not Manager" % REQUEST.AUTHENTICATED_USER)
- log("roles=%s" % REQUEST.AUTHENTICATED_USER.getRolesInContext(self))
- raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération")
- log("trying to change admin password")
- # 1-- check strong password
- if not sco_users.is_valid_password(password):
- log("refusing weak password")
- return REQUEST.RESPONSE.redirect(
- "change_admin_user_form?message=Mot%20de%20passe%20trop%20simple,%20recommencez"
- )
- # 2-- change password for admin user
- username = "admin"
- acl_users = self.aq_parent.acl_users
- user = acl_users.getUser(username)
- r = acl_users._changeUser(
- username, password, password, user.roles, user.domains
- )
- if not r:
- # OK, set property to indicate we changed the password
- log("admin password changed successfully")
- self.manage_changeProperties(admin_password_initialized="1")
- return r or REQUEST.RESPONSE.redirect("index_html")
-
- security.declareProtected("View", "change_admin_user_form")
-
- def change_admin_user_form(self, message="", REQUEST=None):
- """Form allowing to change the ScoDoc admin password"""
- # note: controle sur le role et non pas sur une permission
- # (non definies au top level)
- if not REQUEST.AUTHENTICATED_USER.has_role("Manager"):
- raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération")
- H = [
- html_sco_header.scodoc_top_html_header(
- self, REQUEST, page_title="ScoDoc: changement mot de passe"
- )
- ]
- if message:
- H.append('%s
' % message)
- H.append(
- """Changement du mot de passe administrateur (utilisateur admin)
-
-