View | Details | Raw Unified | Return to bug 41231 | Differences between
and this patch

Collapse All | Expand All

(-)doc/manual/import-hooks-de.xml (-1 / +9 lines)
 Lines 116-127    Link Here 
116
	  zugeordnet wird.
116
	  zugeordnet wird.
117
	</para>
117
	</para>
118
	<para>
118
	<para>
119
	  Über drei weitere &ucsUCR;-Variablen kann das Verhalten des Hooks gesteuert
119
	  Über vier weitere &ucsUCR;-Variablen kann das Verhalten des Hooks gesteuert
120
	  werden:
120
	  werden:
121
	</para>
121
	</para>
122
	  <itemizedlist>
122
	  <itemizedlist>
123
		<listitem>
123
		<listitem>
124
		  <para>
124
		  <para>
125
			<command>ucsschool/import/generate/share/marktplatz/name</command>
126
		  </para>
127
		  <para>
128
			Diese Variable definiert den Namen der Freigabe. Der Standard ist <literal>Marktplatz</literal>.
129
		  </para>
130
		</listitem>
131
		<listitem>
132
		  <para>
125
			<command>ucsschool/import/generate/share/marktplatz/sharepath</command>
133
			<command>ucsschool/import/generate/share/marktplatz/sharepath</command>
126
		  </para>
134
		  </para>
127
		  <para>
135
		  <para>
(-)doc/manual/performance-de.xml (+4 lines)
 Lines 93-98    Link Here 
93
  		  </simpara>
93
  		  </simpara>
94
  		</listitem>
94
  		</listitem>
95
  	  </itemizedlist>
95
  	  </itemizedlist>
96
  	  <note>
97
  	    Der Teil des Gruppennamens der hier &lt;Edukativnetz&gt; ist, kann seit &ucsUAS;-Version 4.1 R2 v10
98
  	    verändert werden. Siehe dazu auch <xref linkend="structure:ldap:container_names"/>.
99
  	  </note>
96
  	</para>
100
  	</para>
97
    </section>
101
    </section>
98
  
102
  
(-)doc/manual/setup-school-generic-de.xml (-17 / +23 lines)
 Lines 39-52    Link Here 
39
            Zugriffsrechte gesetzt werden. Dabei kann der Zugriff für einzelne Benutzer oder ganze Gruppen
39
            Zugriffsrechte gesetzt werden. Dabei kann der Zugriff für einzelne Benutzer oder ganze Gruppen
40
            erlaubt bzw. gesperrt werden. Um den Schülern den Zugriff auf die physikalischen Drucker zu
40
            erlaubt bzw. gesperrt werden. Um den Schülern den Zugriff auf die physikalischen Drucker zu
41
            verbieten, muss an den Druckerfreigaben für diese Drucker der Zugriff durch Benutzer der
41
            verbieten, muss an den Druckerfreigaben für diese Drucker der Zugriff durch Benutzer der
42
            OU-spezifischen Gruppe
42
            OU-spezifischen Gruppe <systemitem class="groupname">schueler-<replaceable>OU</replaceable></systemitem>
43
            <systemitem class="groupname">schueler-
43
            (z.B. <systemitem class="groupname">schueler-gsmitte</systemitem>) verboten werden. Für den PDF-Drucker
44
                <replaceable>OU</replaceable>
44
            <systemitem class="resource">PDFDrucker</systemitem> sollten keine Einschränkungen gemacht werden.
45
            </systemitem>
45
            <note>
46
            > (z.B. <systemitem class="groupname">schueler-gsmitte</systemitem>)
46
                Der Teil des Gruppennamens der hier &lt;schueler-&gt; ist, kann seit &ucsUAS;-Version 4.1 R2 v10 verändert
47
            verboten werden. Für den PDF-Drucker <systemitem class="resource">PDFDrucker</systemitem> sollten keine
47
                werden. Siehe dazu auch <xref linkend="structure:ldap:container_names"/>.
48
            Einschränkungen
48
            </note>
49
            gemacht werden.
50
        </para>
49
        </para>
51
        <para>
50
        <para>
52
            Schüler haben damit nur noch die Möglichkeit Druckaufträge an den
51
            Schüler haben damit nur noch die Möglichkeit Druckaufträge an den
 Lines 228-233    Link Here 
228
            Anlegen einer OU kann durch das Setzen der &ucsUCRV;
227
            Anlegen einer OU kann durch das Setzen der &ucsUCRV;
229
            <envar>ucsschool/import/generate/marktplatz</envar> auf den
228
            <envar>ucsschool/import/generate/marktplatz</envar> auf den
230
            Wert <literal>no</literal> verhindert werden.
229
            Wert <literal>no</literal> verhindert werden.
230
            <note>
231
                Weiterführnde Informationen zur <emphasis>Marktplatz</emphasis>-Freigabe finden sich unter <xref linkend="import:marketplace"/>.
232
            </note>
231
        </para>
233
        </para>
232
        <para>
234
        <para>
233
            Diese Freigaben müssen zwingend auf dem Schulserver bereitgestellt
235
            Diese Freigaben müssen zwingend auf dem Schulserver bereitgestellt
 Lines 280-285    Link Here 
280
            Die Freigabe erlaubt der Gruppe <systemitem class="resource">lehrer-&lt;OU&gt;</systemitem> den
282
            Die Freigabe erlaubt der Gruppe <systemitem class="resource">lehrer-&lt;OU&gt;</systemitem> den
281
            administrativen
283
            administrativen
282
            Zugriff auf das Basisverzeichnis <filename class="directory">/home/&lt;OU&gt;/schueler</filename>.
284
            Zugriff auf das Basisverzeichnis <filename class="directory">/home/&lt;OU&gt;/schueler</filename>.
285
            <note>
286
                Der Teil des Gruppennamens der hier &lt;schueler-&gt; bzw.&lt;lehrer-&gt; ist, kann seit
287
                &ucsUAS;-Version 4.1 R2 v10 verändert werden. Siehe dazu auch <xref linkend="structure:ldap:container_names"/>.
288
            </note>
283
        </para>
289
        </para>
284
        <para>
290
        <para>
285
            Per Voreinstellung wird der Lehrergruppe Lesezugriff gewährt.
291
            Per Voreinstellung wird der Lehrergruppe Lesezugriff gewährt.
 Lines 310-332    Link Here 
310
            Option zu Schuladministratoren umgewandelt werden.
316
            Option zu Schuladministratoren umgewandelt werden.
311
            <itemizedlist>
317
            <itemizedlist>
312
                <listitem>
318
                <listitem>
313
                    <simpara>
319
                    <para>
314
                        Die zusätzliche Gruppenmitgliedschaft muss manuell über das &ucsUMC;-Modul
320
                        Die zusätzliche Gruppenmitgliedschaft muss manuell über das &ucsUMC;-Modul
315
                        <guimenu>Benutzer</guimenu>
321
                        <guimenu>Benutzer</guimenu> auf dem &ucsMaster; hinzugefügt werden. Auf dem Reiter
316
                        auf dem &ucsMaster; hinzugefügt werden. Auf dem Reiter
322
                        <guimenu>Gruppen</guimenu> muss das Benutzerkonto in die Gruppe
317
                        <guimenu>Gruppen</guimenu>
318
                        muss das Benutzerkonto in die Gruppe
319
                        <systemitem class="groupname"><replaceable>admins-OU</replaceable></systemitem>
323
                        <systemitem class="groupname"><replaceable>admins-OU</replaceable></systemitem>
320
                        (für die OU <wordasword>gym17</wordasword> ist dies die Gruppe
324
                        (für die OU <wordasword>gym17</wordasword> ist dies die Gruppe
321
                        <systemitem class="groupname">admins-gym17</systemitem>) aufgenommen werden.
325
                        <systemitem class="groupname">admins-gym17</systemitem>) aufgenommen werden.
322
                    </simpara>
326
                        <note>
327
                            Der Teil des Gruppennamens der hier &lt;admins-&gt; ist, kann seit &ucsUAS;-Version 4.1 R2 v10
328
                            verändert werden. Siehe dazu auch <xref linkend="structure:ldap:container_names"/>.
329
                        </note>
330
                    </para>
323
                </listitem>
331
                </listitem>
324
                <listitem>
332
                <listitem>
325
                    <simpara>
333
                    <simpara>
326
                        Im &ucsUMC;-Modul <guimenu>Benutzer</guimenu> muss außerdem im Reiter
334
                        Im &ucsUMC;-Modul <guimenu>Benutzer</guimenu> muss außerdem im Reiter
327
                        <guimenu>Optionen</guimenu>
335
                        <guimenu>Optionen</guimenu> die Option <option>UCS@school-Administrator</option>
328
                        die Option
329
                        <option>UCS@school-Administrator</option>
330
                        eingeschaltet werden.
336
                        eingeschaltet werden.
331
                    </simpara>
337
                    </simpara>
332
                </listitem>
338
                </listitem>
(-)doc/manual/structure-de.xml (+78 lines)
 Lines 329-334    Link Here 
329
		</note>
329
		</note>
330
	  </section>
330
	  </section>
331
331
332
	  <section id="structure:ldap:container_names">
333
		<title>Gruppen-, Verzeichnis- und Containernamen</title>
334
		  <para>
335
		    Seit &ucsUAS;-Version 4.1 R2 v7 können mit Hilfe von UCR-Variablen Teile der Gruppen-, Verzeichnis- und Containernamen
336
		    <emphasis>vor der Installation der &ucsUAS;-App</emphasis> bestimmt werden.
337
		  </para>
338
		  <para>
339
			Beispielsweise wird die Gruppe <systemitem class="groupname">Member-Edukativnetz</systemitem> durch Setzen
340
			der UCR-Variablen <envar>ucsschool/ldap/default/groupname/all-educational-member=Membre-Enseignement</envar>
341
			mit dem Namen <systemitem class="groupname">Membre-Enseignement</systemitem> angelegt.
342
		  </para>
343
		  <para>
344
			  Sollen zum Beispiel die Benutzerkonten von Schülern nicht im Container
345
			  <uri>cn=schueler,cn=groups,ou=gymmitte,dc=example,dc=com</uri> gespeichert werden, sondern unter
346
			  <uri>cn=ecolier,cn=groups,ou=gymmitte,dc=example,dc=com</uri>, muss
347
			  <envar>ucsschool/ldap/default/container/pupils=ecolier</envar> gesetzt werden.
348
		  </para>
349
		  <para>
350
			  Die Bedeutung der aller UCR-Variablen können Sie durch das Lesen der Hilfetexte zu den UCR-Variablen erfahren
351
			  (siehe <biblioref linkend="ucs-handbuch"/>).
352
		  </para>
353
		  <para>
354
			  <simpara>
355
				Die folgenden Teile von Containernamen (z.B. in <uri>cn=admins,cn=groups,ou=gymmitte,dc=example,dc=com</uri>) können gesetzt werden:
356
			  </simpara>
357
			  <itemizedlist>
358
				  <listitem><simpara>admins:                 <envar>ucsschool/ldap/default/container/admins</envar></simpara></listitem>
359
				  <listitem><simpara>schueler:               <envar>ucsschool/ldap/default/container/pupils</envar></simpara></listitem>
360
				  <listitem><simpara>mitarbeiter:            <envar>ucsschool/ldap/default/container/staff</envar></simpara></listitem>
361
				  <listitem><simpara>lehrer und mitarbeiter: <envar>ucsschool/ldap/default/container/teachers-and-staff</envar></simpara></listitem>
362
				  <listitem><simpara>lehrer:                 <envar>ucsschool/ldap/default/container/teachers</envar></simpara></listitem>
363
				  <listitem><simpara>klassen:                <envar>ucsschool/ldap/default/container/class</envar></simpara></listitem>
364
				  <listitem><simpara>raeume:                 <envar>ucsschool/ldap/default/container/rooms</envar></simpara></listitem>
365
				  <listitem><simpara>examusers:              <envar>ucsschool/ldap/default/container/exam</envar></simpara></listitem>
366
			  </itemizedlist>
367
		  </para>
368
		  <para>
369
			  <simpara>
370
				Die folgenden Präfixe von Gruppennamen (z.B. in <systemitem class="groupname">schueler-gymmitte</systemitem>) können gesetzt werden:
371
			  </simpara>
372
			  <itemizedlist>
373
				  <listitem><simpara>schueler-:              <envar>ucsschool/ldap/default/groupprefix/pupils</envar></simpara></listitem>
374
				  <listitem><simpara>lehrer-:                <envar>ucsschool/ldap/default/groupprefix/teachers</envar></simpara></listitem>
375
				  <listitem><simpara>admins-:                <envar>ucsschool/ldap/default/groupprefix/admins</envar></simpara></listitem>
376
				  <listitem><simpara>mitarbeiter-:           <envar>ucsschool/ldap/default/groupprefix/staff</envar></simpara></listitem>
377
			  </itemizedlist>
378
			  <simpara>
379
				  Die folgenden Gruppennamen können per UCR gesetzt werden. Bei Namen die <replaceable>%(ou)s</replaceable> enthalten
380
				  wird dieses vom System durch das jeweilige Schulkürzel ersetzt (z.B. <uri>gymmitte</uri> in
381
				  <systemitem class="groupname">OUgymmitte-DC-Edukativnetz</systemitem>).
382
			  </simpara>
383
			  <itemizedlist>
384
				  <listitem><simpara>DC-Edukativnetz:                 <envar>ucsschool/ldap/default/groupname/all-educational-dc</envar></simpara></listitem>
385
				  <listitem><simpara>Member-Edukativnetz:             <envar>ucsschool/ldap/default/groupname/all-educational-member</envar></simpara></listitem>
386
				  <listitem><simpara>DC-Verwaltungsnetz:              <envar>ucsschool/ldap/default/groupname/all-administrativ-dc</envar></simpara></listitem>
387
				  <listitem><simpara>Member-Verwaltungsnetz:          <envar>ucsschool/ldap/default/groupname/all-administrativ-member</envar></simpara></listitem>
388
				  <listitem><simpara>OU%(ou)s-DC-Edukativnetz:        <envar>ucsschool/ldap/default/groupname/ou-educational-dc</envar></simpara></listitem>
389
				  <listitem><simpara>OU%(ou)s-Member-Edukativnetz:    <envar>ucsschool/ldap/default/groupname/ou-educational-member</envar></simpara></listitem>
390
				  <listitem><simpara>OU%(ou)s-DC-Verwaltungsnetz:     <envar>ucsschool/ldap/default/groupname/ou-administrativ-dc</envar></simpara></listitem>
391
				  <listitem><simpara>OU%(ou)s-Member-Verwaltungsnetz: <envar>ucsschool/ldap/default/groupname/ou-administrativ-member</envar></simpara></listitem>
392
				  <listitem><simpara>OU%(ou)s-Klassenarbeit:          <envar>ucsschool/ldap/default/groupname/exam</envar></simpara></listitem>
393
			  </itemizedlist>
394
			  <simpara>
395
				  Die folgenden Verzeichnisnamen können per UCR gesetzt werden (z.B. <envar>klassen</envar> in <filename class="directory">/home/groups/klassen/3b</filename>):
396
			  </simpara>
397
			  <itemizedlist>
398
				  <listitem><simpara>klassen:                <envar>ucsschool/ldap/default/share/class</envar></simpara></listitem>
399
				  <listitem><simpara>schueler:               <envar>ucsschool/ldap/default/share/pupils</envar></simpara></listitem>
400
				  <listitem><simpara>lehrer:                 <envar>ucsschool/ldap/default/share/teachers</envar></simpara></listitem>
401
				  <listitem><simpara>Unterrichtsmaterial:    <envar>ucsschool/datadistribution/datadir/sender</envar></simpara></listitem>
402
				  <listitem><simpara>Unterrichtsmaterial:    <envar>ucsschool/datadistribution/datadir/recipient</envar></simpara></listitem>
403
				  <listitem><simpara>Klassenarbeiten:        <envar>ucsschool/ldap/default/share/exams</envar></simpara></listitem>
404
				  <listitem><simpara>schueler, lehrer, mitarbeiter:  <envar>ucsschool/import/roleshare/.*/path</envar></simpara></listitem>
405
				  <listitem><simpara>Marktplatz:             <envar>ucsschool/import/generate/share/marktplatz/name</envar></simpara></listitem>
406
			  </itemizedlist>
407
		  </para>
408
	  </section>
409
332
	  <section id="structure:ldap:global">
410
	  <section id="structure:ldap:global">
333
		<title>Weitere &ucsUAS;-Objekte</title>
411
		<title>Weitere &ucsUAS;-Objekte</title>
334
		<para>
412
		<para>
(-)ucs-school-import/debian/ucs-school-import.univention-config-registry-variables (-21 / +123 lines)
 Lines 4-57    Link Here 
4
Type=str
4
Type=str
5
Categories=ucsschool-base
5
Categories=ucsschool-base
6
6
7
[ucsschool/ldap/default/container/admins]
8
Description[de]=Standard-Container-Name für Administratoren. Standard ist "admins".
9
Description[en]=Default container name for administrators. Default is "admins".
10
Type=str
11
Categories=ucsschool-base
12
13
[ucsschool/ldap/default/container/class]
14
Description[de]=Standard-Container-Name für Schulklassen. Standard ist "klassen".
15
Description[en]=Default container name for school classes. Default is "klassen".
16
Type=str
17
Categories=ucsschool-base
18
19
[ucsschool/ldap/default/container/exam]
20
Description[de]=Standard-Container-Name für Schüler in einer Prüfung. Standard ist "examusers".
21
Description[en]=Default container name name for pupils writing exams. Default is "examusers".
22
Type=str
23
Categories=ucsschool-base
24
7
[ucsschool/ldap/default/container/pupils]
25
[ucsschool/ldap/default/container/pupils]
8
Description[de]=Standard-Container für Schüler
26
Description[de]=Standard-Container-Name für Schüler. Standard ist "schueler".
9
Description[en]=Default container for pupils
27
Description[en]=Default container name for pupils. Default is "schueler".
10
Type=str
28
Type=str
11
Categories=ucsschool-base
29
Categories=ucsschool-base
12
30
31
[ucsschool/ldap/default/container/rooms]
32
Description[de]=Standard-Container-Name für Klassenräume. Standard ist "raeume".
33
Description[en]=Default container name for class rooms. Default is "raeume".
34
Type=str
35
Categories=ucsschool-base
36
37
[ucsschool/ldap/default/container/staff]
38
Description[de]=Standard-Container-Name für Mitarbeiter. Standard ist "mitarbeiter".
39
Description[en]=Default container name for staff members. Default is "mitarbeiter".
40
Type=str
41
Categories=ucsschool-base
42
13
[ucsschool/ldap/default/container/teachers]
43
[ucsschool/ldap/default/container/teachers]
14
Description[de]=Standard-Container für Lehrer
44
Description[de]=Standard-Container-Name für Lehrer. Standard ist "lehrer".
15
Description[en]=Default container for teachers
45
Description[en]=Default container name for teachers. Default is "lehrer".
16
Type=str
46
Type=str
17
Categories=ucsschool-base
47
Categories=ucsschool-base
18
48
19
[ucsschool/ldap/default/container/admins]
49
[ucsschool/ldap/default/container/teachers-and-staff]
20
Description[de]=Standard-Container für Administratoren
50
Description[de]=Standard-Container-Name für Benutzer die gleichzeitig Lehrer und Mitarbeiter sind. Standard ist "lehrer und mitarbeiter".
21
Description[en]=Default container for administrators
51
Description[en]=Default container name for users that are both teachers and staff members. Default is "lehrer und mitarbeiter".
22
Type=str
52
Type=str
23
Categories=ucsschool-base
53
Categories=ucsschool-base
24
54
25
[ucsschool/ldap/default/container/staff]
55
[ucsschool/ldap/default/groupname/exam]
26
Description[de]=Standard-Container für Mitarbeiter
56
Description[de]=Standard Gruppenname für Schüler in einer Prüfung. Das "%(ou)s" im Namen wird mit dem Schulkürzel (OU) ersetzt. Standard ist "OU%(ou)s-Klassenarbeit".
27
Description[en]=Default container for staff members
57
Description[en]=Default group name for pupils writing exams. The "%(ou)s" in the name will be replaced by the short name of the school (OU). Default is "OU%(ou)s-Klassenarbeit".
28
Type=str
58
Type=str
29
Categories=ucsschool-base
59
Categories=ucsschool-base
30
60
31
[ucsschool/ldap/default/groupprefix/pupils]
61
[ucsschool/ldap/default/groupname/all-administrativ-dc]
32
Description[de]=Standard-Prefix für die Schüler-Gruppen
62
Description[de]=Standard Gruppenname für Domain Controller in Verwaltungsnetzen. Standard ist "DC-Verwaltungsnetz".
33
Description[en]=Default prefix for pupils groups
63
Description[en]=Default group name for domain controllers in administrativ networks. Default is "DC-Verwaltungsnetz".
34
Type=str
64
Type=str
35
Categories=ucsschool-base
65
Categories=ucsschool-base
36
66
37
[ucsschool/ldap/default/groupprefix/teachers]
67
[ucsschool/ldap/default/groupname/all-administrativ-member]
38
Description[de]=Standard-Prefix für die Lehrer-Gruppen
68
Description[de]=Standard Gruppenname für Member Server in Verwaltungsnetzen. Standard ist "Member-Verwaltungsnetz".
39
Description[en]=Default prefix for teacher groups
69
Description[en]=Default group name for member servers in administrativ networks. Default is "Member-Verwaltungsnetz".
40
Type=str
70
Type=str
41
Categories=ucsschool-base
71
Categories=ucsschool-base
42
72
73
[ucsschool/ldap/default/groupname/all-educational-dc]
74
Description[de]=Standard Gruppenname für Domain Controller in Edukativnetzen. Standard ist "DC-Edukativnetz".
75
Description[en]=Default group name for domain controllers in educational networks. Default is "DC-Edukativnetz".
76
Type=str
77
Categories=ucsschool-base
78
79
[ucsschool/ldap/default/groupname/all-educational-member]
80
Description[de]=Standard Gruppenname für Member Server in Edukativnetzen. Standard ist "Member-Edukativnetz".
81
Description[en]=Default group name for member servers in educational networks. Default is "Member-Edukativnetz".
82
Type=str
83
Categories=ucsschool-base
84
85
[ucsschool/ldap/default/groupname/ou-administrativ-dc]
86
Description[de]=Standard Gruppenname für Domain Controller im Verwaltungsnetz einer bestimmten Schule. Das "%(ou)s" im Namen wird mit dem Schulkürzel (OU) ersetzt. Standard ist "OU%(ou)s-DC-Verwaltungsnetz".
87
Description[en]=Default group name for domain controllers in the administrativ network. The "%(ou)s" in the name will be replaced by the short name of the school (OU). Default is "OU%(ou)s-DC-Verwaltungsnetz".
88
Type=str
89
Categories=ucsschool-base
90
91
[ucsschool/ldap/default/groupname/ou-administrativ-member]
92
Description[de]=Standard Gruppenname für Member Server im Verwaltungsnetz einer bestimmten Schule. Das "%(ou)s" im Namen wird mit dem Schulkürzel (OU) ersetzt. Standard ist "OU%(ou)s-Member-Verwaltungsnetz".
93
Description[en]=Default group name for member servers in the administrativ network. The "%(ou)s" in the name will be replaced by the short name of the school (OU). Default is "OU%(ou)s-Member-Verwaltungsnetz".
94
Type=str
95
Categories=ucsschool-base
96
97
[ucsschool/ldap/default/groupname/ou-educational-dc]
98
Description[de]=Standard Gruppenname für Domain Controller im Edukativnetz einer bestimmten Schule. Das "%(ou)s" im Namen wird mit dem Schulkürzel (OU) ersetzt. Standard ist "OU%(ou)s-DC-Edukativnetz".
99
Description[en]=Default group name for domain controllers in the educational network. The "%(ou)s" in the name will be replaced by the short name of the school (OU). Default is "OU%(ou)s-DC-Edukativnetz".
100
Type=str
101
Categories=ucsschool-base
102
103
[ucsschool/ldap/default/groupname/ou-educational-member]
104
Description[de]=Standard Gruppenname für Member Server im Edukativnetz einer bestimmten Schule. Das "%(ou)s" im Namen wird mit dem Schulkürzel (OU) ersetzt. Standard ist "OU%(ou)s-Member-Edukativnetz".
105
Description[en]=Default group name for member servers in the educational network. The "%(ou)s" in the name will be replaced by the short name of the school (OU). Default is "OU%(ou)s-Member-Edukativnetz".
106
Type=str
107
Categories=ucsschool-base
108
43
[ucsschool/ldap/default/groupprefix/admins]
109
[ucsschool/ldap/default/groupprefix/admins]
44
Description[de]=Standard-Prefix für die Administrator-Gruppen
110
Description[de]=Standard-Prefix für die Administrator-Gruppen. Standard ist "admins-".
45
Description[en]=Default prefix for admin groups
111
Description[en]=Default prefix for admin groups. Default is "admins-".
46
Type=str
112
Type=str
47
Categories=ucsschool-base
113
Categories=ucsschool-base
48
114
115
[ucsschool/ldap/default/groupprefix/pupils]
116
Description[de]=Standard-Prefix für die Schüler-Gruppen. Standard ist "schueler-".
117
Description[en]=Default prefix for pupils groups. Default is "schueler-".
118
Type=str
119
Categories=ucsschool-base
120
49
[ucsschool/ldap/default/groupprefix/staff]
121
[ucsschool/ldap/default/groupprefix/staff]
50
Description[de]=Standard-Prefix für die Mitarbeiter-Gruppen
122
Description[de]=Standard-Prefix für die Mitarbeiter-Gruppen. Standard ist "mitarbeiter-".
51
Description[en]=Default prefix for staff groups
123
Description[en]=Default prefix for staff groups. Default is "mitarbeiter-".
52
Type=str
124
Type=str
53
Categories=ucsschool-base
125
Categories=ucsschool-base
54
126
127
[ucsschool/ldap/default/groupprefix/teachers]
128
Description[de]=Standard-Prefix für die Lehrer-Gruppen. Standard ist "lehrer-".
129
Description[en]=Default prefix for teacher groups. Default is "lehrer-".
130
Type=str
131
Categories=ucsschool-base
132
133
[ucsschool/ldap/default/share/class]
134
Description[de]=Standard Verzeichnisname für die Klassen-Freigabe. Standard ist "klassen".
135
Description[en]=Default directory name for the class share. Default is "klassen".
136
Type=str
137
Categories=ucsschool-base
138
139
[ucsschool/ldap/default/share/pupils]
140
Description[de]=Standard Verzeichnisname für die Schüler-Verzeichnisse. Standard ist "schueler".
141
Description[en]=Default directory name for the pupils directories. Default is "schueler".
142
Type=str
143
Categories=ucsschool-base
144
145
[ucsschool/ldap/default/share/teachers]
146
Description[de]=Standard Verzeichnisname für die Lehrer-Verzeichnisse. Standard ist "lehrer".
147
Description[en]=Default directory name for the teachers directories. Default is "lehrer".
148
Type=str
149
Categories=ucsschool-base
150
55
[ucsschool/ldap/default/dcs]
151
[ucsschool/ldap/default/dcs]
56
Description[de]=Spezifiziert welche Schul-DCs beim Erzeugen einer Schule angelegt werden sollen (Werte: edukativ und/oder verwaltung)
152
Description[de]=Spezifiziert welche Schul-DCs beim Erzeugen einer Schule angelegt werden sollen (Werte: edukativ und/oder verwaltung)
57
Description[en]=Specifies which school DCs are created during the school set up (values: edukativ and/or verwaltung)
153
Description[en]=Specifies which school DCs are created during the school set up (values: edukativ and/or verwaltung)
 Lines 64-69    Link Here 
64
Type=str
160
Type=str
65
Categories=ucsschool-base
161
Categories=ucsschool-base
66
162
163
[ucsschool/import/generate/share/marktplatz/name]
164
Description[de]=Name der Freigabe (Default: "Marktplatz").
165
Description[en]=Name of share (default: "Marktplatz").
166
Type=str
167
Categories=ucsschool-base
168
67
[ucsschool/import/generate/share/marktplatz/sharepath]
169
[ucsschool/import/generate/share/marktplatz/sharepath]
68
Description[de]=Vorgabepfad der Freigabe "Marktplatz" (Default: /home/$ou/groups/Marktplatz)
170
Description[de]=Vorgabepfad der Freigabe "Marktplatz" (Default: /home/$ou/groups/Marktplatz)
69
Description[en]=Default path of share "Marktplatz" (default: /home/$ou/groups/Marktplatz)
171
Description[en]=Default path of share "Marktplatz" (default: /home/$ou/groups/Marktplatz)
 Lines 125-131    Link Here 
125
Categories=ucsschool-base
227
Categories=ucsschool-base
126
228
127
[ucsschool/import/roleshare]
229
[ucsschool/import/roleshare]
128
Description[de]=Falls diese Variable nicht auf "false" oder "no" gesetzt, dann werden Homeverzeichnisse für Benutzer und Klassengruppen in einer rollen- und schulspezifischen Struktur von Unterverzeichnissen angelegt, z.B. unter /home/$ou/schueler/.
230
Description[de]=Falls diese Variable nicht auf "false" oder "no" gesetzt wird, werden Homeverzeichnisse für Benutzer und Klassengruppen in einer rollen- und schulspezifischen Struktur von Unterverzeichnissen angelegt, z.B. unter /home/$ou/schueler/.
129
Description[en]=If this variable is not set to "false" or "no", then home directories for users and class groups will be created in a role and school specific structure of subdirectories, e.g. in /home/$ou/schueler/.
231
Description[en]=If this variable is not set to "false" or "no", then home directories for users and class groups will be created in a role and school specific structure of subdirectories, e.g. in /home/$ou/schueler/.
130
Type=str
232
Type=str
131
Categories=ucsschool-base
233
Categories=ucsschool-base
(-)ucs-school-import/modules/ucsschool/importer/contrib/csv.py (-1 / +1 lines)
 Lines 346-352    Link Here 
346
346
347
	def next(self):
347
	def next(self):
348
		if self.line_num == 0:
348
		if self.line_num == 0:
349
		    # Used only for its side effect.
349
			# Used only for its side effect.
350
			self.fieldnames
350
			self.fieldnames
351
		self.row = self.reader.next()
351
		self.row = self.reader.next()
352
		self.line_num = self.reader.line_num
352
		self.line_num = self.reader.line_num
(-)ucs-school-import/modules/ucsschool/importer/models/import_user.py (-1 / +1 lines)
 Lines 107-113    Link Here 
107
			self.__class__.config = Configuration()
107
			self.__class__.config = Configuration()
108
			self.__class__.reader = self.factory.make_reader()
108
			self.__class__.reader = self.factory.make_reader()
109
			self.__class__.logger = get_logger()
109
			self.__class__.logger = get_logger()
110
			self.__class__.username_max_length = 20 - len(self.ucr.get("ucsschool/ldap/default/userprefix/exam", "exam-"))
110
			self.__class__.username_max_length = 20 - len(Student.get_search_base(school).user_prefix_exam)
111
		self._lo = None
111
		self._lo = None
112
		self._userexpiry = None
112
		self._userexpiry = None
113
		super(ImportUser, self).__init__(name, school, **kwargs)
113
		super(ImportUser, self).__init__(name, school, **kwargs)
(-)ucs-school-import/tests/test_move_domaincontroller_to_ou (-1 / +5 lines)
 Lines 37-42    Link Here 
37
	exit 1
37
	exit 1
38
fi
38
fi
39
39
40
. /usr/share/ucs-school-lib/base.sh
41
40
eval "$(ucr shell)"
42
eval "$(ucr shell)"
41
43
42
./create_ou test1 dctest1
44
./create_ou test1 dctest1
 Lines 51-58    Link Here 
51
53
52
udm computers/domaincontroller_slave create --position "cn=computers,$ldap_base" --set name=dctest7-01
54
udm computers/domaincontroller_slave create --position "cn=computers,$ldap_base" --set name=dctest7-01
53
./create_ou test7
55
./create_ou test7
54
udm computers/domaincontroller_slave modify --dn "cn=dctest7-01,cn=computers,$ldap_base" --append groups="cn=OUtest7-DC-Edukativnetz,cn=ucsschool,cn=groups,$ldap_base"
55
56
57
test7_dc="$(ucr_names_default ucsschool/ldap/default/groupname/ou-educational-dc test7)"
58
udm computers/domaincontroller_slave modify --dn "cn=dctest7-01,cn=computers,$ldap_base" --append groups="cn=$test7_dc,cn=ucsschool,cn=groups,$ldap_base"
59
56
echo "TEST: DC is unknown"
60
echo "TEST: DC is unknown"
57
./move_domaincontroller_to_ou --dcname UnKnOwN --ou test1
61
./move_domaincontroller_to_ou --dcname UnKnOwN --ou test1
58
echo "EXITCODE: $?"
62
echo "EXITCODE: $?"
(-)ucs-school-import/usr/share/ucs-school-import/hooks/ou_create_post.d/52marktplatz_create (-6 / +9 lines)
 Lines 1-7    Link Here 
1
#!/bin/bash
1
#!/bin/bash
2
#
2
#
3
# 52marktplatz_create
3
# 52marktplatz_create
4
#  Creates a Markplatz share for the specified OUs
4
#  Creates a Marktplatz share for the specified OUs
5
#
5
#
6
# Depends: ucs-school-import
6
# Depends: ucs-school-import
7
#
7
#
 Lines 35-45    Link Here 
