MetaEditor   A
last analyzed

Complexity

Total Complexity 32

Size/Duplication

Total Lines 242
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 32
eloc 86
c 2
b 0
f 0
dl 0
loc 242
rs 9.84

13 Methods

Rating   Name   Duplication   Size   Complexity  
A getStandardField() 0 6 3
A endpointField() 0 18 4
A hiddenField() 0 3 1
A header() 0 3 1
A flattenLanguageField() 0 8 4
A readonlyField() 0 7 2
A metaToForm() 0 19 2
A requireStandardField() 0 7 3
A readonlyDateField() 0 7 2
A checkForm() 0 4 1
A standardField() 0 13 3
A getEndpointField() 0 19 4
A formToMeta() 0 13 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SimpleSAML\Module\metaedit;
6
7
use Exception;
8
use SimpleSAML\SAML2\Constants as C;
9
10
/**
11
 * Editor for metadata
12
 *
13
 * @package simpleSAMLphp
14
 */
15
class MetaEditor
16
{
17
    /**
18
     * @param array $request
19
     * @param array &$metadata
20
     * @param string $key
21
     */
22
    protected function getStandardField(array $request, array &$metadata, string $key): void
23
    {
24
        if (array_key_exists('field_' . $key, $request)) {
25
            $metadata[$key] = $request['field_' . $key];
26
        } elseif (isset($metadata[$key])) {
27
            unset($metadata[$key]);
28
        }
29
    }
30
31
32
    /**
33
     * @param array $request
34
     * @param array &$metadata
35
     * @param string $key
36
     * @param string $binding
37
     * @param bool $indexed
38
     */
39
    protected function getEndpointField(
40
        array $request,
41
        array &$metadata,
42
        string $key,
43
        string $binding,
44
        bool $indexed,
45
    ): void {
46
        if (array_key_exists('field_' . $key, $request)) {
47
            $e = [
48
                'Binding' => $binding,
49
                'Location' => $request['field_' . $key],
50
            ];
51
            if ($indexed) {
52
                $e['index'] = 0;
53
            }
54
            $metadata[$key] = [$e];
55
        } else {
56
            if (isset($metadata[$key])) {
57
                unset($metadata[$key]);
58
            }
59
        }
60
    }
61
62
63
    /**
64
     * @param array $request
65
     * @param array $metadata
66
     * @param array $override
67
     * @return array
68
     */
69
    public function formToMeta(array $request, array $metadata = [], array $override = []): array
70
    {
71
        $this->getStandardField($request, $metadata, 'entityid');
72
        $this->getStandardField($request, $metadata, 'name');
73
        $this->getStandardField($request, $metadata, 'description');
74
        $this->getEndpointField($request, $metadata, 'AssertionConsumerService', C::BINDING_HTTP_POST, true);
75
        $this->getEndpointField($request, $metadata, 'SingleLogoutService', C::BINDING_HTTP_REDIRECT, false);
76
        $metadata['updated'] = time();
77
78
        foreach ($override as $key => $value) {
79
            $metadata[$key] = $value;
80
        }
81
        return $metadata;
82
    }
83
84
85
    /**
86
     * @param array $request
87
     * @param string $key
88
     */
89
    protected function requireStandardField(array $request, string $key): void
90
    {
91
        if (!array_key_exists('field_' . $key, $request)) {
92
            throw new Exception('Required field [' . $key . '] was missing.');
93
        }
94
        if (empty($request['field_' . $key])) {
95
            throw new Exception('Required field [' . $key . '] was empty.');
96
        }
97
    }
98
99
100
    /**
101
     * @param array $request
102
     */
103
    public function checkForm(array $request): void
104
    {
105
        $this->requireStandardField($request, 'entityid');
106
        $this->requireStandardField($request, 'name');
107
    }
108
109
110
    /**
111
     * @param string $name
112
     * @return string
113
     */
114
    protected function header(string $name): string
115
    {
116
        return '<tr ><td>&nbsp;</td><td class="header">' . $name . '</td></tr>';
117
    }
118
119
120
    /**
121
     * @param array $metadata
122
     * @param string $key
123
     * @param string $name
124
     * @return string
125
     */
126
    protected function readonlyDateField(array $metadata, string $key, string $name): string
127
    {
128
        $value = '<span class="readonly">Not set</a>';
129
        if (array_key_exists($key, $metadata)) {
130
            $value = date('j. F Y, G:i', $metadata[$key]);
131
        }
132
        return '<tr><td class="name">' . $name . '</td><td class="data">' . $value . '</td></tr>';
133
    }
134
135
136
    /**
137
     * @param array $metadata
138
     * @param string $key
139
     * @param string $name
140
     * @return string
141
     */
142
    protected function readonlyField(array $metadata, string $key, string $name): string
143
    {
144
        $value = '';
145
        if (array_key_exists($key, $metadata)) {
146
            $value = $metadata[$key];
147
        }
148
        return '<tr><td class="name">' . $name . '</td><td class="data">' . htmlspecialchars($value) . '</td></tr>';
149
    }
150
151
152
    /**
153
     * @param string $key
154
     * @param string $value
155
     * @return string
156
     */
157
    protected function hiddenField(string $key, string $value): string
158
    {
159
        return '<input type="hidden" name="' . $key . '" value="' . htmlspecialchars($value) . '" />';
160
    }
161
162
163
    /**
164
     * @param array &$metadata
165
     * @param string $key
166
     */
167
    protected function flattenLanguageField(array &$metadata, string $key): void
168
    {
169
        if (array_key_exists($key, $metadata)) {
170
            if (is_array($metadata[$key])) {
171
                if (isset($metadata[$key]['en'])) {
172
                    $metadata[$key] = $metadata[$key]['en'];
173
                } else {
174
                    unset($metadata[$key]);
175
                }
176
            }
177
        }
178
    }
179
180
181
    /**
182
     * @param array $metadata
183
     * @param string $key
184
     * @param string $name
185
     * @param bool $textarea
186
     * @return string
187
     */
188
    protected function standardField(array $metadata, string $key, string $name, bool $textarea = false): string
189
    {
190
        $value = '';
191
        if (array_key_exists($key, $metadata)) {
192
            $value = htmlspecialchars($metadata[$key]);
193
        }
194
        if ($textarea) {
195
            return '<tr><td class="name">' . $name . '</td><td class="data"><textarea name="field_'
196
                . $key . '" rows="5" cols="50">' . $value . '</textarea></td></tr>';
197
        } else {
198
            return '<tr><td class="name">' . $name
199
                . '</td><td class="data"><input type="text" size="60" name="field_'
200
                . $key . '" value="' . $value . '" /></td></tr>';
201
        }
202
    }
203
204
205
    /**
206
     * @param array $metadata
207
     * @param string $key
208
     * @param string $name
209
     * @param bool $textarea
210
     * @return string
211
     */
212
    protected function endpointField(array $metadata, string $key, string $name, bool $textarea = false): string
213
    {
214
        $value = '';
215
        if (array_key_exists($key, $metadata)) {
216
            if (is_array($metadata[$key])) {
217
                $value = htmlspecialchars($metadata[$key][0]['Location']);
218
            } else {
219
                $value = htmlspecialchars($metadata[$key]);
220
            }
221
        }
222
223
        if ($textarea) {
224
            return '<tr><td class="name">' . $name . '</td><td class="data"><textarea name="field_'
225
                . $key . '" rows="5" cols="50">' . $value . '</textarea></td></tr>';
226
        } else {
227
            return '<tr><td class="name">' . $name
228
                . '</td><td class="data"><input type="text" size="60" name="field_'
229
                . $key . '" value="' . $value . '" /></td></tr>';
230
        }
231
    }
232
233
234
    /**
235
     * @param array $metadata
236
     * @return string
237
     */
238
    public function metaToForm(array $metadata): string
239
    {
240
        $this->flattenLanguageField($metadata, 'name');
241
        $this->flattenLanguageField($metadata, 'description');
242
        return '<form action="/module.php/metaedit/edit" method="post">' .
243
            (array_key_exists('entityid', $metadata) ?
244
            $this->hiddenField('was-entityid', $metadata['entityid']) :
245
            '') . '<div id="tabdiv"><ul><li><a href="#basic">Name and descrition</a></li>' .
246
            '<li><a href="#saml">SAML 2.0</a></li></ul><div id="basic"><table class="formtable">' .
247
            $this->standardField($metadata, 'entityid', 'EntityID') .
248
            $this->standardField($metadata, 'name', 'Name of service') .
249
            $this->standardField($metadata, 'description', 'Description of service', true) .
250
            $this->readonlyField($metadata, 'owner', 'Owner') .
251
            $this->readonlyDateField($metadata, 'updated', 'Last updated') .
252
            $this->readonlyDateField($metadata, 'expire', 'Expire') .
253
            '</table></div><div id="saml"><table class="formtable">' .
254
            $this->endpointField($metadata, 'AssertionConsumerService', 'AssertionConsumerService endpoint') .
255
            $this->endpointField($metadata, 'SingleLogoutService', 'SingleLogoutService endpoint') .
256
            '</table></div></div><input type="submit" id="edit-submit" name="submit" value="Save" /></form>';
257
    }
258
}
259