dbxapp 4.1.3
CMS, Shop, Workflows und modulare Geschäftsanwendungen
Loading...
Searching...
No Matches
dbxUser_password_change_test.php
Go to the documentation of this file.
1<?php
2
3define('dbxSystem', 'dbxWebApp');
4define('dbxRunAsAdmin', 1);
5
6require_once dirname(__DIR__, 3) . '/vendor/autoload.php';
7require_once dirname(__DIR__, 3) . '/include/dbxKernel.php';
8require_once dirname(__DIR__) . '/include/dbxUser.class.php';
9
10$class = new ReflectionClass('dbx\\dbxAdmin\\dbxUser');
11$user = $class->newInstanceWithoutConstructor();
12$validate = $class->getMethod('validate_password_change');
13$texts = new class {
14 private array $messages = array(
15 'password_required' => 'Bitte ein neues Passwort eingeben.',
16 'password_repeat_required' => 'Bitte das neue Passwort wiederholen.',
17 'password_mismatch' => 'Die Passwoerter stimmen nicht ueberein.',
18 'password_too_short' => 'Das Passwort muss mindestens 6 Zeichen lang sein.',
19 'settings_empty' => 'Leer',
20 'option_yes' => 'Ja',
21 'option_no' => 'Nein',
22 'settings_not_set' => 'Nicht gesetzt',
23 'settings_entries' => '{count} Einträge',
24 'settings_invalid' => 'Ungültig',
25 'settings_email_confirmed' => 'E-Mail bestätigt',
26 'settings_link_expired' => 'Bestätigungslink abgelaufen',
27 'settings_confirmation_pending' => 'Bestätigung ausstehend',
28 'settings_no_confirmation' => 'Keine Bestätigung',
29 'settings_registration_status' => 'Registrierung',
30 'settings_mail_sent' => 'E-Mail versendet',
31 'settings_link_valid_until' => 'Link gültig bis',
32 'settings_password_change' => 'Passwortwechsel erforderlich',
33 'settings_protected' => 'Geschützt',
34 'settings_security_hint' => 'Sicherheitswerte werden nicht angezeigt.',
35 );
36
37 public function get_fd_message(string $key): string {
38 return $this->messages[$key] ?? $key;
39 }
40
41 public function format_fd_message(string $key, array $values): string {
42 $message = $this->get_fd_message($key);
43 foreach ($values as $name => $value) {
44 $message = str_replace('{' . $name . '}', (string)$value, $message);
45 }
46 return $message;
47 }
48};
49
50$cases = array(
51 array(false, '', '', false, '', ''),
52 array(true, '', '', false, 'password_new', 'Bitte ein neues Passwort eingeben.'),
53 array(false, 'abcdef', '', false, 'password_new2', 'Bitte das neue Passwort wiederholen.'),
54 array(false, 'abcdef', 'abcdeg', false, 'password_new2', 'Die Passwoerter stimmen nicht ueberein.'),
55 array(false, 'abc', 'abc', false, 'password_new', 'Das Passwort muss mindestens 6 Zeichen lang sein.'),
56 array(false, 'Sicher-123', 'Sicher-123', true, '', ''),
57 array(true, 'Sicher-123', 'Sicher-123', true, '', ''),
58);
59
60foreach ($cases as $index => $case) {
61 [$isNew, $password, $repeat, $change, $field, $message] = $case;
62 $result = $validate->invoke($user, $isNew, $password, $repeat, $texts);
63 if (($result['change'] ?? null) !== $change
64 || ($result['field'] ?? null) !== $field
65 || ($result['message'] ?? null) !== $message) {
66 fwrite(STDERR, 'FAIL: Passwortpruefung Fall ' . ($index + 1) . PHP_EOL);
67 exit(1);
68 }
69}
70
71$settingsAfterChange = $class->getMethod('settings_after_password_change');
72$changedSettings = json_decode(
74 $user,
75 json_encode(array(
76 'password_reset_required' => 1,
77 'dashboard_layout' => 'compact',
78 ))
79 ),
80 true
81);
82if (!is_array($changedSettings)
83 || isset($changedSettings['password_reset_required'])
84 || ($changedSettings['dashboard_layout'] ?? '') !== 'compact'
85 || empty($changedSettings['password_changed_at'])) {
86 fwrite(STDERR, "FAIL: Ein geändertes Passwort muss die Installationswarnung dauerhaft aufheben.\n");
87 exit(5);
88}
89
90$template = file_get_contents(dirname(__DIR__) . '/tpl/htm/form-admin-user.htm');
91$profilePos = strpos((string)$template, '>Profil<');
92$passwordPos = strpos((string)$template, '{obj:password_new}');
93$repeatPos = strpos((string)$template, '{obj:password_new2}');
94$contactPos = strpos((string)$template, '>Kontakt<');
95if ($profilePos === false || $passwordPos === false || $repeatPos === false || $contactPos === false
97 || substr_count((string)$template, '{obj:password_new}') !== 1
98 || substr_count((string)$template, '{obj:password_new2}') !== 1) {
99 fwrite(STDERR, "FAIL: Beide Passwortfelder muessen einmalig im rechten Profil-Block stehen.\n");
100 exit(2);
101}
102
103if (strpos((string)$template, '{obj:settings_view}') === false
104 || strpos((string)$template, '{obj:settings}') !== false) {
105 fwrite(STDERR, "FAIL: Einstellungen muessen strukturiert statt als JSON-Feld ausgegeben werden.\n");
106 exit(3);
107}
108
109$settingsView = $class->getMethod('user_settings_view');
111 'is_confirm' => 0,
112 'settings' => json_encode(array(
113 'register_confirm' => array(
114 'token_hash' => 'DARF-NICHT-SICHTBAR-SEIN',
115 'expires' => time() - 60,
116 'sent' => '2026-05-29 17:10:56',
117 ),
118 'password_reset_required' => 1,
119 'theme' => 'dunkel',
120 'api_secret' => 'DARF-AUCH-NICHT-SICHTBAR-SEIN',
121 )),
122), $texts);
123if (strpos($settingsHtml, 'Bestätigungslink abgelaufen') === false
124 || strpos($settingsHtml, 'Passwortwechsel erforderlich') === false
125 || strpos($settingsHtml, 'Theme') === false
126 || strpos($settingsHtml, 'dunkel') === false
127 || strpos($settingsHtml, 'DARF-NICHT-SICHTBAR-SEIN') !== false
128 || strpos($settingsHtml, 'DARF-AUCH-NICHT-SICHTBAR-SEIN') !== false) {
129 fwrite(STDERR, "FAIL: Strukturierte Einstellungen sind unvollstaendig oder zeigen Sicherheitswerte.\n");
130 exit(4);
131}
132
133echo "OK dbxAdmin user password change\n";
$messages
Definition config.fd.php:2
if( $profilePos===false||$passwordPos===false||$repeatPos===false||$contactPos===false||!( $profilePos< $passwordPos &&$passwordPos< $repeatPos &&$repeatPos< $contactPos)||substr_count((string) $template, '{obj:password_new}') !==1||substr_count((string) $template, '{obj:password_new2}') !==1) if(strpos((string) $template, '{obj:settings_view}')===false||strpos((string) $template, '{obj:settings}') !==false $settingsView)
foreach($cases as $index=> $case) $settingsAfterChange
exit
Definition index.php:146