35
[ $# -ne 2 ] && echo "USAGE: $(basename $0) FILE DN" && exit 1
35
[ $# -ne 2 ] && echo "USAGE: $(basename $0) FILE DN" && exit 1
36
36
37
. /usr/share/univention-lib/ucr.sh
37
. /usr/share/univention-lib/ucr.sh
38
. /usr/share/ucs-school-lib/base.sh
38
39
39
eval "$(ucr shell)"
40
eval "$(ucr shell)"
40
41
42
name="$(ucr_names_default ucsschool/import/generate/share/marktplatz/name)"
43
41
if ! is_ucr_true "ucsschool/import/generate/share/marktplatz" ; then
44
if ! is_ucr_true "ucsschool/import/generate/share/marktplatz" ; then
42
	echo "$(basename $0): creation of share 'Marktplatz' has been disabled by ucsschool/import/generate/share/marktplatz"
45
	echo "$(basename $0): creation of share '$name' has been disabled by ucsschool/import/generate/share/marktplatz"
43
	exit 0
46
	exit 0
44
fi
47
fi
45
48
 Lines 58-66    Link Here 
58
sharepath="$ucsschool_import_generate_share_marktplatz_sharepath"
61
sharepath="$ucsschool_import_generate_share_marktplatz_sharepath"
59
if [ -z "$sharepath" ] ; then
62
if [ -z "$sharepath" ] ; then
60
	if [ -z "$ucsschool_import_roleshare" ] || is_ucr_true "ucsschool/import/roleshare"; then
63
	if [ -z "$ucsschool_import_roleshare" ] || is_ucr_true "ucsschool/import/roleshare"; then
61
		sharepath="/home/$ou/groups/Marktplatz"
64
		sharepath="/home/$ou/groups/$name"
62
	else
65
	else
63
		sharepath="/home/groups/Marktplatz"
66
		sharepath="/home/groups/$name"
64
	fi
67
	fi
65
fi
68
fi
66
69
 Lines 77-88    Link Here 
77
80
78
udm shares/share create --ignore_exists \
81
udm shares/share create --ignore_exists \
79
	--position "cn=shares,ou=${ou}${district},${ldap_base}" \
82
	--position "cn=shares,ou=${ou}${district},${ldap_base}" \
80
	--set name=Marktplatz \
83
	--set name="${name}" \
81
	--set "host=${dcname}" \
84
	--set "host=${dcname}" \
82
	--set "path=${sharepath}" \
85
	--set "path=${sharepath}" \
83
	--set "directorymode=${sharemode}" \
86
	--set "directorymode=${sharemode}" \
84
	--set "group=${grpuidnumber}"
87
	--set "group=${grpuidnumber}"
85
88
86
echo "$(basename $0): added new share Markplatz for server ${dcname}"
89
echo "$(basename $0): added new share '$name' for server ${dcname}"
87
90
88
exit 0
91
exit 0
(-)ucs-school-import/usr/share/ucs-school-import/scripts/ucs-school-import (-106 / +80 lines)
 Lines 78-85    Link Here 
78
import univention.lib.policy_result
78
import univention.lib.policy_result
79
from ucsschool.lib.roles import role_pupil, role_teacher, role_staff
79
from ucsschool.lib.roles import role_pupil, role_teacher, role_staff
80
from ucsschool.lib.roleshares import roleshare_home_subdir
80
from ucsschool.lib.roleshares import roleshare_home_subdir
81
from ucsschool.lib.models.utils import stopped_notifier, add_stream_logger_to_schoollib
81
from ucsschool.lib.models.utils import stopped_notifier, add_stream_logger_to_schoollib, create_passwd
82
from ucsschool.lib.models.utils import create_passwd
82
from ucsschool.lib.models import School, SchoolClass, ClassShare
83
83
84
84
85
ldap_errors = (ldap.LDAPError, univention.admin.uexceptions.base,)
85
ldap_errors = (ldap.LDAPError, univention.admin.uexceptions.base,)
 Lines 107-123    Link Here 
107
107
108
pwLengthOu = {}
108
pwLengthOu = {}
109
109
110
cn_pupils = configRegistry.get('ucsschool/ldap/default/container/pupils', 'schueler')
111
cn_teachers = configRegistry.get('ucsschool/ldap/default/container/teachers', 'lehrer')
112
cn_teachers_staff = configRegistry.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter')
113
cn_admins = configRegistry.get('ucsschool/ldap/default/container/admins', 'admins')
114
cn_staff = configRegistry.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
115
116
grp_prefix_pupils = configRegistry.get('ucsschool/ldap/default/groupprefix/pupils', 'schueler-')
117
grp_prefix_teachers = configRegistry.get('ucsschool/ldap/default/groupprefix/teachers', 'lehrer-')
118
grp_prefix_admins = configRegistry.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
119
grp_prefix_staff = configRegistry.get('ucsschool/ldap/default/groupprefix/staff', 'mitarbeiter-')
120
121
grp_policy_pupils = configRegistry.get('ucsschool/ldap/default/policy/umc/pupils', 'cn=ucsschool-umc-pupils-default,cn=UMC,cn=policies,%s' % baseDN)
110
grp_policy_pupils = configRegistry.get('ucsschool/ldap/default/policy/umc/pupils', 'cn=ucsschool-umc-pupils-default,cn=UMC,cn=policies,%s' % baseDN)
122
grp_policy_teachers = configRegistry.get('ucsschool/ldap/default/policy/umc/teachers', 'cn=ucsschool-umc-teachers-default,cn=UMC,cn=policies,%s' % baseDN)
111
grp_policy_teachers = configRegistry.get('ucsschool/ldap/default/policy/umc/teachers', 'cn=ucsschool-umc-teachers-default,cn=UMC,cn=policies,%s' % baseDN)
123
grp_policy_admins = configRegistry.get('ucsschool/ldap/default/policy/umc/admins', 'cn=ucsschool-umc-admins-default,cn=UMC,cn=policies,%s' % baseDN)
112
grp_policy_admins = configRegistry.get('ucsschool/ldap/default/policy/umc/admins', 'cn=ucsschool-umc-admins-default,cn=UMC,cn=policies,%s' % baseDN)
 Lines 138-154    Link Here 
138
# IP address prefix len conecerning the netmask
127
# IP address prefix len conecerning the netmask
139
default_prefixlen = 24
128
default_prefixlen = 24
140
129
141
if not (cn_pupils and cn_teachers and cn_teachers_staff and cn_admins and cn_staff):
142
	print '''ERROR: Unable to proceed: one of the following UCR variables is not set correctly:
143
	ucsschool/ldap/default/container/pupils
144
	ucsschool/ldap/default/container/teachers
145
	ucsschool/ldap/default/container/teachers-and-staff
146
	ucsschool/ldap/default/container/staff
147
	ucsschool/ldap/default/container/admins
148
'''
149
	sys.exit(1)
150
130
151
152
def is_valid_ou_name(name):
131
def is_valid_ou_name(name):
153
	""" check if given OU name is valid """
132
	""" check if given OU name is valid """
154
	return bool(re.match('^[a-zA-Z0-9](([a-zA-Z0-9_]*)([a-zA-Z0-9]$))?$', name))
133
	return bool(re.match('^[a-zA-Z0-9](([a-zA-Z0-9_]*)([a-zA-Z0-9]$))?$', name))
 Lines 274-279    Link Here 
274
		else:
253
		else:
275
			self.allsNrs = [self.sNr]
254
			self.allsNrs = [self.sNr]
276
			self.other_sNr = []
255
			self.other_sNr = []
256
		self.search_base = School.get_search_base(self.allsNrs[0])
277
257
278
		# split into multiple class number if comma is present
258
		# split into multiple class number if comma is present
279
		if ',' in self.cNr:
259
		if ',' in self.cNr:
 Lines 328-341    Link Here 
328
308
329
	def getPosition_dn(self):
309
	def getPosition_dn(self):
330
		# resolution order for the position is pupil, teacher, staff
310
		# resolution order for the position is pupil, teacher, staff
331
		cn = cn_pupils
332
		if role_teacher in self.getRole() and role_staff in self.getRole():
311
		if role_teacher in self.getRole() and role_staff in self.getRole():
333
			cn = cn_teachers_staff
312
			return self.search_base.teachersAndStaff
334
		elif role_teacher in self.getRole():
313
		elif role_teacher in self.getRole ():
335
			cn = cn_teachers
314
			return self.search_base.teachers
336
		elif role_staff in self.getRole():
315
		elif role_staff in self.getRole():
337
			cn = cn_staff
316
			return self.search_base.staff
338
		return "cn=%s,cn=users,%s" % (cn, getDN(self.sNr))
317
		return self.search_base.students
339
318
340
	def getDN(self):
319
	def getDN(self):
341
		return "uid=" + self.login + "," + self.getPosition_dn()
320
		return "uid=" + self.login + "," + self.getPosition_dn()
 Lines 344-360    Link Here 
344
		default_groups = []
323
		default_groups = []
345
324
346
		# default group
325
		# default group
347
		default_groups.append("cn=Domain Users " + self.sNr + ",cn=groups,%s" % (getDN(self.sNr), ))
326
		default_groups.append("cn=Domain Users %s,%s" % (self.sNr, self.search_base.groups))
348
327
328
		grp_dns = {
329
			role_teacher: self.search_base.teachers_ou_group,
330
			role_pupil: self.search_base.students_ou_group,
331
			role_staff: self.search_base.staff_ou_group}
349
		for role in self.getRole():
332
		for role in self.getRole():
350
			user_grp_prefix = {role_teacher: grp_prefix_teachers, role_pupil: grp_prefix_pupils, role_staff: grp_prefix_staff}[role]
351
			if role == role_staff and not configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
333
			if role == role_staff and not configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
352
				continue
334
				continue
353
			# class if available
335
			# class if available
354
			for cnr in self.cNr:
336
			for cnr in self.cNr:
355
				default_groups.append("cn=" + cnr + ",cn=klassen,cn=%s,cn=groups,%s" % (cn_pupils, getDN(self.sNr)))
337
				default_groups.append("cn=%s,%s" % (cnr, self.search_base.classes))
356
338
357
			default_groups.append("cn=%s%s,cn=groups,%s" % (user_grp_prefix, self.sNr, getDN(self.sNr)))
339
			default_groups.append(grp_dns[role])
358
340
359
		return default_groups
341
		return default_groups
360
342
 Lines 376-382    Link Here 
376
	except IndexError:
358
	except IndexError:
377
		# TODO: add more debug output
359
		# TODO: add more debug output
378
		print "ERROR: Unable to extract district from school number: %s' % schoolNr + \
360
		print "ERROR: Unable to extract district from school number: %s' % schoolNr + \
379
			'\n\tIf you don't use the district model deactivate UCR variable ucsschool/ldap/district/enable"
361
				'\n\tIf you don't use the district model deactivate UCR variable ucsschool/ldap/district/enable"
380
362
381
363
382
def getDN(schoolNr, base='school', basedn=baseDN):
364
def getDN(schoolNr, base='school', basedn=baseDN):
 Lines 511-531    Link Here 
511
		verify_container(getDN(schoolNr, base='district'), ou_module, co, lo, superordinate, baseDN)
493
		verify_container(getDN(schoolNr, base='district'), ou_module, co, lo, superordinate, baseDN)
512
494
513
	print "verify ou for school nr %s" % schoolNr
495
	print "verify ou for school nr %s" % schoolNr
496
	search_base = School.get_search_base(schoolNr)
514
	# list of needed sub-containers, the dictionary-key adds the container as default during create in verify_container
497
	# list of needed sub-containers, the dictionary-key adds the container as default during create in verify_container
515
	container = {
498
	container = {
516
		'0printerPath': ['cn=printers'],
499
		'0printerPath': [search_base.printers],
517
		'1userPath': ['cn=users', 'cn=%s,cn=users' % cn_pupils, 'cn=%s,cn=users' % cn_teachers, 'cn=%s,cn=users' % cn_admins],
500
		'1userPath': [search_base.users, search_base.students, search_base.teachers, search_base.admins],
518
		'2computerPath': ['cn=computers', 'cn=server,cn=computers', 'cn=dc,cn=server,cn=computers'],
501
		'2computerPath': [search_base.computers, 'cn=server,{}'.format(search_base.computers), 'cn=dc,cn=server,{}'.format(search_base.computers)],
519
		'3networkPath': ['cn=networks'],
502
		'3networkPath': [search_base.networks],
520
		'4groupPath': ['cn=groups', 'cn=%s,cn=groups' % cn_pupils, 'cn=%s,cn=groups' % cn_teachers, 'cn=klassen,cn=%s,cn=groups' % cn_pupils, 'cn=raeume,cn=groups'],
503
		'4groupPath': [search_base.groups, search_base.workgroups, search_base.teachers_group, search_base.classes, search_base.rooms],
521
		'5dhcpPath': ['cn=dhcp'],
504
		'5dhcpPath': [search_base.dhcp],
522
		'6policyPath': ['cn=policies'],
505
		'6policyPath': [search_base.policies],
523
		'7sharePath': ['cn=shares', 'cn=klassen,cn=shares'],
506
		'7sharePath': [search_base.shares, search_base.classShares],
524
		'8none': ['cn=dc,cn=server,cn=computers']
507
		'8none': ['cn=dc,cn=server,{}'.format(search_base.computers)]
525
	}
508
	}
526
	if configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
509
	if configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
527
		container['1userPath'].extend(['cn=%s,cn=users' % cn_staff, 'cn=%s,cn=users' % cn_teachers_staff])
510
		container['1userPath'].extend([search_base.staff, search_base.teachersAndStaff])
528
		container['4groupPath'].append('cn=%s,cn=groups' % cn_staff)
511
		container['4groupPath'].append(search_base.staff_group)
529
	# FIXME: die Policies sollten besser mit der Gruppe verknüpft werden, um
512
	# FIXME: die Policies sollten besser mit der Gruppe verknüpft werden, um
530
	# z.B. Mitarbeiter und Lehrer im selben Container pflegen zu können
513
	# z.B. Mitarbeiter und Lehrer im selben Container pflegen zu können
531
	# container_policies = { 'cn=%s,cn=users' % cn_teachers: ['cn=default-lehrer,cn=UMC,cn=policies,' + baseDN] }
514
	# container_policies = { 'cn=%s,cn=users' % cn_teachers: ['cn=default-lehrer,cn=UMC,cn=policies,' + baseDN] }
 Lines 540-559    Link Here 
540
		dccn = ''
523
		dccn = ''
541
	myline = '%s\t%s' % (schoolNr, dccn)
524
	myline = '%s\t%s' % (schoolNr, dccn)
542
	hooks.pre('ou', 'A', line=myline)
525
	hooks.pre('ou', 'A', line=myline)
526
	search_base = School.get_search_base(schoolNr)
543
527
544
	# verify global dc groups
528
	# verify global dc groups
545
	groups_administrative = [
529
	groups_administrative = [search_base.administrative_dc_group, search_base.administrative_member_group]
546
		"cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % baseDN,
530
	groups_education = [search_base.educational_dc_group, search_base.educational_member_group]
547
		"cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % baseDN]
531
	groups_administrativeOU = [search_base.administrative_ou_dc_group, search_base.administrative_ou_member_group]
548
	groups_education = [
532
	groups_educationOU = [search_base.educational_ou_dc_group, search_base.educational_ou_member_group]
549
		"cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % baseDN,
550
		"cn=Member-Edukativnetz,cn=ucsschool,cn=groups,%s" % baseDN]
551
	groups_administrativeOU = [
552
		"cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN),
553
		"cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN)]
554
	groups_educationOU = [
555
		"cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN),
556
		"cn=OU%s-Member-Edukativnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN)]
557
533
558
	if configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
534
	if configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
559
		groups = groups_administrative + groups_education + groups_administrativeOU + groups_educationOU
535
		groups = groups_administrative + groups_education + groups_administrativeOU + groups_educationOU
 Lines 575-589    Link Here 
575
			# TODO FIXME The following snippet does not make any sense:
551
			# TODO FIXME The following snippet does not make any sense:
576
			# if the DC is member of DC-Verwaltungsnetz then is added again to that group?!? Looks like this code is unused.
552
			# if the DC is member of DC-Verwaltungsnetz then is added again to that group?!? Looks like this code is unused.
577
			for grp in dcobject['groups']:
553
			for grp in dcobject['groups']:
578
				if grp.startswith("cn=DC-Verwaltungsnetz,"):
554
				if grp.startswith(univention.admin.uldap.explodeDn(search_base.administrative_dc_group)[0]):
579
					zone = "verwaltung"
555
					zone = "verwaltung"
580
			groups = []
556
			groups = []
581
			if zone == "edukativ":
557
			if zone == "edukativ":
582
				groups.append("cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % baseDN)
558
				groups.append(search_base.educational_dc_group)
583
				groups.append("cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN))
559
				groups.append(search_base.educational_ou_dc_group)
584
			if zone == "verwaltung":
560
			if zone == "verwaltung":
585
				groups.append("cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % baseDN)
561
				groups.append(search_base.administrative_dc_group)
586
				groups.append("cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN))
562
				groups.append(search_base.administrative_ou_dc_group)
587
			modified = False
563
			modified = False
588
			for grp in groups:
564
			for grp in groups:
589
				if grp not in dcobject['groups']:
565
				if grp not in dcobject['groups']:
 Lines 632-655    Link Here 
632
		if displayName is not None:
608
		if displayName is not None:
633
			r = lo.modify(ou_base, [('displayName', lo.get(ou_base, ['displayName']).get('displayName', []), [displayName])])
609
			r = lo.modify(ou_base, [('displayName', lo.get(ou_base, ['displayName']).get('displayName', []), [displayName])])
634
610
635
	keys = container.keys()
611
	for path in sorted(container.keys()):
636
	keys.sort()
637
	for path in keys:
638
		for dn in container[path]:
612
		for dn in container[path]:
639
			if path[1:] == 'none':
613
			if path[1:] == 'none':
640
				path = ' '
614
				path = ' '
641
			verify_container('%s,%s' % (dn, ou_base), cn_module, co, lo, superordinate, baseDN, path=path[1:])
615
			verify_container(dn, cn_module, co, lo, superordinate, baseDN, path=path[1:])
642
616
643
	# create groups if not existant
617
	# create groups if not existant
644
	grp_ouadmins = "cn=%s%s,cn=ouadmins,cn=groups,%s" % (grp_prefix_admins, schoolNr.lower(), baseDN)
618
	grp_ouadmins = search_base.admin_group
645
	groups = [
619
	groups = [
646
		(grp_ouadmins, grp_policy_admins),
620
		(grp_ouadmins, grp_policy_admins),
647
		("cn=%s%s,cn=groups,%s" % (grp_prefix_pupils, schoolNr.lower(), getDN(schoolNr)), grp_policy_pupils),
621
		(search_base.students_ou_group, grp_policy_pupils),
648
		("cn=%s%s,cn=groups,%s" % (grp_prefix_teachers, schoolNr.lower(), getDN(schoolNr)), grp_policy_teachers),
622
		(search_base.teachers_ou_group, grp_policy_teachers),
649
	]
623
	]
650
624
651
	if configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
625
	if configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
652
		groups.append(("cn=%s%s,cn=groups,%s" % (grp_prefix_staff, schoolNr.lower(), getDN(schoolNr)), grp_policy_staff), )
626
		groups.append((search_base.staff_ou_group, grp_policy_staff))
653
	if configRegistry.is_true('ucsschool/import/attach/policy/default-umc-users', True):
627
	if configRegistry.is_true('ucsschool/import/attach/policy/default-umc-users', True):
654
		domain_users_school = "cn=Domain Users %s,cn=groups,%s" % (schoolNr.lower(), getDN(schoolNr))
628
		domain_users_school = "cn=Domain Users %s,cn=groups,%s" % (schoolNr.lower(), getDN(schoolNr))
655
		groups.append((domain_users_school, "cn=default-umc-users,cn=UMC,cn=policies,%s" % (baseDN,)))
629
		groups.append((domain_users_school, "cn=default-umc-users,cn=UMC,cn=policies,%s" % (baseDN,)))
 Lines 686-692    Link Here 
686
			else:
660
			else:
687
				dccn = 'dc%s-01' % schoolNr.lower()
661
				dccn = 'dc%s-01' % schoolNr.lower()
688
662
689
		dcgroups = ["cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN), "cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (baseDN, )]
663
		dcgroups = [search_base.educational_ou_dc_group, search_base.educational_dc_group]
690
664
691
		if dc == 'verwaltung':
665
		if dc == 'verwaltung':
692
			if not configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
666
			if not configRegistry.is_true('ucsschool/ldap/noneducational/create/objects', True):
 Lines 698-707    Link Here 
698
					dccn = configRegistry.get('hostname')
672
					dccn = configRegistry.get('hostname')
699
				else:
673
				else:
700
					dccn = 'dc%sv-01' % schoolNr.lower()  # this is the naming convention, a trailing v for Verwaltungsnetz DCs
674
					dccn = 'dc%sv-01' % schoolNr.lower()  # this is the naming convention, a trailing v for Verwaltungsnetz DCs
701
			dcgroups = [
675
			dcgroups = [search_base.administrative_ou_dc_group, search_base.administrative_dc_group]
702
				"cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN),
703
				"cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (baseDN, )
704
			]
705
676
706
		# create server if not exsistant
677
		# create server if not exsistant
707
		objects = univention.admin.modules.lookup(
678
		objects = univention.admin.modules.lookup(
 Lines 724-732    Link Here 
724
		if not server_exists and not dcName:
695
		if not server_exists and not dcName:
725
			try:
696
			try:
726
				if dc == 'verwaltung':
697
				if dc == 'verwaltung':
727
					grpdn = 'cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (schoolNr.lower(), baseDN)
698
					grpdn = search_base.administrative_ou_dc_group
728
				else:
699
				else:
729
					grpdn = 'cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s' % (schoolNr.lower(), baseDN)
700
					grpdn = search_base.educational_ou_dc_group
730
				hostlist = lo.get(grpdn, ['uniqueMember']).get('uniqueMember', [])
701
				hostlist = lo.get(grpdn, ['uniqueMember']).get('uniqueMember', [])
731
			except ldap.NO_SUCH_OBJECT:
702
			except ldap.NO_SUCH_OBJECT:
732
				hostlist = []
703
				hostlist = []
 Lines 1098-1104    Link Here 
1098
	if (schoolNr, classNr.lower()) in verified_group_shares:
1069
	if (schoolNr, classNr.lower()) in verified_group_shares:
1099
		return True
1070
		return True
1100
1071
1101
	position_dn = "cn=%s,cn=klassen,cn=shares,%s" % (classNr, getDN(schoolNr, basedn=base))
1072
	position_dn = ClassShare(school=schoolNr, name=classNr).dn
1102
	module = univention.admin.modules.get("shares/share")
1073
	module = univention.admin.modules.get("shares/share")
1103
	position_basedn = univention.admin.uldap.position(baseDN)
1074
	position_basedn = univention.admin.uldap.position(baseDN)
1104
	univention.admin.modules.init(lo, position_basedn, module)
1075
	univention.admin.modules.init(lo, position_basedn, module)
 Lines 1134-1140    Link Here 
1134
		print "need to create groupshare %s" % position_dn
1105
		print "need to create groupshare %s" % position_dn
1135
1106
1136
		# get gid form corresponding group
1107
		# get gid form corresponding group
1137
		group_dn = "cn=%s,cn=klassen,cn=%s,cn=groups,%s" % (classNr, cn_pupils, getDN(schoolNr, basedn=base))
1108
		school_class = SchoolClass(school=schoolNr, name=classNr)
1109
		class_share = ClassShare.from_school_class(school_class)
1110
		group_dn = school_class.dn
1138
		gids = lo.get(group_dn, ['gidNumber'])
1111
		gids = lo.get(group_dn, ['gidNumber'])
1139
		gid = 0
1112
		gid = 0
1140
		if len(gids) > 1:  # TODO FIXME This doesn't look correct to me - gids is a dict and not a list!
1113
		if len(gids) > 1:  # TODO FIXME This doesn't look correct to me - gids is a dict and not a list!
 Lines 1183-1192    Link Here 
1183
		object.open()
1156
		object.open()
1184
		object["name"] = "%s" % classNr
1157
		object["name"] = "%s" % classNr
1185
		object["host"] = serverfqdn
1158
		object["host"] = serverfqdn
1186
		if configRegistry.is_true('ucsschool/import/roleshare', True):
1159
		object["path"] = class_share.get_share_path()
1187
			object["path"] = "/home/" + os.path.join(schoolNr, "groups/klassen/%s" % (classNr,))
1188
		else:
1189
			object["path"] = "/home/groups/klassen/%s" % (classNr,)
1190
		object["writeable"] = "1"
1160
		object["writeable"] = "1"
1191
		object["sambaWriteable"] = "1"
1161
		object["sambaWriteable"] = "1"
1192
		object["sambaBrowseable"] = "1"
1162
		object["sambaBrowseable"] = "1"
 Lines 1327-1333    Link Here 
1327
	object["username"] = person.login
1297
	object["username"] = person.login
1328
	object["primaryGroup"] = default_groups[0]
1298
	object["primaryGroup"] = default_groups[0]
1329
	subdir = roleshare_home_subdir(person.sNr, person.getRole(), configRegistry)
1299
	subdir = roleshare_home_subdir(person.sNr, person.getRole(), configRegistry)
1330
	object["unixhome"] = "/home/" + os.path.join(subdir, person.login)
1300
	object["unixhome"] = os.path.join("/home", subdir, person.login)
1331
	object["firstname"] = person.name
1301
	object["firstname"] = person.name
1332
	object["lastname"] = person.sname
1302
	object["lastname"] = person.sname
1333
	object["e-mail"] = person.mail
1303
	object["e-mail"] = person.mail
 Lines 1349-1360    Link Here 
1349
			# FIXME / TODO
1319
			# FIXME / TODO
1350
			# Test should be following:
1320
			# Test should be following:
1351
			# if ( ( ( parts[0].startswith( 'cn=%s' % grp_prefix_pupils) or parts[0].startswith( 'cn=%s' % grp_prefix_pupils) ) and parts[1] == 'cn=groups' and parts[2].startswith('ou=') ) or
1321
			# if ( ( ( parts[0].startswith( 'cn=%s' % grp_prefix_pupils) or parts[0].startswith( 'cn=%s' % grp_prefix_pupils) ) and parts[1] == 'cn=groups' and parts[2].startswith('ou=') ) or
1352
			# 	 ( parts[1] == 'cn=klassen' and parts[2] == 'cn=%s' % cn_pupils and parts[3] == 'cn=groups' and parts[4].startswith('ou=') ) ):
1322
			# 	 ( parts[1] == 'cn=%s' % cn_classes and parts[2] == 'cn=%s' % cn_pupils and parts[3] == 'cn=groups' and parts[4].startswith('ou=') ) ):
1353
1323
1324
			search_base = School.get_search_base(None)
1325
			cn_pupils = ldap.explode_dn(search_base.students, True)[0]
1326
			cn_classes = ldap.explode_dn(search_base.classes, True)[0]
1327
			grp_prefix_pupils = search_base.group_prefix_students
1328
			grp_prefix_teachers = search_base.group_prefix_teachers
1329
1354
			if (
1330
			if (
1355
				parts[0].startswith('cn=%s' % grp_prefix_pupils) or
1331
				parts[0].startswith('cn=%s' % grp_prefix_pupils) or
1356
				parts[0].startswith('cn=%s' % grp_prefix_teachers) or
1332
				parts[0].startswith('cn=%s' % grp_prefix_teachers) or
1357
				(parts[1] == 'cn=klassen' and parts[2] == 'cn=%s' % cn_pupils)
1333
				(parts[1] == 'cn=%s' % cn_classes and parts[2] == 'cn=%s' % cn_pupils)
1358
			):
1334
			):
1359
				# group looks like a default group, so we don't need it anymore
1335
				# group looks like a default group, so we don't need it anymore
1360
				print "remove from group: %s" % group
1336
				print "remove from group: %s" % group
 Lines 1499-1505    Link Here 
1499
	if len(groups) > 1:
1475
	if len(groups) > 1:
1500
		object["groups"] = groups[1:]
1476
		object["groups"] = groups[1:]
1501
	subdir = roleshare_home_subdir(person.sNr, person.getRole(), configRegistry)
1477
	subdir = roleshare_home_subdir(person.sNr, person.getRole(), configRegistry)
1502
	object["unixhome"] = "/home/" + os.path.join(subdir, person.login)
1478
	object["unixhome"] = os.path.join("/home", subdir, person.login)
1503
	if object.has_key('mailbox'):
1479
	if object.has_key('mailbox'):
1504
		object["mailbox"] = "/var/spool/%s/" % person.login
1480
		object["mailbox"] = "/var/spool/%s/" % person.login
1505
	object["password"] = password
1481
	object["password"] = password
 Lines 1645-1656    Link Here 
1645
					main_person.isTeacher = '0'
1621
					main_person.isTeacher = '0'
1646
					main_person.isStaff = '0'
1622
					main_person.isStaff = '0'
1647
1623
1648
					if object.dn.endswith(',cn=%s,cn=users,%s' % (cn_teachers_staff, getDN(ou))):
1624
					search_base = School.get_search_base(ou)
1625
					if object.dn.endswith(',%s' % search_base.teachersAndStaff):
1649
						main_person.isTeacher = '1'
1626
						main_person.isTeacher = '1'
1650
						main_person.isStaff = '1'
1627
						main_person.isStaff = '1'
1651
					elif object.dn.endswith(',cn=%s,cn=users,%s' % (cn_teachers, getDN(ou))):
1628
					elif object.dn.endswith(',%s' % search_base.teachers):
1652
						main_person.isTeacher = '1'
1629
						main_person.isTeacher = '1'
1653
					elif object.dn.endswith(',cn=%s,cn=users,%s' % (cn_staff, getDN(ou))):
1630
					elif object.dn.endswith(',%s' % search_base.staff):
1654
						main_person.isStaff = '1'
1631
						main_person.isStaff = '1'
1655
1632
1656
					if ou in main_person.allsNrs:
1633
					if ou in main_person.allsNrs:
 Lines 2265-2270    Link Here 
2265
				zone = parsed[6]
2242
				zone = parsed[6]
2266
2243
2267
			verify_school_ou(schoolNr, co, lo, baseDN)
2244
			verify_school_ou(schoolNr, co, lo, baseDN)
2245
			search_base = School.get_search_base(schoolNr)
2268
2246
2269
			try:
2247
			try:
2270
				ip = ipaddr.IPv4Network(IP)
2248
				ip = ipaddr.IPv4Network(IP)
 Lines 2281-2291    Link Here 
2281
			groups = {}
2259
			groups = {}
2282
			if ctype == "memberserver":
2260
			if ctype == "memberserver":
2283
				if zone == "edukativ":
2261
				if zone == "edukativ":
2284
					groups["cn=OU%s-Member-Edukativnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN)] = 1
2262
					groups[search_base.educational_ou_member_group] = 1
2285
					groups["cn=Member-Edukativnetz,cn=ucsschool,cn=groups,%s" % baseDN] = 1
2263
					groups[search_base.educational_member_group] = 1
2286
				if zone == "verwaltung":
2264
				if zone == "verwaltung":
2287
					groups["cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (schoolNr.lower(), baseDN)] = 1
2265
					groups[search_base.administrative_ou_member_group] = 1
2288
					groups["cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % baseDN] = 1
2266
					groups[search_base.administrative_member_group] = 1
2289
2267
2290
			# invoke pre hooks
2268
			# invoke pre hooks
2291
			hooks.pre('computer', 'A', line=line)
2269
			hooks.pre('computer', 'A', line=line)
 Lines 2390-2397    Link Here 
2390
			ClassID = parsed[2]
2368
			ClassID = parsed[2]
2391
			Descrpt = parsed[3]
2369
			Descrpt = parsed[3]
2392
2370
2393
			group_dn = "cn=%s,cn=klassen,cn=%s,cn=groups,%s" % (ClassID, cn_pupils, getDN(schoolNr))
2371
			group_dn = SchoolClass(school=schoolNr, name=ClassID).dn
2394
			share_dn = "cn=%s,cn=klassen,cn=shares,%s" % (ClassID, getDN(schoolNr))
2372
			share_dn = ClassShare(school=schoolNr, name=ClassID).dn
2395
2373
2396
			verify_school_ou(schoolNr, co, lo, baseDN)
2374
			verify_school_ou(schoolNr, co, lo, baseDN)
2397
2375
 Lines 2934-2944    Link Here 
2934
2912
2935
	slave = slaves[0]
2913
	slave = slaves[0]
2936
	ouDn = oulist[0].dn
2914
	ouDn = oulist[0].dn
2915
	search_base = School.get_search_base(options.ou)
2937
2916
2938
	group_filter = univention.admin.filter.conjunction('&', [
2917
	group_filter = univention.admin.filter.conjunction('&', [
2939
		univention.admin.filter.conjunction('|', [
2918
		univention.admin.filter.conjunction('|', [
2940
			univention.admin.filter.expression('cn', 'OU%s-DC-Edukativnetz' % options.ou),
2919
			univention.admin.uldap.explodeDn(search_base.educational_ou_dc_group)[0],
2941
			univention.admin.filter.expression('cn', 'OU%s-DC-Verwaltungsnetz' % options.ou),
2920
			univention.admin.uldap.explodeDn(search_base.administrative_ou_dc_group)[0],
2942
		]),
2921
		]),
2943
		univention.admin.filter.expression('uniqueMember', slave.dn),
2922
		univention.admin.filter.expression('uniqueMember', slave.dn),
2944
	])
2923
	])
 Lines 3039-3054    Link Here 
3039
		print 'ERROR: specified OU %r does not exist' % ou_name
3018
		print 'ERROR: specified OU %r does not exist' % ou_name
3040
		sys.exit(1)
3019
		sys.exit(1)
3041
3020
3021
	search_base = School.get_search_base(ou_name)
3042
	# get list of desired group memberships
3022
	# get list of desired group memberships
3043
	group_dn_list = {
3023
	group_dn_list = {
3044
		TYPE_DC_ADMINISTRATIVE: [
3024
		TYPE_DC_ADMINISTRATIVE: [search_base.administrative_ou_dc_group, search_base.administrative_dc_group],
3045
			'cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou_name.lower(), baseDN),
3025
		TYPE_DC_EDUCATIONAL: [search_base.educational_dc_group, search_base.educational_ou_dc_group]
3046
			'cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (baseDN,),
3047
		],
3048
		TYPE_DC_EDUCATIONAL: [
3049
			'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s' % (baseDN,),
3050
			'cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s' % (ou_name.lower(), baseDN),
3051
		],
3052
	}[dc_type]
3026
	}[dc_type]
3053
	for grpdn in group_dn_list:
3027
	for grpdn in group_dn_list:
3054
		verify_group(grpdn, co, lo, superordinate, baseDN)
3028
		verify_group(grpdn, co, lo, superordinate, baseDN)
(-)ucs-school-import/usr/share/ucs-school-import/scripts/ucs-school-join-secondary-samba4 (-6 / +9 lines)
 Lines 31-36    Link Here 
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
. /usr/share/univention-lib/all.sh
33
. /usr/share/univention-lib/all.sh
34
. /usr/share/ucs-school-lib/base.sh
34
35
35
display_help() {
36
display_help() {
36
	cat <<-EOL
37
	cat <<-EOL
 Lines 195-205    Link Here 
195
while read service; do
196
while read service; do
196
	case "$service" in
197
	case "$service" in
197
		"UCS@school Education")
198
		"UCS@school Education")
198
			target_server_ucsschool_type=Edukativnetz
199
			target_server_all_dcs="$(ucr_names_default ucsschool/ldap/default/groupname/all-educational-dc)"
200
			target_server_ou_dcs="$(ucr_names_default ucsschool/ldap/default/groupname/ou-educational-dc)"
199
			target_server_ucsschool_service="$service"
201
			target_server_ucsschool_service="$service"
200
			;;
202
			;;
201
		"UCS@school Administration")
203
		"UCS@school Administration")
202
			target_server_ucsschool_type=Verwaltungsnetz
204
			target_server_all_dcs="$(ucr_names_default ucsschool/ldap/default/groupname/all-administrativ-dc)"
205
			target_server_ou_dcs="$(ucr_names_default ucsschool/ldap/default/groupname/ou-administrativ-dc)"
203
			target_server_ucsschool_service="$service"
206
			target_server_ucsschool_service="$service"
204
			;;
207
			;;
205
	esac
208
	esac
 Lines 258-274    Link Here 
258
261
259
	echo -n "Check group memberschip : "
262
	echo -n "Check group memberschip : "
260
	test_output=$(univention-ssh "$ROOTPWD" "root@${target_school_dc_ip}" \
263
	test_output=$(univention-ssh "$ROOTPWD" "root@${target_school_dc_ip}" \
261
		/usr/sbin/udm groups/group list --filter name="DC-$target_server_ucsschool_type" | sed -n "/^ *hosts: $target_ldap_hostdn$/p")
264
		/usr/sbin/udm groups/group list --filter name="$target_server_all_dcs" | sed -n "/^ *hosts: $target_ldap_hostdn$/p")
262
	if [ -z "$test_output" ]; then
265
	if [ -z "$test_output" ]; then
263
		echo -e "\033[60Gfailed"
266
		echo -e "\033[60Gfailed"
264
		echo "$hostname is not member of the group DC-$target_server_ucsschool_type, this needs to be fixed first manually."
267
		echo "$hostname is not member of the group $target_server_all_dcs, this needs to be fixed first manually."
265
		exit 1
268
		exit 1
266
	fi
269
	fi
267
	test_output=$(univention-ssh "$ROOTPWD" "root@${target_school_dc_ip}" \
270
	test_output=$(univention-ssh "$ROOTPWD" "root@${target_school_dc_ip}" \
268
		/usr/sbin/udm groups/group list --filter name="OU$my_school_ou-DC-$target_server_ucsschool_type" | sed -n "/^ *hosts: $target_ldap_hostdn$/p")
271
		/usr/sbin/udm groups/group list --filter name="$(replace_ou "$target_server_ou_dcs" "$my_school_ou")" | sed -n "/^ *hosts: $target_ldap_hostdn$/p")
269
	if [ -z "$test_output" ]; then
272
	if [ -z "$test_output" ]; then
270
		echo -e "\033[60Gfailed"
273
		echo -e "\033[60Gfailed"
271
		echo "$hostname is not member of the group OU$my_school_ou-DC-$target_server_ucsschool_type, this needs to be fixed first manually."
274
		echo "$hostname is not member of the group $(replace_ou "$target_server_ou_dcs" "$my_school_ou"), this needs to be fixed first manually."
272
		exit 1
275
		exit 1
273
	else
276
	else
274
		echo -e "\033[60Gdone"
277
		echo -e "\033[60Gdone"
(-)ucs-school-import/usr/share/ucs-school-import/scripts/ucs-school-verify-class-memberships (-4 / +6 lines)
 Lines 42-47    Link Here 
42
import univention.admin.handlers.groups.group
42
import univention.admin.handlers.groups.group
43
import univention.admin.handlers.users.user
43
import univention.admin.handlers.users.user
44
import univention.admin.objects
44
import univention.admin.objects
45
from ucsschool.lib.models import School, SchoolClass, Staff, Student, Teacher
45
46
46
47
47
class Problem(Exception):
48
class Problem(Exception):
 Lines 160-166    Link Here 
160
161
161
162
162
def parse_line(lo, line):
163
def parse_line(lo, line):
163
	oubase = 'ou=%s,%s' % (line['school'], ucr['ldap/base'],)
164
	school = School(name=line['school'])
165
	oubase = school.dn
164
	uid = line['name']
166
	uid = line['name']
165
	try:
167
	try:
166
		dn = lo.search(filter_format('uid=%s', (uid,)), oubase, unique=True)[0][0]
168
		dn = lo.search(filter_format('uid=%s', (uid,)), oubase, unique=True)[0][0]
 Lines 173-180    Link Here 
173
			raise StudentDoesNotExists(line, uid)
175
			raise StudentDoesNotExists(line, uid)
174
		else:
176
		else:
175
			raise StudentIsInAnotherSchool(line, uid, dn)
177
			raise StudentIsInAnotherSchool(line, uid, dn)
176
	if not dn.endswith(',cn=schueler,cn=users,%s' % (oubase,)):
178
	if not dn.endswith(Student.get_container(school.name)):
177
		if not dn.endswith(',cn=lehrer,cn=users,%s' % (oubase,)) or not dn.endswith(',cn=mitarbeiter,cn=users,%s' % (oubase,)):
179
		if not dn.endswith(Teacher.get_container(school.name)) or not dn.endswith(Staff.get_container(school.name)):
178
			print('Ignoring teacher/staff %r' % (uid,))
180
			print('Ignoring teacher/staff %r' % (uid,))
179
			return
181
			return
180
		msg('ERROR: %s (%s %s) is not a student/teacher/staff.' % (uid, line['firstname'], line['lastname']))
182
		msg('ERROR: %s (%s %s) is not a student/teacher/staff.' % (uid, line['firstname'], line['lastname']))
 Lines 186-192    Link Here 
186
	correct = False
188
	correct = False
187
	invalid_groups = set()
189
	invalid_groups = set()
188
	for gdn, group in groups:  # pylint: disable=W0612
190
	for gdn, group in groups:  # pylint: disable=W0612
189
		if not gdn.endswith(',cn=klassen,cn=schueler,cn=groups,%s' % (oubase,)):
191
		if not gdn.endswith(SchoolClass.get_container(school.name)):
190
			if not gdn.endswith(oubase) and re.search(',ou=[^,]+,%s$' % (ucr['ldap/base'],), gdn, re.I):
192
			if not gdn.endswith(oubase) and re.search(',ou=[^,]+,%s$' % (ucr['ldap/base'],), gdn, re.I):
191
				raise StudentIsInAnotherClassInAnotherSchool(line, uid, dn, gdn)
193
				raise StudentIsInAnotherClassInAnotherSchool(line, uid, dn, gdn)
192
			continue  # ignore workgroups / Domain Users
194
			continue  # ignore workgroups / Domain Users
(-)ucs-school-ldap-acls-master/61ucsschool_presettings (-56 / +90 lines)
 Lines 1-65    Link Here 
1
@!@
2
# -*- coding: utf-8 -*-
3
import re
4
5
6
def replace_ucr_variables(template):
7
	variable_token = re.compile('@[$]@')
8
9
	dir_ucsschool = {
10
		'ALL_ADM_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-dc', 'DC-Verwaltungsnetz'),
11
		'ALL_ADM_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-member', 'Member-Verwaltungsnetz'),
12
		'ALL_EDU_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-dc', 'DC-Edukativnetz'),
13
		'ALL_EDU_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-member', 'Member-Edukativnetz'),
14
	}
15
16
	while 1:
17
		i = variable_token.finditer(template)
18
		try:
19
			start = i.next()
20
			end = i.next()
21
			name = template[start.end():end.start()]
22
23
			template = template[:start.start()] + dir_ucsschool.get(name,'') + template[end.end():]
24
		except StopIteration:
25
			break
26
27
	return template
28
29
30
aclset += """
1
# start 61ucsschool_presettings
31
# start 61ucsschool_presettings
2
32
3
# revert rule from UCS; Bug #41402
33
# revert rule from UCS; Bug #41402
4
access to attrs=entry,objectClass,uniqueMember,ou,uid,loginShell,homeDirectory,uidNumber,gidNumber,sn,cn,gecos,description,memberUid
34
access to attrs=entry,objectClass,uniqueMember,ou,uid,loginShell,homeDirectory,uidNumber,gidNumber,sn,cn,gecos,description,memberUid
5
	by dn.regex=".*cn=computers,ou=([^,]+),(ou=[^,]+,)?@%@ldap/base@%@" none break
35
	by dn.regex=".*cn=computers,ou=([^,]+),(ou=[^,]+,)?@%@ldap/base@%@" none break
6
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
36
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
7
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
37
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
8
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
38
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
9
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
39
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none break
10
	by set="user/objectClass & ([ucsschoolStudent] | [ucsschoolTeacher] | [ucsschoolStaff] | [ucsschoolAdministrator])" none break
40
	by set="user/objectClass & ([ucsschoolStudent] | [ucsschoolTeacher] | [ucsschoolStaff] | [ucsschoolAdministrator])" none break
11
	by * +0 break
41
	by * +0 break
12
42
13
# Slave-Controller und Member-Server duerfen Samba-Domaenenobjekt(e) modifizieren
43
# Slave-Controller und Member-Server duerfen Samba-Domaenenobjekt(e) modifizieren
14
access to filter="(objectClass=sambaDomain)"
44
access to filter="(objectClass=sambaDomain)"
15
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
45
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
16
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
46
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
17
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
47
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
18
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
48
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
19
	by * +0 break
49
	by * +0 break
20
50
21
# grant write access to domaincontroller slave/member server for certain univention app center settings
51
# grant write access to domaincontroller slave/member server for certain univention app center settings
22
access to dn.regex="^univentionAppID=([^,]+),cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" filter="(objectClass=univentionApp)"
52
access to dn.regex="^univentionAppID=([^,]+),cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" filter="(objectClass=univentionApp)"
23
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
53
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
24
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
54
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
25
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
55
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
26
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
56
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
27
	by * +0 break
57
	by * +0 break
28
58
29
access to dn.regex="^cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" attrs=children,entry
59
access to dn.regex="^cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" attrs=children,entry
30
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
60
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
31
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
61
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
32
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
62
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
33
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
63
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
34
	by * +0 break
64
	by * +0 break
35
65
36
access to dn="cn=apps,cn=univention,@%@ldap/base@%@" attrs=children,entry
66
access to dn="cn=apps,cn=univention,@%@ldap/base@%@" attrs=children,entry
37
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
67
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
38
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
68
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
39
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
69
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
40
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
70
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
41
	by * +0 break
71
	by * +0 break
42
72
43
# Slave controllers and memberservers require write access to virtual machine manager objects
73
# Slave controllers and memberservers require write access to virtual machine manager objects
44
access to dn.regex="^univentionVirtualMachineUUID=([^,]+),cn=Information,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachine)"
74
access to dn.regex="^univentionVirtualMachineUUID=([^,]+),cn=Information,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachine)"
45
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
75
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
46
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
76
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
47
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
77
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
48
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
78
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
49
	by * +0 break
79
	by * +0 break
50
80
51
access to dn.regex="^cn=([^,]+),cn=CloudConnection,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachineCloudConnection)"
81
access to dn.regex="^cn=([^,]+),cn=CloudConnection,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachineCloudConnection)"
52
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
82
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
53
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
83
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
54
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
84
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
55
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
85
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
56
	by * +0 break
86
	by * +0 break
57
87
58
access to dn="cn=(Information|CloudConnection),cn=Virtual Machine Manager,@%@ldap/base@%@" attrs=children,entry
88
access to dn="cn=(Information|CloudConnection),cn=Virtual Machine Manager,@%@ldap/base@%@" attrs=children,entry
59
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
89
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
60
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
90
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
61
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
91
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
62
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
92
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
63
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
93
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
64
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
94
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
65
	by * +0 break
95
	by * +0 break
 Lines 66-112    Link Here 
66
96
67
# Slave-Controller und Member-Server benoetigen idmap-Container
97
# Slave-Controller und Member-Server benoetigen idmap-Container
68
access to dn.base="cn=idmap,cn=univention,@%@ldap/base@%@"
98
access to dn.base="cn=idmap,cn=univention,@%@ldap/base@%@"
69
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
99
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
70
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
100
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
71
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
101
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
72
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
102
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
73
	by * +0 break
103
	by * +0 break
74
104
75
# Slave-Controller und Member-Server benoetigen ID-Mapping
105
# Slave-Controller und Member-Server benoetigen ID-Mapping
76
access to dn.subtree="cn=idmap,cn=univention,@%@ldap/base@%@" filter="(|(&(objectClass=sambaUnixIdPool)(objectClass=organizationalRole)(objectClass=top))(&(objectClass=sambaIdmapEntry)(objectClass=sambaSidEntry)))"
106
access to dn.subtree="cn=idmap,cn=univention,@%@ldap/base@%@" filter="(|(&(objectClass=sambaUnixIdPool)(objectClass=organizationalRole)(objectClass=top))(&(objectClass=sambaIdmapEntry)(objectClass=sambaSidEntry)))"
77
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
107
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
78
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
108
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
79
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
109
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
80
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
110
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
81
	by * +0 break
111
	by * +0 break
82
112
83
# Slave-Controller und Member-Server benoetigen nicht alle Container
113
# Slave-Controller und Member-Server benoetigen nicht alle Container
84
access to dn.subtree="cn=backup,@%@ldap/base@%@"
114
access to dn.subtree="cn=backup,@%@ldap/base@%@"
85
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
115
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
86
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
116
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
87
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
117
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
88
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
118
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
89
	by * +0 break
119
	by * +0 break
90
120
91
access to dn.subtree="cn=printers,@%@ldap/base@%@"
121
access to dn.subtree="cn=printers,@%@ldap/base@%@"
92
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
122
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
93
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
123
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
94
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
124
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
95
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
125
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
96
	by * +0 break
126
	by * +0 break
97
127
98
access to dn.subtree="cn=networks,@%@ldap/base@%@"
128
access to dn.subtree="cn=networks,@%@ldap/base@%@"
99
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
129
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
100
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
130
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
101
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
131
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
102
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
132
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
103
	by * +0 break
133
	by * +0 break
104
134
105
access to dn.regex="^(.*,)?cn=(cups|ppolicy|packages|services|templates|admin-settings|default containers|saml-serviceprovider),cn=univention,@%@ldap/base@%@$$"
135
access to dn.regex="^(.*,)?cn=(cups|ppolicy|packages|services|templates|admin-settings|default containers|saml-serviceprovider),cn=univention,@%@ldap/base@%@$$"
106
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
136
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
107
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
137
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
108
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
138
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
109
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
139
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
110
	by * +0 break
140
	by * +0 break
111
141
112
# end 61ucsschool_presettings
142
# end 61ucsschool_presettings
143
"""
144
145
print replace_ucr_variables(aclset)
146
@!@
(-)ucs-school-ldap-acls-master/65ucsschool (-57 / +62 lines)
 Lines 14-32    Link Here 
14
def replace_ucr_variables(template):
14
def replace_ucr_variables(template):
15
	variable_token = re.compile('@[$]@')
15
	variable_token = re.compile('@[$]@')
16
16
17
	dir_ucsschool = { }
17
	dir_ucsschool = {
18
	dir_ucsschool[ 'DISTRICT' ] = ''
18
		'DISTRICT':       'ou=[^,]+,' if configRegistry.is_true('ucsschool/ldap/district/enable') else '',
19
	if configRegistry.get('ucsschool/ldap/district/enable','no').lower() in ( 'yes', 'true', '1' ):
19
		'PUPILS':         configRegistry.get('ucsschool/ldap/default/container/pupils', 'schueler'),
20
		dir_ucsschool[ 'DISTRICT' ] = 'ou=[^,]+,'
20
		'TEACHERS':       configRegistry.get('ucsschool/ldap/default/container/teachers', 'lehrer'),
21
	dir_ucsschool[ 'PUPILS' ] =   configRegistry.get('ucsschool/ldap/default/container/pupils', 'schueler')
21
		'STAFF':          configRegistry.get('ucsschool/ldap/default/container/staff', 'mitarbeiter'),
22
	dir_ucsschool[ 'TEACHERS' ] = configRegistry.get('ucsschool/ldap/default/container/teachers', 'lehrer')
22
		'TEACHERS-STAFF': configRegistry.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter'),
23
	dir_ucsschool[ 'STAFF' ] =	  configRegistry.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
23
		'ADMINS':         configRegistry.get('ucsschool/ldap/default/container/admins', 'admins'),
24
	dir_ucsschool[ 'TEACHERS-STAFF' ] = configRegistry.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter')
24
		'GRPADMINS':      configRegistry.get('ucsschool/ldap/default/groupprefix/admins', 'admins-'),
25
	dir_ucsschool[ 'ADMINS' ] =	  configRegistry.get('ucsschool/ldap/default/container/admins', 'admins')
25
		'EXAM':           configRegistry.get('ucsschool/ldap/default/container/exam', 'examusers'),
26
	dir_ucsschool[ 'GRPADMINS' ] =	  configRegistry.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
26
		'CLASS':          configRegistry.get('ucsschool/ldap/default/container/class', 'klassen'),
27
	dir_ucsschool[ 'EXAM' ] = configRegistry.get('ucsschool/ldap/default/container/exam', 'examusers')
27
		'ROOMS':          configRegistry.get('ucsschool/ldap/default/container/rooms', 'raeume'),
28
		'ALL_ADM_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-dc', 'DC-Verwaltungsnetz'),
29
		'ALL_ADM_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-member', 'Member-Verwaltungsnetz'),
30
		'ALL_EDU_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-dc', 'DC-Edukativnetz'),
31
		'ALL_EDU_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-member', 'Member-Edukativnetz'),
32
		'DOMAIN_ADMINS': custom_groupname('Domain Admins'),
33
	}
28
34
29
	dir_ucsschool['DOMAIN_ADMINS'] = custom_groupname('Domain Admins')
30
	while 1:
35
	while 1:
31
		i = variable_token.finditer(template)
36
		i = variable_token.finditer(template)
32
		try:
37
		try:
 Lines 44-63    Link Here 
44
aclset += """
49
aclset += """
45
# DC Slaves need write access to the members of the group Domain Computers
50
# DC Slaves need write access to the members of the group Domain Computers
46
access to dn.exact="cn=Domain Computers,cn=groups,@%@ldap/base@%@" attrs="uniqueMember,memberUid"
51
access to dn.exact="cn=Domain Computers,cn=groups,@%@ldap/base@%@" attrs="uniqueMember,memberUid"
47
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
52
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
48
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
53
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
49
	by * +0 break
54
	by * +0 break
50
55
51
# Slave DCs can read and write policy containers for MS GPOs and msPrintConnectionPolicy objects
56
# Slave DCs can read and write policy containers for MS GPOs and msPrintConnectionPolicy objects
52
access to dn.subtree="cn=policies,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msGPOContainer)(objectClass=organizationalRole)(objectClass=msPrintConnectionPolicy))"
57
access to dn.subtree="cn=policies,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msGPOContainer)(objectClass=organizationalRole)(objectClass=msPrintConnectionPolicy))"
53
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
58
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
54
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
59
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
55
	by * +0 break
60
	by * +0 break
56
61
57
# Slave DCs can read and write policy containers for MS WMI filter objects
62
# Slave DCs can read and write policy containers for MS WMI filter objects
58
access to dn.subtree="cn=WMIPolicy,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msWMISom)(objectClass=organizationalRole))"
63
access to dn.subtree="cn=WMIPolicy,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msWMISom)(objectClass=organizationalRole))"
59
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
64
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
60
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
65
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
61
	by * +0 break
66
	by * +0 break
62
67
63
# Lehrer, Mitarbeiter und OU-Admins duerfen Schueler-Passwoerter aendern
68
# Lehrer, Mitarbeiter und OU-Admins duerfen Schueler-Passwoerter aendern
 Lines 71-82    Link Here 
71
	by * +0 break
76
	by * +0 break
72
77
73
# Lehrer, Mitarbeiter und OU-Admins duerfen Raum-Gruppen anlegen und bearbeiten
78
# Lehrer, Mitarbeiter und OU-Admins duerfen Raum-Gruppen anlegen und bearbeiten
74
access to dn.regex="^cn=raeume,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
79
access to dn.regex="^cn=@$@ROOMS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
75
	by set.expand="[$1] & ([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" write
80
	by set.expand="[$1] & ([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" write
76
@$@# old rule@$@	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$1,@$@DISTRICT@$@@%@ldap/base@%@$$" write
81
@$@# old rule@$@	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$1,@$@DISTRICT@$@@%@ldap/base@%@$$" write
77
	by * +0 break
82
	by * +0 break
78
83
79
access to dn.regex="^cn=([^,]+),cn=raeume,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
84
access to dn.regex="^cn=([^,]+),cn=@$@ROOMS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
80
	by set.expand="[$2] & ([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" write
85
	by set.expand="[$2] & ([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" write
81
@$@# old rule@$@	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" write
86
@$@# old rule@$@	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" write
82
	by * +0 break
87
	by * +0 break
 Lines 146-155    Link Here 
146
	by * +0 break
151
	by * +0 break
147
152
148
access to dn.subtree="cn=temporary,cn=univention,@%@ldap/base@%@"
153
access to dn.subtree="cn=temporary,cn=univention,@%@ldap/base@%@"
149
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
154
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
150
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
155
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
151
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
156
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
152
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
157
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
153
	by * +0 break
158
	by * +0 break
154
159
155
# OU-Admins duerfen MAC-Adressen im Rechner- und DHCP-Objekt aendern
160
# OU-Admins duerfen MAC-Adressen im Rechner- und DHCP-Objekt aendern
 Lines 173-196    Link Here 
173
178
174
# domaincontroller slaves and memberservers of management group are not allowed to replicate pupils and teachers
179
# domaincontroller slaves and memberservers of management group are not allowed to replicate pupils and teachers
175
access to dn.regex="^.+,cn=(@$@TEACHERS@$@|@$@PUPILS@$@),cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
180
access to dn.regex="^.+,cn=(@$@TEACHERS@$@|@$@PUPILS@$@),cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
176
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
181
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
177
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
182
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
178
	by * +0 break
183
	by * +0 break
179
184
180
access to filter="(|(objectClass=ucsschoolStudent)(&(objectClass=ucsschoolTeacher)(!(objectClass=ucsschoolStaff))))"
185
access to filter="(|(objectClass=ucsschoolStudent)(&(objectClass=ucsschoolTeacher)(!(objectClass=ucsschoolStaff))))"
181
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
186
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
182
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
187
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
183
	by * +0 break
188
	by * +0 break
184
189
185
# domaincontroller slaves and memberservers of educational group are not allowed to replicate staff users
190
# domaincontroller slaves and memberservers of educational group are not allowed to replicate staff users
186
access to dn.regex="^.+,cn=@$@STAFF@$@,cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
191
access to dn.regex="^.+,cn=@$@STAFF@$@,cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
187
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
192
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
188
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
193
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
189
	by * +0 break
194
	by * +0 break
190
195
191
access to filter="(&(objectClass=ucsschoolStaff)(!(objectClass=ucsschoolTeacher))(!(objectClass=ucsschoolAdministrator)))"
196
access to filter="(&(objectClass=ucsschoolStaff)(!(objectClass=ucsschoolTeacher))(!(objectClass=ucsschoolAdministrator)))"
192
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
197
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
193
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
198
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
194
	by * +0 break
199
	by * +0 break
195
200
196
# FIXME: this rule allows to read all passwords underneath of all OU's instead of only the password belonging to the OU; explain why or fix it
201
# FIXME: this rule allows to read all passwords underneath of all OU's instead of only the password belonging to the OU; explain why or fix it
 Lines 197-237    Link Here 
197
# TODO: are the following attributes missing here?: 'sambaBadPasswordCount', 'krb5PasswordEnd', 'shadowMax', 'sambaAcctFlags', 'sambaPasswordHistory'
202
# TODO: are the following attributes missing here?: 'sambaBadPasswordCount', 'krb5PasswordEnd', 'shadowMax', 'sambaAcctFlags', 'sambaPasswordHistory'
198
# Memberserver duerfen Passwoerter aller Objekte unterhalb einer Schule lesen
203
# Memberserver duerfen Passwoerter aller Objekte unterhalb einer Schule lesen
199
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=userPassword,krb5Key,krb5KDCFlags,sambaNTPassword,sambaLMPassword,shadowLastChange,sambaPwdLastSet,pwhistory,krb5KeyVersionNumber,sambaPwdCanChange,sambaPwdMustChange
204
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=userPassword,krb5Key,krb5KDCFlags,sambaNTPassword,sambaLMPassword,shadowLastChange,sambaPwdLastSet,pwhistory,krb5KeyVersionNumber,sambaPwdCanChange,sambaPwdMustChange
200
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
205
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
201
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
206
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
202
	by * +0 break
207
	by * +0 break
203
208
204
# Alle DC-Slaves muessen alle Benutzercontainer und Gruppen jeder Schule lesen koennen
209
# Alle DC-Slaves muessen alle Benutzercontainer und Gruppen jeder Schule lesen koennen
205
access to dn.regex="^ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="objectClass=ucsschoolOrganizationalUnit"
210
access to dn.regex="^ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="objectClass=ucsschoolOrganizationalUnit"
206
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
211
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
207
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
212
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
208
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
213
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
209
	by * +0 break
214
	by * +0 break
210
215
211
access to dn.regex="^cn=(users|groups|@$@EXAM@$@),ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
216
access to dn.regex="^cn=(users|groups|@$@EXAM@$@),ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
212
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
217
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
213
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
218
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
214
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
219
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
215
	by * +0 break
220
	by * +0 break
216
221
217
access to dn.regex="^([^,]+),cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
222
access to dn.regex="^([^,]+),cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
218
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
223
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
219
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
224
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
220
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
225
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
221
	by * +0 break
226
	by * +0 break
222
227
223
access to dn.regex="^cn=(@$@PUPILS@$@|@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
228
access to dn.regex="^cn=(@$@PUPILS@$@|@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
224
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
229
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
225
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
230
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
226
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
231
	by dn.regex="^cn=.*,cn=server,cn=computers,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd
227
	by * +0 break
232
	by * +0 break
228
233
229
# DC-Slaves muessen die Benutzer ihrer Schule lesen und schreiben duerfen
234
# DC-Slaves muessen die Benutzer ihrer Schule lesen und schreiben duerfen
230
access to dn.regex="^uid=([^,]+),cn=(@$@PUPILS@$@|@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
235
access to dn.regex="^uid=([^,]+),cn=(@$@PUPILS@$@|@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
231
	by set="([cn=OU]+this/ucsschoolSchool+[-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@])/uniqueMember & user" write
236
	by set="([cn=OU]+this/ucsschoolSchool+[-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@])/uniqueMember & user" write
232
	by * +0 break
237
	by * +0 break
233
access to dn.regex="^uid=([^,]+),cn=@$@EXAM@$@,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
238
access to dn.regex="^uid=([^,]+),cn=@$@EXAM@$@,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
234
	by set="([cn=OU]+this/ucsschoolSchool+[-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@])/uniqueMember & user" write
239
	by set="([cn=OU]+this/ucsschoolSchool+[-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@])/uniqueMember & user" write
235
	by * +0 break
240
	by * +0 break
236
241
237
# Schul-Slave-Server duerfen nur Eintraege ihrer OU lesen und schreiben (Passwortaenderungen etc.)
242
# Schul-Slave-Server duerfen nur Eintraege ihrer OU lesen und schreiben (Passwortaenderungen etc.)
 Lines 239-251    Link Here 
239
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
244
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
240
	by group/univentionGroup/uniqueMember="cn=@$@DOMAIN_ADMINS@$@,cn=groups,@%@ldap/base@%@" +0 break
245
	by group/univentionGroup/uniqueMember="cn=@$@DOMAIN_ADMINS@$@,cn=groups,@%@ldap/base@%@" +0 break
241
	by set.expand="[ldap:///ou=$2,@%@ldap/base@%@?ou?base?%28%21%28objectClass%3DucsschoolOrganizationalUnit%29%29]/ou" +0 break
246
	by set.expand="[ldap:///ou=$2,@%@ldap/base@%@?ou?base?%28%21%28objectClass%3DucsschoolOrganizationalUnit%29%29]/ou" +0 break
242
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
247
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
243
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
248
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
244
	by group/univentionLDAPACL/univentionLDAPAccessWrite.expand="ou=$2,@$@DISTRICT@$@@%@ldap/base@%@" write
249
	by group/univentionLDAPACL/univentionLDAPAccessWrite.expand="ou=$2,@$@DISTRICT@$@@%@ldap/base@%@" write
245
	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd continue
250
	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd continue
246
	by set.expand="[$2] & ([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" +rscxd continue
251
	by set.expand="[$2] & ([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" +rscxd continue
247
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +0 stop
252
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +0 stop
248
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +0 stop
253
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +0 stop
249
	by set.expand="([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" +0 stop
254
	by set.expand="([ldap:///]+user/entryDN+[?entryDN?base?%28%7C%28objectClass%3DucsschoolTeacher%29%28objectClass%3DucsschoolAdministrator%29%28objectClass%3DucsschoolStaff%29%29])/ucsschoolSchool" +0 stop
250
	by dn.regex="^.*,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd break
255
	by dn.regex="^.*,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" +rscxd break
251
	by dn.regex="^.*,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +0 stop
256
	by dn.regex="^.*,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" +0 stop
 Lines 252-273    Link Here 
252
	by * +0 break
257
	by * +0 break
253
258
254
# Slave-Controller duerfen Klassen-Gruppen bearbeiten (AUSNAHME! Wird fuer Lehrerzuordnung in UMC benoetigt!)
259
# Slave-Controller duerfen Klassen-Gruppen bearbeiten (AUSNAHME! Wird fuer Lehrerzuordnung in UMC benoetigt!)
255
access to dn.regex="^cn=klassen,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
260
access to dn.regex="^cn=@$@CLASS@$@,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
256
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
261
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
257
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
262
	by group/univentionGroup/uniqueMember.expand="cn=OU$1-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
258
	by * +0 break
263
	by * +0 break
259
264
260
access to dn.regex="^cn=([^,]+),cn=klassen,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
265
access to dn.regex="^cn=([^,]+),cn=klassen,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
261
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
266
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
262
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
267
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
263
	by * +0 break
268
	by * +0 break
264
269
265
# Schulserver duerfen die Passwoerter aller globalen Objekte replizieren
270
# Schulserver duerfen die Passwoerter aller globalen Objekte replizieren
266
access to dn.regex="^(.+,)?cn=(users|kerberos|computers),@%@ldap/base@%@$$"
271
access to dn.regex="^(.+,)?cn=(users|kerberos|computers),@%@ldap/base@%@$$"
267
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
272
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
268
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
273
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
269
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
274
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
270
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
275
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" +rscxd
271
	by * +0 break
276
	by * +0 break
272
"""
277
"""
273
278
(-)ucs-school-ldap-acls-master/70ucsschool-ldap-acls-master.inst (-1 / +7 lines)
 Lines 32-37    Link Here 
32
VERSION=7
32
VERSION=7
33
. /usr/share/univention-join/joinscripthelper.lib
33
. /usr/share/univention-join/joinscripthelper.lib
34
. /usr/share/univention-lib/ldap.sh
34
. /usr/share/univention-lib/ldap.sh
35
. /usr/share/ucs-school-lib/base.sh
36
35
joinscript_init
37
joinscript_init
36
38
37
eval "$(univention-config-registry shell)"
39
eval "$(univention-config-registry shell)"
 Lines 43-49    Link Here 
43
	--set name="ucsschool"
45
	--set name="ucsschool"
44
46
45
# create global groups required for LDAP ACLs for UCS@school
47
# create global groups required for LDAP ACLs for UCS@school
46
for grp in "DC-Verwaltungsnetz" "Member-Verwaltungsnetz" "DC-Edukativnetz" "Member-Edukativnetz" ; do
48
for grp in \
49
		"$(ucr_names_default ucsschool/ldap/default/groupname/all-administrativ-dc)" \
50
		"$(ucr_names_default ucsschool/ldap/default/groupname/all-administrativ-member)" \
51
		"$(ucr_names_default ucsschool/ldap/default/groupname/all-educational-dc)" \
52
		"$(ucr_names_default ucsschool/ldap/default/groupname/all-educational-member)"; do
47
	univention-directory-manager groups/group create "$@" \
53
	univention-directory-manager groups/group create "$@" \
48
		--ignore_exist \
54
		--ignore_exist \
49
		--position="cn=ucsschool,cn=groups,$ldap_base" \
55
		--position="cn=ucsschool,cn=groups,$ldap_base" \
(-)ucs-school-ldap-acls-master/debian/control (-1 / +1 lines)
 Lines 9-15    Link Here 
9
9
10
Package: ucs-school-ldap-acls-master
10
Package: ucs-school-ldap-acls-master
11
Architecture: all
11
Architecture: all
12
Depends: univention-ldap-server, univention-ldap-config
12
Depends: univention-ldap-server, univention-ldap-config, shell-ucs-school
13
Conflicts: univention-server-slave, univention-server-member, univention-mobile-client, univention-managed-client, univention-basesystem
13
Conflicts: univention-server-slave, univention-server-member, univention-mobile-client, univention-managed-client, univention-basesystem
14
Description: Special LDAP ACLs for UCS@school
14
Description: Special LDAP ACLs for UCS@school
15
 This package provides additional LDAP ACLs for slapd
15
 This package provides additional LDAP ACLs for slapd
(-)ucs-school-lib/python/models/school.py (-33 / +37 lines)
 Lines 80-101    Link Here 
80
	def get_container(cls, school=None):
80
	def get_container(cls, school=None):
81
		return ucr.get('ldap/base')
81
		return ucr.get('ldap/base')
82
82
83
	@classmethod
84
	def cn_name(cls, name, default):
85
		ucr_var = 'ucsschool/ldap/default/container/%s' % name
86
		return ucr.get(ucr_var, default)
87
88
	def create_default_containers(self, lo):
83
	def create_default_containers(self, lo):
89
		cn_pupils = self.cn_name('pupils', 'schueler')
84
		search_base = self.get_search_base(self.name)
90
		cn_teachers = self.cn_name('teachers', 'lehrer')
85
		cn_pupils = ldap.explode_dn(search_base.students, True)[0]
91
		cn_admins = self.cn_name('admins', 'admins')
86
		cn_teachers = ldap.explode_dn(search_base.teachers, True)[0]
92
		cn_classes = self.cn_name('class', 'klassen')
87
		cn_admins = ldap.explode_dn(search_base.admins, True)[0]
93
		cn_rooms = self.cn_name('rooms', 'raeume')
88
		cn_classes = ldap.explode_dn(search_base.classes, True)[0]
89
		cn_rooms = ldap.explode_dn(search_base.rooms, True)[0]
94
		user_containers = [cn_pupils, cn_teachers, cn_admins]
90
		user_containers = [cn_pupils, cn_teachers, cn_admins]
95
		group_containers = [cn_pupils, [cn_classes], cn_teachers, cn_rooms]
91
		group_containers = [cn_pupils, [cn_classes], cn_teachers, cn_rooms]
96
		if self.shall_create_administrative_objects():
92
		if self.shall_create_administrative_objects():
97
			cn_staff = self.cn_name('staff', 'mitarbeiter')
93
			cn_staff = ldap.explode_dn(search_base.staff, True)[0]
98
			cn_teachers_staff = self.cn_name('teachers-and-staff', 'lehrer und mitarbeiter')
94
			cn_teachers_staff = ldap.explode_dn(search_base.teachersAndStaff, True)[0]
99
			user_containers.extend([cn_staff, cn_teachers_staff])
95
			user_containers.extend([cn_staff, cn_teachers_staff])
100
			group_containers.append(cn_staff)
96
			group_containers.append(cn_staff)
101
		containers_with_path = {
97
		containers_with_path = {
 Lines 127-138    Link Here 
127
			for cn in containers:
123
			for cn in containers:
128
				last_dn = _add_container(cn, last_dn, self.dn, path, lo)
124
				last_dn = _add_container(cn, last_dn, self.dn, path, lo)
129
125
130
	def group_name(self, prefix_var, default_prefix):
131
		ucr_var = 'ucsschool/ldap/default/groupprefix/%s' % prefix_var
132
		name_part = ucr.get(ucr_var, default_prefix)
133
		school_part = self.name.lower()
134
		return '%s%s' % (name_part, school_part)
135
136
	def get_umc_policy_dn(self, name):
126
	def get_umc_policy_dn(self, name):
137
		# at least the default ones should exist due to the join script
127
		# at least the default ones should exist due to the join script
138
		return ucr.get('ucsschool/ldap/default/policy/umc/%s' % name, 'cn=ucsschool-umc-%s-default,cn=UMC,cn=policies,%s' % (name, ucr.get('ldap/base')))
128
		return ucr.get('ucsschool/ldap/default/policy/umc/%s' % name, 'cn=ucsschool-umc-%s-default,cn=UMC,cn=policies,%s' % (name, ucr.get('ldap/base')))
 Lines 153-160    Link Here 
153
			group.create(lo)
143
			group.create(lo)
154
144
155
		# cn=ouadmins
145
		# cn=ouadmins
156
		admin_group_container = 'cn=ouadmins,cn=groups,%s' % ucr.get('ldap/base')
146
		search_base = self.get_search_base(self.name)
157
		group = BasicGroup.cache(self.group_name('admins', 'admins-'), container=admin_group_container)
147
		group = BasicGroup.cache("{}{}".format(search_base.group_prefix_admins, self.name.lower()), container=search_base.globalGroupContainer)
158
		group.create(lo)
148
		group.create(lo)
159
		group.add_umc_policy(self.get_umc_policy_dn('admins'), lo)
149
		group.add_umc_policy(self.get_umc_policy_dn('admins'), lo)
160
		try:
150
		try:
 Lines 169-186    Link Here 
169
			udm_obj.modify()
159
			udm_obj.modify()
170
160
171
		# cn=schueler
161
		# cn=schueler
172
		group = Group.cache(self.group_name('pupils', 'schueler-'), self.name)
162
		group = Group.cache("{}{}".format(search_base.group_prefix_students, self.name.lower()), self.name)
173
		group.create(lo)
163
		group.create(lo)
174
		group.add_umc_policy(self.get_umc_policy_dn('pupils'), lo)
164
		group.add_umc_policy(self.get_umc_policy_dn('pupils'), lo)
175
165
176
		# cn=lehrer
166
		# cn=lehrer
177
		group = Group.cache(self.group_name('teachers', 'lehrer-'), self.name)
167
		group = Group.cache("{}{}".format(search_base.group_prefix_teachers, self.name.lower()), self.name)
178
		group.create(lo)
168
		group.create(lo)
179
		group.add_umc_policy(self.get_umc_policy_dn('teachers'), lo)
169
		group.add_umc_policy(self.get_umc_policy_dn('teachers'), lo)
180
170
181
		# cn=mitarbeiter
171
		# cn=mitarbeiter
182
		if self.shall_create_administrative_objects():
172
		if self.shall_create_administrative_objects():
183
			group = Group.cache(self.group_name('staff', 'mitarbeiter-'), self.name)
173
			group = Group.cache("{}{}".format(search_base.group_prefix_staff, self.name.lower()), self.name)
184
			group.create(lo)
174
			group.create(lo)
185
			group.add_umc_policy(self.get_umc_policy_dn('staff'), lo)
175
			group.add_umc_policy(self.get_umc_policy_dn('staff'), lo)
186
176
 Lines 237-256    Link Here 
237
			return flatten([self.get_administrative_group_name(group_type, True, ou_specific, as_dn), self.get_administrative_group_name(group_type, False, ou_specific, as_dn)])
227
			return flatten([self.get_administrative_group_name(group_type, True, ou_specific, as_dn), self.get_administrative_group_name(group_type, False, ou_specific, as_dn)])
238
		if ou_specific == 'both':
228
		if ou_specific == 'both':
239
			return flatten([self.get_administrative_group_name(group_type, domain_controller, False, as_dn), self.get_administrative_group_name(group_type, domain_controller, True, as_dn)])
229
			return flatten([self.get_administrative_group_name(group_type, domain_controller, False, as_dn), self.get_administrative_group_name(group_type, domain_controller, True, as_dn)])
230
		search_base = self.get_search_base(self.name)
231
		base_dn = ucr.get('ldap/base')
240
		if group_type == 'administrative':
232
		if group_type == 'administrative':
241
			name = 'Verwaltungsnetz'
233
			if domain_controller:
234
				if ou_specific:
235
					dn = search_base.administrative_ou_dc_group
236
				else:
237
					dn = search_base.administrative_dc_group
238
			else:
239
				if ou_specific:
240
					dn = search_base.administrative_ou_member_group
241
				else:
242
					dn = search_base.administrative_member_group
242
		else:
243
		else:
243
			name = 'Edukativnetz'
244
			if domain_controller:
244
		if domain_controller:
245
				if ou_specific:
245
			name = 'DC-%s' % name
246
					dn = search_base.educational_ou_dc_group
246
		else:
247
				else:
247
			name = 'Member-%s' % name
248
					dn = search_base.educational_dc_group
248
		if ou_specific:
249
			else:
249
			name = 'OU%s-%s' % (self.name.lower(), name)
250
				if ou_specific:
251
					dn = search_base.educational_ou_member_group
252
				else:
253
					dn = search_base.educational_member_group
250
		if as_dn:
254
		if as_dn:
251
			return 'cn=%s,cn=ucsschool,cn=groups,%s' % (name, ucr.get('ldap/base'))
255
			return dn
252
		else:
256
		else:
253
			return name
257
			return ldap.explode_dn(dn, True)[0]
254
258
255
	def get_administrative_server_names(self, lo):
259
	def get_administrative_server_names(self, lo):
256
		dn = self.get_administrative_group_name('administrative', ou_specific=True, as_dn=True)
260
		dn = self.get_administrative_group_name('administrative', ou_specific=True, as_dn=True)
(-)ucs-school-lib/python/models/share.py (-2 / +2 lines)
 Lines 138-143    Link Here 
138
138
139
	def get_share_path(self):
139
	def get_share_path(self):
140
		if ucr.is_true('ucsschool/import/roleshare', True):
140
		if ucr.is_true('ucsschool/import/roleshare', True):
141
			return '/home/%s/groups/klassen/%s' % (self.school_group.school, self.name)
141
			return '/home/%s/groups/%s/%s' % (self.school_group.school, self.get_search_base(self.school).share_name_class, self.name)
142
		else:
142
		else:
143
			return '/home/groups/klassen/%s' % self.name
143
			return '/home/groups/%s/%s' % (self.get_search_base(self.school).share_name_class, self.name)
(-)ucs-school-lib/python/models/user.py (-4 / +4 lines)
 Lines 435-449    Link Here 
435
		return [self.get_group_dn('Domain Users %s' % school, school) for school in self.schools]
435
		return [self.get_group_dn('Domain Users %s' % school, school) for school in self.schools]
436
436
437
	def get_students_groups(self):
437
	def get_students_groups(self):
438
		prefix = ucr.get('ucsschool/ldap/default/groupprefix/pupils', 'schueler-')
438
		prefix = self.get_search_base(self.school).group_prefix_students
439
		return [self.get_group_dn('%s%s' % (prefix, school), school) for school in self.schools]
439
		return [self.get_group_dn('%s%s' % (prefix, school), school) for school in self.schools]
440
440
441
	def get_teachers_groups(self):
441
	def get_teachers_groups(self):
442
		prefix = ucr.get('ucsschool/ldap/default/groupprefix/teachers', 'lehrer-')
442
		prefix = self.get_search_base(self.school).group_prefix_teachers
443
		return [self.get_group_dn('%s%s' % (prefix, school), school) for school in self.schools]
443
		return [self.get_group_dn('%s%s' % (prefix, school), school) for school in self.schools]
444
444
445
	def get_staff_groups(self):
445
	def get_staff_groups(self):
446
		prefix = ucr.get('ucsschool/ldap/default/groupprefix/staff', 'mitarbeiter-')
446
		prefix = self.get_search_base(self.school).group_prefix_staff
447
		return [self.get_group_dn('%s%s' % (prefix, school), school) for school in self.schools]
447
		return [self.get_group_dn('%s%s' % (prefix, school), school) for school in self.schools]
448
448
449
	def groups_used(self, lo):
449
	def groups_used(self, lo):
 Lines 667-672    Link Here 
667
667
668
	@classmethod
668
	@classmethod
669
	def from_student_dn(cls, lo, school, dn):
669
	def from_student_dn(cls, lo, school, dn):
670
		examUserPrefix = ucr.get('ucsschool/ldap/default/userprefix/exam', 'exam-')
670
		examUserPrefix = cls.get_search_base(school).user_prefix_exam
671
		dn = 'uid=%s%s,%s' % (escape_dn_chars(examUserPrefix), explode_dn(dn, True)[0], cls.get_container(school))
671
		dn = 'uid=%s%s,%s' % (escape_dn_chars(examUserPrefix), explode_dn(dn, True)[0], cls.get_container(school))
672
		return cls.from_dn(dn, school, lo)
672
		return cls.from_dn(dn, school, lo)
(-)ucs-school-lib/python/roleshares.py (-2 / +2 lines)
 Lines 36-42    Link Here 
36
import univention.config_registry
36
import univention.config_registry
37
from ucsschool.lib.roles import role_pupil, role_teacher, role_staff
37
from ucsschool.lib.roles import role_pupil, role_teacher, role_staff
38
from ucsschool.lib.i18n import ucs_school_name_i18n
38
from ucsschool.lib.i18n import ucs_school_name_i18n
39
from ucsschool.lib.models import Group, School
39
from ucsschool.lib.models import Group, School, Share
40
from ucsschool.lib.schoolldap import LDAP_Connection, USER_READ, USER_WRITE, MACHINE_READ
40
from ucsschool.lib.schoolldap import LDAP_Connection, USER_READ, USER_WRITE, MACHINE_READ
41
import univention.admin.uexceptions
41
import univention.admin.uexceptions
42
import univention.admin.uldap as udm_uldap
42
import univention.admin.uldap as udm_uldap
 Lines 151-157    Link Here 
151
		ucr.load()
151
		ucr.load()
152
152
153
	school_ou = school.name
153
	school_ou = school.name
154
	share_container_dn = school.get_search_base(school.name).shares
154
	share_container_dn = Share.get_container(school.name)
155
155
156
	teacher_groupname = '-'.join((ucs_school_name_i18n(role_teacher), school_ou))
156
	teacher_groupname = '-'.join((ucs_school_name_i18n(role_teacher), school_ou))
157
	teacher_group = Group(name=teacher_groupname, school=school_ou).get_udm_object(ldap_user_read)
157
	teacher_group = Group(name=teacher_groupname, school=school_ou).get_udm_object(ldap_user_read)
(-)ucs-school-lib/python/schoolldap.py (-10 / +129 lines)
 Lines 177-183    Link Here 
177
		self._school = school or availableSchools[0]
177
		self._school = school or availableSchools[0]
178
		self._schoolDN = dn or School.cache(self.school).dn
178
		self._schoolDN = dn or School.cache(self.school).dn
179
179
180
		# prefixes
180
		#
181
		# When adding/updating UCRV defaults, also add/update them in shell/base.sh.
182
		#
183
184
		#
185
		# When changing any of ucsschool/ldap/default/groupname/all-{administrativ, educational}-{dc, member}
186
		# copy the changes to ucs-school-ldap-acls-master/{61ucsschool_presettings, 65ucsschool}.
187
		#
188
189
		# containers
181
		self._containerAdmins = ucr.get('ucsschool/ldap/default/container/admins', 'admins')
190
		self._containerAdmins = ucr.get('ucsschool/ldap/default/container/admins', 'admins')
182
		self._containerStudents = ucr.get('ucsschool/ldap/default/container/pupils', 'schueler')
191
		self._containerStudents = ucr.get('ucsschool/ldap/default/container/pupils', 'schueler')
183
		self._containerStaff = ucr.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
192
		self._containerStaff = ucr.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
 Lines 186-197    Link Here 
186
		self._containerClass = ucr.get('ucsschool/ldap/default/container/class', 'klassen')
195
		self._containerClass = ucr.get('ucsschool/ldap/default/container/class', 'klassen')
187
		self._containerRooms = ucr.get('ucsschool/ldap/default/container/rooms', 'raeume')
196
		self._containerRooms = ucr.get('ucsschool/ldap/default/container/rooms', 'raeume')
188
		self._examUserContainerName = ucr.get('ucsschool/ldap/default/container/exam', 'examusers')
197
		self._examUserContainerName = ucr.get('ucsschool/ldap/default/container/exam', 'examusers')
189
		self._examGroupNameTemplate = ucr.get('ucsschool/ldap/default/groupname/exam', 'OU%(ou)s-Klassenarbeit')
198
		# group names
190
199
		self._examGroupName = ucr.get('ucsschool/ldap/default/groupname/exam',
200
			'OU%(ou)s-Klassenarbeit') % {'ou': self._school.lower()}
201
		self._all_administrativ_dc = ucr.get('ucsschool/ldap/default/groupname/all-administrativ-dc',
202
			'DC-Verwaltungsnetz')
203
		self._all_administrativ_member = ucr.get('ucsschool/ldap/default/groupname/all-administrativ-member',
204
			'Member-Verwaltungsnetz')
205
		self._all_educational_dc = ucr.get('ucsschool/ldap/default/groupname/all-educational-dc',
206
			'DC-Edukativnetz')
207
		self._all_educational_member = ucr.get('ucsschool/ldap/default/groupname/all-educational-member',
208
			'Member-Edukativnetz')
209
		self._ou_administrativ_dc = ucr.get('ucsschool/ldap/default/groupname/ou-administrativ-dc',
210
			'OU%(ou)s-DC-Verwaltungsnetz') % {'ou': self._school.lower()}
211
		self._ou_administrativ_member = ucr.get('ucsschool/ldap/default/groupname/ou-administrativ-member',
212
			'OU%(ou)s-Member-Verwaltungsnetz') % {'ou': self._school.lower()}
213
		self._ou_educational_dc = ucr.get('ucsschool/ldap/default/groupname/ou-educational-dc',
214
			'OU%(ou)s-DC-Edukativnetz') % {'ou': self._school.lower()}
215
		self._ou_educational_member = ucr.get('ucsschool/ldap/default/groupname/ou-educational-member',
216
			'OU%(ou)s-Member-Edukativnetz') % {'ou': self._school.lower()}
217
		# group prefixes
191
		self.group_prefix_students = ucr.get('ucsschool/ldap/default/groupprefix/pupils', 'schueler-')
218
		self.group_prefix_students = ucr.get('ucsschool/ldap/default/groupprefix/pupils', 'schueler-')
192
		self.group_prefix_teachers = ucr.get('ucsschool/ldap/default/groupprefix/teachers', 'lehrer-')
219
		self.group_prefix_teachers = ucr.get('ucsschool/ldap/default/groupprefix/teachers', 'lehrer-')
193
		self.group_prefix_admins = ucr.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
220
		self.group_prefix_admins = ucr.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
194
		self.group_prefix_staff = ucr.get('ucsschool/ldap/default/groupprefix/staff', 'mitarbeiter-')
221
		self.group_prefix_staff = ucr.get('ucsschool/ldap/default/groupprefix/staff', 'mitarbeiter-')
222
		# user prefix
223
		self.user_prefix_exam = ucr.get('ucsschool/ldap/default/userprefix/exam', 'exam-')
224
		# share/directory names
225
		self.share_name_class = ucr.get('ucsschool/ldap/default/share/class', 'klassen')
226
		self.share_name_pupils = ucr.get('ucsschool/ldap/default/share/pupils', 'schueler')
227
		self.share_name_teachers = ucr.get('ucsschool/ldap/default/share/teachers', 'lehrer')
228
		self.share_name_exams = ucr.get('ucsschool/ldap/default/share/exams', 'Klassenarbeiten')
229
		self.share_name_marktplatz = ucr.get('ucsschool/import/generate/share/marktplatz/name', 'Marktplatz')
195
230
196
	@classmethod
231
	@classmethod
197
	def getOU(cls, dn):
232
	def getOU(cls, dn):
 Lines 260-284    Link Here 
260
295
261
	@property
296
	@property
262
	def students(self):
297
	def students(self):
298
		"""cn=schueler,cn=users,<ou dn>"""
263
		return "cn=%s,cn=users,%s" % (self._containerStudents, self.schoolDN)
299
		return "cn=%s,cn=users,%s" % (self._containerStudents, self.schoolDN)
264
300
265
	@property
301
	@property
302
	def students_group(self):
303
		"""cn=schueler,cn=groups,<ou dn>"""
304
		return "cn=%s,cn=groups,%s" % (self._containerStudents, self.schoolDN)
305
306
	@property
307
	def students_ou_group(self):
308
		"""cn=schueler-%(ou)s,cn=groups,<ou dn> (ou already replaced)"""
309
		return "cn=%s%s,cn=groups,%s" % (self.group_prefix_students, self.school, self.schoolDN)
310
311
	@property
266
	def teachers(self):
312
	def teachers(self):
313
		"""cn=lehrer,cn=users,<ou dn>"""
267
		return "cn=%s,cn=users,%s" % (self._containerTeachers, self.schoolDN)
314
		return "cn=%s,cn=users,%s" % (self._containerTeachers, self.schoolDN)
268
315
269
	@property
316
	@property
317
	def teachers_group(self):
318
		"""cn=lehrer,cn=groups,<ou dn>"""
319
		return "cn=%s,cn=groups,%s" % (self._containerTeachers, self.schoolDN)
320
321
	@property
322
	def teachers_ou_group(self):
323
		"""cn=lehrer-%(ou)s,cn=groups,<ou dn> (ou already replaced)"""
324
		return "cn=%s%s,cn=groups,%s" % (self.group_prefix_teachers, self.school, self.schoolDN)
325
326
	@property
270
	def teachersAndStaff(self):
327
	def teachersAndStaff(self):
328
		"""cn=lehrer und mitarbeiter,cn=users,<ou dn>"""
271
		return "cn=%s,cn=users,%s" % (self._containerTeachersAndStaff, self.schoolDN)
329
		return "cn=%s,cn=users,%s" % (self._containerTeachersAndStaff, self.schoolDN)
272
330
273
	@property
331
	@property
274
	def staff(self):
332
	def staff(self):
333
		"""cn=mitarbeiter,cn=users,<ou dn>"""
275
		return "cn=%s,cn=users,%s" % (self._containerStaff, self.schoolDN)
334
		return "cn=%s,cn=users,%s" % (self._containerStaff, self.schoolDN)
276
335
277
	@property
336
	@property
337
	def staff_group(self):
338
		"""cn=mitarbeiter,cn=groups,<ou dn>"""
339
		return "cn=%s,cn=groups,%s" % (self._containerStaff, self.schoolDN)
340
341
	@property
342
	def staff_ou_group(self):
343
		"""cn=mitarbeiter-%(ou)s,cn=groups,<ou dn> (ou already replaced)"""
344
		return "cn=%s%s,cn=groups,%s" % (self.group_prefix_staff, self.school, self.schoolDN)
345
346
	@property
278
	def admins(self):
347
	def admins(self):
348
		"""cn=admins,cn=users,<ou dn>"""
279
		return "cn=%s,cn=users,%s" % (self._containerAdmins, self.schoolDN)
349
		return "cn=%s,cn=users,%s" % (self._containerAdmins, self.schoolDN)
280
350
281
	@property
351
	@property
352
	def admin_group(self):
353
		"""cn=admins-%(ou)s,cn=ouadmins,cn=groups,<ou dn> (ou already replaced)"""
354
		return "cn=%s%s,cn=ouadmins,cn=groups,%s" % (self.group_prefix_admins, self.school, self.schoolDN)
355
356
	@property
282
	def classShares(self):
357
	def classShares(self):
283
		return "cn=%s,cn=shares,%s" % (self._containerClass, self.schoolDN)
358
		return "cn=%s,cn=shares,%s" % (self._containerClass, self.schoolDN)
284
359
 Lines 304-331    Link Here 
304
379
305
	@property
380
	@property
306
	def educationalDCGroup(self):
381
	def educationalDCGroup(self):
307
		return "cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (self.school, self._ldapBase)
382
		"""deprecated, please use educational_ou_dc_group"""
383
		return self.educational_ou_dc_group
308
384
309
	@property
385
	@property
310
	def educationalMemberGroup(self):
386
	def educationalMemberGroup(self):
311
		return "cn=OU%s-Member-Edukativnetz,cn=ucsschool,cn=groups,%s" % (self.school, self._ldapBase)
387
		"""deprecated, please use educational_ou_member_group"""
388
		return self.educational_ou_member_group
312
389
313
	@property
390
	@property
314
	def administrativeDCGroup(self):
391
	def administrativeDCGroup(self):
315
		return "cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (self.school, self._ldapBase)
392
		"""deprecated, please use administrative_ou_dc_group"""
393
		return self.administrative_ou_dc_group
316
394
317
	@property
395
	@property
318
	def administrativeMemberGroup(self):
396
	def administrativeMemberGroup(self):
319
		return "cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % (self.school, self._ldapBase)
397
		"""deprecated, please use administrative_ou_member_group"""
398
		return self.administrative_ou_member_group
320
399
321
	@property
400
	@property
401
	def administrative_dc_group(self):
402
		"""cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,<ldap base>"""
403
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._all_administrativ_dc, self._ldapBase)
404
405
	@property
406
	def administrative_member_group(self):
407
		"""cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,<ldap base>"""
408
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._all_administrativ_member, self._ldapBase)
409
410
	@property
411
	def educational_dc_group(self):
412
		"""cn=DC-Edukativnetz,cn=ucsschool,cn=groups,<ldap base>"""
413
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._all_educational_dc, self._ldapBase)
414
415
	@property
416
	def educational_member_group(self):
417
		"""cn=Member-Edukativnetz,cn=ucsschool,cn=groups,<ldap base>"""
418
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._all_educational_member, self._ldapBase)
419
420
	@property
421
	def educational_ou_dc_group(self):
422
		"""cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,<ldap base> (ou already replaced)"""
423
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._ou_educational_dc, self._ldapBase)
424
425
	@property
426
	def educational_ou_member_group(self):
427
		"""cn=OU%(ou)s-Member-Edukativnetz,cn=ucsschool,cn=groups,<ldap base> (ou already replaced)"""
428
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._ou_educational_member, self._ldapBase)
429
430
	@property
