1<?php
2/*
3** Zabbix
4** Copyright (C) 2001-2021 Zabbix SIA
5**
6** This program is free software; you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation; either version 2 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program; if not, write to the Free Software
18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19**/
20
21
22/**
23 * @var CView $this
24 */
25
26$this->addJsFile('multilineinput.js');
27$this->addJsFile('class.tab-indicators.js');
28
29$this->includeJsFile('administration.mediatype.edit.js.php');
30
31$widget = (new CWidget())->setTitle(_('Media types'));
32
33$tabs = new CTabView();
34
35if ($data['form_refresh'] == 0) {
36	$tabs->setSelected(0);
37}
38
39// create form
40$mediaTypeForm = (new CForm())
41	->setId('media-type-form')
42	->addVar('form', 1)
43	->addVar('mediatypeid', $data['mediatypeid'])
44	->addItem((new CVar('status', MEDIA_TYPE_STATUS_DISABLED))->removeId())
45	->disablePasswordAutofill()
46	->setAttribute('aria-labeledby', ZBX_STYLE_PAGE_TITLE);
47
48// Create form list.
49$mediatype_formlist = (new CFormList())
50	->addRow((new CLabel(_('Name'), 'name'))->setAsteriskMark(),
51		(new CTextBox('name', $data['name'], false, 100))
52			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
53			->setAriaRequired()
54			->setAttribute('autofocus', 'autofocus')
55	)
56	->addRow(new CLabel(_('Type'), 'label-type'), (new CSelect('type'))
57		->setId('type')
58		->setFocusableElementId('label-type')
59		->addOptions(CSelect::createOptionsFromArray(media_type2str()))
60		->setValue($data['type'])
61	)
62	->addRow((new CLabel(_('SMTP server'), 'smtp_server'))->setAsteriskMark(),
63		(new CTextBox('smtp_server', $data['smtp_server']))
64			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
65			->setAriaRequired()
66	)
67	->addRow(_('SMTP server port'),
68		(new CNumericBox('smtp_port', $data['smtp_port'], 5, false, false, false))->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
69	)
70	->addRow((new CLabel(_('SMTP helo'), 'smtp_helo'))->setAsteriskMark(),
71		(new CTextBox('smtp_helo', $data['smtp_helo']))
72			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
73			->setAriaRequired()
74	)
75	->addRow((new CLabel(_('SMTP email'), 'smtp_email'))->setAsteriskMark(),
76		(new CTextBox('smtp_email', $data['smtp_email']))
77			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
78			->setAriaRequired()
79	)
80	->addRow(new CLabel(_('Connection security'), 'smtp_security'),
81		(new CRadioButtonList('smtp_security', (int) $data['smtp_security']))
82			->addValue(_('None'), SMTP_CONNECTION_SECURITY_NONE)
83			->addValue(_('STARTTLS'), SMTP_CONNECTION_SECURITY_STARTTLS)
84			->addValue(_('SSL/TLS'), SMTP_CONNECTION_SECURITY_SSL_TLS)
85			->setModern(true)
86	)
87	->addRow(_('SSL verify peer'), (new CCheckBox('smtp_verify_peer'))->setChecked($data['smtp_verify_peer']))
88	->addRow(_('SSL verify host'), (new CCheckBox('smtp_verify_host'))->setChecked($data['smtp_verify_host']))
89	->addRow(new CLabel(_('Authentication'), 'smtp_authentication'),
90		(new CRadioButtonList('smtp_authentication', (int) $data['smtp_authentication']))
91			->addValue(_('None'), SMTP_AUTHENTICATION_NONE)
92			->addValue(_('Username and password'), SMTP_AUTHENTICATION_NORMAL)
93			->setModern(true)
94	)
95	->addRow(_('Username'), (new CTextBox('smtp_username', $data['smtp_username']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH))
96	->addRow((new CLabel(_('Script name'), 'exec_path'))->setAsteriskMark(),
97		(new CTextBox('exec_path', $data['exec_path']))
98			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
99			->setAriaRequired()
100	);
101
102$exec_params_table = (new CTable())
103	->setId('exec_params_table')
104	->setHeader([_('Parameter'), _('Action')])
105	->setAttribute('style', 'width: 100%;');
106
107foreach ($data['exec_params'] as $i => $exec_param) {
108	$exec_params_table->addRow([
109		(new CTextBox('exec_params['.$i.'][exec_param]', $exec_param['exec_param'], false, 255))
110			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
111		(new CButton('exec_params['.$i.'][remove]', _('Remove')))
112			->addClass(ZBX_STYLE_BTN_LINK)
113			->addClass('element-table-remove')
114		], 'form_row');
115}
116
117$exec_params_table->addRow([(new CButton('exec_param_add', _('Add')))
118	->addClass(ZBX_STYLE_BTN_LINK)
119	->addClass('element-table-add')]);
120
121$mediatype_formlist->addRow(_('Script parameters'),
122	(new CDiv($exec_params_table))
123		->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
124		->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;'),
125	'row_exec_params'
126);
127
128$mediatype_formlist->addRow((new CLabel(_('GSM modem'), 'gsm_modem'))->setAsteriskMark(),
129	(new CTextBox('gsm_modem', $data['gsm_modem']))
130		->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
131		->setAriaRequired()
132);
133
134// Create password field.
135if ($data['passwd'] !== '' && !$data['change_passwd']) {
136	// Disabling 'passwd' field prevents stored passwords autofill by browser.
137	$passwd_field = [
138		(new CButton('chPass_btn', _('Change password'))),
139		(new CPassBox('passwd', ''))
140			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
141			->setAriaRequired()
142			->addStyle('display: none;')
143			->setAttribute('disabled', 'disabled')
144	];
145}
146else {
147	$passwd_field = (new CPassBox('passwd', $data['passwd']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH);
148}
149
150// MEDIA_TYPE_WEBHOOK
151$parameters_table = (new CTable())
152	->setId('parameters_table')
153	->setHeader([
154		(new CColHeader(_('Name')))->setWidth('50%'),
155		(new CColHeader(_('Value')))->setWidth('50%'),
156		_('Action')
157	])
158	->setAttribute('style', 'width: 100%;');
159
160foreach ($data['parameters'] as $parameter) {
161	$parameters_table->addRow([
162		(new CTextBox('parameters[name][]', $parameter['name'], false, DB::getFieldLength('media_type_param', 'name')))
163			->setAttribute('style', 'width: 100%;')
164			->removeId(),
165		(new CTextBox('parameters[value][]', $parameter['value'], false,
166			DB::getFieldLength('media_type_param', 'value')
167		))
168			->setAttribute('style', 'width: 100%;')
169			->removeId(),
170		(new CButton('', _('Remove')))
171			->removeId()
172			->onClick('jQuery(this).closest("tr").remove()')
173			->addClass(ZBX_STYLE_BTN_LINK)
174			->addClass('element-table-remove')
175	], 'form_row');
176}
177
178$row_template = (new CTag('script', true))
179	->setId('parameters_row')
180	->setAttribute('type', 'text/x-jquery-tmpl')
181	->addItem(
182		(new CRow([
183			(new CTextBox('parameters[name][]', '', false, DB::getFieldLength('media_type_param', 'name')))
184				->setAttribute('style', 'width: 100%;')
185				->removeId(),
186			(new CTextBox('parameters[value][]', '', false, DB::getFieldLength('media_type_param', 'value')))
187				->setAttribute('style', 'width: 100%;')
188				->removeId(),
189			(new CButton('', _('Remove')))
190				->removeId()
191				->onClick('jQuery(this).closest("tr").remove()')
192				->addClass(ZBX_STYLE_BTN_LINK)
193				->addClass('element-table-remove')
194		]))->addClass('form_row')
195	);
196
197$widget->addItem($row_template);
198
199$parameters_table->addRow([(new CButton('parameter_add', _('Add')))
200	->addClass(ZBX_STYLE_BTN_LINK)
201	->addClass('element-table-add')]);
202
203// append password field to form list
204$mediatype_formlist
205	->addRow(new CLabel(_('Password'), 'passwd'), $passwd_field)
206	->addRow(new CLabel(_('Message format'), 'content_type'),
207		(new CRadioButtonList('content_type', (int) $data['content_type']))
208			->addValue(_('HTML'), SMTP_MESSAGE_FORMAT_HTML)
209			->addValue(_('Plain text'), SMTP_MESSAGE_FORMAT_PLAIN_TEXT)
210			->setModern(true)
211	)
212	->addRow(new CLabel(_('Parameters'), $parameters_table->getId()),
213		(new CDiv($parameters_table))
214			->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
215			->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;'),
216		'row_webhook_parameters'
217	)
218	->addRow((new CLabel(_('Script'), 'script'))->setAsteriskMark(),
219		(new CMultilineInput('script', $data['script'], [
220			'title' => _('JavaScript'),
221			'placeholder' => _('script'),
222			'placeholder_textarea' => 'return value',
223			'grow' => 'auto',
224			'rows' => 0,
225			'maxlength' => DB::getFieldLength('media_type', 'script')
226		]))
227			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
228			->setAriaRequired(),
229		'row_webhook_script'
230	)
231	->addRow((new CLabel(_('Timeout'), 'timeout'))->setAsteriskMark(),
232		(new CTextBox('timeout', $data['timeout']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH),
233		'row_webhook_timeout'
234	)
235	->addRow(new CLabel(_('Process tags'), 'process_tags'),
236		(new CCheckBox('process_tags', ZBX_MEDIA_TYPE_TAGS_ENABLED))
237			->setChecked($data['process_tags'] == ZBX_MEDIA_TYPE_TAGS_ENABLED)
238			->setUncheckedValue(ZBX_MEDIA_TYPE_TAGS_DISABLED),
239		'row_webhook_tags'
240	)
241	->addRow(new CLabel(_('Include event menu entry'), 'show_event_menu'),
242		(new CCheckBox('show_event_menu', ZBX_EVENT_MENU_SHOW))
243			->setChecked($data['show_event_menu'] == ZBX_EVENT_MENU_SHOW)
244			->setUncheckedValue(ZBX_EVENT_MENU_HIDE),
245		'row_webhook_show_event_menu'
246	)
247	->addRow((new CLabel(_('Menu entry name'), 'event_menu_name'))->setAsteriskMark(),
248		(new CTextBox('event_menu_name', $data['event_menu_name'], false,
249			DB::getFieldLength('media_type', 'event_menu_name')
250		))
251			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
252			->setEnabled($data['show_event_menu'] == ZBX_EVENT_MENU_SHOW)
253			->setAriaRequired(),
254		'row_webhook_url_name'
255	)
256	->addRow((new CLabel(_('Menu entry URL'), 'event_menu_url'))->setAsteriskMark(),
257		(new CTextBox('event_menu_url', $data['event_menu_url'], false,
258			DB::getFieldLength('media_type', 'event_menu_url')
259		))
260			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
261			->setEnabled($data['show_event_menu'] == ZBX_EVENT_MENU_SHOW)
262			->setAriaRequired(),
263		'row_webhook_event_menu_url'
264	)
265	->addRow(_('Description'),
266		(new CTextArea('description', $data['description']))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
267	)
268	->addRow(_('Enabled'),
269		(new CCheckBox('status', MEDIA_TYPE_STATUS_ACTIVE))->setChecked($data['status'] == MEDIA_TYPE_STATUS_ACTIVE)
270	);
271$tabs->addTab('mediaTab', _('Media type'), $mediatype_formlist);
272
273// Message templates tab.
274$message_templates_formlist = (new CFormList('messageTemplatesFormlist'))
275	->addRow(null,
276		(new CDiv(
277			(new CTable())
278				->addStyle('width: 100%;')
279				->setHeader([
280					_('Message type'),
281					_('Template'),
282					_('Actions')
283				])
284				->setFooter(
285					(new CRow(
286						(new CCol(
287							(new CSimpleButton(_('Add')))
288								->setAttribute('data-action', 'add')
289								->addClass(ZBX_STYLE_BTN_LINK)
290						))->setColSpan(3)
291					))->setId('message-templates-footer')
292				)
293		))
294			->setId('message-templates')
295			->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
296			->addStyle('width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
297	);
298$tabs->addTab('messageTemplatesTab', _('Message templates'), $message_templates_formlist,
299	TAB_INDICATOR_MESSAGE_TEMPLATE
300);
301
302// media options tab
303$max_sessions = ($data['maxsessions'] > 1) ? $data['maxsessions'] : 0;
304if ($data['type'] == MEDIA_TYPE_SMS) {
305	$max_sessions = 1;
306}
307
308switch ($data['maxsessions']) {
309	case 1:
310		$data['maxsessions_type'] = 'one';
311		break;
312	case 0:
313		$data['maxsessions_type'] = 'unlimited';
314		break;
315	default:
316		$data['maxsessions_type'] = 'custom';
317}
318
319$mediaOptionsForm = (new CFormList('options'))
320	->addRow(new CLabel(_('Concurrent sessions'), 'maxsessions_type'),
321		(new CDiv())
322			->addClass(ZBX_STYLE_NOWRAP)
323			->addItem([
324				(new CDiv(
325					(new CRadioButtonList('maxsessions_type', $data['maxsessions_type']))
326						->addValue(_('One'), 'one')
327						->addValue(_('Unlimited'), 'unlimited')
328						->addValue(_('Custom'), 'custom')
329						->setModern(true)
330				))->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
331				(new CNumericBox('maxsessions', $max_sessions, 3, false, false, false))
332					->setAriaRequired()
333					->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
334			])
335	)
336	->addRow((new CLabel(_('Attempts'), 'maxattempts'))->setAsteriskMark(),
337		(new CNumericBox('maxattempts', $data['maxattempts'], 3, false, false, false))
338			->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
339			->setAriaRequired()
340	)
341	->addRow((new CLabel(_('Attempt interval'), 'attempt_interval'))->setAsteriskMark(),
342		(new CTextBox('attempt_interval', $data['attempt_interval'], false, 12))
343			->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
344			->setAriaRequired()
345	);
346$tabs->addTab('optionsTab', _('Options'), $mediaOptionsForm);
347
348// append buttons to form
349$cancelButton = (new CRedirectButton(_('Cancel'), (new CUrl('zabbix.php'))
350	->setArgument('action', 'mediatype.list')
351	->setArgument('page', CPagerHelper::loadPage('mediatype.list', null))
352))->setId('cancel');
353
354if ($data['mediatypeid'] == 0) {
355	$addButton = (new CSubmitButton(_('Add'), 'action', 'mediatype.create'))->setId('add');
356
357	$tabs->setFooter(makeFormFooter(
358		$addButton,
359		[$cancelButton]
360	));
361}
362else {
363	$updateButton = (new CSubmitButton(_('Update'), 'action', 'mediatype.update'))->setId('update');
364	$cloneButton = (new CSimpleButton(_('Clone')))->setId('clone');
365	$deleteButton = (new CRedirectButton(_('Delete'),
366		'zabbix.php?action=mediatype.delete&sid='.$data['sid'].'&mediatypeids[]='.$data['mediatypeid'],
367		_('Delete media type?')
368	))
369		->setId('delete');
370
371	$tabs->setFooter(makeFormFooter(
372		$updateButton,
373		[
374			$cloneButton,
375			$deleteButton,
376			$cancelButton
377		]
378	));
379}
380
381// append tab to form
382$mediaTypeForm->addItem($tabs);
383
384// append form to widget
385$widget->addItem($mediaTypeForm)->show();
386