431
	def administrative_ou_dc_group(self):
432
		"""cn=OU%(ou)s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,<ldap base> (ou already replaced)"""
433
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._ou_administrativ_dc, self._ldapBase)
434
435
	@property
436
	def administrative_ou_member_group(self):
437
		"""cn=OU%(ou)s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,<ldap base> (ou already replaced)"""
438
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self._ou_administrativ_member, self._ldapBase)
439
440
	@property
322
	def examGroupName(self):
441
	def examGroupName(self):
323
		# replace '%(ou)s' strings in generic exam_group_name
442
		"""OU%(ou)s-Klassenarbeit (only name, not a DN, ou already replaced)"""
324
		ucr_value_keywords = {'ou': self.school}
443
		return self._examGroupName
325
		return self._examGroupNameTemplate % ucr_value_keywords
326
444
327
	@property
445
	@property
328
	def examGroup(self):
446
	def examGroup(self):
447
		"""cn=OU%(ou)s-Klassenarbeit,cn=ucsschool,cn=groups,<ldap base> (ou already replaced)"""
329
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self.examGroupName, self._ldapBase)
448
		return "cn=%s,cn=ucsschool,cn=groups,%s" % (self.examGroupName, self._ldapBase)
330
449
331
	def isWorkgroup(self, groupDN):
450
	def isWorkgroup(self, groupDN):
(-)ucs-school-lib/shell/base.sh (-5 / +93 lines)
 Lines 110-116    Link Here 
110
	#
110
	#
111
	# $ servers_school_ous -h $(ucr get ldap/master) -p $(ucr get ldap/master/port)
111
	# $ servers_school_ous -h $(ucr get ldap/master) -p $(ucr get ldap/master/port)
112
	# ou=bar,dc=example,dc=com
112
	# ou=bar,dc=example,dc=com
113
	local ldap_hostdn ldap_base ldap_server ldap_port IFS
113
	local ldap_hostdn ldap_base ldap_server ldap_port IFS res
114
	. /usr/share/univention-lib/ucr.sh
114
	. /usr/share/univention-lib/ucr.sh
115
115
116
	ldap_base="$(/usr/sbin/univention-config-registry get ldap/base)"
116
	ldap_base="$(/usr/sbin/univention-config-registry get ldap/base)"
 Lines 140-149    Link Here 
140
	res=""
140
	res=""
141
	for oudn in $(univention-ldapsearch $ldap_server $ldap_port -xLLL -b "$ldap_base" 'objectClass=ucsschoolOrganizationalUnit' dn | ldapsearch-wrapper | sed -nre 's/^dn: //p') ; do
141
	for oudn in $(univention-ldapsearch $ldap_server $ldap_port -xLLL -b "$ldap_base" 'objectClass=ucsschoolOrganizationalUnit' dn | ldapsearch-wrapper | sed -nre 's/^dn: //p') ; do
142
		ouname="$(school_ou "$oudn")"
142
		ouname="$(school_ou "$oudn")"
143
		if is_ucr_true ucsschool/singlemaster; then
143
		search_str="(|(cn=$(ucr_names_default ucsschool/ldap/default/groupname/ou-educational-dc ${ouname}))(cn=$(ucr_names_default ucsschool/ldap/default/groupname/ou-administrativ-dc OU${ouname})))"
144
			search_str="(|(cn=OU${ouname}-DC-Edukativnetz)(cn=OU${ouname}-DC-Verwaltungsnetz))"
144
		if ! is_ucr_true ucsschool/singlemaster; then
145
		else
145
			search_str="(&${search_str}(uniqueMember=${ldap_hostdn}))"
146
			search_str="(&(|(cn=OU${ouname}-DC-Edukativnetz)(cn=OU${ouname}-DC-Verwaltungsnetz))(uniqueMember=${ldap_hostdn}))"
147
		fi
146
		fi
148
		if univention-ldapsearch $ldap_server $ldap_port -xLLL "$search_str" dn | grep -q "^dn: "; then
147
		if univention-ldapsearch $ldap_server $ldap_port -xLLL "$search_str" dn | grep -q "^dn: "; then
149
			res="$res
148
			res="$res
 Lines 152-154    Link Here 
152
	done
151
	done
153
	echo -n "${res}" | egrep -v "^\s*$"
152
	echo -n "${res}" | egrep -v "^\s*$"
154
}
153
}
154
155
replace_ou() {
156
	# syntax: replace_ou <template> <ou>
157
	#
158
	# Replace '%(ou)s' in <template> with <ou>
159
	#
160
	# example:
161
	# $ replace_ou "OU%(ou)s-DC-Edukativnetz" "myschool"
162
	# "OUmyschool-DC-Edukativnetz
163
	if [ "$#" != 2 ]; then
164
		echo "syntax: replace_ou <template> <ou>"
165
		return 1
166
	fi
167
	echo -n "$1" | sed "s/%(ou)s/$2/"
168
}
169
170
ucr_names_default() {
171
	# syntax: ucr_names_default <ucr> [ou]
172
	#
173
	# Get UCR value or default, optionally replace '%(ou)s'.
174
	#
175
	# example:
176
	# $ ucr_names_default "ucsschool/ldap/default/container/pupils"
177
	# "schueler
178
	# $ ucr_names_default "ucsschool/ldap/default/groupname/ou-administrativ-dc" "myschool"
179
	# "OUmyschool-DC-Verwaltungsnetz"
180
	local res
181
182
	if [ "$#" -lt 1 -o "$#" -gt 2 ]; then
183
		echo "syntax: ucr_names_default <ucr> [ou]"
184
		return 1
185
	fi
186
	if [ $(echo -n "$1" | cut -f 1-3 -d '/') != 'ucsschool/ldap/default' ]; then
187
		echo "<ucr> must be a UCR variable from ucsschool/ldap/default/*/*"
188
		return 1
189
	fi
190
191
	#
192
	# When adding/updating UCRV defaults, also add/update them in python/schoolldap.py.
193
	#
194
195
	res="$(ucr get $1)"
196
	if [ -z "$res" ]; then
197
		case "$1" in
198
			# containers
199
			'ucsschool/ldap/default/container/admins') res='admins';;
200
			'ucsschool/ldap/default/container/pupils') res='schueler';;
201
			'ucsschool/ldap/default/container/staff') res='mitarbeiter';;
202
			'ucsschool/ldap/default/container/teachers-and-staff') res='lehrer und mitarbeiter';;
203
			'ucsschool/ldap/default/container/teachers') res='lehrer';;
204
			'ucsschool/ldap/default/container/class') res='klassen';;
205
			'ucsschool/ldap/default/container/rooms') res='raeume';;
206
			'ucsschool/ldap/default/container/exam') res='examusers';;
207
			# group names
208
			'ucsschool/ldap/default/groupname/exam') res='OU%(ou)%s-Klassenarbeit';;
209
			'ucsschool/ldap/default/groupname/all-administrativ-dc') res='DC-Verwaltungsnetz';;
210
			'ucsschool/ldap/default/groupname/all-administrativ-member') res='Member-Verwaltungsnetz';;
211
			'ucsschool/ldap/default/groupname/all-educational-dc') res='DC-Edukativnetz';;
212
			'ucsschool/ldap/default/groupname/all-educational-member') res='Member-Edukativnetz';;
213
			'ucsschool/ldap/default/groupname/ou-administrativ-dc') res='OU%(ou)s-DC-Verwaltungsnetz';;
214
			'ucsschool/ldap/default/groupname/ou-administrativ-member') res='OU%(ou)s-Member-Verwaltungsnetz';;
215
			'ucsschool/ldap/default/groupname/ou-educational-dc') res='OU%(ou)s-DC-Edukativnetz';;
216
			'ucsschool/ldap/default/groupname/ou-educational-member') res='OU%(ou)s-Member-Edukativnetz';;
217
			# group prefixes
218
			'ucsschool/ldap/default/groupprefix/pupils') res='schueler-';;
219
			'ucsschool/ldap/default/groupprefix/teachers') res='lehrer-';;
220
			'ucsschool/ldap/default/groupprefix/admins') res='admins-';;
221
			'ucsschool/ldap/default/groupprefix/staff') res='mitarbeiter-';;
222
			# user prefix
223
			'ucsschool/ldap/default/userprefix/exam') res='exam-';;
224
			# share/directory names
225
			'ucsschool/ldap/default/share/class') res='klassen';;
226
			'ucsschool/ldap/default/share/pupils') res='schueler';;
227
			'ucsschool/ldap/default/share/teachers') res='lehrer';;
228
			'ucsschool/ldap/default/share/exams') res='Klassenarbeiten';;
229
			'ucsschool/import/generate/share/marktplatz/name') res='Marktplatz';;
230
		esac
231
	fi
232
	if [ -z "$res" ]; then
233
		echo "Error: Unknown UCR $1."
234
		return 1
235
	fi
236
237
	if [ -z "$2" ]; then
238
		echo -n "$res"
239
	else
240
		replace_ou "$res" "$2"
241
	fi
242
}
(-)ucs-school-netlogon-user-logonscripts/99ucs-school-netlogon-user-logonscripts.inst (-3 / +6 lines)
 Lines 32-40    Link Here 
32
VERSION="1"
32
VERSION="1"
33
33
34
. /usr/share/univention-join/joinscripthelper.lib
34
. /usr/share/univention-join/joinscripthelper.lib
35
. /usr/share/ucs-school-lib/base.sh
36
35
joinscript_init
37
joinscript_init
36
38
37
eval "$(univention-config-registry shell)"
39
eval "$(univention-config-registry shell)"
40
share_name="$(ucr_names_default ucsschool/import/generate/share/marktplatz/name)"
38
41
39
# samba 4 netlogon share
42
# samba 4 netlogon share
40
myrealm=$(echo $kerberos_realm |  awk '{print tolower($0)}')
43
myrealm=$(echo $kerberos_realm |  awk '{print tolower($0)}')
 Lines 43-51    Link Here 
43
fi
46
fi
44
47
45
univention-config-registry set \
48
univention-config-registry set \
46
    ucsschool/userlogon/commonshares?"Marktplatz" \
49
    ucsschool/userlogon/commonshares?"$share_name" \
47
    ucsschool/userlogon/commonshares/server/Marktplatz?"$hostname" \
50
    "ucsschool/userlogon/commonshares/server/$share_name?$hostname" \
48
    ucsschool/userlogon/commonshares/letter/Marktplatz?"M" \
51
    "ucsschool/userlogon/commonshares/letter/$share_name?M" \
49
    ucsschool/userlogon/classshareletter?"K" \
52
    ucsschool/userlogon/classshareletter?"K" \
50
    ucsschool/netlogon/ucs-school-netlogon-user-logonscripts/script?'user\%USERNAME%.vbs'
53
    ucsschool/netlogon/ucs-school-netlogon-user-logonscripts/script?'user\%USERNAME%.vbs'
51
54
(-)ucs-school-netlogon-user-logonscripts/debian/control (+1 lines)
 Lines 13-18    Link Here 
13
 univention-directory-listener,
13
 univention-directory-listener,
14
 ucs-school-netlogon,
14
 ucs-school-netlogon,
15
 shell-univention-lib,
15
 shell-univention-lib,
16
 shell-ucs-school,
16
 univention-config
17
 univention-config
17
Description: UCS@school userspecific netlogon scripts
18
Description: UCS@school userspecific netlogon scripts
18
 This package provides a listener-module that creates
19
 This package provides a listener-module that creates
(-)ucs-school-netlogon-user-logonscripts/debian/ucs-school-netlogon-user-logonscripts.postinst (-3 / +5 lines)
 Lines 33-46    Link Here 
33
#DEBHELPER#
33
#DEBHELPER#
34
34
35
. /usr/share/univention-lib/all.sh
35
. /usr/share/univention-lib/all.sh
36
. /usr/share/ucs-school-lib/base.sh
36
37
37
eval "$(ucr shell)"
38
eval "$(ucr shell)"
39
share_name="$(ucr_names_default ucsschool/import/generate/share/marktplatz/name)"
38
40
39
univention-config-registry set \
41
univention-config-registry set \
40
	samba/homedirletter?I \
42
	samba/homedirletter?I \
41
    ucsschool/userlogon/commonshares?"Marktplatz" \
43
    ucsschool/userlogon/commonshares?"$share_name" \
42
    ucsschool/userlogon/commonshares/server/Marktplatz?"$hostname" \
44
    "ucsschool/userlogon/commonshares/server/$share_name?$hostname" \
43
    ucsschool/userlogon/commonshares/letter/Marktplatz?"M" \
45
    "ucsschool/userlogon/commonshares/letter/$share_name?M" \
44
    ucsschool/userlogon/classshareletter?"K" \
46
    ucsschool/userlogon/classshareletter?"K" \
45
    ucsschool/netlogon/ucs-school-netlogon-user-logonscripts/script?'user\%USERNAME%.vbs' \
47
    ucsschool/netlogon/ucs-school-netlogon-user-logonscripts/script?'user\%USERNAME%.vbs' \
46
	ucsschool/userlogon/myshares/enabled?no
48
	ucsschool/userlogon/myshares/enabled?no
(-)ucs-school-umc-computerroom/umc/python/computerroom/__init__.py (-1 / +1 lines)
 Lines 700-706    Link Here 
700
			vset[vunset[-1]] = shareMode
700
			vset[vunset[-1]] = shareMode
701
			vextract.append('samba/othershares/hosts/deny')
701
			vextract.append('samba/othershares/hosts/deny')
702
			vappend[vextract[-1]] = hosts
702
			vappend[vextract[-1]] = hosts
703
			vextract.append('samba/share/Marktplatz/hosts/deny')
703
			vextract.append('samba/share/{}/hosts/deny'.format(School.get_search_base(self._italc.school).share_name_marktplatz))
704
			vappend[vextract[-1]] = hosts
704
			vappend[vextract[-1]] = hosts
705
		else:
705
		else:
706
			vunset_now.append('samba/sharemode/room/%s' % self._italc.room)
706
			vunset_now.append('samba/sharemode/room/%s' % self._italc.room)
(-)ucs-school-umc-csv-import/umc/python/schoolcsvimport/util.py (-1 / +1 lines)
 Lines 126-132    Link Here 
126
			firstname = firstname[:5] + '.'
126
			firstname = firstname[:5] + '.'
127
127
128
		username = firstname + lastname[:5]
128
		username = firstname + lastname[:5]
129
		maxlength = 20 - len(ucr.get('ucsschool/ldap/default/userprefix/exam', 'exam-'))
129
		maxlength = 20 - len(self.get_search_base(self.school).user_prefix_exam)
130
		return replace_invalid_chars(username[:maxlength])
130
		return replace_invalid_chars(username[:maxlength])
131
131
132
	@classmethod
132
	@classmethod
(-)ucs-school-umc-exam/debian/control (+1 lines)
 Lines 31-36    Link Here 
31
 python-ucs-school,
31
 python-ucs-school,
32
 ucs-school-import,
32
 ucs-school-import,
33
 shell-univention-lib,
33
 shell-univention-lib,
34
 shell-ucs-school,
34
 univention-ldap-config (>= 9.0.27-3),
35
 univention-ldap-config (>= 9.0.27-3),
35
Description: UMC module delivering backend services for ucs-school-umc-exam
36
Description: UMC module delivering backend services for ucs-school-umc-exam
36
 UMC module delivering backend services for ucs-school-umc-exam
37
 UMC module delivering backend services for ucs-school-umc-exam
(-)ucs-school-umc-exam/hooks/ou_create_post.d/60schoolexam-master (-9 / +3 lines)
 Lines 35-40    Link Here 
35
[ $# -ne 2 ] && echo "USAGE: $(basename $0) FILE DN" && exit 1
35
[ $# -ne 2 ] && echo "USAGE: $(basename $0) FILE DN" && exit 1
36
36
37
. /usr/share/univention-lib/ucr.sh
37
. /usr/share/univention-lib/ucr.sh
38
. /usr/share/ucs-school-lib/base.sh
38
39
39
eval "$(ucr shell)"
40
eval "$(ucr shell)"
40
41
 Lines 43-62    Link Here 
43
	district=",ou=${ou:0:2}"
44
	district=",ou=${ou:0:2}"
44
fi
45
fi
45
46
46
examusers="$ucsschool_ldap_default_container_exam"
47
examusers="$(ucr_names_default ucsschool/ldap/default/container/exam)"
47
if [ -z "$examusers" ] ; then
48
	examusers='examusers'
49
fi
50
48
51
udm container/cn create --ignore_exists \
49
udm container/cn create --ignore_exists \
52
	--position "ou=${ou}${district},${ldap_base}" \
50
	--position "ou=${ou}${district},${ldap_base}" \
53
	--set name="${examusers}" \
51
	--set name="${examusers}" \
54
52
55
examgroupname="$ucsschool_ldap_default_groupname_exam"
53
ou_specific_examgroupname="$(ucr_names_default ucsschool/ldap/default/groupname/exam)"
56
if [ -z "$examgroupname" ] ; then
57
	examgroupname='OU%(ou)s-Klassenarbeit'
58
fi
59
ou_specific_examgroupname=$(python -c "print '$examgroupname' % {'ou': '$ou'}")
60
54
61
udm groups/group create --ignore_exists \
55
udm groups/group create --ignore_exists \
62
	--position "cn=ucsschool,cn=groups,${ldap_base}" \
56
	--position "cn=ucsschool,cn=groups,${ldap_base}" \
(-)ucs-school-umc-exam/share/exam-and-room-cleanup (-4 / +3 lines)
 Lines 39-45    Link Here 
39
import univention.config_registry
39
import univention.config_registry
40
import univention.uldap
40
import univention.uldap
41
import univention.admin.uldap
41
import univention.admin.uldap
42
from ucsschool.lib.schoolldap import SchoolSearchBase
42
from ucsschool.lib.models import ExamStudent
43
from univention.lib.umc_connection import UMCConnection
43
from univention.lib.umc_connection import UMCConnection
44
from univention.admin.uexceptions import noObject
44
from univention.admin.uexceptions import noObject
45
from ldap.filter import escape_filter_chars
45
from ldap.filter import escape_filter_chars
 Lines 59-65    Link Here 
59
		self.hostname = self.ucr.get('hostname')
59
		self.hostname = self.ucr.get('hostname')
60
		self.umcp = self.get_UMCP_connection()
60
		self.umcp = self.get_UMCP_connection()
61
		self.lo = self.get_LDAP_connection()
61
		self.lo = self.get_LDAP_connection()
62
		self.exam_prefix = self.ucr.get('ucsschool/ldap/default/userprefix/exam', 'exam-')
63
		self.DIR_ROOMS = '/var/cache/ucs-school-umc-computerroom'
62
		self.DIR_ROOMS = '/var/cache/ucs-school-umc-computerroom'
64
		self.DIR_EXAMS = self.ucr.get('ucsschool/exam/cache', '/var/lib/ucs-school-umc-schoolexam')
63
		self.DIR_EXAMS = self.ucr.get('ucsschool/exam/cache', '/var/lib/ucs-school-umc-schoolexam')
65
64
 Lines 143-151    Link Here 
143
			ou_list = self.lo.search(filter='(objectClass=ucsschoolOrganizationalUnit)')
142
			ou_list = self.lo.search(filter='(objectClass=ucsschoolOrganizationalUnit)')
144
			for ou_dn, ou_attrs in ou_list:
143
			for ou_dn, ou_attrs in ou_list:
145
				ou_name = ou_attrs['ou'][0]
144
				ou_name = ou_attrs['ou'][0]
146
				searchbase = SchoolSearchBase([ou_name], dn=ou_dn)
145
				exam_prefix = ExamStudent.get_search_base(ou_name).user_prefix_exam
147
				try:
146
				try:
148
					userlist = mod_user.lookup({}, lo, 'uid=%s*' % (escape_filter_chars(self.exam_prefix),), base=searchbase.examUsers)
147
					userlist = mod_user.lookup({}, lo, 'uid=%s*' % (escape_filter_chars(exam_prefix),), base=ExamStudent.get_container(ou_name))
149
				except noObject:
148
				except noObject:
150
					# no exam users container in this OU
149
					# no exam users container in this OU
151
					continue
150
					continue
(-)ucs-school-umc-exam/umc/python/schoolexam-master/__init__.py (-6 / +5 lines)
 Lines 39-44    Link Here 
39
import traceback
39
import traceback
40
import re
40
import re
41
from ldap.filter import filter_format
41
from ldap.filter import filter_format
42
from ldap import explode_dn
42
43
43
from univention.management.console.config import ucr
44
from univention.management.console.config import ucr
44
from univention.management.console.log import MODULE
45
from univention.management.console.log import MODULE
 Lines 61-68    Link Here 
61
	def __init__(self):
62
	def __init__(self):
62
		SchoolBaseModule.__init__(self)
63
		SchoolBaseModule.__init__(self)
63
64
64
		self._examUserPrefix = ucr.get('ucsschool/ldap/default/userprefix/exam', 'exam-')
65
66
		# cache objects
65
		# cache objects
67
		self._udm_modules = dict()
66
		self._udm_modules = dict()
68
		self._examGroup = None
67
		self._examGroup = None
 Lines 104-112    Link Here 
104
	def examUserContainerDN(self, ldap_admin_write, ldap_position, school):
103
	def examUserContainerDN(self, ldap_admin_write, ldap_position, school):
105
		'''lookup examUserContainerDN, create it if missing'''
104
		'''lookup examUserContainerDN, create it if missing'''
106
		if not self._examUserContainerDN:
105
		if not self._examUserContainerDN:
107
			search_base = School.get_search_base(school)
106
			examUsers = ExamStudent.get_container(school)
108
			examUsers = search_base.examUsers
107
			examUserContainerName = explode_dn(ExamStudent.get_search_base(school).examUsers, True)[0]
109
			examUserContainerName = search_base._examUserContainerName
110
			try:
108
			try:
111
				ldap_admin_write.searchDn('(objectClass=organizationalRole)', examUsers, scope='base')
109
				ldap_admin_write.searchDn('(objectClass=organizationalRole)', examUsers, scope='base')
112
			except univention.admin.uexceptions.noObject:
110
			except univention.admin.uexceptions.noObject:
 Lines 151-157    Link Here 
151
		user_orig = user.get_udm_object(ldap_admin_write)
149
		user_orig = user.get_udm_object(ldap_admin_write)
152
150
153
		# uid and DN of exam_user
151
		# uid and DN of exam_user
154
		exam_user_uid = "".join((self._examUserPrefix, user_orig['username']))
152
		exam_user_prefix = ExamStudent.get_search_base(school).user_prefix_exam
153
		exam_user_uid = "".join((exam_user_prefix, user_orig['username']))
155
		exam_user_dn = "uid=%s,%s" % (exam_user_uid, self.examUserContainerDN(ldap_admin_write, ldap_position, user.school or school))
154
		exam_user_dn = "uid=%s,%s" % (exam_user_uid, self.examUserContainerDN(ldap_admin_write, ldap_position, user.school or school))
156
155
157
		try:
156
		try:
(-)ucs-test-ucsschool/90_ucsschool/07_printermoderation_check (-6 / +4 lines)
 Lines 21-26    Link Here 
21
import univention.testing.udm
21
import univention.testing.udm
22
import univention.testing.utils as utils
22
import univention.testing.utils as utils
23
from univention.testing.umc2 import Client
23
from univention.testing.umc2 import Client
24
from ucsschool.lib.models import SchoolClass
24
25
25
26
26
def _dir(userName):
27
def _dir(userName):
 Lines 95-104    Link Here 
95
# get the current printed jobs
96
# get the current printed jobs
96
def queryPrintJobs(connection, printerName, cName, school, pattern, basedn):
97
def queryPrintJobs(connection, printerName, cName, school, pattern, basedn):
97
	if cName != 'None':
98
	if cName != 'None':
98
		cdn = 'cn=%s,cn=klassen,cn=schueler,cn=groups,ou=%s,%s' % (
99
		cdn = SchoolClass(school=school, name=cName).dn
99
			cName,
100
			school,
101
			basedn)
102
	else:
100
	else:
103
		cdn = cName
101
		cdn = cName
104
	param = {'school': school, 'class': cdn, 'pattern': pattern}
102
	param = {'school': school, 'class': cdn, 'pattern': pattern}
 Lines 166-177    Link Here 
166
				klasse1_dn = udm.create_object(
164
				klasse1_dn = udm.create_object(
167
					'groups/group',
165
					'groups/group',
168
					name='%s-1A' % school,
166
					name='%s-1A' % school,
169
					position="cn=klassen,cn=schueler,cn=groups,%s" % oudn
167
					position=SchoolClass.get_container(oudn)
170
				)
168
				)
171
				klasse2_dn = udm.create_object(
169
				klasse2_dn = udm.create_object(
172
					'groups/group',
170
					'groups/group',
173
					name='%s-2B' % school,
171
					name='%s-2B' % school,
174
					position="cn=klassen,cn=schueler,cn=groups,%s" % oudn
172
					position=SchoolClass.get_container(school)
175
				)
173
				)
176
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
174
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
177
				stu1, stu1_dn = schoolenv.create_user(school)
175
				stu1, stu1_dn = schoolenv.create_user(school)
(-)ucs-test-ucsschool/90_ucsschool/101_exam_mode (-2 / +2 lines)
 Lines 14-20    Link Here 
14
import univention.testing.ucsschool as utu
14
import univention.testing.ucsschool as utu
15
import univention.testing.udm
15
import univention.testing.udm
16
import univention.testing.strings as uts
16
import univention.testing.strings as uts
17
from ucsschool.lib.models import Student
17
from ucsschool.lib.models import SchoolClass, Student
18
18
19
19
20
def main():
20
def main():
 Lines 32-38    Link Here 
32
				else:
32
				else:
33
					edudc = ucr.get('hostname')
33
					edudc = ucr.get('hostname')
34
				school, oudn = schoolenv.create_ou(name_edudc=edudc)
34
				school, oudn = schoolenv.create_ou(name_edudc=edudc)
35
				klasse_dn = udm.create_object('groups/group', name='%s-AA1' % school, position="cn=klassen,cn=schueler,cn=groups,%s" % oudn)
35
				klasse_dn = udm.create_object('groups/group', name='%s-AA1' % school, position=SchoolClass.get_container(school))
36
36
37
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
37
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
38
				stu, studn = schoolenv.create_user(school)
38
				stu, studn = schoolenv.create_user(school)
(-)ucs-test-ucsschool/90_ucsschool/101_exam_mode_group_members (-6 / +14 lines)
 Lines 16-22    Link Here 
16
import univention.testing.udm
16
import univention.testing.udm
17
import univention.testing.utils as utils
17
import univention.testing.utils as utils
18
import univention.testing.strings as uts
18
import univention.testing.strings as uts
19
from ucsschool.lib.models import Student
19
from ucsschool.lib.models import ExamStudent, SchoolClass, Student
20
20
21
21
22
def main():
22
def main():
 Lines 31-37    Link Here 
31
				else:
31
				else:
32
					edudc = ucr.get('hostname')
32
					edudc = ucr.get('hostname')
33
				school, oudn = schoolenv.create_ou(name_edudc=edudc)
33
				school, oudn = schoolenv.create_ou(name_edudc=edudc)
34
				klasse_dn = udm.create_object('groups/group', name='%s-AA1' % school, position="cn=klassen,cn=schueler,cn=groups,%s" % oudn)
34
				klasse_dn = udm.create_object(
35
					'groups/group',
36
					name='%s-AA1' % school,
37
					position=SchoolClass.get_container(school)
38
				)
35
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
39
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
36
				stu, studn = schoolenv.create_user(school)
40
				stu, studn = schoolenv.create_user(school)
37
				student2 = Student(
41
				student2 = Student(
 Lines 68-84    Link Here 
68
72
69
				try:
73
				try:
70
					expected_memberUid = ["%s$" % pc2.name, "exam-%s" % stu, "exam-%s" % student2.name]
74
					expected_memberUid = ["%s$" % pc2.name, "exam-%s" % stu, "exam-%s" % student2.name]
71
					expected_uniqueMember = ["%s" % pc2.dn, "uid=exam-%s,cn=examusers,%s" % (stu, oudn), "uid=exam-%s,cn=examusers,%s" % (student2.name, oudn)]
75
					expected_uniqueMember = [
76
						pc2.dn,
77
						ExamStudent(school=school, name=stu).dn,
78
						ExamStudent(school=school, name=student2.name).dn
79
					]
72
80
73
					# Get the current attributes values
81
					# Get the current attributes values
74
					lo = getMachineConnection()
82
					lo = getMachineConnection()
75
					exam_group_dn = "cn=OU%s-Klassenarbeit,cn=ucsschool,cn=groups,%s" % (school, ucr.get('ldap/base'))
83
					exam_group_dn = ExamStudent.get_search_base(school).examGroup
76
					memberUid = lo.search(base=exam_group_dn)[0][1].get('memberUid')
84
					memberUid = lo.search(base=exam_group_dn)[0][1].get('memberUid')
77
					uniqueMember = lo.search(base=exam_group_dn)[0][1].get('uniqueMember')
85
					uniqueMember = lo.search(base=exam_group_dn)[0][1].get('uniqueMember')
78
86
79
					if (set(memberUid) != set(expected_memberUid)):
87
					if set(memberUid) != set(expected_memberUid):
80
						utils.fail("Current memberUid = %r\nExpected = %r" % (memberUid, expected_memberUid))
88
						utils.fail("Current memberUid = %r\nExpected = %r" % (memberUid, expected_memberUid))
81
					if (set(uniqueMember) != set(expected_uniqueMember)):
89
					if set(uniqueMember) != set(expected_uniqueMember):
82
						utils.fail("Current uniqueMember = %r\nExpected= %r" % (uniqueMember, expected_uniqueMember))
90
						utils.fail("Current uniqueMember = %r\nExpected= %r" % (uniqueMember, expected_uniqueMember))
83
91
84
				finally:
92
				finally:
(-)ucs-test-ucsschool/90_ucsschool/101_exam_mode_settings (-2 / +2 lines)
 Lines 18-24    Link Here 
18
import univention.testing.ucsschool as utu
18
import univention.testing.ucsschool as utu
19
import univention.testing.udm
19
import univention.testing.udm
20
import univention.testing.strings as uts
20
import univention.testing.strings as uts
21
from ucsschool.lib.models import Student
21
from ucsschool.lib.models import SchoolClass, Student
22
22
23
23
24
def main():
24
def main():
 Lines 37-43    Link Here 
37
					edudc = ucr.get('hostname')
37
					edudc = ucr.get('hostname')
38
38
39
				school, oudn = schoolenv.create_ou(name_edudc=edudc)
39
				school, oudn = schoolenv.create_ou(name_edudc=edudc)
40
				klasse_dn = udm.create_object('groups/group', name='%s-AA1' % school, position="cn=klassen,cn=schueler,cn=groups,%s" % oudn)
40
				klasse_dn = udm.create_object('groups/group', name='%s-AA1' % school, position=SchoolClass.get_container(school))
41
41
42
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
42
				tea, teadn = schoolenv.create_user(school, is_teacher=True)
43
				stu, studn = schoolenv.create_user(school)
43
				stu, studn = schoolenv.create_user(school)
(-)ucs-test-ucsschool/90_ucsschool/102_rename_class (-5 / +6 lines)
 Lines 16-22    Link Here 
16
import univention.testing.ucr as ucr_test
16
import univention.testing.ucr as ucr_test
17
import univention.testing.ucsschool as utu
17
import univention.testing.ucsschool as utu
18
import univention.testing.utils as utils
18
import univention.testing.utils as utils
19
from ucsschool.lib.models import ClassShare, SchoolClass
19
20
21
20
BACKUP_PATH = '/home/backup/groups'
22
BACKUP_PATH = '/home/backup/groups'
21
23
22
24
 Lines 46-62    Link Here 
46
48
47
49
48
def share_dn(class_name, school):
50
def share_dn(class_name, school):
49
	with ucr_test.UCSTestConfigRegistry() as ucr:
51
	return ClassShare(school=school, name=class_name).dn
50
		return 'cn=%s,cn=klassen,cn=shares,ou=%s,%s' % (class_name, school, ucr.get('ldap/base'))
51
52
52
53
53
def class_dn(class_name, school):
54
def class_dn(class_name, school):
54
	with ucr_test.UCSTestConfigRegistry() as ucr:
55
	return SchoolClass(school=school, name=class_name).dn
55
		return 'cn=%s,cn=klassen,cn=schueler,cn=groups,ou=%s,%s' % (class_name, school, ucr.get('ldap/base'))
56
56
57
57
58
def share_path(class_name, school):
58
def share_path(class_name, school):
59
	path = '/home/%s/groups/klassen/%s' % (school, class_name)
59
	sc = SchoolClass(school=school, name=class_name)
60
	path = ClassShare(school=school, name=class_name, school_group=sc).get_share_path()
60
	if os.path.exists(path):
61
	if os.path.exists(path):
61
		return path
62
		return path
62
63
(-)ucs-test-ucsschool/90_ucsschool/110_set_default-umc-users (-1 / +2 lines)
 Lines 10-15    Link Here 
10
import ldap
10
import ldap
11
import univention.testing.ucr as ucr_test
11
import univention.testing.ucr as ucr_test
12
import univention.testing.utils as utils
12
import univention.testing.utils as utils
13
from ucsschool.lib.models import Group
13
14
14
15
15
def main():
16
def main():
 Lines 38-44    Link Here 
38
					utils.fail('Attribute %s was not found in ldap object %r' % (
39
					utils.fail('Attribute %s was not found in ldap object %r' % (
39
						'univentionPolicyReference', base))
40
						'univentionPolicyReference', base))
40
				except ldap.NO_SUCH_OBJECT as e:
41
				except ldap.NO_SUCH_OBJECT as e:
41
					if "cn=groups,%s" % (schoolenv.get_ou_base_dn(school),) in str(e):
42
					if Group.get_container(school) in str(e):
42
						print ('* Cought an expected exception: %r' % e)
43
						print ('* Cought an expected exception: %r' % e)
43
					else:
44
					else:
44
						utils.fail('Unexpected Exception: %r' % e)
45
						utils.fail('Unexpected Exception: %r' % e)
(-)ucs-test-ucsschool/90_ucsschool/131_check_for_nfs_shares (-1 / +1 lines)
 Lines 19-25    Link Here 
19
			for share in Share.get_all(lo, school.name):
19
			for share in Share.get_all(lo, school.name):
20
				share_udm = share.get_udm_object(lo)
20
				share_udm = share.get_udm_object(lo)
21
				if "nfs" in share_udm.options:
21
				if "nfs" in share_udm.options:
22
					if share.name in ["Marktplatz", "iTALC-Installation"]:
22
					if share.name in [Share.get_search_base(school).share_name_marktplatz, "iTALC-Installation"]:
23
						print("*** Ignoring //{}/{} (Bug #42514)".format(school.name, share.name))
23
						print("*** Ignoring //{}/{} (Bug #42514)".format(school.name, share.name))
24
					else:
24
					else:
25
						nfs_shares.append((school.name, share.name))
25
						nfs_shares.append((school.name, share.name))
(-)ucs-test-ucsschool/90_ucsschool/16_s4_slave_automatic_srv_record (-2 / +2 lines)
 Lines 135-141    Link Here 
135
					position="cn=dc,cn=server,cn=computers,%s" % (school.dn,),
135
					position="cn=dc,cn=server,cn=computers,%s" % (school.dn,),
136
					domain=ucr.get('domainname'),
136
					domain=ucr.get('domainname'),
137
					service=("S4 SlavePDC", _local_ucsschool_service),
137
					service=("S4 SlavePDC", _local_ucsschool_service),
138
					groups=("cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(ldap/base)s" % ucr)
138
					groups=(school.get_search_base(school.name).educational_dc_group)
139
				)
139
				)
140
140
141
				positive_test_fqdn = ".".join((positive_test_hostname, ucr.get('domainname')))
141
				positive_test_fqdn = ".".join((positive_test_hostname, ucr.get('domainname')))
 Lines 148-154    Link Here 
148
					position="cn=dc,cn=server,cn=computers,%s" % (school.dn,),
148
					position="cn=dc,cn=server,cn=computers,%s" % (school.dn,),
149
					domain=ucr.get('domainname'),
149
					domain=ucr.get('domainname'),
150
					service=("S4 SlavePDC", _not_local_ucsschool_service),
150
					service=("S4 SlavePDC", _not_local_ucsschool_service),
151
					groups=("cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(ldap/base)s" % ucr)
151
					groups=(school.get_search_base(school.name).educational_dc_group)
152
				)
152
				)
153
153
154
				negative_test_fqdn = ".".join((negative_test_hostname, ucr.get('domainname')))
154
				negative_test_fqdn = ".".join((negative_test_hostname, ucr.get('domainname')))
(-)ucs-test-ucsschool/90_ucsschool/19_available_umc_modules (-3 / +4 lines)
 Lines 9-15    Link Here 
9
import univention.testing.ucsschool as utu
9
import univention.testing.ucsschool as utu
10
import univention.testing.udm as udm_test
10
import univention.testing.udm as udm_test
11
import univention.testing.utils as utils
11
import univention.testing.utils as utils
12
12
from ucsschool.lib.models import School
13
from univention.testing.umc2 import Client
13
from univention.testing.umc2 import Client
14
14
15
15
 Lines 146-153    Link Here 
146
				utils.wait_for_replication_and_postrun()
146
				utils.wait_for_replication_and_postrun()
147
147
148
				basedn = ucr.get('ldap/base')
148
				basedn = ucr.get('ldap/base')
149
				position = 'cn=admins,cn=users,ou=%s,%s' % (school, basedn)
149
				search_base = School.get_search_base(school)
150
				groups = ["cn=admins-%s,cn=ouadmins,cn=groups,%s" % (school, basedn)]
150
				position = search_base.admins
151
				groups = [search_base.admin_group]
151
				dn, schooladmin = udm.create_user(position=position, groups=groups)
152
				dn, schooladmin = udm.create_user(position=position, groups=groups)
152
				groups = ["cn=Domain Admins,cn=groups,%s" % (basedn,)]
153
				groups = ["cn=Domain Admins,cn=groups,%s" % (basedn,)]
153
				dn, domainadmin = udm.create_user(position=position, groups=groups)
154
				dn, domainadmin = udm.create_user(position=position, groups=groups)
(-)ucs-test-ucsschool/90_ucsschool/213_import-users_modify_with_several_groups (-4 / +5 lines)
 Lines 12-17    Link Here 
12
import univention.testing.utils as utils
12
import univention.testing.utils as utils
13
from essential.importusers_cli_v2 import CLI_Import_v2_Tester
13
from essential.importusers_cli_v2 import CLI_Import_v2_Tester
14
from essential.importusers import Person
14
from essential.importusers import Person
15
from ucsschool.lib.models import SchoolClass, WorkGroup
15
16
16
17
17
class Test(CLI_Import_v2_Tester):
18
class Test(CLI_Import_v2_Tester):
 Lines 39-48    Link Here 
39
		self.log.debug('*** Creating groups...')
40
		self.log.debug('*** Creating groups...')
40
		global_group_dn, global_group_name = self.udm.create_group()
41
		global_group_dn, global_group_name = self.udm.create_group()
41
		workgroup_A_dn, workgroup_A_name = self.udm.create_group(
42
		workgroup_A_dn, workgroup_A_name = self.udm.create_group(
42
			position='cn=schueler,cn=groups,%s' % (self.ou_A.dn,),
43
			position=WorkGroup.get_container(self.ou_A.name),
43
			name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
44
			name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
44
		class_A_dn, class_A_name = self.udm.create_group(
45
		class_A_dn, class_A_name = self.udm.create_group(
45
			position='cn=klassen,cn=schueler,cn=groups,%s' % (self.ou_A.dn,),
46
			position=SchoolClass.get_container(self.ou_A.name),
46
			name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
47
			name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
47
		cn_A_dn = self.udm.create_object('container/cn', position=self.ou_A.dn, name='kurs-%s' % uts.random_string())
48
		cn_A_dn = self.udm.create_object('container/cn', position=self.ou_A.dn, name='kurs-%s' % uts.random_string())
48
		extra_A_group1_dn, extra_A_group1_name = self.udm.create_group(position=cn_A_dn)
49
		extra_A_group1_dn, extra_A_group1_name = self.udm.create_group(position=cn_A_dn)
 Lines 51-60    Link Here 
51
			name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
52
			name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
52
53
53
		workgroup_B_dn, workgroup_B_name = self.udm.create_group(
54
		workgroup_B_dn, workgroup_B_name = self.udm.create_group(
54
			position='cn=schueler,cn=groups,%s' % (self.ou_B.dn,),
55
			position=WorkGroup.get_container(self.ou_B.name),
55
			name="{}-{}".format(self.ou_B.name, uts.random_groupname()))
56
			name="{}-{}".format(self.ou_B.name, uts.random_groupname()))
56
		class_B_dn, class_B_name = self.udm.create_group(
57
		class_B_dn, class_B_name = self.udm.create_group(
57
			position='cn=klassen,cn=schueler,cn=groups,%s' % (self.ou_B.dn,),
58
			position=SchoolClass.get_container(self.ou_B.name),
58
			name="{}-{}".format(self.ou_B.name, uts.random_groupname()))
59
			name="{}-{}".format(self.ou_B.name, uts.random_groupname()))
59
		cn_B_dn = self.udm.create_object('container/cn', position=self.ou_B.dn, name='kurs-%s' % uts.random_string())
60
		cn_B_dn = self.udm.create_object('container/cn', position=self.ou_B.dn, name='kurs-%s' % uts.random_string())
60
		extra_B_group1_dn, extra_B_group1_name = self.udm.create_group(position=cn_B_dn)
61
		extra_B_group1_dn, extra_B_group1_name = self.udm.create_group(position=cn_B_dn)
(-)ucs-test-ucsschool/90_ucsschool/214_import-users_empty_class_column (-2 / +3 lines)
 Lines 13-18    Link Here 
13
import univention.testing.utils as utils
13
import univention.testing.utils as utils
14
from essential.importusers_cli_v2 import CLI_Import_v2_Tester
14
from essential.importusers_cli_v2 import CLI_Import_v2_Tester
15
from essential.importusers import Person
15
from essential.importusers import Person
16
from ucsschool.lib.models import SchoolClass
16
17
17
18
18
class Test(CLI_Import_v2_Tester):
19
class Test(CLI_Import_v2_Tester):
 Lines 45-51    Link Here 
45
46
46
		def create_user_w_two_classes(record_uid, source_uid, same_ou=True):
47
		def create_user_w_two_classes(record_uid, source_uid, same_ou=True):
47
			cls1_dn, cls1_name = self.udm.create_group(
48
			cls1_dn, cls1_name = self.udm.create_group(
48
				position='cn=klassen,cn=schueler,cn=groups,%s' % (self.ou_A.dn,),
49
				position=SchoolClass.get_container(self.ou_A.name),
49
				name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
50
				name="{}-{}".format(self.ou_A.name, uts.random_groupname()))
50
			if same_ou:
51
			if same_ou:
51
				dn = self.ou_A.dn
52
				dn = self.ou_A.dn
 Lines 56-62    Link Here 
56
				name = self.ou_B.name
57
				name = self.ou_B.name
57
				school = sorted([self.ou_A.name, self.ou_B.name])[0]
58
				school = sorted([self.ou_A.name, self.ou_B.name])[0]
58
			cls2_dn, cls2_name = self.udm.create_group(
59
			cls2_dn, cls2_name = self.udm.create_group(
59
				position='cn=klassen,cn=schueler,cn=groups,%s' % (dn,),
60
				position=SchoolClass.get_container(name),
60
				name="{}-{}".format(name, uts.random_groupname()))
61
				name="{}-{}".format(name, uts.random_groupname()))
61
			person = Person(school, role)
62
			person = Person(school, role)
62
			person.update(record_uid=record_uid, source_uid=source_uid, username=uts.random_username())
63
			person.update(record_uid=record_uid, source_uid=source_uid, username=uts.random_username())
(-)ucs-test-ucsschool/90_ucsschool/22_computerroom_two_rooms_settings_interference (-1 / +2 lines)
 Lines 11-16    Link Here 
11
from essential.computerroom import Room, Computers, add_printer, remove_printer, clean_folder
11
from essential.computerroom import Room, Computers, add_printer, remove_printer, clean_folder
12
from essential.internetrule import InternetRule
12
from essential.internetrule import InternetRule
13
from essential.workgroup import Workgroup
13
from essential.workgroup import Workgroup
14
from ucsschool.lib.models import Share
14
from univention.testing.umc2 import Client
15
from univention.testing.umc2 import Client
15
from univention.testing.network import NetworkRedirector
16
from univention.testing.network import NetworkRedirector
16
import datetime
17
import datetime
 Lines 113-119    Link Here 
113
								room1.check_behavior(room1_old_settings, room1_new_settings, tea, computers_ips[1], printer_name, white_page, global_domains, ucr)
114
								room1.check_behavior(room1_old_settings, room1_new_settings, tea, computers_ips[1], printer_name, white_page, global_domains, ucr)
114
								# For DEBUG purposes
115
								# For DEBUG purposes
115
								# run_commands([['ucr', 'search', room1.name], ['ucr','search', room2.name], ['atq']], {})
116
								# run_commands([['ucr', 'search', room1.name], ['ucr','search', room2.name], ['atq']], {})
116
								clean_folder('/home/gsmitte/groups/Marktplatz/')
117
								clean_folder('/home/gsmitte/groups/{}/'.format(Share.get_search_base(school).share_name_marktplatz))
117
								clean_folder('/home/%s/lehrer/%s/' % (school, tea))
118
								clean_folder('/home/%s/lehrer/%s/' % (school, tea))
118
							# TODO Exception Errno4
119
							# TODO Exception Errno4
119
							except ConnectorError as e:
120
							except ConnectorError as e:
(-)ucs-test-ucsschool/90_ucsschool/40_schoolwizard_school_create (-27 / +22 lines)
 Lines 8-14    Link Here 
8
##   - ucs-school-master | ucs-school-singlemaster
8
##   - ucs-school-master | ucs-school-singlemaster
9
9
10
import pytest
10
import pytest
11
11
from ucsschool.lib.models import Group
12
import univention.testing.ucr as ucr_test
12
import univention.testing.ucr as ucr_test
13
import univention.testing.utils as utils
13
import univention.testing.utils as utils
14
import univention.testing.strings as uts
14
import univention.testing.strings as uts
 Lines 31-36    Link Here 
31
	assert connection.umc_command('schoolwizards/schools/create', jsonargs, 'schoolwizards/schools').result[0] is True
31
	assert connection.umc_command('schoolwizards/schools/create', jsonargs, 'schoolwizards/schools').result[0] is True
32
32
33
33
34
def grp_dns(ou_name, edu=True):
35
	search_base = Group.get_search_base(ou_name)
36
	if edu:
37
		return [search_base.educational_ou_dc_group, search_base.educational_dc_group]
38
	else:
39
		return [search_base.administrative_ou_dc_group, search_base.administrative_dc_group]
40
41
34
def main():
42
def main():
35
	remove_ous = []
43
	remove_ous = []
36
	testschool = UCSTestSchool()
44
	testschool = UCSTestSchool()
 Lines 47-54    Link Here 
47
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=False)
55
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=False)
48
		else:
56
		else:
49
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
57
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
50
			for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
58
			for grp_dn in grp_dns(ou_name):
51
				grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
52
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
59
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
53
60
54
		msg = 'new random OU, new random DC'
61
		msg = 'new random OU, new random DC'
 Lines 59-66    Link Here 
59
		schoolwizards_schools_create(ou_name, dc_name)
66
		schoolwizards_schools_create(ou_name, dc_name)
60
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
67
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
61
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
68
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
62
		for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
69
		for grp_dn in grp_dns(ou_name):
63
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
64
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
70
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
65
71
66
		msg = 'new random OU, existing DC in other OU'
72
		msg = 'new random OU, existing DC in other OU'
 Lines 70-77    Link Here 
70
		schoolwizards_schools_create(ou_name, dc_name)
76
		schoolwizards_schools_create(ou_name, dc_name)
71
		# reusing first DC
77
		# reusing first DC
72
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
78
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
73
		for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
79
		for grp_dn in grp_dns(ou_name):
74
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
75
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
80
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
76
81
77
		msg = 'new random OU with existing DC in cn=computers,BASEDN'
82
		msg = 'new random OU with existing DC in cn=computers,BASEDN'
 Lines 90-97    Link Here 
90
			schoolwizards_schools_create(ou_name, dc_name)
95
			schoolwizards_schools_create(ou_name, dc_name)
91
96
92
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
97
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
93
			for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
98
			for grp_dn in grp_dns(ou_name):
94
				grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
95
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
99
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
96
100
97
		msg = 'new random OU, new random DC and then try to add a second new random DC'
101
		msg = 'new random OU, new random DC and then try to add a second new random DC'
 Lines 102-109    Link Here 
102
		schoolwizards_schools_create(ou_name, dc_name)
106
		schoolwizards_schools_create(ou_name, dc_name)
103
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
107
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
104
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
108
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
105
		for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
109
		for grp_dn in grp_dns(ou_name):
106
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
107
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
110
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
108
111
109
		dc_name = uts.random_string()
112
		dc_name = uts.random_string()
 Lines 111-118    Link Here 
111
			schoolwizards_schools_create(ou_name, dc_name)
114
			schoolwizards_schools_create(ou_name, dc_name)
112
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
115
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
113
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
116
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
114
		for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
117
		for grp_dn in grp_dns(ou_name):
115
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
116
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
118
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
117
119
118
		msg = 'new random OU, new random administrative DC'
120
		msg = 'new random OU, new random administrative DC'
 Lines 125-135    Link Here 
125
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
127
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
126
		dc_dn_administrative = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name_administrative, testschool.get_ou_base_dn(ou_name))
128
		dc_dn_administrative = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name_administrative, testschool.get_ou_base_dn(ou_name))
127
		utils.verify_ldap_object(dc_dn_administrative, expected_attr={'cn': [dc_name_administrative]}, strict=True, should_exist=True)
129
		utils.verify_ldap_object(dc_dn_administrative, expected_attr={'cn': [dc_name_administrative]}, strict=True, should_exist=True)
128
		for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
130
		for grp_dn in grp_dns(ou_name):
129
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
130
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
131
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
131
		for grp_dn in ('cn=OU%(ou)s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
132
		for grp_dn in grp_dns(ou_name, False):
132
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
133
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn_administrative]}, strict=False, should_exist=True)
133
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn_administrative]}, strict=False, should_exist=True)
134
134
135
		msg = 'new random OU, new random educational DC and then try to add a second new random administrative DC'
135
		msg = 'new random OU, new random educational DC and then try to add a second new random administrative DC'
 Lines 140-147    Link Here 
140
		schoolwizards_schools_create(ou_name, dc_name)
140
		schoolwizards_schools_create(ou_name, dc_name)
141
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
141
		dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
142
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
142
		utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
143
		for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
143
		for grp_dn in grp_dns(ou_name):
144
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
145
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
144
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
146
145
147
		dc_name_administrative = uts.random_string()
146
		dc_name_administrative = uts.random_string()
 Lines 149-159    Link Here 
149
			schoolwizards_schools_create(ou_name, dc_name, dc_name_administrative)
148
			schoolwizards_schools_create(ou_name, dc_name, dc_name_administrative)
150
		dc_dn_administrative = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name_administrative, testschool.get_ou_base_dn(ou_name))
149
		dc_dn_administrative = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name_administrative, testschool.get_ou_base_dn(ou_name))
151
		utils.verify_ldap_object(dc_dn_administrative, expected_attr={'cn': [dc_name_administrative]}, strict=True, should_exist=True)
150
		utils.verify_ldap_object(dc_dn_administrative, expected_attr={'cn': [dc_name_administrative]}, strict=True, should_exist=True)
152
		for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
151
		for grp_dn in grp_dns(ou_name):
153
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
154
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
152
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
155
		for grp_dn in ('cn=OU%(ou)s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
153
		for grp_dn in grp_dns(ou_name, False):
156
			grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
157
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn_administrative]}, strict=False, should_exist=True)
154
			utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn_administrative]}, strict=False, should_exist=True)
158
155
159
		msg = 'new random OU with existing administrative DC in cn=computers,BASEDN'
156
		msg = 'new random OU with existing administrative DC in cn=computers,BASEDN'
 Lines 174-184    Link Here 
174
171
175
			dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
172
			dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, testschool.get_ou_base_dn(ou_name))
176
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
173
			utils.verify_ldap_object(dc_dn, expected_attr={'cn': [dc_name]}, strict=True, should_exist=True)
177
			for grp_dn in ('cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
174
			for grp_dn in grp_dns(ou_name):
178
				grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
179
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
175
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn]}, strict=False, should_exist=True)
180
			for grp_dn in ('cn=OU%(ou)s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s', 'cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s', ):
176
			for grp_dn in grp_dns(ou_name, False):
181
				grp_dn = grp_dn % {'ou': ou_name, 'basedn': ucr.get('ldap/base')}
182
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn_administrative]}, strict=False, should_exist=True)
177
				utils.verify_ldap_object(grp_dn, expected_attr={'uniqueMember': [dc_dn_administrative]}, strict=False, should_exist=True)
183
178
184
	finally:
179
	finally:
(-)ucs-test-ucsschool/90_ucsschool/41_create_marktplatz_share (-5 / +17 lines)
 Lines 1-14    Link Here 
1
#!/usr/share/ucs-test/runner python
1
#!/usr/share/ucs-test/runner python
2
## -*- coding: utf-8 -*-
2
## -*- coding: utf-8 -*-
3
## desc: computerroom module settings checks
3
## desc: check marktplatz creation
4
## roles: [domaincontroller_master]
4
## roles: [domaincontroller_master]
5
## tags: [apptest,ucsschool]
5
## tags: [apptest,ucsschool]
6
## exposure: dangerous
6
## exposure: dangerous
7
## packages: [ucs-school-umc-computerroom]
7
## packages: [ucs-school-umc-computerroom]
8
## bugs: [40785]
8
## bugs: [40785, 41231]
9
9
10
import univention.testing.ucr as ucr_test
10
import univention.testing.ucr as ucr_test
11
import univention.testing.ucsschool as utu
11
import univention.testing.ucsschool as utu
12
import univention.testing.strings as uts
12
from univention.testing import utils
13
from univention.testing import utils
13
from univention.config_registry import handler_set, handler_unset
14
from univention.config_registry import handler_set, handler_unset
14
15
 Lines 15-31    Link Here 
15
16
16
def main():
17
def main():
17
	with utu.UCSTestSchool() as schoolenv, ucr_test.UCSTestConfigRegistry() as ucr:
18
	with utu.UCSTestSchool() as schoolenv, ucr_test.UCSTestConfigRegistry() as ucr:
18
		for should_exist, variable in [(False, None), (True, 'yes'), (False, 'no')]:
19
		for should_exist, variable, name in [(False, None, ''), (True, 'yes', 'Marktplatz'), (True, 'yes', uts.random_name()), (False, 'no', '')]:
19
			if variable is None:
20
			if variable is None:
20
				handler_unset(['ucsschool/import/generate/share/marktplatz'])
21
				handler_unset(['ucsschool/import/generate/share/marktplatz'])
21
			else:
22
			else:
23
				print '### Setting ucsschool/import/generate/share/marktplatz=%s.' % variable
22
				handler_set(['ucsschool/import/generate/share/marktplatz=%s' % (variable,)])
24
				handler_set(['ucsschool/import/generate/share/marktplatz=%s' % (variable,)])
23
25
24
			print '### Creating school. Expecting Marktplatz to exists = %r' % (should_exist,)
26
			print '### Creating school. Expecting Marktplatz to exists = %r' % (should_exist,)
27
			if should_exist:
28
				if name:
29
					print '### Setting share name to %r.' % name
30
					handler_set(['ucsschool/import/generate/share/marktplatz/name={}'.format(name)])
31
				else:
32
					print '### Not setting share name, should be "Marktplatz".'
33
					handler_unset(['ucsschool/import/generate/share/marktplatz/name'])
34
25
			school, oudn = schoolenv.create_ou(name_edudc=ucr.get('hostname'))
35
			school, oudn = schoolenv.create_ou(name_edudc=ucr.get('hostname'))
26
			utils.wait_for_replication()
36
			utils.wait_for_replication()
27
			utils.verify_ldap_object('cn=Marktplatz,cn=shares,%s' % (oudn,), strict=True, should_exist=should_exist)
37
			utils.verify_ldap_object(
38
				'cn={},cn=shares,{}'.format(name or 'Marktplatz', oudn),
39
				strict=True,
40
				should_exist=should_exist)
28
41
29
30
if __name__ == '__main__':
42
if __name__ == '__main__':
31
	main()
43
	main()
(-)ucs-test-ucsschool/90_ucsschool/75_ldap_acls_admins (-3 / +4 lines)
 Lines 12-17    Link Here 
12
from essential.schoolroom import ComputerRoom
12
from essential.schoolroom import ComputerRoom
13
import univention.testing.ucr as ucr_test
13
import univention.testing.ucr as ucr_test
14
import univention.testing.ucsschool as utu
14
import univention.testing.ucsschool as utu
15
from ucsschool.lib.models import ClassShare, Share
15
16
16
17
17
def main():
18
def main():
 Lines 52-62    Link Here 
52
			acl.assert_teacher_group('write')
53
			acl.assert_teacher_group('write')
53
			acl.assert_student_group('write')
54
			acl.assert_student_group('write')
54
55
55
			shares_dn = 'cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
56
			shares_dn = Share.get_container(school)
56
			acl.assert_shares(shares_dn, 'write')
57
			acl.assert_shares(shares_dn, 'write')
57
			shares_dn = 'cn=Marktplatz,cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
58
			shares_dn = Share(school=school, name=Share.get_search_base(school).share_name_marktplatz).dn
58
			acl.assert_shares(shares_dn, 'write')
59
			acl.assert_shares(shares_dn, 'write')
59
			shares_dn = 'cn=klassen,cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
60
			shares_dn = ClassShare.get_container(school)
60
			acl.assert_shares(shares_dn, 'read')
61
			acl.assert_shares(shares_dn, 'read')
61
62
62
			acl.assert_temps('write')
63
			acl.assert_temps('write')
(-)ucs-test-ucsschool/90_ucsschool/75_ldap_acls_staff (-1 / +2 lines)
 Lines 10-15    Link Here 
10
from essential.acl import Acl
10
from essential.acl import Acl
11
from essential.computerroom import Computers
11
from essential.computerroom import Computers
12
from essential.schoolroom import ComputerRoom
12
from essential.schoolroom import ComputerRoom
13
from ucsschool.lib.models import Share
13
import univention.testing.ucr as ucr_test
14
import univention.testing.ucr as ucr_test
14
import univention.testing.ucsschool as utu
15
import univention.testing.ucsschool as utu
15
16
 Lines 50-56    Link Here 
50
			share_dn = open_ldap_co.searchDn(filter=filter_format('(&(objectClass=univentionShare)(cn=%s))', (class_name,)))[0]
51
			share_dn = open_ldap_co.searchDn(filter=filter_format('(&(objectClass=univentionShare)(cn=%s))', (class_name,)))[0]
51
			acl.assert_share_object_access(share_dn, 'read', 'ALLOWED')
52
			acl.assert_share_object_access(share_dn, 'read', 'ALLOWED')
52
			acl.assert_share_object_access(share_dn, 'write', 'DENIED')
53
			acl.assert_share_object_access(share_dn, 'write', 'DENIED')
53
			share_dn = 'cn=Marktplatz,cn=shares,%s' % (oudn,)
54
			share_dn = Share(school=school, name=Share.get_search_base(school).share_name_marktplatz).dn
54
			acl.assert_share_object_access(share_dn, 'read', 'ALLOWED')
55
			acl.assert_share_object_access(share_dn, 'read', 'ALLOWED')
55
			acl.assert_share_object_access(share_dn, 'write', 'DENIED')
56
			acl.assert_share_object_access(share_dn, 'write', 'DENIED')
56
57
(-)ucs-test-ucsschool/90_ucsschool/75_ldap_acls_teacher_and_staff (-3 / +4 lines)
 Lines 12-17    Link Here 
12
from essential.schoolroom import ComputerRoom
12
from essential.schoolroom import ComputerRoom
13
import univention.testing.ucr as ucr_test
13
import univention.testing.ucr as ucr_test
14
import univention.testing.ucsschool as utu
14
import univention.testing.ucsschool as utu
15
from ucsschool.lib.models import ClassShare, Share
15
16
16
17
17
def main():
18
def main():
 Lines 40-50    Link Here 
40
			acl.assert_teacher_group('write')
41
			acl.assert_teacher_group('write')
41
			acl.assert_student_group('write')
42
			acl.assert_student_group('write')
42
43
43
			shares_dn = 'cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
44
			shares_dn = Share.get_container(school)
44
			acl.assert_shares(shares_dn, 'write')
45
			acl.assert_shares(shares_dn, 'write')
45
			shares_dn = 'cn=Marktplatz,cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
46
			shares_dn = Share(school=school, name=Share.get_search_base(school).share_name_marktplatz).dn
46
			acl.assert_shares(shares_dn, 'write')
47
			acl.assert_shares(shares_dn, 'write')
47
			shares_dn = 'cn=klassen,cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
48
			shares_dn = ClassShare.get_container(school)
48
			acl.assert_shares(shares_dn, 'read')
49
			acl.assert_shares(shares_dn, 'read')
49
50
50
			acl.assert_temps('write')
51
			acl.assert_temps('write')
(-)ucs-test-ucsschool/90_ucsschool/75_ldap_acls_teachers (-3 / +4 lines)
 Lines 12-17    Link Here 
12
from essential.schoolroom import ComputerRoom
12
from essential.schoolroom import ComputerRoom
13
import univention.testing.ucr as ucr_test
13
import univention.testing.ucr as ucr_test
14
import univention.testing.ucsschool as utu
14
import univention.testing.ucsschool as utu
15
from ucsschool.lib.models import ClassShare, Share
15
16
16
17
17
def main():
18
def main():
 Lines 41-51    Link Here 
41
42
42
			acl.assert_teacher_group('write')
43
			acl.assert_teacher_group('write')
43
44
44
			shares_dn = 'cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
45
			shares_dn = Share.get_container(school)
45
			acl.assert_shares(shares_dn, 'write')
46
			acl.assert_shares(shares_dn, 'write')
46
			shares_dn = 'cn=Marktplatz,cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
47
			shares_dn = Share(school=school, name=Share.get_search_base(school).share_name_marktplatz).dn
47
			acl.assert_shares(shares_dn, 'write')
48
			acl.assert_shares(shares_dn, 'write')
48
			shares_dn = 'cn=klassen,cn=shares,%s' % utu.UCSTestSchool().get_ou_base_dn(school)
49
			shares_dn = ClassShare.get_container(school)
49
			acl.assert_shares(shares_dn, 'read')
50
			acl.assert_shares(shares_dn, 'read')
50
51
51
			acl.assert_temps('write')
52
			acl.assert_temps('write')
(-)ucs-test-ucsschool/90_ucsschool/76_ldap_acls (-9 / +13 lines)
 Lines 14-19    Link Here 
14
from univention.uldap import getMachineConnection
14
from univention.uldap import getMachineConnection
15
import univention.testing.ucr as ucr_test
15
import univention.testing.ucr as ucr_test
16
import univention.testing.ucsschool as utu
16
import univention.testing.ucsschool as utu
17
from ucsschool.lib.models import Group, Policy
17
18
18
19
19
class FailAcl(Exception):
20
class FailAcl(Exception):
 Lines 370-384    Link Here 
370
			room = ComputerRoom(school, host_members=computers_dns)
371
			room = ComputerRoom(school, host_members=computers_dns)
371
			room.add()
372
			room.add()
372
373
373
			room_container_dn = 'cn=raeume,cn=groups,%s' % school_dn
374
			room_container_dn = ComputerRoom.get_container(school)
374
			shares_dn = 'cn=shares,%s' % school_dn
375
375
376
			teacher_group2_dn = 'cn=lehrer-%s,cn=groups,%s' % (school, school_dn)
376
			# unused?
377
			student_group2_dn = 'cn=schueler-%s,cn=groups,%s' % (school, school_dn)
377
			#
378
			# shares_dn = search_base.shares
379
			#
380
			# teacher_group2_dn = search_base.teachers_ou_group
381
			# student_group2_dn = search_base.students_ou_group
382
			#
383
			# teacher_group_dn = search_base.teachers_group
384
			# student_group_dn = search_base.students_group
378
385
379
			teacher_group_dn = 'cn=lehrer,cn=groups,%s' % school_dn
380
			student_group_dn = 'cn=schueler,cn=groups,%s' % school_dn
381
382
			gid_temp_dn = 'cn=gid,cn=temporary,cn=univention,%s' % base_dn
386
			gid_temp_dn = 'cn=gid,cn=temporary,cn=univention,%s' % base_dn
383
			gidNumber_temp_dn = 'cn=gidNumber,cn=temporary,cn=univention,%s' % base_dn
387
			gidNumber_temp_dn = 'cn=gidNumber,cn=temporary,cn=univention,%s' % base_dn
384
			sid_temp_dn = 'cn=sid,cn=temporary,cn=univention,%s' % base_dn
388
			sid_temp_dn = 'cn=sid,cn=temporary,cn=univention,%s' % base_dn
 Lines 386-394    Link Here 
386
			mac_temp_dn = 'cn=mac,cn=temporary,cn=univention,%s' % base_dn
390
			mac_temp_dn = 'cn=mac,cn=temporary,cn=univention,%s' % base_dn
387
391
388
			global_univention_dn = 'cn=univention,%s' % base_dn
392
			global_univention_dn = 'cn=univention,%s' % base_dn
389
			global_policies_dn = 'cn=policies,%s' % base_dn
393
			global_policies_dn = Policy.get_container(school)
390
			global_dns_dn = 'cn=dns,%s' % base_dn
394
			global_dns_dn = 'cn=dns,%s' % base_dn
391
			global_groups_dn = 'cn=groups,%s' % base_dn
395
			global_groups_dn = Group.get_container(school)
392
396
393
			dhcp_dn = 'cn=%s,cn=%s,cn=dhcp,%s' % (computers_hostnames[0], school, base_dn)
397
			dhcp_dn = 'cn=%s,cn=%s,cn=dhcp,%s' % (computers_hostnames[0], school, base_dn)
394
398
(-)ucs-test-ucsschool/90_ucsschool/78_ldap_acls_dump.oldconfig.61ucsschool_presettings (-80 / +115 lines)
 Lines 1-154    Link Here 
1
@!@
1
# -*- coding: utf-8 -*-
2
# -*- coding: utf-8 -*-
3
import re
2
4
5
6
def replace_ucr_variables(template):
7
	variable_token = re.compile('@[$]@')
8
9
	dir_ucsschool = {
10
		'ALL_ADM_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-dc', 'DC-Verwaltungsnetz'),
11
		'ALL_ADM_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-member', 'Member-Verwaltungsnetz'),
12
		'ALL_EDU_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-dc', 'DC-Edukativnetz'),
13
		'ALL_EDU_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-member', 'Member-Edukativnetz'),
14
	}
15
16
	while 1:
17
		i = variable_token.finditer(template)
18
		try:
19
			start = i.next()
20
			end = i.next()
21
			name = template[start.end():end.start()]
22
23
			template = template[:start.start()] + dir_ucsschool.get(name,'') + template[end.end():]
24
		except StopIteration:
25
			break
26
27
	return template
28
29
30
aclset += """
31
# -*- coding: utf-8 -*-
32
3
# Slave-Controller und Member-Server duerfen Samba-Domaenenobjekt(e) modifizieren
33
# Slave-Controller und Member-Server duerfen Samba-Domaenenobjekt(e) modifizieren
4
access to filter="(objectClass=sambaDomain)"
34
access to filter="(objectClass=sambaDomain)"
5
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
35
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
6
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
36
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
7
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
37
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
8
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
38
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
9
   by * none break
39
   by * none break
10
40
11
# Slave-Controller und Memberserver duerfen ausschliesslich den univention-Container replizieren
41
# Slave-Controller und Memberserver duerfen ausschliesslich den univention-Container replizieren
12
access to dn="cn=univention,@%@ldap/base@%@"
42
access to dn="cn=univention,@%@ldap/base@%@"
13
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
43
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
14
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
44
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
15
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
45
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
16
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
46
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
17
   by * none break
47
   by * none break
18
48
19
# Slave-Controller may replicate license container
49
# Slave-Controller may replicate license container
20
access to dn.subtree="cn=license,cn=univention,@%@ldap/base@%@"
50
access to dn.subtree="cn=license,cn=univention,@%@ldap/base@%@"
21
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
51
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
22
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
52
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
23
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
53
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
24
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
54
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
25
   by * none break
55
   by * none break
26
56
27
# Slave-Controller duerfen custom attributes-Container und dessen Inhalt replizieren
57
# Slave-Controller duerfen custom attributes-Container und dessen Inhalt replizieren
28
access to dn.subtree="cn=custom attributes,cn=univention,@%@ldap/base@%@"
58
access to dn.subtree="cn=custom attributes,cn=univention,@%@ldap/base@%@"
29
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
59
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
30
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
60
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
31
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
61
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
32
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
62
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
33
   by * none break
63
   by * none break
34
64
35
# Slave-Controller benoetigen den Console-Container fuer die Berechtigungen an der Lehrerconsole
65
# Slave-Controller benoetigen den Console-Container fuer die Berechtigungen an der Lehrerconsole
36
access to dn.subtree="cn=console,cn=univention,@%@ldap/base@%@"
66
access to dn.subtree="cn=console,cn=univention,@%@ldap/base@%@"
37
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
67
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
38
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
68
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
39
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
69
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
40
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
70
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
41
   by * none break 
71
   by * none break 
42
72
43
# Slave-Controller benoetigen den UMC-Container fuer die Berechtigungen an der Lehrerconsole
73
# Slave-Controller benoetigen den UMC-Container fuer die Berechtigungen an der Lehrerconsole
44
access to dn.subtree="cn=UMC,cn=univention,@%@ldap/base@%@"
74
access to dn.subtree="cn=UMC,cn=univention,@%@ldap/base@%@"
45
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
75
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
46
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
76
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
47
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
77
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
48
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
78
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
49
   by * none break 
79
   by * none break 
50
80
51
# grant write access to domaincontroller slave/member server for certain univention app center settings
81
# grant write access to domaincontroller slave/member server for certain univention app center settings
52
access to dn.regex="^univentionAppID=([^,]+),cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" filter="(objectClass=univentionApp)"
82
access to dn.regex="^univentionAppID=([^,]+),cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" filter="(objectClass=univentionApp)"
53
        by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
83
        by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
54
        by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
84
        by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
55
        by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
85
        by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
56
        by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
86
        by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
57
        by * none break
87
        by * none break
58
88
59
access to dn.regex="^cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" attrs=children,entry
89
access to dn.regex="^cn=([^,]+),cn=apps,cn=univention,@%@ldap/base@%@$" attrs=children,entry
60
        by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
90
        by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
61
        by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
91
        by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
62
        by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
92
        by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
63
        by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
93
        by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
64
        by * none break
94
        by * none break
65
95
66
access to dn="cn=apps,cn=univention,@%@ldap/base@%@" attrs=children,entry
96
access to dn="cn=apps,cn=univention,@%@ldap/base@%@" attrs=children,entry
67
        by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
97
        by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
68
        by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
98
        by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
69
        by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
99
        by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
70
        by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
100
        by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
71
        by * none break
101
        by * none break
72
102
73
# grant read access to domaincontroller slave/member server for all other univention app center settings
103
# grant read access to domaincontroller slave/member server for all other univention app center settings
74
access to dn.subtree="cn=apps,cn=univention,@%@ldap/base@%@"
104
access to dn.subtree="cn=apps,cn=univention,@%@ldap/base@%@"
75
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
105
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
76
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
106
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
77
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
107
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
78
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
108
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
79
   by * none break 
109
   by * none break 
80
110
81
access to dn.subtree="cn=udm_module,cn=univention,@%@ldap/base@%@"
111
access to dn.subtree="cn=udm_module,cn=univention,@%@ldap/base@%@"
82
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
112
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
83
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
113
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
84
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
114
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
85
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
115
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
86
   by * none break 
116
   by * none break 
87
117
88
access to dn.subtree="cn=udm_hook,cn=univention,@%@ldap/base@%@"
118
access to dn.subtree="cn=udm_hook,cn=univention,@%@ldap/base@%@"
89
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
119
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
90
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
120
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
91
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
121
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
92
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
122
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
93
   by * none break 
123
   by * none break 
94
124
95
access to dn.subtree="cn=udm_syntax,cn=univention,@%@ldap/base@%@"
125
access to dn.subtree="cn=udm_syntax,cn=univention,@%@ldap/base@%@"
96
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
126
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
97
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
127
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
98
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
128
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
99
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
129
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
100
   by * none break 
130
   by * none break 
101
131
102
access to dn.subtree="cn=ldapacl,cn=univention,@%@ldap/base@%@"
132
access to dn.subtree="cn=ldapacl,cn=univention,@%@ldap/base@%@"
103
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
133
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
104
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
134
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
105
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
135
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
106
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
136
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
107
   by * none break 
137
   by * none break 
108
138
109
access to dn.subtree="cn=ldapschema,cn=univention,@%@ldap/base@%@"
139
access to dn.subtree="cn=ldapschema,cn=univention,@%@ldap/base@%@"
110
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
140
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
111
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
141
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
112
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
142
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
113
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
143
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
114
   by * none break 
144
   by * none break 
115
145
116
# Slave-Controller und Member-Server benoetigen idmap-Container
146
# Slave-Controller und Member-Server benoetigen idmap-Container
117
access to dn.base="cn=idmap,cn=univention,@%@ldap/base@%@"
147
access to dn.base="cn=idmap,cn=univention,@%@ldap/base@%@"
118
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
148
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
119
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
149
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
120
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
150
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
121
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
151
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
122
   by * none break 
152
   by * none break 
123
153
124
# Slave-Controller und Member-Server benoetigen ID-Mapping
154
# Slave-Controller und Member-Server benoetigen ID-Mapping
125
access to dn.subtree="cn=idmap,cn=univention,@%@ldap/base@%@" filter="(|(&(objectClass=sambaUnixIdPool)(objectClass=organizationalRole)(objectClass=top))(&(objectClass=sambaIdmapEntry)(objectClass=sambaSidEntry)))"
155
access to dn.subtree="cn=idmap,cn=univention,@%@ldap/base@%@" filter="(|(&(objectClass=sambaUnixIdPool)(objectClass=organizationalRole)(objectClass=top))(&(objectClass=sambaIdmapEntry)(objectClass=sambaSidEntry)))"
126
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
156
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
127
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
157
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
128
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
158
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
129
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
159
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
130
   by * none break
160
   by * none break
131
161
132
# Slave-Controller und Memberserver duerfen samba-Container und dessen Inhalt replizieren
162
# Slave-Controller und Memberserver duerfen samba-Container und dessen Inhalt replizieren
133
access to dn.subtree="cn=samba,@%@ldap/base@%@"
163
access to dn.subtree="cn=samba,@%@ldap/base@%@"
134
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
164
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
135
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
165
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
136
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
166
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
137
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
167
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
138
   by * none break
168
   by * none break
139
169
140
# Slave-Controller needs the builtin groups
170
# Slave-Controller needs the builtin groups
141
access to dn.subtree="cn=Builtin,@%@ldap/base@%@"
171
access to dn.subtree="cn=Builtin,@%@ldap/base@%@"
142
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
172
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
143
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
173
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
144
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
174
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
145
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
175
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
146
   by * none break 
176
   by * none break 
147
177
148
# sonst duerfen sie nichts aus cn=univention,BASEDN replizieren
178
# sonst duerfen sie nichts aus cn=univention,BASEDN replizieren
149
access to dn.subtree="cn=univention,@%@ldap/base@%@"
179
access to dn.subtree="cn=univention,@%@ldap/base@%@"
150
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
180
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
151
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
181
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
152
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
182
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
153
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
183
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
154
   by * none break
184
   by * none break
185
186
"""
187
188
print replace_ucr_variables(aclset)
189
@!@
(-)ucs-test-ucsschool/90_ucsschool/78_ldap_acls_dump.oldconfig.65ucsschool (-79 / +81 lines)
 Lines 13-30    Link Here 
13
def replace_ucr_variables(template):
13
def replace_ucr_variables(template):
14
	variable_token = re.compile('@[$]@')
14
	variable_token = re.compile('@[$]@')
15
15
16
	dir_ucsschool = { }
16
	dir_ucsschool = {
17
	dir_ucsschool[ 'DISTRICT' ] = ''
17
		'DISTRICT':       'ou=[^,]+,' if configRegistry.is_true('ucsschool/ldap/district/enable') else '',
18
	if configRegistry.get('ucsschool/ldap/district/enable','no').lower() in ( 'yes', 'true', '1' ):
18
		'PUPILS':         configRegistry.get('ucsschool/ldap/default/container/pupils', 'schueler'),
19
		dir_ucsschool[ 'DISTRICT' ] = 'ou=[^,]+,'
19
		'TEACHERS':       configRegistry.get('ucsschool/ldap/default/container/teachers', 'lehrer'),
20
	dir_ucsschool[ 'PUPILS' ] =   configRegistry.get('ucsschool/ldap/default/container/pupils', 'schueler')
20
		'STAFF':          configRegistry.get('ucsschool/ldap/default/container/staff', 'mitarbeiter'),
21
	dir_ucsschool[ 'TEACHERS' ] = configRegistry.get('ucsschool/ldap/default/container/teachers', 'lehrer')
21
		'TEACHERS-STAFF': configRegistry.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter'),
22
	dir_ucsschool[ 'STAFF' ] =	  configRegistry.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
22
		'ADMINS':         configRegistry.get('ucsschool/ldap/default/container/admins', 'admins'),
23
	dir_ucsschool[ 'TEACHERS-STAFF' ] = configRegistry.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter')
23
		'GRPADMINS':      configRegistry.get('ucsschool/ldap/default/groupprefix/admins', 'admins-'),
24
	dir_ucsschool[ 'ADMINS' ] =	  configRegistry.get('ucsschool/ldap/default/container/admins', 'admins')
24
		'ROOMS':          configRegistry.get('ucsschool/ldap/default/container/rooms', 'raeume'),
25
	dir_ucsschool[ 'GRPADMINS' ] =	  configRegistry.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
25
		'ALL_ADM_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-dc', 'DC-Verwaltungsnetz'),
26
		'ALL_ADM_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-administrativ-member', 'Member-Verwaltungsnetz'),
27
		'ALL_EDU_DC': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-dc', 'DC-Edukativnetz'),
28
		'ALL_EDU_MEMBER': configRegistry.get('ucsschool/ldap/default/groupname/all-educational-member', 'Member-Edukativnetz'),
29
	}
26
30
27
28
	while 1:
31
	while 1:
29
		i = variable_token.finditer(template)
32
		i = variable_token.finditer(template)
30
		try:
33
		try:
 Lines 39-53    Link Here 
39
	return template
42
	return template
40
43
41
44
42
45
if configRegistry.is_true('ucsschool/ldap/district/enable','no'):
43
if configRegistry.get('ucsschool/ldap/district/enable','no').lower() in ( 'yes', 'true', '1' ):
44
   aclset += """
46
   aclset += """
45
# DCs und Memberserver erhalten Lesezugriff auf das OU-Objekt selbst (im DISTRICT-Mode notwendig)
47
# DCs und Memberserver erhalten Lesezugriff auf das OU-Objekt selbst (im DISTRICT-Mode notwendig)
46
access to dn.regex="^ou=([^,]+),@%@ldap/base@%@$$"
48
access to dn.regex="^ou=([^,]+),@%@ldap/base@%@$$"
47
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
49
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
48
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
50
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
49
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
51
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
50
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
52
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
51
	by * none break
53
	by * none break
52
54
53
"""
55
"""
 Lines 61-88    Link Here 
61
63
62
# Slave controllers and memberservers require write access to virtual machine manager objects
64
# Slave controllers and memberservers require write access to virtual machine manager objects
63
access to dn.regex="^univentionVirtualMachineUUID=([^,]+),cn=Information,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachine)"
65
access to dn.regex="^univentionVirtualMachineUUID=([^,]+),cn=Information,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachine)"
64
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
66
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
65
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
67
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
66
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
68
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
67
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
69
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
68
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
70
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
69
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
71
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
70
	by * read break
72
	by * read break
71
73
72
access to dn.regex="^cn=([^,]+),cn=CloudConnection,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachineCloudConnection)"
74
access to dn.regex="^cn=([^,]+),cn=CloudConnection,cn=Virtual Machine Manager,@%@ldap/base@%@" filter="(objectClass=univentionVirtualMachineCloudConnection)"
73
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
75
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
74
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
76
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
75
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
77
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
76
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
78
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
77
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
79
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
78
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
80
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
79
	by * read break
81
	by * read break
80
82
81
access to dn="cn=(Information|CloudConnection),cn=Virtual Machine Manager,@%@ldap/base@%@" attrs=children,entry
83
access to dn="cn=(Information|CloudConnection),cn=Virtual Machine Manager,@%@ldap/base@%@" attrs=children,entry
82
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
84
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
83
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
85
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
84
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
86
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
85
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
87
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
86
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
88
	by dn.regex="^[^,]+,cn=dc,cn=computers,@%@ldap/base@%@$$" write
87
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
89
	by dn.regex="^[^,]+,cn=memberserver,cn=computers,@%@ldap/base@%@$$" write
88
	by * read break
90
	by * read break
 Lines 89-106    Link Here 
89
91
90
# Slave controller and memberservers may replicate the Virtual Machine Manager container
92
# Slave controller and memberservers may replicate the Virtual Machine Manager container
91
access to dn.subtree="cn=Virtual Machine Manager,@%@ldap/base@%@"
93
access to dn.subtree="cn=Virtual Machine Manager,@%@ldap/base@%@"
92
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
94
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
93
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
95
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
94
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
96
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
95
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
97
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
96
   by * read break
98
   by * read break
97
99
98
# Slave controller and memberservers may replicate the mail container
100
# Slave controller and memberservers may replicate the mail container
99
access to dn.subtree="cn=mail,@%@ldap/base@%@"
101
access to dn.subtree="cn=mail,@%@ldap/base@%@"
100
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
102
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
101
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
103
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
102
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
104
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
103
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
105
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
104
   by * read break
106
   by * read break
105
107
106
access to dn.regex="^@%@ldap/base@%@$$"
108
access to dn.regex="^@%@ldap/base@%@$$"
 Lines 109-142    Link Here 
109
111
110
# DC Slaves need write access to the members of the group Domain Computers
112
# DC Slaves need write access to the members of the group Domain Computers
111
access to dn.exact="cn=Domain Computers,cn=groups,@%@ldap/base@%@" attrs="uniqueMember,memberUid"
113
access to dn.exact="cn=Domain Computers,cn=groups,@%@ldap/base@%@" attrs="uniqueMember,memberUid"
112
    by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
114
    by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
113
    by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
115
    by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
114
    by * none break
116
    by * none break
115
117
116
# Slave-Controller und Memberserver duerfen globale Container computers, shares, dns, dhcp, kerberos und policies sowie Benutzer lesen
118
# Slave-Controller und Memberserver duerfen globale Container computers, shares, dns, dhcp, kerberos und policies sowie Benutzer lesen
117
access to dn.regex="(^(.+,)?cn=(groups|dns|dhcp|policies|computers|kerberos|shares),|^(uid=[^,]+,|)cn=users,|^)@%@ldap/base@%@$$"
119
access to dn.regex="(^(.+,)?cn=(groups|dns|dhcp|policies|computers|kerberos|shares),|^(uid=[^,]+,|)cn=users,|^)@%@ldap/base@%@$$"
118
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
120
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
119
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
121
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
120
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
122
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
121
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
123
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
122
	by * none break
124
	by * none break
123
125
124
# Slave DCs can read MS system container
126
# Slave DCs can read MS system container
125
access to dn.base="cn=system,@%@ldap/base@%@"
127
access to dn.base="cn=system,@%@ldap/base@%@"
126
    by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
128
    by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
127
    by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
129
    by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
128
    by * none break
130
    by * none break
129
131
130
# Slave DCs can read and write policy containers for MS GPOs and msPrintConnectionPolicy objects
132
# Slave DCs can read and write policy containers for MS GPOs and msPrintConnectionPolicy objects
131
access to dn.subtree="cn=policies,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msGPOContainer)(objectClass=organizationalRole)(objectClass=msPrintConnectionPolicy))"
133
access to dn.subtree="cn=policies,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msGPOContainer)(objectClass=organizationalRole)(objectClass=msPrintConnectionPolicy))"
132
    by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
134
    by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
133
    by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
135
    by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
134
    by * none break
136
    by * none break
135
137
136
# Slave DCs can read and write policy containers for MS WMI filter objects
138
# Slave DCs can read and write policy containers for MS WMI filter objects
137
access to dn.subtree="cn=WMIPolicy,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msWMISom)(objectClass=organizationalRole))"
139
access to dn.subtree="cn=WMIPolicy,cn=system,@%@ldap/base@%@" filter="(|(objectClass=msWMISom)(objectClass=organizationalRole))"
138
    by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
140
    by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
139
    by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
141
    by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
140
    by * none break
142
    by * none break
141
143
142
# Lehrer, Mitarbeiter und OU-Admins duerfen Schueler-Passwoerter aendern
144
# Lehrer, Mitarbeiter und OU-Admins duerfen Schueler-Passwoerter aendern
 Lines 145-155    Link Here 
145
	by * none break
147
	by * none break
146
148
147
# Lehrer und ouadmins duerfen Raum-Gruppen anlegen und bearbeiten
149
# Lehrer und ouadmins duerfen Raum-Gruppen anlegen und bearbeiten
148
access to dn.regex="^cn=raeume,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
150
access to dn.regex="^cn=@$@ROOMS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
149
	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$1,@$@DISTRICT@$@@%@ldap/base@%@$$" write
151
	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$1,@$@DISTRICT@$@@%@ldap/base@%@$$" write
150
	by * none break
152
	by * none break
151
153
152
access to dn.regex="^cn=([^,]+),cn=raeume,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
154
access to dn.regex="^cn=([^,]+),cn=@$@ROOMS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
153
	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" write
155
	by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" write
154
	by * none break
156
	by * none break
155
157
 Lines 224-263    Link Here 
224
226
225
# domaincontroller slaves and memberservers of management group are not allowed to replicate pupils and teachers
227
# domaincontroller slaves and memberservers of management group are not allowed to replicate pupils and teachers
226
access to dn.regex="^.+,cn=(@$@TEACHERS@$@|@$@PUPILS@$@),cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
228
access to dn.regex="^.+,cn=(@$@TEACHERS@$@|@$@PUPILS@$@),cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
227
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
229
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
228
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
230
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
229
	by * none break
231
	by * none break
230
232
231
# domaincontroller slaves and memberservers of educational group are not allowed to replicate staff users
233
# domaincontroller slaves and memberservers of educational group are not allowed to replicate staff users
232
access to dn.regex="^.+,cn=@$@STAFF@$@,cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
234
access to dn.regex="^.+,cn=@$@STAFF@$@,cn=users,ou=[^,]+,@$@DISTRICT@$@@%@ldap/base@%@$$"
233
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
235
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
234
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
236
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
235
	by * none break
237
	by * none break
236
238
237
# domaincontroller slaves and memberservers may replicate the OU "domain controllers"
239
# domaincontroller slaves and memberservers may replicate the OU "domain controllers"
238
access to dn.subtree="ou=domain controllers,@%@ldap/base@%@"
240
access to dn.subtree="ou=domain controllers,@%@ldap/base@%@"
239
   by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
241
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
240
   by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
242
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
241
   by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
243
   by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
242
   by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
244
   by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
243
   by * read break
245
   by * read break
244
246
245
# Memberserver duerfen bestimmte Attribute lesen
247
# Memberserver duerfen bestimmte Attribute lesen
246
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=userPassword,krb5Key,krb5KDCFlags,sambaNTPassword,sambaLMPassword,shadowLastChange,sambaPwdLastSet,pwhistory,krb5KeyVersionNumber,univentionWindowsReinstall,sambaPwdCanChange,sambaPwdMustChange
248
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=userPassword,krb5Key,krb5KDCFlags,sambaNTPassword,sambaLMPassword,shadowLastChange,sambaPwdLastSet,pwhistory,krb5KeyVersionNumber,univentionWindowsReinstall,sambaPwdCanChange,sambaPwdMustChange
247
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
249
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
248
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
250
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
249
	by * none break
251
	by * none break
250
252
251
# Slave-Controller duerfen Eintraege Ihrer ou lesen und schreiben (Passwortaenderungen etc.)
253
# Slave-Controller duerfen Eintraege Ihrer ou lesen und schreiben (Passwortaenderungen etc.)
252
# Lehrer und Memberserver duerfen sie lesen, ou-eigene bekommen Standard-ACLs, ou-fremde Server/user duerfen nichts
254
# Lehrer und Memberserver duerfen sie lesen, ou-eigene bekommen Standard-ACLs, ou-fremde Server/user duerfen nichts
253
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
255
access to dn.regex="^(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$"
254
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
256
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
255
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
257
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
256
    by group/univentionLDAPACL/univentionLDAPAccessWrite.expand="ou=$2,@$@DISTRICT@$@@%@ldap/base@%@" write
258
    by group/univentionLDAPACL/univentionLDAPAccessWrite.expand="ou=$2,@$@DISTRICT@$@@%@ldap/base@%@" write
257
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
259
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
258
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
260
	by group/univentionGroup/uniqueMember.expand="cn=OU$2-@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
259
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
261
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
260
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
262
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
261
    by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" read
263
    by dn.regex="^uid=([^,]+),cn=(@$@TEACHERS@$@|@$@TEACHERS-STAFF@$@|@$@STAFF@$@|@$@ADMINS@$@),cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" read
262
    by dn.regex="^uid=(.+,)?cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" none break
264
    by dn.regex="^uid=(.+,)?cn=users,ou=$2,@$@DISTRICT@$@@%@ldap/base@%@$$" none break
263
    by dn.regex="^uid=(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" none
265
    by dn.regex="^uid=(.+,)?ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" none
 Lines 265-285    Link Here 
265
267
266
# Slave-Controller duerfen Klassen-Gruppen bearbeiten (AUSNAHME! Wird fuer Lehrerzuordnung in UMC benoetigt!)
268
# Slave-Controller duerfen Klassen-Gruppen bearbeiten (AUSNAHME! Wird fuer Lehrerzuordnung in UMC benoetigt!)
267
access to dn.regex="^cn=klassen,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
269
access to dn.regex="^cn=klassen,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" attrs=children,entry
268
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
270
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
269
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
271
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
270
	by * none break
272
	by * none break
271
273
272
access to dn.regex="^cn=([^,]+),cn=klassen,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
274
access to dn.regex="^cn=([^,]+),cn=klassen,cn=@$@PUPILS@$@,cn=groups,ou=([^,]+),@$@DISTRICT@$@@%@ldap/base@%@$$" filter="(&(!(|(uidNumber=*)(objectClass=SambaSamAccount)))(objectClass=univentionGroup))"
273
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
275
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
274
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
276
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" write
275
	by * none break
277
	by * none break
276
278
277
# Slave-Controller duerfen nagios-Container und Inhalt replizieren
279
# Slave-Controller duerfen nagios-Container und Inhalt replizieren
278
access to dn.subtree="cn=nagios,@%@ldap/base@%@"
280
access to dn.subtree="cn=nagios,@%@ldap/base@%@"
279
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
281
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
280
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
282
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
281
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
283
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
282
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
284
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" read
283
	by * none break
285
	by * none break
284
286
285
# Schüler, Lehrer, Mitarbeiter, Admins duerfen globale Container univention, policies, groups und dns lesen 
287
# Schüler, Lehrer, Mitarbeiter, Admins duerfen globale Container univention, policies, groups und dns lesen 
 Lines 290-299    Link Here 
290
292
291
# Slave-Controller und normale Lehrer duerfen sonst nichts lesen, Schueler sowieso nicht
293
# Slave-Controller und normale Lehrer duerfen sonst nichts lesen, Schueler sowieso nicht
292
access to *
294
access to *
293
	by group/univentionGroup/uniqueMember="cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
295
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
294
	by group/univentionGroup/uniqueMember="cn=DC-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
296
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_DC@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
295
	by group/univentionGroup/uniqueMember="cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
297
	by group/univentionGroup/uniqueMember="cn=@$@ALL_ADM_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
296
	by group/univentionGroup/uniqueMember="cn=Member-Edukativnetz,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
298
	by group/univentionGroup/uniqueMember="cn=@$@ALL_EDU_MEMBER@$@,cn=ucsschool,cn=groups,@%@ldap/base@%@" none
297
	by * none break
299
	by * none break
298
300
299
"""
301
"""
(-)ucs-test-ucsschool/90_ucsschool/80_move_users_into_another_ou (-17 / +13 lines)
 Lines 32-61    Link Here 
32
		# TODO: change school and uid at once!
32
		# TODO: change school and uid at once!
33
		# TODO: user without classes
33
		# TODO: user without classes
34
34
35
		base = ucr['ldap/base']
35
		search_base = User.get_search_base(b)
36
		domain_users_school = 'cn=Domain Users %s,cn=groups,ou=%s,%s' % (b, b, base)
36
		domain_users_school = 'cn=Domain Users {},{}'.format(b, search_base.groups)
37
		teacher_group = 'cn=lehrer-%s,cn=groups,ou=%s,%s' % (b, b, base)
37
		teacher_group = search_base.teachers_ou_group
38
		staff_group = 'cn=mitarbeiter-%s,cn=groups,ou=%s,%s' % (b, b, base)
38
		staff_group = search_base.staff_ou_group
39
		students_group = 'cn=schueler-%s,cn=groups,ou=%s,%s' % (b, b, base)
39
		students_group = search_base.students_ou_group
40
		grp1_name = uts.random_username()
40
		grp1_name = uts.random_username()
41
		grp2_name = uts.random_username()
41
		grp2_name = uts.random_username()
42
		two_klasses = '{0}-{1},{0}-{2}'.format(a, grp1_name, grp2_name)
42
		two_klasses = '{0}-{1},{0}-{2}'.format(a, grp1_name, grp2_name)
43
		workgroup_dn, workgroup_name = udm.create_group(position='cn=schueler,cn=groups,%s' % (a_dn,))
43
		workgroup_dn, workgroup_name = udm.create_group(position=WorkGroup.get_container(a))
44
		global_group_dn, global_group_name = udm.create_group()
44
		global_group_dn, global_group_name = udm.create_group()
45
45
46
		users = [
46
		users = [
47
			(env.create_user(a, classes=two_klasses), 'schueler',
47
			(env.create_user(a, classes=two_klasses), [students_group, domain_users_school, global_group_dn]),
48
				[students_group, domain_users_school, global_group_dn]),
48
			(env.create_user(a, is_teacher=True, classes=two_klasses), [domain_users_school, teacher_group, global_group_dn]),
49
			(env.create_user(a, is_teacher=True, classes=two_klasses), 'lehrer',
49
			(env.create_user(a, is_staff=True), [domain_users_school, staff_group, global_group_dn]),
50
				[domain_users_school, teacher_group, global_group_dn]),
50
			(env.create_user(a, is_teacher=True, is_staff=True, classes=two_klasses), [domain_users_school, teacher_group, staff_group, global_group_dn]),
51
			(env.create_user(a, is_staff=True), 'mitarbeiter',
52
				[domain_users_school, staff_group, global_group_dn]),
53
			(env.create_user(a, is_teacher=True, is_staff=True, classes=two_klasses), 'lehrer',
54
				[domain_users_school, teacher_group, staff_group, global_group_dn]),
55
		]
51
		]
56
		lo = env.open_ldap_connection()
52
		lo = env.open_ldap_connection()
57
		workgroup = WorkGroup.from_dn(workgroup_dn, None, lo)
53
		workgroup = WorkGroup.from_dn(workgroup_dn, None, lo)
58
		users_dns = [dn for (user, dn,), roleshare_path, groups in users]
54
		users_dns = [dn for (user, dn,), groups in users]
59
		udm.modify_object('groups/group', dn=global_group_dn, append={'users': users_dns})
55
		udm.modify_object('groups/group', dn=global_group_dn, append={'users': users_dns})
60
		workgroup.users.extend(users_dns)
56
		workgroup.users.extend(users_dns)
61
		workgroup.modify(lo)
57
		workgroup.modify(lo)
 Lines 62-68    Link Here 
62
		workgroup = WorkGroup.from_dn(workgroup_dn, None, lo)
58
		workgroup = WorkGroup.from_dn(workgroup_dn, None, lo)
63
		print('*** Users in workgroup {}: {}'.format(workgroup.name, workgroup.users))
59
		print('*** Users in workgroup {}: {}'.format(workgroup.name, workgroup.users))
64
60
65
		for (user, dn,), roleshare_path, groups in users:
61
		for (user, dn,), groups in users:
66
			user = User.from_dn(dn, None, lo)
62
			user = User.from_dn(dn, None, lo)
67
			print('*** Groups {} is in: {}'.format(user, user.get_udm_object(lo)['groups']))
63
			print('*** Groups {} is in: {}'.format(user, user.get_udm_object(lo)['groups']))
68
64
 Lines 71-77    Link Here 
71
			print '################################'
67
			print '################################'
72
68
73
			attrs = {
69
			attrs = {
74
				'homeDirectory': [os.path.join('/home', b, roleshare_path, user.name)],
70
				'homeDirectory': [os.path.join('/home', user.get_roleshare_home_subdir(), user.name)],
75
				'ucsschoolSchool': [b],
71
				'ucsschoolSchool': [b],
76
				'departmentNumber': [b],
72
				'departmentNumber': [b],
77
				# TODO: add sambaHomeDrive sambaHomePath sambaLogonScript sambaProfilePath
73
				# TODO: add sambaHomeDrive sambaHomePath sambaLogonScript sambaProfilePath
(-)ucs-test-ucsschool/90_ucsschool/98_samba4_evaluate_windows_gpo (-2 / +3 lines)
 Lines 26-32    Link Here 
26
26
27
from datetime import datetime, timedelta
27
from datetime import datetime, timedelta
28
from ucsschool.lib.schoolldap import SchoolSearchBase
28
from ucsschool.lib.schoolldap import SchoolSearchBase
29
from ucsschool.lib.models import School
29
from ucsschool.lib.models import School, SchoolClass
30
from essential.computerroom import Room
30
from essential.computerroom import Room
31
from essential.exam import Exam
31
from essential.exam import Exam
32
32
 Lines 170-175    Link Here 
170
		return True
170
		return True
171
	utils.fail("Get-ItemProperty for %s did not return expected value (%s) for subkey %s" % (reg_key, expected_value, subkey))
171
	utils.fail("Get-ItemProperty for %s did not return expected value (%s) for subkey %s" % (reg_key, expected_value, subkey))
172
172
173
173
def samba_check_gpo_exists(gpo_name):
174
def samba_check_gpo_exists(gpo_name):
174
	"""
175
	"""
175
	Checks that GPO with 'gpo_name' exists via samba-tool.
176
	Checks that GPO with 'gpo_name' exists via samba-tool.
 Lines 526-532    Link Here 
526
	klasse_dn = udm.create_object(
527
	klasse_dn = udm.create_object(
527
		'groups/group',
528
		'groups/group',
528
		name=schoolclassname,
529
		name=schoolclassname,
529
		position="cn=klassen,cn=schueler,cn=groups,%s" % school_dn
530
		position=SchoolClass.get_container(school)
530
	)
531
	)
531
532
532
	student_pwd = "univention"
533
	student_pwd = "univention"
(-)ucs-test-ucsschool/90_ucsschool/essential/acl.py (-3 / +5 lines)
 Lines 13-18    Link Here 
13
import univention.testing.ucr as ucr_test
13
import univention.testing.ucr as ucr_test
14
import univention.testing.ucsschool as utu
14
import univention.testing.ucsschool as utu
15
import univention.testing.strings as uts
15
import univention.testing.strings as uts
16
from ucsschool.lib.models import ComputerRoom, School
16
17
17
18
18
class FailAcl(Exception):
19
class FailAcl(Exception):
 Lines 122-127    Link Here 
122
		self.access_allowance = access_allowance
123
		self.access_allowance = access_allowance
123
		self.ucr = ucr_test.UCSTestConfigRegistry()
124
		self.ucr = ucr_test.UCSTestConfigRegistry()
124
		self.ucr.load()
125
		self.ucr.load()
126
		self.search_base = School.get_search_base(self.school)
125
127
126
	def assert_acl(self, target_dn, access, attrs, access_allowance=None):
128
	def assert_acl(self, target_dn, access, attrs, access_allowance=None):
127
		"""Test ACL rule:\n
129
		"""Test ACL rule:\n
 Lines 202-208    Link Here 
202
	def assert_room(self, room_dn, access):
204
	def assert_room(self, room_dn, access):
203
		"""Lehrer und ouadmins duerfen Raum-Gruppen anlegen und bearbeiten
205
		"""Lehrer und ouadmins duerfen Raum-Gruppen anlegen und bearbeiten
204
		"""
206
		"""
205
		target_dn = 'cn=raeume,cn=groups,%s' % utu.UCSTestSchool().get_ou_base_dn(self.school)
207
		target_dn = ComputerRoom.get_container(self.school)
206
		attrs = [
208
		attrs = [
207
			'children',
209
			'children',
208
			'entry',
210
			'entry',
 Lines 229-235    Link Here 
229
		"""Lehrer, Mitarbeiter und Mitglieder der lokalen Administratoren
231
		"""Lehrer, Mitarbeiter und Mitglieder der lokalen Administratoren
230
		duerfen Arbeitsgruppen anlegen und aendern
232
		duerfen Arbeitsgruppen anlegen und aendern
231
		"""
233
		"""
232
		group_dn = 'cn=lehrer,cn=groups,%s' % utu.UCSTestSchool().get_ou_base_dn(self.school)
234
		group_dn = self.search_base.teachers_group
233
		attrs = [
235
		attrs = [
234
			'children',
236
			'children',
235
			'entry',
237
			'entry',
 Lines 259-265    Link Here 
259
		self.assert_acl(group_dn, access, attrs)
261
		self.assert_acl(group_dn, access, attrs)
260
262
261
	def assert_student_group(self, access):
263
	def assert_student_group(self, access):
262
		group_dn = 'cn=schueler,cn=groups,%s' % utu.UCSTestSchool().get_ou_base_dn(self.school)
264
		group_dn = self.search_base.students_group
263
		attrs = [
265
		attrs = [
264
			'children',
266
			'children',
265
			'entry',
267
			'entry',
(-)ucs-test-ucsschool/90_ucsschool/essential/computerroom.py (-12 / +16 lines)
 Lines 7-12    Link Here 
7
from ucsschool.lib.models import IPComputer as IPComputerLib
7
from ucsschool.lib.models import IPComputer as IPComputerLib
8
from ucsschool.lib.models import MacComputer as MacComputerLib
8
from ucsschool.lib.models import MacComputer as MacComputerLib
9
from ucsschool.lib.models import WindowsComputer as WindowsComputerLib
9
from ucsschool.lib.models import WindowsComputer as WindowsComputerLib
10
from ucsschool.lib.models import School as SchoolLib
11
from ucsschool.lib.models import ComputerRoom as ComputerRoomLib
10
from univention.testing.umc2 import Client
12
from univention.testing.umc2 import Client
11
from univention.testing.umc2 import ConnectionError
13
from univention.testing.umc2 import ConnectionError
12
import copy
14
import copy
 Lines 92-101    Link Here 
92
	def __init__(self, school, name=None, dn=None, description=None, host_members=None):
94
	def __init__(self, school, name=None, dn=None, description=None, host_members=None):
93
		self.school = school
95
		self.school = school
94
		self.name = name if name else uts.random_name()
96
		self.name = name if name else uts.random_name()
95
		self.dn = dn if dn else 'cn=%s-%s,cn=raeume,cn=groups,%s' % (
97
		self.dn = dn if dn else ComputerRoomLib(school=school, name='{}-{}'.format(school, self.name)).dn
96
			school, self.name, utu.UCSTestSchool().get_ou_base_dn(school))
97
		self.description = description if description else uts.random_name()
98
		self.description = description if description else uts.random_name()
98
		self.host_members = host_members or []
99
		self.host_members = host_members or []
100
		self.marktplatz_name = SchoolLib.get_search_base(self.school).share_name_marktplatz
99
101
100
	def get_room_user(self, client):
102
	def get_room_user(self, client):
101
		print 'Executing command: computerroom/rooms in school:', self.school
103
		print 'Executing command: computerroom/rooms in school:', self.school
 Lines 286-320    Link Here 
286
			utils.fail('Write to home directory result (%r), expected (%r)' % (write[0], expected_result))
288
			utils.fail('Write to home directory result (%r), expected (%r)' % (write[0], expected_result))
287
289
288
	def check_marktplatz_read(self, user, ip_address, passwd='univention', expected_result=0):
290
	def check_marktplatz_read(self, user, ip_address, passwd='univention', expected_result=0):
289
		print '.... Check Marktplatz read ....'
291
		print '.... Check Marktplatz ({}) read ....'.format(self.marktplatz_name)
290
		cmd_read_marktplatz = ['smbclient', '//%(ip)s/Marktplatz', '-U', '%(user)s', '-c', 'dir']
292
		cmd_read_marktplatz = ['smbclient', '//%(ip)s/%(marktplatz_name)s', '-U', '%(user)s', '-c', 'dir']
291
		read = run_commands(
293
		read = run_commands(
292
			[cmd_read_marktplatz],
294
			[cmd_read_marktplatz],
293
			{
295
			{
294
				'ip': ip_address,
296
				'ip': ip_address,
295
				'user': '{0}%{1}'.format(user, passwd)
297
				'user': '{0}%{1}'.format(user, passwd),
298
				'marktplatz_name': self.marktplatz_name
296
			}
299
			}
297
		)
300
		)
298
		if read[0] != expected_result:
301
		if read[0] != expected_result:
299
			print 'FAIL .. Read Marktplatz directory result (%r), expected (%r)' % (read[0], expected_result)
302
			print 'FAIL .. Read Marktplatz (%s) directory result (%r), expected (%r)' % (self.marktplatz_name, read[0], expected_result)
300
			utils.fail('Read Marktplatz directory result (%r), expected (%r)' % (read[0], expected_result))
303
			utils.fail('Read Marktplatz (%s) directory result (%r), expected (%r)' % (self.marktplatz_name, read[0], expected_result))
301
304
302
	def check_marktplatz_write(self, user, ip_address, passwd='univention', expected_result=0):
305
	def check_marktplatz_write(self, user, ip_address, passwd='univention', expected_result=0):
303
		print '.... Check Marktplatz write ....'
306
		print '.... Check Marktplatz ({}) write ....'.format(self.marktplatz_name)
304
		f = tempfile.NamedTemporaryFile(dir='/tmp')
307
		f = tempfile.NamedTemporaryFile(dir='/tmp')
305
		cmd_write_marktplatz = ['smbclient', '//%(ip)s/Marktplatz', '-U', '%(user)s', '-c', 'put %(filename)s']
308
		cmd_write_marktplatz = ['smbclient', '//%(ip)s/%(marktplatz_name)s', '-U', '%(user)s', '-c', 'put %(filename)s']
306
		write = run_commands(
309
		write = run_commands(
307
			[cmd_write_marktplatz],
310
			[cmd_write_marktplatz],
308
			{
311
			{
309
				'ip': ip_address,
312
				'ip': ip_address,
310
				'user': '{0}%{1}'.format(user, passwd),
313
				'user': '{0}%{1}'.format(user, passwd),
311
				'filename': '%s %s' % (f.name, f.name.split('/')[-1])
314
				'filename': '%s %s' % (f.name, f.name.split('/')[-1]),
315
				'marktplatz_name': self.marktplatz_name,
312
			}
316
			}
313
		)
317
		)
314
		f.close()
318
		f.close()
315
		if write[0] != expected_result:
319
		if write[0] != expected_result:
316
			print 'FAIL .. Write to Marktplatz directory result (%r), expected (%r)' % (write[0], expected_result)
320
			print 'FAIL .. Write to Marktplatz (%s) directory result (%r), expected (%r)' % (self.marktplatz_name, write[0], expected_result)
317
			utils.fail('Write to Marktplatz directory result (%r), expected (%r)' % (write[0], expected_result))
321
			utils.fail('Write to Marktplatz (%s) directory result (%r), expected (%r)' % (self.marktplatz_name, write[0], expected_result))
318
322
319
	def check_share_access(self, user, ip_address, expected_home_result, expected_marktplatz_result):
323
	def check_share_access(self, user, ip_address, expected_home_result, expected_marktplatz_result):
320
		self.check_home_read(user, ip_address, expected_result=expected_home_result)
324
		self.check_home_read(user, ip_address, expected_result=expected_home_result)
(-)ucs-test-ucsschool/90_ucsschool/essential/distribution.py (-4 / +30 lines)
 Lines 13-18    Link Here 
13
import univention.testing.strings as uts
13
import univention.testing.strings as uts
14
import univention.testing.ucr as ucr_test
14
import univention.testing.ucr as ucr_test
15
import univention.testing.utils as utils
15
import univention.testing.utils as utils
16
from ucsschool.lib.models import School
16
17
17
18
18
class Distribution(object):
19
class Distribution(object):
 Lines 505-518    Link Here 
505
		path = ''
506
		path = ''
506
		self.ucr.load()
507
		self.ucr.load()
507
		roleshare = self.ucr.get('ucsschool/import/roleshare')
508
		roleshare = self.ucr.get('ucsschool/import/roleshare')
509
		collect_from = self.ucr.get('ucsschool/datadistribution/datadir/sender', 'Unterrichtsmaterial')
510
		distribute_to = self.ucr.get('ucsschool/datadistribution/datadir/recipient', 'Unterrichtsmaterial')
511
		search_base = School.get_search_base(self.school)
508
		if purpose == 'distribute':
512
		if purpose == 'distribute':
509
			if roleshare == 'no' or roleshare is False:
513
			if roleshare == 'no' or roleshare is False:
510
				path = '/home/{0}/Unterrichtsmaterial/{1}/'.format(user, self.name)
514
				path = '/home/{}/{}/{}/'.format(
515
					user,
516
					distribute_to,
517
					self.name
518
				)
511
			else:
519
			else:
512
				path = '/home/{0}/schueler/{1}/Unterrichtsmaterial/{2}'.format(self.school, user, self.name)
520
				path = '/home/{}/{}/{}/{}/{}'.format(
521
					self.school,
522
					search_base.share_name_pupils,
523
					user,
524
					distribute_to,
525
					self.name
526
				)
513
		elif purpose == 'collect':
527
		elif purpose == 'collect':
514
			if roleshare == 'no' or roleshare is False:
528
			if roleshare == 'no' or roleshare is False:
515
				path = '/home/{0}/Unterrichtsmaterial/{1}/{2}/'.format(self.sender, self.name, user)
529
				path = '/home/{}/{}/{}/{}/'.format(
530
						self.sender,
531
						collect_from,
532
						self.name,
533
						user
534
				)
516
			else:
535
			else:
517
				path = '/home/{0}/lehrer/{1}/Unterrichtsmaterial/{2}/{3}'.format(self.school, self.sender, self.name, user)
536
				path = '/home/{}/{}/{}/{}/{}/{}'.format(
537
					self.school,
538
					search_base.share_name_teachers,
539
					self.sender,
540
					collect_from,
541
					self.name,
542
					user
543
				)
518
		return path
544
		return path
(-)ucs-test-ucsschool/90_ucsschool/essential/exam.py (-2 / +4 lines)
 Lines 15-20    Link Here 
15
import subprocess
15
import subprocess
16
import univention.testing.strings as uts
16
import univention.testing.strings as uts
17
import univention.testing.utils as utils
17
import univention.testing.utils as utils
18
from ucsschool.lib.models import School
18
19
19
20
20
class StartFail(Exception):
21
class StartFail(Exception):
 Lines 120-125    Link Here 
120
		self.shareMode = shareMode
121
		self.shareMode = shareMode
121
		self.internetRule = internetRule
122
		self.internetRule = internetRule
122
		self.customRule = customRule
123
		self.customRule = customRule
124
		self.search_base = School.get_search_base(self.school)
123
125
124
		if connection:
126
		if connection:
125
			self.client = connection
127
			self.client = connection
 Lines 251-257    Link Here 
251
	def check_collect(self):
253
	def check_collect(self):
252
		account = utils.UCSTestDomainAdminCredentials()
254
		account = utils.UCSTestDomainAdminCredentials()
253
		admin = account.username
255
		admin = account.username
254
		path = '/home/%s/Klassenarbeiten/%s' % (admin, self.name)
256
		path = '/home/%s/%s/%s' % (admin, self.search_base.share_name_exams, self.name)
255
		path_files = get_dir_files(path)
257
		path_files = get_dir_files(path)
256
		if not set(self.files).issubset(set(path_files)):
258
		if not set(self.files).issubset(set(path_files)):
257
			utils.fail('%r were not collected to %r' % (self.files, path))
259
			utils.fail('%r were not collected to %r' % (self.files, path))
 Lines 263-269    Link Here 
263
			utils.fail('%r were not uploaded to %r' % (self.files, path))
265
			utils.fail('%r were not uploaded to %r' % (self.files, path))
264
266
265
	def check_distribute(self):
267
	def check_distribute(self):
266
		path = '/home/%s/schueler' % self.school
268
		path = '/home/%s/%s' % (self.school, self.search_base.share_name_pupils)
267
		path_files = get_dir_files(path)
269
		path_files = get_dir_files(path)
268
		if not set(self.files).issubset(set(path_files)):
270
		if not set(self.files).issubset(set(path_files)):
269
			utils.fail('%r were not uploaded to %r' % (self.files, path))
271
			utils.fail('%r were not uploaded to %r' % (self.files, path))
(-)ucs-test-ucsschool/90_ucsschool/essential/importcomputers.py (-5 / +5 lines)
 Lines 146-156    Link Here 
146
		print 'verify computer: %s' % self.name
146
		print 'verify computer: %s' % self.name
147
147
148
		utils.verify_ldap_object(self.dn, expected_attr=self.expected_attributes(), should_exist=True)
148
		utils.verify_ldap_object(self.dn, expected_attr=self.expected_attributes(), should_exist=True)
149
149
		search_base = SchoolLib.get_search_base(self.school)
150
		verwaltung_member_group1 = 'cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (self.school, configRegistry.get('ldap/base'))
150
		verwaltung_member_group1 = search_base.administrative_ou_member_group
151
		verwaltung_member_group2 = 'cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (configRegistry.get('ldap/base'))
151
		verwaltung_member_group2 = search_base.administrative_member_group
152
		edukativ_member_group1 = 'cn=OU%s-Member-Edukativnetz,cn=ucsschool,cn=groups,%s' % (self.school, configRegistry.get('ldap/base'))
152
		edukativ_member_group1 = search_base.educational_ou_member_group
153
		edukativ_member_group2 = 'cn=Member-Edukativnetz,cn=ucsschool,cn=groups,%s' % (configRegistry.get('ldap/base'))
153
		edukativ_member_group2 = search_base.educational_member_group
154
		if self.zone == 'verwaltung':
154
		if self.zone == 'verwaltung':
155
			utils.verify_ldap_object(verwaltung_member_group1, expected_attr={'uniqueMember': [self.dn]}, strict=False, should_exist=True)
155
			utils.verify_ldap_object(verwaltung_member_group1, expected_attr={'uniqueMember': [self.dn]}, strict=False, should_exist=True)
156
			utils.verify_ldap_object(verwaltung_member_group2, expected_attr={'uniqueMember': [self.dn]}, strict=False, should_exist=True)
156
			utils.verify_ldap_object(verwaltung_member_group2, expected_attr={'uniqueMember': [self.dn]}, strict=False, should_exist=True)
(-)ucs-test-ucsschool/90_ucsschool/essential/importgroups.py (-4 / +3 lines)
 Lines 10-15    Link Here 
10
import univention.testing.strings as uts
10
import univention.testing.strings as uts
11
from ucsschool.lib.models import SchoolClass as GroupLib
11
from ucsschool.lib.models import SchoolClass as GroupLib
12
from ucsschool.lib.models import School as SchoolLib
12
from ucsschool.lib.models import School as SchoolLib
13
from ucsschool.lib.models import ClassShare as ClassShareLib
13
import ucsschool.lib.models.utils
14
import ucsschool.lib.models.utils
14
15
15
from essential.importou import remove_ou, get_school_base
16
from essential.importou import remove_ou, get_school_base
 Lines 28-36    Link Here 
28
configRegistry = univention.config_registry.ConfigRegistry()
29
configRegistry = univention.config_registry.ConfigRegistry()
29
configRegistry.load()
30
configRegistry.load()
30
31
31
cn_pupils = configRegistry.get('ucsschool/ldap/default/container/pupils', 'schueler')
32
32
33
34
class Group:
33
class Group:
35
34
36
	def __init__(self, school):
35
	def __init__(self, school):
 Lines 41-48    Link Here 
41
40
42
		self.school_base = get_school_base(self.school)
41
		self.school_base = get_school_base(self.school)
43
42
44
		self.dn = 'cn=%s,cn=klassen,cn=%s,cn=groups,%s' % (self.name, cn_pupils, self.school_base)
43
		self.dn = GroupLib(school=self.school, name=self.name).dn
45
		self.share_dn = 'cn=%s,cn=klassen,cn=shares,%s' % (self.name, self.school_base)
44
		self.share_dn = ClassShareLib(school=self.school, name=self.name).dn
46
45
47
	def set_mode_to_modify(self):
46
	def set_mode_to_modify(self):
48
		self.mode = 'M'
47
		self.mode = 'M'
(-)ucs-test-ucsschool/90_ucsschool/essential/importou.py (-58 / +57 lines)
 Lines 13-18    Link Here 
13
13
14
import univention.uldap
14
import univention.uldap
15
import univention.admin.uldap
15
import univention.admin.uldap
16
import ldap
16
import univention.admin.modules
17
import univention.admin.modules
17
import univention.admin.filter
18
import univention.admin.filter
18
import univention.config_registry
19
import univention.config_registry
 Lines 299-310    Link Here 
299
	old_dhcpd_ldap_base = ucr.get('dhcpd/ldap/base')
300
	old_dhcpd_ldap_base = ucr.get('dhcpd/ldap/base')
300
	lo = univention.uldap.getMachineConnection()
301
	lo = univention.uldap.getMachineConnection()
301
	base_dn = ucr.get('ldap/base')
302
	base_dn = ucr.get('ldap/base')
303
	search_base = School.get_search_base(ou)
302
304
303
	cn_pupils = ucr.get('ucsschool/ldap/default/container/pupils', 'schueler')
305
	cn_pupils = ldap.explode_dn(search_base.students, True)[0]
304
	cn_teachers = ucr.get('ucsschool/ldap/default/container/teachers', 'lehrer')
306
	cn_teachers = ldap.explode_dn(search_base.teachers, True)[0]
305
	cn_teachers_staff = ucr.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter')
307
	cn_teachers_staff = ldap.explode_dn(search_base.teachersAndStaff, True)[0]
306
	cn_admins = ucr.get('ucsschool/ldap/default/container/admins', 'admins')
308
	cn_admins = ldap.explode_dn(search_base.admins, True)[0]
307
	cn_staff = ucr.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
309
	cn_staff = ldap.explode_dn(search_base.staff, True)[0]
310
	cn_class = ldap.explode_dn(search_base.classes, True)[0]
311
	cn_rooms = ldap.explode_dn(search_base.rooms, True)[0]
308
312
309
	singlemaster = ucr.is_true('ucsschool/singlemaster')
313
	singlemaster = ucr.is_true('ucsschool/singlemaster')
310
	noneducational_create_objects = ucr.is_true('ucsschool/ldap/noneducational/create/objects')
314
	noneducational_create_objects = ucr.is_true('ucsschool/ldap/noneducational/create/objects')
 Lines 332-374    Link Here 
332
336
333
	utils.verify_ldap_object(ou_base, expected_attr={'ou': [ou], 'ucsschoolClassShareFileServer': [sharefileserver_dn], 'ucsschoolHomeShareFileServer': [sharefileserver_dn]}, should_exist=must_exist)
337
	utils.verify_ldap_object(ou_base, expected_attr={'ou': [ou], 'ucsschoolClassShareFileServer': [sharefileserver_dn], 'ucsschoolHomeShareFileServer': [sharefileserver_dn]}, should_exist=must_exist)
334
338
335
	utils.verify_ldap_object('cn=printers,%s' % ou_base, expected_attr={'cn': ['printers']}, should_exist=must_exist)
339
	utils.verify_ldap_object(search_base.printers, expected_attr={'cn': ['printers']}, should_exist=must_exist)
336
	utils.verify_ldap_object('cn=users,%s' % ou_base, expected_attr={'cn': ['users']}, should_exist=must_exist)
340
	utils.verify_ldap_object(search_base.users, expected_attr={'cn': ['users']}, should_exist=must_exist)
337
	utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_pupils, ou_base), expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
341
	utils.verify_ldap_object(search_base.students, expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
338
	utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_teachers, ou_base), expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
342
	utils.verify_ldap_object(search_base.teachers, expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
339
	utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_admins, ou_base), expected_attr={'cn': [cn_admins]}, should_exist=must_exist)
343
	utils.verify_ldap_object(search_base.admins, expected_attr={'cn': [cn_admins]}, should_exist=must_exist)
340
	utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_admins, ou_base), expected_attr={'cn': [cn_admins]}, should_exist=must_exist)
341
344
342
	utils.verify_ldap_object('cn=computers,%s' % ou_base, expected_attr={'cn': ['computers']}, should_exist=must_exist)
345
	utils.verify_ldap_object(search_base.computers, expected_attr={'cn': ['computers']}, should_exist=must_exist)
343
	utils.verify_ldap_object('cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['server']}, should_exist=must_exist)
346
	utils.verify_ldap_object('cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['server']}, should_exist=must_exist)
344
	utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
347
	utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
345
	utils.verify_ldap_object('cn=networks,%s' % ou_base, expected_attr={'cn': ['networks']}, should_exist=must_exist)
348
	utils.verify_ldap_object(search_base.networks, expected_attr={'cn': ['networks']}, should_exist=must_exist)
346
	utils.verify_ldap_object('cn=groups,%s' % ou_base, expected_attr={'cn': ['groups']}, should_exist=must_exist)
349
	utils.verify_ldap_object(search_base.groups, expected_attr={'cn': ['groups']}, should_exist=must_exist)
347
	utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_pupils, ou_base), expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
350
	utils.verify_ldap_object(search_base.workgroups, expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
348
	utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_teachers, ou_base), expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
351
	utils.verify_ldap_object(search_base.teachers_group, expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
349
	utils.verify_ldap_object('cn=klassen,cn=%s,cn=groups,%s' % (cn_pupils, ou_base), expected_attr={'cn': ['klassen']}, should_exist=must_exist)
352
	utils.verify_ldap_object(search_base.classes, expected_attr={'cn': [cn_class]}, should_exist=must_exist)
350
	utils.verify_ldap_object('cn=raeume,cn=groups,%s' % ou_base, expected_attr={'cn': ['raeume']}, should_exist=must_exist)
353
	utils.verify_ldap_object(search_base.rooms, expected_attr={'cn': [cn_rooms]}, should_exist=must_exist)
351
354
352
	utils.verify_ldap_object('cn=dhcp,%s' % ou_base, expected_attr={'cn': ['dhcp']}, should_exist=must_exist)
355
	utils.verify_ldap_object(search_base.dhcp, expected_attr={'cn': ['dhcp']}, should_exist=must_exist)
353
	utils.verify_ldap_object('cn=policies,%s' % ou_base, expected_attr={'cn': ['policies']}, should_exist=must_exist)
356
	utils.verify_ldap_object(search_base.policies, expected_attr={'cn': ['policies']}, should_exist=must_exist)
354
	utils.verify_ldap_object('cn=shares,%s' % ou_base, expected_attr={'cn': ['shares']}, should_exist=must_exist)
357
	utils.verify_ldap_object(search_base.shares, expected_attr={'cn': ['shares']}, should_exist=must_exist)
355
	utils.verify_ldap_object('cn=klassen,cn=shares,%s' % ou_base, expected_attr={'cn': ['klassen']}, should_exist=must_exist)
358
	utils.verify_ldap_object(search_base.classShares, expected_attr={'cn': [cn_class]}, should_exist=must_exist)
356
	utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
359
	utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
357
360
358
	if noneducational_create_objects:
361
	if noneducational_create_objects:
359
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_staff, ou_base), should_exist=must_exist)
362
		utils.verify_ldap_object(search_base.staff, should_exist=must_exist)
360
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_teachers_staff, ou_base), should_exist=must_exist)
363
		utils.verify_ldap_object(search_base.teachersAndStaff, should_exist=must_exist)
361
		utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_staff, ou_base), should_exist=must_exist)
364
		utils.verify_ldap_object(search_base.staff_group, should_exist=must_exist)
362
	else:
365
	else:
363
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_staff, ou_base), should_exist=False)
366
		utils.verify_ldap_object(search_base.staff, should_exist=False)
364
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_teachers_staff, ou_base), should_exist=False)
367
		utils.verify_ldap_object(search_base.teachersAndStaff, should_exist=False)
365
		utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_staff, ou_base), should_exist=False)
368
		utils.verify_ldap_object(search_base.staff_group, should_exist=False)
366
369
367
	if noneducational_create_objects:
370
	if noneducational_create_objects:
368
		utils.verify_ldap_object('cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % base_dn, should_exist=True)
371
		utils.verify_ldap_object(search_base.administrative_dc_group, should_exist=True)
369
		utils.verify_ldap_object('cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % base_dn, should_exist=True)
372
		utils.verify_ldap_object(search_base.administrative_member_group, should_exist=True)
370
		utils.verify_ldap_object('cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn), should_exist=True)
373
		utils.verify_ldap_object(search_base.administrative_ou_dc_group)
371
		utils.verify_ldap_object('cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn), should_exist=True)
374
		utils.verify_ldap_object(search_base.administrative_ou_member_group)
372
	# This will fail because we don't cleanup these groups in cleanup_ou
375
	# This will fail because we don't cleanup these groups in cleanup_ou
373
	# else:
376
	# else:
374
	#	utils.verify_ldap_object("cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % base_dn, should_exist=False)
377
	#	utils.verify_ldap_object("cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % base_dn, should_exist=False)
 Lines 382-403    Link Here 
382
	if dc_administrative:
385
	if dc_administrative:
383
		verify_dc(ou, dc_administrative, TYPE_DC_ADMINISTRATIVE, base_dn, must_exist)
386
		verify_dc(ou, dc_administrative, TYPE_DC_ADMINISTRATIVE, base_dn, must_exist)
384
387
385
	grp_prefix_pupils = ucr.get('ucsschool/ldap/default/groupprefix/pupils', 'schueler-')
386
	grp_prefix_teachers = ucr.get('ucsschool/ldap/default/groupprefix/teachers', 'lehrer-')
387
	grp_prefix_admins = ucr.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
388
	grp_prefix_staff = ucr.get('ucsschool/ldap/default/groupprefix/staff', 'mitarbeiter-')
389
390
	grp_policy_pupils = ucr.get('ucsschool/ldap/default/policy/umc/pupils', 'cn=ucsschool-umc-pupils-default,cn=UMC,cn=policies,%s' % base_dn)
388
	grp_policy_pupils = ucr.get('ucsschool/ldap/default/policy/umc/pupils', 'cn=ucsschool-umc-pupils-default,cn=UMC,cn=policies,%s' % base_dn)
391
	grp_policy_teachers = ucr.get('ucsschool/ldap/default/policy/umc/teachers', 'cn=ucsschool-umc-teachers-default,cn=UMC,cn=policies,%s' % base_dn)
389
	grp_policy_teachers = ucr.get('ucsschool/ldap/default/policy/umc/teachers', 'cn=ucsschool-umc-teachers-default,cn=UMC,cn=policies,%s' % base_dn)
392
	grp_policy_admins = ucr.get('ucsschool/ldap/default/policy/umc/admins', 'cn=ucsschool-umc-admins-default,cn=UMC,cn=policies,%s' % base_dn)
390
	grp_policy_admins = ucr.get('ucsschool/ldap/default/policy/umc/admins', 'cn=ucsschool-umc-admins-default,cn=UMC,cn=policies,%s' % base_dn)
393
	grp_policy_staff = ucr.get('ucsschool/ldap/default/policy/umc/staff', 'cn=ucsschool-umc-staff-default,cn=UMC,cn=policies,%s' % base_dn)
391
	grp_policy_staff = ucr.get('ucsschool/ldap/default/policy/umc/staff', 'cn=ucsschool-umc-staff-default,cn=UMC,cn=policies,%s' % base_dn)
394
392
395
	utils.verify_ldap_object("cn=%s%s,cn=ouadmins,cn=groups,%s" % (grp_prefix_admins, ou, base_dn), expected_attr={'univentionPolicyReference': [grp_policy_admins]}, should_exist=True)
393
	utils.verify_ldap_object(search_base.admin_group, expected_attr={'univentionPolicyReference': [grp_policy_admins]}, should_exist=True)
396
	utils.verify_ldap_object("cn=%s%s,cn=groups,%s" % (grp_prefix_pupils, ou, ou_base), expected_attr={'univentionPolicyReference': [grp_policy_pupils]}, should_exist=must_exist)
394
	utils.verify_ldap_object(search_base.students_ou_group, expected_attr={'univentionPolicyReference': [grp_policy_pupils]}, should_exist=must_exist)
397
	utils.verify_ldap_object("cn=%s%s,cn=groups,%s" % (grp_prefix_teachers, ou, ou_base), expected_attr={'univentionPolicyReference': [grp_policy_teachers]}, should_exist=must_exist)
395
	utils.verify_ldap_object(search_base.teachers_ou_group, expected_attr={'univentionPolicyReference': [grp_policy_teachers]}, should_exist=must_exist)
398
396
399
	if noneducational_create_objects:
397
	if noneducational_create_objects:
400
		utils.verify_ldap_object("cn=%s%s,cn=groups,%s" % (grp_prefix_staff, ou, ou_base), expected_attr={'univentionPolicyReference': [grp_policy_staff]}, should_exist=must_exist)
398
		utils.verify_ldap_object(search_base.staff_ou_group, expected_attr={'univentionPolicyReference': [grp_policy_staff]}, should_exist=must_exist)
401
399
402
	dcmaster_module = univention.admin.modules.get("computers/domaincontroller_master")
400
	dcmaster_module = univention.admin.modules.get("computers/domaincontroller_master")
403
	dcbackup_module = univention.admin.modules.get("computers/domaincontroller_backup")
401
	dcbackup_module = univention.admin.modules.get("computers/domaincontroller_backup")
 Lines 410-416    Link Here 
410
	# check group membership
408
	# check group membership
411
	#  slave should be member
409
	#  slave should be member
412
	#  master and backup should not be member
410
	#  master and backup should not be member
413
	dcgroups = ["cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (ou, base_dn), "cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (base_dn)]
411
	dcgroups = [search_base.educational_ou_dc_group, search_base.educational_dc_group]
414
412
415
	if must_exist:
413
	if must_exist:
416
		if masterobjs:
414
		if masterobjs:
 Lines 486-518    Link Here 
486
		base_dn = ucr.get('ldap/base')
484
		base_dn = ucr.get('ldap/base')
487
	ou_base = get_ou_base(ou, ucr.is_true('ucsschool/ldap/district/enable', False))
485
	ou_base = get_ou_base(ou, ucr.is_true('ucsschool/ldap/district/enable', False))
488
	dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, ou_base)
486
	dc_dn = 'cn=%s,cn=dc,cn=server,cn=computers,%s' % (dc_name, ou_base)
487
	search_base = School.get_search_base(ou)
489
488
490
	# define list of (un-)desired group memberships ==> [(IS_MEMBER, GROUP_DN), ...]
489
	# define list of (un-)desired group memberships ==> [(IS_MEMBER, GROUP_DN), ...]
491
	group_dn_list = []
490
	group_dn_list = []
492
	if dc_type == TYPE_DC_ADMINISTRATIVE:
491
	if dc_type == TYPE_DC_ADMINISTRATIVE:
493
		group_dn_list += [
492
		group_dn_list += [
494
			(True, 'cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou.lower(), base_dn)),
493
			(True, search_base.administrative_ou_dc_group),
495
			(True, 'cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (base_dn, )),
494
			(True, search_base.administrative_dc_group),
496
			(False, 'cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % base_dn),
495
			(False, search_base.administrative_member_group),
497
			(False, 'cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn)),
496
			(False, search_base.administrative_ou_member_group),
498
			(False, 'cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s' % (ou.lower(), base_dn)),
497
			(False, search_base.educational_ou_dc_group),
499
			(False, 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s' % (base_dn, )),
498
			(False, search_base.educational_dc_group),
500
			(False, 'cn=Member-Edukativnetz,cn=ucsschool,cn=groups,%s' % base_dn),
499
			(False, search_base.educational_member_group),
501
			(False, 'cn=OU%s-Member-Edukativnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn)),
500
			(False, search_base.educational_ou_member_group),
502
		]
501
		]
503
	else:
502
	else:
504
		group_dn_list += [
503
		group_dn_list += [
505
			(True, 'cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s' % (ou.lower(), base_dn)),
504
			(True, search_base.educational_ou_dc_group),
506
			(True, 'cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s' % (base_dn, )),
505
			(True, search_base.educational_dc_group),
507
			(False, 'cn=Member-Edukativnetz,cn=ucsschool,cn=groups,%s' % base_dn),
506
			(False, search_base.educational_member_group),
508
			(False, 'cn=OU%s-Member-Edukativnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn)),
507
			(False, search_base.educational_ou_member_group),
509
		]
508
		]
510
		if ucr.is_true('ucsschool/ldap/noneducational/create/objects', must_exist):
509
		if ucr.is_true('ucsschool/ldap/noneducational/create/objects', must_exist):
511
			group_dn_list += [
510
			group_dn_list += [
512
				(False, 'cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou.lower(), base_dn)),
511
				(False, search_base.administrative_ou_dc_group),
513
				(False, 'cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (base_dn, )),
512
				(False, search_base.administrative_dc_group),
514
				(False, 'cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % base_dn),
513
				(False, search_base.administrative_member_group),
515
				(False, 'cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn)),
514
				(False, search_base.administrative_ou_member_group),
516
			]
515
			]
517
516
518
	utils.verify_ldap_object(dc_dn, should_exist=must_exist)
517
	utils.verify_ldap_object(dc_dn, should_exist=must_exist)
(-)ucs-test-ucsschool/90_ucsschool/essential/importusers.py (-40 / +21 lines)
 Lines 13-18    Link Here 
13
from univention.testing.decorators import SetTimeout
13
from univention.testing.decorators import SetTimeout
14
import univention.uldap
14
import univention.uldap
15
import univention.config_registry
15
import univention.config_registry
16
from ucsschool.lib.models import SchoolClass as SchoolClassLib
16
from ucsschool.lib.models import Student as StudentLib
17
from ucsschool.lib.models import Student as StudentLib
17
from ucsschool.lib.models import Teacher as TeacherLib
18
from ucsschool.lib.models import Teacher as TeacherLib
18
from ucsschool.lib.models import Staff as StaffLib
19
from ucsschool.lib.models import Staff as StaffLib
 Lines 31-37    Link Here 
31
32
32
HOOK_BASEDIR = '/usr/share/ucs-school-import/hooks'
33
HOOK_BASEDIR = '/usr/share/ucs-school-import/hooks'
33
34
34
35
i
35
class ImportUser(Exception):
36
class ImportUser(Exception):
36
	pass
37
	pass
37
38
 Lines 43-59    Link Here 
43
configRegistry = univention.config_registry.ConfigRegistry()
44
configRegistry = univention.config_registry.ConfigRegistry()
44
configRegistry.load()
45
configRegistry.load()
45
46
46
cn_pupils = configRegistry.get('ucsschool/ldap/default/container/pupils', 'schueler')
47
cn_teachers = configRegistry.get('ucsschool/ldap/default/container/teachers', 'lehrer')
48
cn_teachers_staff = configRegistry.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter')
49
cn_staff = configRegistry.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
50
47
51
grp_prefix_pupils = configRegistry.get('ucsschool/ldap/default/groupprefix/pupils', 'schueler-')
52
grp_prefix_teachers = configRegistry.get('ucsschool/ldap/default/groupprefix/teachers', 'lehrer-')
53
grp_prefix_admins = configRegistry.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
54
grp_prefix_staff = configRegistry.get('ucsschool/ldap/default/groupprefix/staff', 'mitarbeiter-')
55
56
57
class Person(object):
48
class Person(object):
58
49
59
	def __init__(self, school, role):
50
	def __init__(self, school, role):
 Lines 62-67    Link Here 
62
		self.username = uts.random_name()
53
		self.username = uts.random_name()
63
		self.school = school
54
		self.school = school
64
		self.schools = [school]
55
		self.schools = [school]
56
		self.search_base = SchoolLib.get_search_base(self.school)
65
		self.role = role
57
		self.role = role
66
		self.record_uid = None
58
		self.record_uid = None
67
		self.source_uid = None
59
		self.source_uid = None
 Lines 69-85    Link Here 
69
		self.mail = '%s@%s' % (self.username, configRegistry.get('domainname'))
61
		self.mail = '%s@%s' % (self.username, configRegistry.get('domainname'))
70
		self.school_classes = {}
62
		self.school_classes = {}
71
		if self.is_student():
63
		if self.is_student():
72
			self.cn = cn_pupils
64
			self.user_type = StudentLib
73
			self.grp_prefix = grp_prefix_pupils
65
			self.role_group_dn = self.search_base.students_ou_group
74
		elif self.is_teacher():
66
		elif self.is_teacher():
75
			self.cn = cn_teachers
67
			self.user_type = TeacherLib
76
			self.grp_prefix = grp_prefix_teachers
68
			self.role_group_dn = self.search_base.teachers_ou_group
77
		elif self.is_teacher_staff():
69
		elif self.is_teacher_staff():
78
			self.cn = cn_teachers_staff
70
			self.user_type = TeachersAndStaffLib
79
			self.grp_prefix = grp_prefix_teachers
71
			self.role_group_dn = self.search_base.teachers_ou_group
80
		elif self.is_staff():
72
		elif self.is_staff():
81
			self.cn = cn_staff
73
			self.user_type = StaffLib
82
			self.grp_prefix = grp_prefix_staff
74
			self.role_group_dn = self.search_base.staff_ou_group
83
		self.mode = 'A'
75
		self.mode = 'A'
84
		self.active = True
76
		self.active = True
85
		self.password = None
77
		self.password = None
 Lines 88-107    Link Here 
88
		self.append_random_groups()
80
		self.append_random_groups()
89
81
90
	def make_dn(self):
82
	def make_dn(self):
91
		return 'uid=%s,cn=%s,cn=users,%s' % (self.username, self.cn, self.school_base)
83
		return self.user_type(school=self.school, name=self.username).dn
92
84
93
	@property
85
	@property
94
	def homedir(self):
86
	def homedir(self):
95
		subdir = ''
96
		if configRegistry.is_true('ucsschool/import/roleshare', True):
87
		if configRegistry.is_true('ucsschool/import/roleshare', True):
97
			if self.is_student():
88
			subdir = self.user_type(school=self.school, name=self.username).get_roleshare_home_subdir()
98
				subdir = os.path.join(self.school, 'schueler')
89
		else:
99
			elif self.is_teacher():
90
			subdir = ''
100
				subdir = os.path.join(self.school, 'lehrer')
101
			elif self.is_teacher_staff():
102
				subdir = os.path.join(self.school, 'lehrer')
103
			elif self.is_staff():
104
				subdir = os.path.join(self.school, 'mitarbeiter')
105
		return os.path.join('/home', subdir, self.username)
91
		return os.path.join('/home', subdir, self.username)
106
92
107
	def make_school_base(self):
93
	def make_school_base(self):
 Lines 340-354    Link Here 
340
326
341
		for school, classes in self.school_classes.iteritems():
327
		for school, classes in self.school_classes.iteritems():
342
			for cl in classes:
328
			for cl in classes:
343
				cl_group_dn = 'cn=%s,cn=klassen,cn=%s,cn=groups,%s' % (cl, cn_pupils, get_school_base(school))
329
				cl_group_dn = SchoolClassLib(school=school, name=cl).dn
344
				utils.verify_ldap_object(cl_group_dn, expected_attr={'uniqueMember': [self.dn], 'memberUid': [self.username]}, strict=False, should_exist=True)
330
				utils.verify_ldap_object(cl_group_dn, expected_attr={'uniqueMember': [self.dn], 'memberUid': [self.username]}, strict=False, should_exist=True)
345
331
346
		assert self.school in self.schools
332
		assert self.school in self.schools
347
333
348
		for school in self.schools:
334
		utils.verify_ldap_object(self.role_group_dn, expected_attr={'uniqueMember': [self.dn], 'memberUid': [self.username]}, strict=False, should_exist=True)
349
			role_group_dn = 'cn=%s%s,cn=groups,%s' % (self.grp_prefix, school, get_school_base(school))
350
			utils.verify_ldap_object(role_group_dn, expected_attr={'uniqueMember': [self.dn], 'memberUid': [self.username]}, strict=False, should_exist=True)
351
352
		print 'person OK: %s' % self.username
335
		print 'person OK: %s' % self.username
353
336
354
337
 Lines 695-710    Link Here 
695
		'name': name,
678
		'name': name,
696
		'service': 'Windows Profile Server',
679
		'service': 'Windows Profile Server',
697
	}
680
	}
698
	school_base = get_school_base(ou)
681
	udm.create_object('computers/memberserver', position=SchoolComputerLib.get_container(ou), **properties)
699
682
700
	udm.create_object('computers/memberserver', position=school_base, **properties)
701
683
702
684
def create_home_server(udm, ou, name):
703
def create_home_server(udm, name):
704
	properties = {
685
	properties = {
705
		'name': name,
686
		'name': name,
706
	}
687
	}
707
	udm.create_object('computers/memberserver', **properties)
688
	udm.create_object('computers/memberserver', position=SchoolComputerLib.get_container(ou), **properties)
708
689
709
690
710
def import_users_basics(use_cli_api=True, use_python_api=False):
691
def import_users_basics(use_cli_api=True, use_python_api=False):
 Lines 729-735    Link Here 
729
710
730
						if home_server_at_ou:
711
						if home_server_at_ou:
731
							home_server_at_ou = uts.random_name()
712
							home_server_at_ou = uts.random_name()
732
							create_home_server(udm, home_server_at_ou)
713
							create_home_server(udm, school_name, home_server_at_ou)
733
							create_ou_cli(school_name, sharefileserver=home_server_at_ou)
714
							create_ou_cli(school_name, sharefileserver=home_server_at_ou)
734
						else:
715
						else:
735
							create_ou_cli(school_name)
716
							create_ou_cli(school_name)
(-)ucs-test-ucsschool/90_ucsschool/essential/internetrule.py (-1 / +2 lines)
 Lines 15-20    Link Here 
15
import univention.testing.utils as utils
15
import univention.testing.utils as utils
16
from univention.testing.ucsschool import UCSTestSchool
16
from univention.testing.ucsschool import UCSTestSchool
17
import univention.testing.ucsschool as utu
17
import univention.testing.ucsschool as utu
18
from ucsschool.lib.models import SchoolClass as SchoolClassLib
18
19
19
20
20
class InternetRule(object):
21
class InternetRule(object):
 Lines 193-199    Link Here 
193
			ucsschool = UCSTestSchool()
194
			ucsschool = UCSTestSchool()
194
			groupdn = ucsschool.get_workinggroup_dn(school, groupName)
195
			groupdn = ucsschool.get_workinggroup_dn(school, groupName)
195
		elif groupType == 'class':
196
		elif groupType == 'class':
196
			groupdn = 'cn=%s-%s,cn=klassen,cn=schueler,cn=groups,%s' % (school, groupName, school_basedn)
197
			groupdn = SchoolClassLib(school=schoolenv.name, name="{}-{}".format(school, groupName)).dn
197
198
198
		if default:
199
		if default:
199
			name = '$default$'
200
			name = '$default$'
(-)ucs-test-ucsschool/90_ucsschool/essential/klasse.py (-3 / +2 lines)
 Lines 9-14    Link Here 
9
from univention.testing.umc2 import Client
9
from univention.testing.umc2 import Client
10
import univention.testing.ucr as ucr_test
10
import univention.testing.ucr as ucr_test
11
from univention.testing.ucsschool import UCSTestSchool
11
from univention.testing.ucsschool import UCSTestSchool
12
from ucsschool.lib.models import SchoolClass as SchoolClassLib
12
13
13
14
14
class GetFail(Exception):
15
class GetFail(Exception):
 Lines 121-129    Link Here 
121
					k, classes_names))
122
					k, classes_names))
122
123
123
	def dn(self):
124
	def dn(self):
124
		return 'cn=%s-%s,cn=klassen,cn=schueler,cn=groups,%s' % (
125
		return SchoolClassLib(school=self.school, name="{}-{}".format(self.school, self.name)).dn
125
			self.school, self.name, UCSTestSchool().get_ou_base_dn(self.school)
126
		)
127
126
128
	def get(self):
127
	def get(self):
129
		"""Get class"""
128
		"""Get class"""
(-)ucs-test-ucsschool/90_ucsschool/essential/school.py (-43 / +43 lines)
 Lines 4-9    Link Here 
4
4
5
.. moduleauthor:: Ammar Najjar <najjar@univention.de>
5
.. moduleauthor:: Ammar Najjar <najjar@univention.de>
6
"""
6
"""
7
import ldap
7
from essential.importcomputers import random_ip
8
from essential.importcomputers import random_ip
8
from essential.importou import DCNotFound, DCMembership, DhcpdLDAPBase, TYPE_DC_ADMINISTRATIVE
9
from essential.importou import DCNotFound, DCMembership, DhcpdLDAPBase, TYPE_DC_ADMINISTRATIVE
9
from essential.importou import get_ou_base, verify_dc, get_school_ou_from_dn, TYPE_DC_EDUCATIONAL
10
from essential.importou import get_ou_base, verify_dc, get_school_ou_from_dn, TYPE_DC_EDUCATIONAL
 Lines 13-18    Link Here 
13
import univention.testing.ucr as ucr_test
14
import univention.testing.ucr as ucr_test
14
import univention.testing.utils as utils
15
import univention.testing.utils as utils
15
import univention.uldap
16
import univention.uldap
17
from ucsschool.lib.models import (School as LibSchool, ComputerRoom as LibComputerRoom, SchoolClass as LibSchoolClass,
18
	Staff as LibStaff, TeachersAndStaff as LibTeachersAndStaff, Teacher as LibTeacher, Student as LibStudent)
16
19
17
20
18
class GetFail(Exception):
21
class GetFail(Exception):
 Lines 251-262    Link Here 
251
		old_dhcpd_ldap_base = ucr.get('dhcpd/ldap/base')
254
		old_dhcpd_ldap_base = ucr.get('dhcpd/ldap/base')
252
		lo = univention.uldap.getMachineConnection()
255
		lo = univention.uldap.getMachineConnection()
253
		base_dn = ucr.get('ldap/base')
256
		base_dn = ucr.get('ldap/base')
257
		search_base = LibSchool.get_search_base(ou)
254
258
255
		cn_pupils = ucr.get('ucsschool/ldap/default/container/pupils', 'schueler')
259
		cn_pupils = ldap.explode_dn(LibStudent.get_container(ou), True)[0]
256
		cn_teachers = ucr.get('ucsschool/ldap/default/container/teachers', 'lehrer')
260
		cn_teachers = ldap.explode_dn(LibTeacher.get_container(ou), True)[0]
257
		cn_teachers_staff = ucr.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter')
261
		cn_teachers_staff = ldap.explode_dn(LibTeachersAndStaff.get_container(ou), True)[0]
258
		cn_admins = ucr.get('ucsschool/ldap/default/container/admins', 'admins')
262
		cn_admins = ldap.explode_dn(search_base.admins, True)[0]
259
		cn_staff = ucr.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
263
		cn_staff = ldap.explode_dn(LibStaff.get_container(ou), True)[0]
264
		cn_class = ldap.explode_dn(LibSchoolClass.get_container(ou), True)[0]
265
		cn_rooms = ldap.explode_dn(LibComputerRoom.get_container(ou), True)[0]
260
266
261
		singlemaster = ucr.is_true('ucsschool/singlemaster')
267
		singlemaster = ucr.is_true('ucsschool/singlemaster')
262
		noneducational_create_objects = ucr.is_true('ucsschool/ldap/noneducational/create/objects')
268
		noneducational_create_objects = ucr.is_true('ucsschool/ldap/noneducational/create/objects')
 Lines 290-332    Link Here 
290
296
291
		utils.verify_ldap_object(ou_base, expected_attr={'ou': [ou], 'ucsschoolClassShareFileServer': [classsharefileserver_dn], 'ucsschoolHomeShareFileServer': [homesharefileserver_dn]}, should_exist=must_exist)
297
		utils.verify_ldap_object(ou_base, expected_attr={'ou': [ou], 'ucsschoolClassShareFileServer': [classsharefileserver_dn], 'ucsschoolHomeShareFileServer': [homesharefileserver_dn]}, should_exist=must_exist)
292
298
293
		utils.verify_ldap_object('cn=printers,%s' % ou_base, expected_attr={'cn': ['printers']}, should_exist=must_exist)
299
		utils.verify_ldap_object(search_base.printers, expected_attr={'cn': ['printers']}, should_exist=must_exist)
294
		utils.verify_ldap_object('cn=users,%s' % ou_base, expected_attr={'cn': ['users']}, should_exist=must_exist)
300
		utils.verify_ldap_object(search_base.users, expected_attr={'cn': ['users']}, should_exist=must_exist)
295
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_pupils, ou_base), expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
301
		utils.verify_ldap_object(search_base.students, expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
296
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_teachers, ou_base), expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
302
		utils.verify_ldap_object(search_base.teachers, expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
297
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_admins, ou_base), expected_attr={'cn': [cn_admins]}, should_exist=must_exist)
303
		utils.verify_ldap_object(search_base.admins, expected_attr={'cn': [cn_admins]}, should_exist=must_exist)
298
		utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_admins, ou_base), expected_attr={'cn': [cn_admins]}, should_exist=must_exist)
299
304
300
		utils.verify_ldap_object('cn=computers,%s' % ou_base, expected_attr={'cn': ['computers']}, should_exist=must_exist)
305
		utils.verify_ldap_object(search_base.computers, expected_attr={'cn': ['computers']}, should_exist=must_exist)
301
		utils.verify_ldap_object('cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['server']}, should_exist=must_exist)
306
		utils.verify_ldap_object('cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['server']}, should_exist=must_exist)
302
		utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
307
		utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
303
		utils.verify_ldap_object('cn=networks,%s' % ou_base, expected_attr={'cn': ['networks']}, should_exist=must_exist)
308
		utils.verify_ldap_object(search_base.networks, expected_attr={'cn': ['networks']}, should_exist=must_exist)
304
		utils.verify_ldap_object('cn=groups,%s' % ou_base, expected_attr={'cn': ['groups']}, should_exist=must_exist)
309
		utils.verify_ldap_object(search_base.groups, expected_attr={'cn': ['groups']}, should_exist=must_exist)
305
		utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_pupils, ou_base), expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
310
		utils.verify_ldap_object(search_base.workgroups, expected_attr={'cn': [cn_pupils]}, should_exist=must_exist)
306
		utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_teachers, ou_base), expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
311
		utils.verify_ldap_object(search_base.teachers_group, expected_attr={'cn': [cn_teachers]}, should_exist=must_exist)
307
		utils.verify_ldap_object('cn=klassen,cn=%s,cn=groups,%s' % (cn_pupils, ou_base), expected_attr={'cn': ['klassen']}, should_exist=must_exist)
312
		utils.verify_ldap_object(search_base.classes, expected_attr={'cn': [cn_class]}, should_exist=must_exist)
308
		utils.verify_ldap_object('cn=raeume,cn=groups,%s' % ou_base, expected_attr={'cn': ['raeume']}, should_exist=must_exist)
313
		utils.verify_ldap_object(search_base.rooms, expected_attr={'cn': [cn_rooms]}, should_exist=must_exist)
309
314
310
		utils.verify_ldap_object('cn=dhcp,%s' % ou_base, expected_attr={'cn': ['dhcp']}, should_exist=must_exist)
315
		utils.verify_ldap_object(search_base.dhcp, expected_attr={'cn': ['dhcp']}, should_exist=must_exist)
311
		utils.verify_ldap_object('cn=policies,%s' % ou_base, expected_attr={'cn': ['policies']}, should_exist=must_exist)
316
		utils.verify_ldap_object(search_base.policies, expected_attr={'cn': ['policies']}, should_exist=must_exist)
312
		utils.verify_ldap_object('cn=shares,%s' % ou_base, expected_attr={'cn': ['shares']}, should_exist=must_exist)
317
		utils.verify_ldap_object(search_base.shares, expected_attr={'cn': ['shares']}, should_exist=must_exist)
313
		utils.verify_ldap_object('cn=klassen,cn=shares,%s' % ou_base, expected_attr={'cn': ['klassen']}, should_exist=must_exist)
318
		utils.verify_ldap_object(search_base.classShares, expected_attr={'cn': [cn_class]}, should_exist=must_exist)
314
		utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
319
		utils.verify_ldap_object('cn=dc,cn=server,cn=computers,%s' % ou_base, expected_attr={'cn': ['dc']}, should_exist=must_exist)
315
320
316
		if noneducational_create_objects:
321
		if noneducational_create_objects:
317
			utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_staff, ou_base), should_exist=must_exist)
322
			utils.verify_ldap_object(search_base.staff, should_exist=must_exist)
318
			utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_teachers_staff, ou_base), should_exist=must_exist)
323
			utils.verify_ldap_object(search_base.teachersAndStaff, should_exist=must_exist)
319
			utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_staff, ou_base), should_exist=must_exist)
324
			utils.verify_ldap_object(search_base.staff_group, should_exist=must_exist)
320
		else:
325
		else:
321
			utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_staff, ou_base), should_exist=False)
326
			utils.verify_ldap_object(search_base.staff, should_exist=False)
322
			utils.verify_ldap_object('cn=%s,cn=users,%s' % (cn_teachers_staff, ou_base), should_exist=False)
327
			utils.verify_ldap_object(search_base.teachersAndStaff, should_exist=False)
323
			utils.verify_ldap_object('cn=%s,cn=groups,%s' % (cn_staff, ou_base), should_exist=False)
328
			utils.verify_ldap_object(search_base.staff_group, should_exist=False)
324
329
325
		if noneducational_create_objects:
330
		if noneducational_create_objects:
326
			utils.verify_ldap_object('cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % base_dn, should_exist=True)
331
			utils.verify_ldap_object(search_base.administrative_dc_group, should_exist=True)
327
			utils.verify_ldap_object('cn=Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % base_dn, should_exist=True)
332
			utils.verify_ldap_object(search_base.administrative_member_group, should_exist=True)
328
			utils.verify_ldap_object('cn=OU%s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn), should_exist=True)
333
			utils.verify_ldap_object(search_base.administrative_ou_dc_group)
329
			utils.verify_ldap_object('cn=OU%s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%s' % (ou, base_dn), should_exist=True)
334
			utils.verify_ldap_object(search_base.administrative_ou_member_group)
330
		# This will fail because we don't cleanup these groups in cleanup_ou
335
		# This will fail because we don't cleanup these groups in cleanup_ou
331
		# else:
336
		# else:
332
		#	utils.verify_ldap_object("cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % base_dn, should_exist=False)
337
		#	utils.verify_ldap_object("cn=DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%s" % base_dn, should_exist=False)
 Lines 340-361    Link Here 
340
		if dc_administrative:
345
		if dc_administrative:
341
			verify_dc(ou, dc_administrative, TYPE_DC_ADMINISTRATIVE, base_dn, must_exist)
346
			verify_dc(ou, dc_administrative, TYPE_DC_ADMINISTRATIVE, base_dn, must_exist)
342
347
343
		grp_prefix_pupils = ucr.get('ucsschool/ldap/default/groupprefix/pupils', 'schueler-')
344
		grp_prefix_teachers = ucr.get('ucsschool/ldap/default/groupprefix/teachers', 'lehrer-')
345
		grp_prefix_admins = ucr.get('ucsschool/ldap/default/groupprefix/admins', 'admins-')
346
		grp_prefix_staff = ucr.get('ucsschool/ldap/default/groupprefix/staff', 'mitarbeiter-')
347
348
		grp_policy_pupils = ucr.get('ucsschool/ldap/default/policy/umc/pupils', 'cn=ucsschool-umc-pupils-default,cn=UMC,cn=policies,%s' % base_dn)
348
		grp_policy_pupils = ucr.get('ucsschool/ldap/default/policy/umc/pupils', 'cn=ucsschool-umc-pupils-default,cn=UMC,cn=policies,%s' % base_dn)
349
		grp_policy_teachers = ucr.get('ucsschool/ldap/default/policy/umc/teachers', 'cn=ucsschool-umc-teachers-default,cn=UMC,cn=policies,%s' % base_dn)
349
		grp_policy_teachers = ucr.get('ucsschool/ldap/default/policy/umc/teachers', 'cn=ucsschool-umc-teachers-default,cn=UMC,cn=policies,%s' % base_dn)
350
		grp_policy_admins = ucr.get('ucsschool/ldap/default/policy/umc/admins', 'cn=ucsschool-umc-admins-default,cn=UMC,cn=policies,%s' % base_dn)
350
		grp_policy_admins = ucr.get('ucsschool/ldap/default/policy/umc/admins', 'cn=ucsschool-umc-admins-default,cn=UMC,cn=policies,%s' % base_dn)
351
		grp_policy_staff = ucr.get('ucsschool/ldap/default/policy/umc/staff', 'cn=ucsschool-umc-staff-default,cn=UMC,cn=policies,%s' % base_dn)
351
		grp_policy_staff = ucr.get('ucsschool/ldap/default/policy/umc/staff', 'cn=ucsschool-umc-staff-default,cn=UMC,cn=policies,%s' % base_dn)
352
352
353
		utils.verify_ldap_object("cn=%s%s,cn=ouadmins,cn=groups,%s" % (grp_prefix_admins, ou, base_dn), expected_attr={'univentionPolicyReference': [grp_policy_admins]}, should_exist=True)
353
		utils.verify_ldap_object(search_base.admin_group, expected_attr={'univentionPolicyReference': [grp_policy_admins]}, should_exist=True)
354
		utils.verify_ldap_object("cn=%s%s,cn=groups,%s" % (grp_prefix_pupils, ou, ou_base), expected_attr={'univentionPolicyReference': [grp_policy_pupils]}, should_exist=must_exist)
354
		utils.verify_ldap_object(search_base.students_ou_group, expected_attr={'univentionPolicyReference': [grp_policy_pupils]}, should_exist=must_exist)
355
		utils.verify_ldap_object("cn=%s%s,cn=groups,%s" % (grp_prefix_teachers, ou, ou_base), expected_attr={'univentionPolicyReference': [grp_policy_teachers]}, should_exist=must_exist)
355
		utils.verify_ldap_object(search_base.teachers_ou_group, expected_attr={'univentionPolicyReference': [grp_policy_teachers]}, should_exist=must_exist)
356
356
357
		if noneducational_create_objects:
357
		if noneducational_create_objects:
358
			utils.verify_ldap_object("cn=%s%s,cn=groups,%s" % (grp_prefix_staff, ou, ou_base), expected_attr={'univentionPolicyReference': [grp_policy_staff]}, should_exist=must_exist)
358
			utils.verify_ldap_object(search_base.staff_ou_group, expected_attr={'univentionPolicyReference': [grp_policy_staff]}, should_exist=must_exist)
359
359
360
		dcmaster_module = univention.admin.modules.get("computers/domaincontroller_master")
360
		dcmaster_module = univention.admin.modules.get("computers/domaincontroller_master")
361
		dcbackup_module = univention.admin.modules.get("computers/domaincontroller_backup")
361
		dcbackup_module = univention.admin.modules.get("computers/domaincontroller_backup")
 Lines 368-374    Link Here 
368
		# check group membership
368
		# check group membership
369
		#  slave should be member
369
		#  slave should be member
370
		#  master and backup should not be member
370
		#  master and backup should not be member
371
		dcgroups = ["cn=OU%s-DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (ou, base_dn), "cn=DC-Edukativnetz,cn=ucsschool,cn=groups,%s" % (base_dn)]
371
		dcgroups = [search_base.educational_ou_dc_group, search_base.educational_dc_group]
372
372
373
		if must_exist:
373
		if must_exist:
374
			if masterobjs:
374
			if masterobjs:
 Lines 412-418    Link Here 
412
				# seems to be the first OU, so check the variable settings
412
				# seems to be the first OU, so check the variable settings
413
				if ucr.get('dhcpd/ldap/base') != "cn=dhcp,%s" % (ou_base,):
413
				if ucr.get('dhcpd/ldap/base') != "cn=dhcp,%s" % (ou_base,):
414
					print 'ERROR: dhcpd/ldap/base =', ucr.get('dhcpd/ldap/base')
414
					print 'ERROR: dhcpd/ldap/base =', ucr.get('dhcpd/ldap/base')
415
					print 'ERROR: expected base =', dhcp_dn
415
					print 'ERROR: expected base =', dhcp_dn  # FIXME: unresolve reference: dhcp_dn
416
					raise DhcpdLDAPBase()
416
					raise DhcpdLDAPBase()
417
417
418
			# use the UCR value and check if the DHCP service exists
418
			# use the UCR value and check if the DHCP service exists
(-)ucs-test-ucsschool/90_ucsschool/essential/schoolroom.py (-1 / +2 lines)
 Lines 3-8    Link Here 
3
import univention.testing.ucr as ucr_test
3
import univention.testing.ucr as ucr_test
4
import univention.testing.ucsschool as utu
4
import univention.testing.ucsschool as utu
5
import univention.testing.utils as utils
5
import univention.testing.utils as utils
6
from ucsschool.lib.models import LibComputerRoom
6
7
7
8
8
class FailQuery(Exception):
9
class FailQuery(Exception):
 Lines 49-55    Link Here 
49
		self.client = Client.get_test_connection()
50
		self.client = Client.get_test_connection()
50
51
51
	def dn(self):
52
	def dn(self):
52
		return 'cn=%s-%s,cn=raeume,cn=groups,%s' % (self.school, self.name, utu.UCSTestSchool().get_ou_base_dn(self.school))
53
		return LibComputerRoom(school="myschool", name='{}-{}'.format("myschool", "myname")).dn
53
54
54
	def add(self, should_pass=True):
55
	def add(self, should_pass=True):
55
		param = [{
56
		param = [{
(-)ucs-test-ucsschool/univention/testing/ucsschool.py (-24 / +18 lines)
 Lines 53-59    Link Here 
53
import univention.admin.uldap as udm_uldap
53
import univention.admin.uldap as udm_uldap
54
import univention.admin.uexceptions as udm_errors
54
import univention.admin.uexceptions as udm_errors
55
55
56
from ucsschool.lib.models import School, User, Student, Teacher, TeachersAndStaff, Staff, SchoolClass, WorkGroup
56
from ucsschool.lib.models import School, User, Student, Teacher, TeachersAndStaff, Staff, SchoolClass, WorkGroup, Share
57
from ucsschool.lib.models.utils import add_stream_logger_to_schoollib
57
from ucsschool.lib.models.utils import add_stream_logger_to_schoollib
58
from ucsschool.lib.models.group import ComputerRoom
58
from ucsschool.lib.models.group import ComputerRoom
59
59
 Lines 83-93    Link Here 
83
	PATH_CMD_CREATE_OU = PATH_CMD_BASE + '/create_ou'
83
	PATH_CMD_CREATE_OU = PATH_CMD_BASE + '/create_ou'
84
84
85
	PATH_CMD_IMPORT_USER = PATH_CMD_BASE + '/import_user'
85
	PATH_CMD_IMPORT_USER = PATH_CMD_BASE + '/import_user'
86
	CN_STUDENT = _ucr.get('ucsschool/ldap/default/container/pupils', 'schueler')
87
	CN_TEACHERS = _ucr.get('ucsschool/ldap/default/container/teachers', 'lehrer')
88
	CN_TEACHERS_STAFF = _ucr.get('ucsschool/ldap/default/container/teachers-and-staff', 'lehrer und mitarbeiter')
89
	CN_ADMINS = _ucr.get('ucsschool/ldap/default/container/admins', 'admins')
90
	CN_STAFF = _ucr.get('ucsschool/ldap/default/container/staff', 'mitarbeiter')
91
86
92
	def __init__(self):
87
	def __init__(self):
93
		self._cleanup_ou_names = set()
88
		self._cleanup_ou_names = set()
 Lines 189-203    Link Here 
189
		print ''
184
		print ''
190
		print '*** Purging OU %s and related objects' % ou_name
185
		print '*** Purging OU %s and related objects' % ou_name
191
		# remove OU specific groups
186
		# remove OU specific groups
187
		search_base = School.get_search_base(ou_name)
192
		for grpdn in (
188
		for grpdn in (
193
			'cn=OU%(ou)s-Member-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s',
189
				search_base.administrative_ou_member_group,
194
			'cn=OU%(ou)s-Member-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s',
190
				search_base.educational_ou_member_group,
195
			'cn=OU%(ou)s-Klassenarbeit,cn=ucsschool,cn=groups,%(basedn)s',
191
				search_base.examGroup,
196
			'cn=OU%(ou)s-DC-Verwaltungsnetz,cn=ucsschool,cn=groups,%(basedn)s',
192
				search_base.administrative_ou_dc_group,
197
			'cn=OU%(ou)s-DC-Edukativnetz,cn=ucsschool,cn=groups,%(basedn)s',
193
				search_base.educational_ou_dc_group,
198
			'cn=admins-%(ou)s,cn=ouadmins,cn=groups,%(basedn)s',
194
				search_base.admin_group):
199
		):
200
			grpdn = grpdn % {'ou': ou_name, 'basedn': self._ucr.get('ldap/base')}
201
			self._remove_udm_object('groups/group', grpdn)
195
			self._remove_udm_object('groups/group', grpdn)
202
196
203
		# remove OU recursively
197
		# remove OU recursively
 Lines 310-333    Link Here 
310
		Returns user container for specified user role and ou_name.
304
		Returns user container for specified user role and ou_name.
311
		"""
305
		"""
312
		if is_teacher and is_staff:
306
		if is_teacher and is_staff:
313
			return 'cn=%s,cn=users,%s' % (self.CN_TEACHERS_STAFF, self.get_ou_base_dn(ou_name))
307
			return TeachersAndStaff.get_container(ou_name)
314
		if is_teacher:
308
		if is_teacher:
315
			return 'cn=%s,cn=users,%s' % (self.CN_TEACHERS, self.get_ou_base_dn(ou_name))
309
			return Teacher.get_container(ou_name)
316
		if is_staff:
310
		if is_staff:
317
			return 'cn=%s,cn=users,%s' % (self.CN_STAFF, self.get_ou_base_dn(ou_name))
311
			return Staff.get_container(ou_name)
318
		return 'cn=%s,cn=users,%s' % (self.CN_STUDENT, self.get_ou_base_dn(ou_name))
312
		return Student.get_container(ou_name)
319
313
320
	def get_workinggroup_dn(self, ou_name, group_name):
314
	def get_workinggroup_dn(self, ou_name, group_name):
321
		"""
315
		"""
322
		Return the DN of the specified working group.
316
		Return the DN of the specified working group.
323
		"""
317
		"""
324
		return 'cn=%s-%s,cn=schueler,cn=groups,%s' % (ou_name, group_name, self.get_ou_base_dn(ou_name))
318
		return WorkGroup(school=ou_name, name="{}-{}".format(ou_name, group_name)).dn
325
319
326
	def get_workinggroup_share_dn(self, ou_name, group_name):
320
	def get_workinggroup_share_dn(self, ou_name, group_name):
327
		"""
321
		"""
328
		Return the DN of the share object for the specified working group.
322
		Return the DN of the share object for the specified working group.
329
		"""
323
		"""
330
		return 'cn=%s-%s,cn=shares,%s' % (ou_name, group_name, self.get_ou_base_dn(ou_name))
324
		return Share(school=ou_name, name="{}-{}".format(ou_name, group_name)).dn
331
325
332
	def create_teacher(self, *args, **kwargs):
326
	def create_teacher(self, *args, **kwargs):
333
		return self.create_user(*args, is_teacher=True, is_staff=False, **kwargs)
327
		return self.create_user(*args, is_teacher=True, is_staff=False, **kwargs)
 Lines 457-463    Link Here 
457
		return school_admin, dn
451
		return school_admin, dn
458
452
459
	def create_domain_admin(self, ou_name, username=None, password='univention'):
453
	def create_domain_admin(self, ou_name, username=None, password='univention'):
460
		position = 'cn=admins,cn=users,%s' % (self.get_ou_base_dn(ou_name))
454
		search_base = School.get_search_base(ou_name)
455
		position = search_base.admins
461
		groups = ["cn=Domain Admins,cn=groups,%s" % (self.LDAP_BASE,)]
456
		groups = ["cn=Domain Admins,cn=groups,%s" % (self.LDAP_BASE,)]
462
		udm = udm_test.UCSTestUDM()
457
		udm = udm_test.UCSTestUDM()
463
		if username is None:
458
		if username is None:
 Lines 487-493    Link Here 
487
			class_name = uts.random_username()
482
			class_name = uts.random_username()
488
		if not class_name.startswith('{}-'.format(ou_name)):
483
		if not class_name.startswith('{}-'.format(ou_name)):
489
			class_name = '{}-{}'.format(ou_name, class_name)
484
			class_name = '{}-{}'.format(ou_name, class_name)
490
		grp_dn = 'cn={},cn=klassen,cn=schueler,cn=groups,ou={},{}'.format(class_name, ou_name, self.LDAP_BASE)
485
		grp_dn = SchoolClass(school=ou_name, name=class_name).dn
491
		kwargs = {
486
		kwargs = {
492
			'school': ou_name,
487
			'school': ou_name,
493
			'name': class_name,
488
			'name': class_name,
 Lines 516-522    Link Here 
516
			workgroup_name = uts.random_username()
511
			workgroup_name = uts.random_username()
517
		if not workgroup_name.startswith('{}-'.format(ou_name)):
512
		if not workgroup_name.startswith('{}-'.format(ou_name)):
518
			workgroup_name = '{}-{}'.format(ou_name, workgroup_name)
513
			workgroup_name = '{}-{}'.format(ou_name, workgroup_name)
519
		grp_dn = 'cn={},cn=schueler,cn=groups,ou={},{}'.format(workgroup_name, ou_name, self.LDAP_BASE)
520
		kwargs = {
514
		kwargs = {
521
			'school': ou_name,
515
			'school': ou_name,
522
			'name': workgroup_name,
516
			'name': workgroup_name,
 Lines 533-539    Link Here 
533
		if wait_for_replication:
527
		if wait_for_replication:
534
			utils.wait_for_replication()
528
			utils.wait_for_replication()
535
529
536
		return workgroup_name, grp_dn
530
		return workgroup_name, WorkGroup(**kwargs).dn
537
531
538
	def create_computerroom(self, ou_name, name=None, description=None, host_members=None, wait_for_replication=True):
532
	def create_computerroom(self, ou_name, name=None, description=None, host_members=None, wait_for_replication=True):
539
		"""
533
		"""
(-)univention-management-console-module-selective-udm/umc/python/selective-udm/__init__.py (-1 / +2 lines)
 Lines 48-53    Link Here 
48
from univention.management.console.modules.sanitizers import StringSanitizer
48
from univention.management.console.modules.sanitizers import StringSanitizer
49
from univention.management.console.modules.decorators import sanitize
49
from univention.management.console.modules.decorators import sanitize
50
from ucsschool.lib.schoolldap import LDAP_Connection, SchoolBaseModule, ADMIN_WRITE, USER_READ
50
from ucsschool.lib.schoolldap import LDAP_Connection, SchoolBaseModule, ADMIN_WRITE, USER_READ
51
from ucsschool.lib.models import SchoolComputer
51
52
52
from univention.management.console.config import ucr
53
from univention.management.console.config import ucr
53
54
 Lines 89-95    Link Here 
89
			raise UMC_Error(_('Could not determine schoolOU.'))
90
			raise UMC_Error(_('Could not determine schoolOU.'))
90
91
91
		# Set new position
92
		# Set new position
92
		ldap_position.setDn(search_base.computers)
93
		ldap_position.setDn(SchoolComputer.get_container(search_base.school))
93
94
94
		self._check_usersid_join_permissions(ldap_user_read, request.options.get('usersid'))
95
		self._check_usersid_join_permissions(ldap_user_read, request.options.get('usersid'))
95
96

Return to bug 41231