summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot2019-02-19 18:53:50 +0100
committerroot2019-02-19 18:53:50 +0100
commit0ad4c0f8196b61699754762aacbaab0223478ab9 (patch)
treede434c4aea8d07ecd01cd3badd48d057d62c2d1b
parent[usb-lock-off] Edit rule cleanup and fix of the dropdown boxes. (diff)
parent[statistics] Fix RAM change warning to handle increase too (diff)
downloadslx-admin-usb-lock-off.tar.gz
slx-admin-usb-lock-off.tar.xz
slx-admin-usb-lock-off.zip
Merge branch 'master' into usb-lock-offusb-lock-off
-rw-r--r--TODO5
-rw-r--r--api.php14
-rw-r--r--inc/dashboard.inc.php7
-rw-r--r--inc/database.inc.php15
-rw-r--r--inc/dictionary.inc.php15
-rw-r--r--inc/event.inc.php16
-rw-r--r--inc/module.inc.php63
-rw-r--r--inc/paginate.inc.php2
-rw-r--r--inc/permission.inc.php36
-rw-r--r--inc/property.inc.php2
-rw-r--r--inc/render.inc.php8
-rw-r--r--inc/taskmanager.inc.php40
-rw-r--r--inc/taskmanagercallback.inc.php9
-rw-r--r--inc/trigger.inc.php33
-rw-r--r--inc/user.inc.php69
-rw-r--r--inc/util.inc.php30
-rw-r--r--index.php11
-rwxr-xr-xinstall-all5
-rw-r--r--lang/de/messages-hardcoded.json24
-rw-r--r--lang/de/messages.json14
-rw-r--r--lang/en/messages-hardcoded.json35
-rw-r--r--lang/en/messages.json14
-rw-r--r--lang/pt/flag.pngbin1115 -> 0 bytes
-rw-r--r--lang/pt/messages-hardcoded.json26
-rw-r--r--lang/pt/messages.json11
-rw-r--r--lang/pt/name.txt1
-rw-r--r--modules-available/adduser/config.json3
-rw-r--r--modules-available/adduser/lang/de/messages.json10
-rw-r--r--modules-available/adduser/lang/de/module.json3
-rw-r--r--modules-available/adduser/lang/de/permissions.json6
-rw-r--r--modules-available/adduser/lang/de/template-tags.json23
-rw-r--r--modules-available/adduser/lang/en/messages.json10
-rw-r--r--modules-available/adduser/lang/en/module.json3
-rw-r--r--modules-available/adduser/lang/en/permissions.json6
-rw-r--r--modules-available/adduser/lang/en/template-tags.json21
-rw-r--r--modules-available/adduser/page.inc.php240
-rw-r--r--modules-available/adduser/permissions/permissions.json14
-rw-r--r--modules-available/adduser/style.css19
-rw-r--r--modules-available/adduser/templates/header.html3
-rw-r--r--modules-available/adduser/templates/js-add-edit.html29
-rw-r--r--modules-available/adduser/templates/page-adduser.html67
-rw-r--r--modules-available/adduser/templates/page-edituser.html74
-rw-r--r--modules-available/adduser/templates/page-userlist.html87
-rw-r--r--modules-available/adduser/templates/user-permissions.html34
-rw-r--r--modules-available/backup/config.json4
-rw-r--r--modules-available/backup/page.inc.php15
-rw-r--r--modules-available/backup/permissions/permissions.json12
-rw-r--r--modules-available/backup/style.css7
-rw-r--r--modules-available/backup/templates/_page.html14
-rw-r--r--modules-available/baseconfig/api.inc.php23
-rw-r--r--modules-available/baseconfig/config.json7
-rw-r--r--modules-available/baseconfig/lang/de/permissions.json4
-rw-r--r--modules-available/baseconfig/lang/en/permissions.json4
-rw-r--r--modules-available/baseconfig/page.inc.php42
-rw-r--r--modules-available/baseconfig/permissions/permissions.json8
-rw-r--r--modules-available/baseconfig/templates/_page.html11
-rw-r--r--modules-available/baseconfig_bwidm/config.json6
-rw-r--r--modules-available/baseconfig_bwidm/hooks/translation.inc.php4
-rw-r--r--modules-available/baseconfig_bwlp/baseconfig/settings.json18
-rw-r--r--modules-available/baseconfig_bwlp/config.json6
-rw-r--r--modules-available/baseconfig_bwlp/hooks/translation.inc.php4
-rw-r--r--modules-available/baseconfig_bwlp/lang/de/config-variables.json5
-rw-r--r--modules-available/baseconfig_bwlp/lang/en/config-variables.json7
-rw-r--r--modules-available/baseconfig_partitions_cdn/config.json8
-rw-r--r--modules-available/baseconfig_partitions_cdn/lang/de/permissions.json7
-rw-r--r--modules-available/baseconfig_partitions_cdn/lang/en/permissions.json7
-rw-r--r--modules-available/baseconfig_partitions_cdn/lang/en/template-tags.json4
-rw-r--r--modules-available/baseconfig_partitions_cdn/page.inc.php41
-rw-r--r--modules-available/baseconfig_partitions_cdn/permissions/permissions.json17
-rw-r--r--modules-available/baseconfig_partitions_cdn/style.css4
-rw-r--r--modules-available/baseconfig_partitions_cdn/templates/_page.html60
-rw-r--r--modules-available/bootstrap_datepicker/config.json17
-rw-r--r--modules-available/bootstrap_dialog/config.json17
-rw-r--r--modules-available/bootstrap_multiselect/config.json17
-rw-r--r--modules-available/bootstrap_switch/config.json13
-rw-r--r--modules-available/bootstrap_timepicker/config.json17
-rw-r--r--modules-available/citymanagement/config.json6
-rw-r--r--modules-available/dnbd3/config.json9
-rw-r--r--modules-available/dnbd3/hooks/main-warning.inc.php2
-rw-r--r--modules-available/dnbd3/hooks/runmode/config.json5
-rw-r--r--modules-available/dnbd3/inc/dnbd3util.inc.php52
-rw-r--r--modules-available/dnbd3/lang/de/permissions.json8
-rw-r--r--modules-available/dnbd3/lang/de/template-tags.json18
-rw-r--r--modules-available/dnbd3/lang/en/permissions.json8
-rw-r--r--modules-available/dnbd3/lang/en/template-tags.json12
-rw-r--r--modules-available/dnbd3/page.inc.php178
-rw-r--r--modules-available/dnbd3/permissions/permissions.json20
-rw-r--r--modules-available/dnbd3/templates/page-proxy-altservers.html12
-rw-r--r--modules-available/dnbd3/templates/page-proxy-clients.html69
-rw-r--r--modules-available/dnbd3/templates/page-proxy-config.html20
-rw-r--r--modules-available/dnbd3/templates/page-proxy-header.html3
-rw-r--r--modules-available/dnbd3/templates/page-proxy-images.html31
-rw-r--r--modules-available/dnbd3/templates/page-proxy-loclist.html27
-rw-r--r--modules-available/dnbd3/templates/page-proxy-stats.html30
-rw-r--r--modules-available/dnbd3/templates/page-serverlist.html55
-rw-r--r--modules-available/dozmod/api.inc.php12
-rw-r--r--modules-available/dozmod/config.json4
-rw-r--r--modules-available/dozmod/hooks/main-warning.inc.php12
-rw-r--r--modules-available/dozmod/lang/de/messages.json20
-rw-r--r--modules-available/dozmod/lang/de/module.json6
-rw-r--r--modules-available/dozmod/lang/de/permissions.json31
-rw-r--r--modules-available/dozmod/lang/de/template-tags.json58
-rw-r--r--modules-available/dozmod/lang/en/messages.json20
-rw-r--r--modules-available/dozmod/lang/en/module.json6
-rw-r--r--modules-available/dozmod/lang/en/permissions.json31
-rw-r--r--modules-available/dozmod/lang/en/template-tags.json56
-rw-r--r--modules-available/dozmod/page.inc.php349
-rw-r--r--modules-available/dozmod/pages/actionlog.inc.php (renamed from modules-available/dozmod/inc/pagedozmodlog.inc.php)72
-rw-r--r--modules-available/dozmod/pages/expiredimages.inc.php97
-rw-r--r--modules-available/dozmod/pages/ldapfilters.inc.php119
-rw-r--r--modules-available/dozmod/pages/mailconfig.inc.php96
-rw-r--r--modules-available/dozmod/pages/networkrules.inc.php98
-rw-r--r--modules-available/dozmod/pages/networkshares.inc.php108
-rw-r--r--modules-available/dozmod/pages/runscripts.inc.php133
-rw-r--r--modules-available/dozmod/pages/runtimeconfig.inc.php112
-rw-r--r--modules-available/dozmod/pages/templates.inc.php (renamed from modules-available/dozmod/inc/pagemailtemplates.inc.php)51
-rw-r--r--modules-available/dozmod/pages/users.inc.php (renamed from modules-available/dozmod/inc/pagedozmodusers.inc.php)51
-rw-r--r--modules-available/dozmod/permissions/permissions.json73
-rw-r--r--modules-available/dozmod/style.css20
-rw-r--r--modules-available/dozmod/templates/actionlog-log.html6
-rw-r--r--modules-available/dozmod/templates/images-delete.html1
-rw-r--r--modules-available/dozmod/templates/ldapfilter-add.html39
-rw-r--r--modules-available/dozmod/templates/ldapfilters.html77
-rw-r--r--modules-available/dozmod/templates/mailconfig.html7
-rw-r--r--modules-available/dozmod/templates/networkrules-edit.html43
-rw-r--r--modules-available/dozmod/templates/networkrules.html82
-rw-r--r--modules-available/dozmod/templates/networkshares-edit.html84
-rw-r--r--modules-available/dozmod/templates/networkshares.html113
-rw-r--r--modules-available/dozmod/templates/runscripts-edit.html89
-rw-r--r--modules-available/dozmod/templates/runscripts-list.html89
-rw-r--r--modules-available/dozmod/templates/runtimeconfig.html5
-rw-r--r--modules-available/dozmod/templates/templates.html7
-rw-r--r--modules-available/dozmod/templates/userlist.html8
-rw-r--r--modules-available/eventlog/config.json4
-rw-r--r--modules-available/eventlog/page.inc.php45
-rw-r--r--modules-available/eventlog/permissions/permissions.json8
-rw-r--r--modules-available/exams/baseconfig/getconfig.inc.php39
-rw-r--r--modules-available/exams/config.json13
-rw-r--r--modules-available/exams/lang/de/permissions.json7
-rw-r--r--modules-available/exams/lang/de/template-tags.json4
-rw-r--r--modules-available/exams/lang/en/permissions.json7
-rw-r--r--modules-available/exams/lang/en/template-tags.json4
-rw-r--r--modules-available/exams/page.inc.php306
-rw-r--r--modules-available/exams/permissions/permissions.json13
-rw-r--r--modules-available/exams/templates/page-add-edit-exam.html6
-rw-r--r--modules-available/exams/templates/page-exams.html8
-rw-r--r--modules-available/imgmanagement/config.json6
-rw-r--r--modules-available/internetaccess/config.json4
-rw-r--r--modules-available/internetaccess/permissions/permissions.json8
-rw-r--r--modules-available/js_chart/config.json10
-rw-r--r--modules-available/js_circles/config.json10
-rw-r--r--modules-available/js_jqueryui/config.json17
-rw-r--r--modules-available/js_moment/config.json14
-rw-r--r--modules-available/js_selectize/config.json17
-rw-r--r--modules-available/js_stupidtable/clientscript.js354
-rw-r--r--modules-available/js_stupidtable/config.json10
-rw-r--r--modules-available/js_stupidtable/style.css3
-rw-r--r--modules-available/js_vis/config.json19
-rwxr-xr-xmodules-available/js_weekcalendar/clientscript.js2
-rw-r--r--modules-available/locationinfo/api.inc.php23
-rw-r--r--modules-available/locationinfo/config.json11
-rw-r--r--modules-available/locationinfo/exchange-includes/README4
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfAppManifestsType.php28
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfAppsType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfArraysOfTrackingPropertiesType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfAttachmentsType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfAttendeeConflictData.php59
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfBaseItemIdsType.php28
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfBinaryType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfBodyContentAttributedValuesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfCalendarEvent.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfCalendarPermissionsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfContextProperty.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfConversationNodesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfConversationsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfDLExpansionType.php76
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfDelegateUserResponseMessageType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfDelegateUserType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfDiscoverySearchConfigurationType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfEmailAddressAttributedValuesType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfEmailAddressesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfEncryptedSharedFolderDataType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfExtendedAttributesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfExtendedPropertyAttributedValueType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfFailedSearchMailboxesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfFindMessageTrackingSearchResultType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfFolderIdType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfFoldersType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfFreeBusyResponse.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfGroupedItemsType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfImGroupType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfInvalidRecipientsType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfItemClassType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfKeywordStatisticsSearchResultsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfMailTipsResponseMessageType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfMailboxData.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfMailboxHoldStatusType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfNonIndexableItemDetailsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfNonIndexableItemStatisticsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfOccurrenceRangesType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfPeopleQuerySource.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfPeopleType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfPermissionsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfPersonaAttributionsType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfPhoneNumberAttributedValuesType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfPostalAddressAttributedValuesType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfPrivateCatalogAddInsType.php29
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfProtectionRulesType.php29
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRealItemsType.php115
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRecipientTrackingEventType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRecipientsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRemindersType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfResolutionType.php76
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfResponseMessagesType.php504
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRetentionPolicyTagsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRoomsType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRuleOperationErrorsType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRuleOperationsType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRuleValidationErrorsType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfRulesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfSearchItemKindsType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfSearchPreviewItemsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfSearchableMailboxesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfServiceConfigurationResponseMessageType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfServiceConfigurationType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfSmtpAddressType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfStringArrayAttributedValuesType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfStringAttributedValuesType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfStringsType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfSuggestion.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfSuggestionDayResult.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfTimeZoneDefinitionType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfTrackingPropertiesType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfTransitionsGroupsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfTransitionsType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfUnknownEntriesType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfUserIdType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfUserMailboxesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfValueAttributionsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/ArrayOfWorkingPeriod.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfAllItemsType.php217
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfAlternateIdsType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfApplyConversationActionType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfAttachmentsType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfAttendeesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfBaseFolderIdsType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfBaseItemIdsType.php56
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfClientAccessTokenRequestsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfDeletedOccurrencesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfExtendedFieldURIs.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfExtendedPropertyType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfFieldOrdersType.php30
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfFolderChangeDescriptionsType.php49
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfFolderChangesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfFolderNamesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfFoldersType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfGroupIdentifiersType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfInternetHeadersType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfItemChangeDescriptionsType.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfItemChangesType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfItemIdsType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfMailboxQueriesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfMailboxSearchScopesType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfNotificationEventTypesType.php29
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfNotificationsType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfOccurrenceInfoType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfPathsToElementType.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfPeriodsType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfPropertyValuesType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfReminderItemActionType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfRequestAttachmentIdsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfResponseObjectsType.php128
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfRestrictedGroupIdentifiersType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfSubscriptionIdsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfTimeZoneIdType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayOfUploadItemsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ArrayType/NonEmptyArrayofLegacyDNsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Autodiscover.php896
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/ClassMap.php684
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Client.php1702
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/AddInStateType.php84
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/AffectedTaskOccurrencesType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/AggregateType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/AppointmentState.php63
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/AvailabilityProxyRequestType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/BodyTypeResponseType.php50
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/BodyTypeType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/CalendarItemCreateOrDeleteOperationType.php46
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/CalendarItemTypeType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/CalendarItemUpdateOperationType.php67
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/CalendarPermissionLevelType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/CalendarPermissionReadAccessType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ClientAccessTokenTypeType.php76
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ConferenceType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ConflictResolutionType.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ConnectionFailureCauseType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ConnectionStatusType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ContactSourceType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ContainmentComparisonType.php92
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ContainmentModeType.php64
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ConversationActionTypeType.php96
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ConversationNodeSortOrder.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ConversationQueryTraversalType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/CreateActionType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DateTimePrecisionType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DayOfWeekIndexType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DayOfWeekType.php106
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DaysOfWeekType.php21
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DefaultShapeNamesType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DelegateFolderPermissionLevelType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DeliverMeetingRequestsType.php57
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DictionaryURIType.php106
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DisableReasonType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DisposalType.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DistinguishedFolderIdNameType.php394
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DistinguishedPropertySetType.php106
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/DistinguishedUserType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ElcFolderType.php187
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/EmailAddressKeyType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ExceptionPropertyURIType.php97
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ExchangeVersionType.php98
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ExternalAudience.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/FileAsMappingType.php178
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/FlagStatusType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/FlaggedForActionType.php116
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/FolderQueryTraversalType.php46
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/FreeBusyViewType.php98
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/HoldActionType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/HoldStatusType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/IdFormatType.php76
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ImAddressKeyType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ImportanceChoicesType.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/IndexBasePointType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/InvalidRecipientResponseCodeType.php65
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ItemClassType.php291
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ItemQueryTraversalType.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/LegacyFreeBusyType.php71
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/LocationSourceType.php71
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MailTipTypes.php107
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MailboxSearchLocationType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MailboxTypeType.php79
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MapiPropertyTypeType.php273
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MeetingAttendeeType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MeetingRequestTypeType.php84
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MemberStatusType.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MessageDispositionType.php66
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MessageTrackingDeliveryStatusType.php63
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MessageTrackingEventDescriptionType.php254
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MessageTrackingReportTemplateType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/MonthNamesType.php124
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/NotificationEventTypeType.php79
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/Occurrence.php96
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/OofState.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PermissionActionType.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PermissionLevelType.php116
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PermissionReadAccessType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PhoneCallStateType.php88
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PhoneNumberKeyType.php187
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PhysicalAddressIndexType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PhysicalAddressKeyType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/PreviewItemBaseShapeType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ReminderActionType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ReminderGroup.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ResolveNamesSearchScopeType.php55
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ResponseClassType.php63
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ResponseCodeType.php4866
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ResponseTypeType.php70
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/RetentionActionType.php79
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/RoutingType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/RuleFieldURIType.php826
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/RuleValidationErrorCodeType.php233
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/Scope.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SearchFolderTraversalType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SearchItemKindType.php124
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SearchPageDirectionType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SearchResultType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SensitivityChoicesType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ServiceConfigurationType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SharingDataType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SortDirectionType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/StandardGroupByType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SubscriptionStatusType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SuggestionQuality.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/SyncFolderItemsScopeType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/TaskDelegateStateType.php76
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/TaskStatusType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/TransitionTargetKindType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/UnindexedFieldURIType.php2941
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/UserConfigurationDictionaryObjectTypesType.php106
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/UserConfigurationPropertyType.php62
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/UserPhotoSizeType.php115
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/UserPhotoTypeType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Enumeration/ViewFilterType.php106
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/AddDelegateType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/AddDistributionGroupToImListType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/AddImContactToGroup.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/AddImGroupType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/AddNewImContactToGroup.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/AddNewTelUriContactToGroupType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/ApplyConversationActionType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/ArchiveItemType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/BaseDelegateType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/BaseMoveCopyFolderType.php32
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/BaseMoveCopyItemType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/BaseRequestType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/ConvertIdType.php40
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CopyFolderType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CopyItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CreateAttachmentType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CreateFolderPathType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CreateFolderType.php32
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CreateItemType.php65
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CreateManagedFolderRequestType.php32
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/CreateUserConfigurationType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/DeleteAttachmentType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/DeleteFolderType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/DeleteItemType.php84
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/DeleteUserConfigurationType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/DisableAppType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/DisconnectPhoneCallType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/EmptyFolderType.php49
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/ExpandDLType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/ExportItemsType.php24
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/FindConversationType.php113
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/FindFolderType.php81
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/FindItemType.php149
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/FindMailboxStatisticsByKeywordsType.php118
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/FindMessageTrackingReportRequestType.php141
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/FindPeopleType.php113
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetAppManifestsType.php100
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetAppMarketplaceUrl.php16
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetAttachmentType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetClientAccessTokenType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetConversationItemsType.php79
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetDelegateType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetDiscoverySearchConfigurationType.php42
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetEventsType.php39
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetFolderType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetHoldOnMailboxesType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetImItemListType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetImItemsType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetInboxRulesRequestType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetItemType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetMailTipsType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetMessageTrackingReportRequestType.php96
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetNonIndexableItemDetailsType.php62
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetNonIndexableItemStatisticsType.php32
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetPasswordExpirationDateType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetPersonaType.php67
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetPhoneCallInformationType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetRemindersType.php58
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetRoomListsType.php17
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetRoomsType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetSearchableMailboxesType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetServerTimeZonesType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetServiceConfigurationType.php44
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetSharingFolderType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetSharingMetadataType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetStreamingEventsType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetUserAvailabilityRequestType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetUserConfigurationType.php38
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetUserOofSettingsRequest.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetUserPhotoType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/GetUserRetentionPolicyTagsType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/InstallAppType.php67
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/MarkAllItemsAsRead.php42
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/MarkAsJunkType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/MoveFolderType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/MoveItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/PerformReminderActionType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/PlayOnPhoneType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/RefreshSharingFolderType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/RemoveContactFromImListType.php24
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/RemoveDelegateType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/RemoveDistributionGroupFromImListType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/RemoveImContactFromGroupType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/RemoveImGroupType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/ResolveNamesType.php82
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SearchMailboxesType.php104
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SendItemType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SetHoldOnMailboxesType.php98
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SetImGroupType.php32
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SetUserOofSettingsRequest.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SubscribeType.php41
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SyncFolderHierarchyType.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/SyncFolderItemsType.php88
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UninstallAppType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UnsubscribeType.php23
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UpdateDelegateType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UpdateFolderType.php24
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UpdateInboxRulesRequestType.php42
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UpdateItemType.php93
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UpdateUserConfigurationType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Request/UploadItemsType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/AddDelegateResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/AddDistributionGroupToImListResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/AddImContactToGroupResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/AddImGroupResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/AddNewImContactToGroupResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/AddNewTelUriContactToGroupResponse.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ApplyConversationActionResponseMessageType.php19
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ApplyConversationActionResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ArchiveItemResponse.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/AttachmentInfoResponseMessageType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/BaseDelegateResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/BaseResponseMessageType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ConvertIdResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ConvertIdResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CopyFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CopyItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CreateAttachmentResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CreateFolderPathResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CreateFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CreateItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CreateManagedFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/CreateUserConfigurationResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DelegateUserResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DeleteAttachmentResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DeleteAttachmentResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DeleteFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DeleteItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DeleteUserConfigurationResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DisableAppResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/DisconnectPhoneCallResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/EmptyFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ExpandDLResponseMessageType.php76
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ExpandDLResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ExportItemsResponseMessageType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ExportItemsResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindConversationResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindFolderResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindItemResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindMailboxStatisticsByKeywordsResponseMessageType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindMailboxStatisticsByKeywordsResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindMessageTrackingReportResponseMessageType.php62
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FindPeopleResponseMessageType.php60
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/FolderInfoResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetAppManifestsResponseType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetAppMarketplaceUrlResponseMessageType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetAttachmentResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetClientAccessTokenResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetClientAccessTokenResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetConversationItemsResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetConversationItemsResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetDelegateResponseMessageType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetDiscoverySearchConfigurationResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetEventsResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetEventsResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetHoldOnMailboxesResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetImItemListResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetImItemsResponse.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetInboxRulesResponseType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetMailTipsResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetMessageTrackingReportResponseMessageType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetNonIndexableItemDetailsResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetNonIndexableItemStatisticsResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetPasswordExpirationDateResponseMessageType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetPersonaResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetPhoneCallInformationResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetRemindersResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetRoomListsResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetRoomsResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetSearchableMailboxesResponseMessageType.php32
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetServerTimeZonesResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetServerTimeZonesResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetServiceConfigurationResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetSharingFolderResponseMessageType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetSharingMetadataResponseMessageType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetStreamingEventsResponseMessageType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetStreamingEventsResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetUserAvailabilityResponseType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetUserConfigurationResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetUserConfigurationResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetUserOofSettingsResponse.php46
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetUserPhotoResponseMessageType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetUserPhotoResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/GetUserRetentionPolicyTagsResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/InstallAppResponseType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ItemInfoResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/MailTipsResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/MarkAllItemsAsReadResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/MarkAsJunkResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/MarkAsJunkResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/MoveFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/MoveItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/PerformReminderActionResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/PlayOnPhoneResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/RefreshSharingFolderResponseMessageType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/RemoveContactFromImListResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/RemoveDelegateResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/RemoveDistributionGroupFromImListResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/RemoveImContactFromGroupResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/RemoveImGroupResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ResolveNamesResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ResolveNamesResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ResponseMessageType.php70
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SearchMailboxesResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SearchMailboxesResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SendItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SendNotificationResponseMessageType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SendNotificationResponseType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/ServiceConfigurationResponseMessageType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SetHoldOnMailboxesResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SetImGroupResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SetUserOofSettingsResponse.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SubscribeResponseMessageType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SubscribeResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SyncFolderHierarchyResponseMessageType.php48
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SyncFolderHierarchyResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SyncFolderItemsResponseMessageType.php48
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/SyncFolderItemsResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UninstallAppResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UnsubscribeResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UpdateDelegateResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UpdateFolderResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UpdateInboxRulesResponseType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UpdateItemResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UpdateItemResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UpdateUserConfigurationResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UploadItemsResponseMessageType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Response/UploadItemsResponseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AbsoluteDateTransitionType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AbsoluteMonthlyRecurrencePatternType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AbsoluteYearlyRecurrencePatternType.php38
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AcceptItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AcceptSharingInvitationType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AddressListIdType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AggregateOnType.php60
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AlternateIdBaseType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AlternateIdType.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AlternatePublicFolderIdType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AlternatePublicFolderItemIdType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AndType.php20
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AppMetadata.php163
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AppType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AppendToFolderFieldType.php60
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AppendToItemFieldType.php105
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AttachmentIdType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AttachmentResponseShapeType.php65
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AttachmentType.php96
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AttendeeConflictData.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/AttendeeType.php49
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseEmailAddressType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseFolderIdType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseFolderType.php103
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseGroupByType.php28
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseItemIdType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseNotificationEventType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseObjectChangedEventType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BasePagingType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BasePathToElementType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BasePermissionType.php92
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BaseSubscriptionRequestType.php65
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BodyContentAttributedValueType.php38
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BodyContentType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/BodyType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CalendarEvent.php66
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CalendarEventDetails.php90
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CalendarFolderType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CalendarItemType.php447
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CalendarPermissionSetType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CalendarPermissionType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CalendarViewType.php55
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CancelCalendarItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ChangeDescriptionType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ClientAccessTokenRequestType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ClientAccessTokenType.php54
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CompleteNameType.php108
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConflictResultsType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConnectingSIDType.php67
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConstantValueType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ContactItemType.php413
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ContactsFolderType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ContactsViewType.php51
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ContainsExpressionType.php46
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ContextPropertyType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConversationActionType.php131
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConversationNodeType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConversationResponseType.php54
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConversationShape.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ConversationType.php310
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/CreateRuleOperationType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DailyRecurrencePatternType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DailyRegeneratingPatternType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DeclineItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DelegatePermissionsType.php82
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DelegateUserType.php55
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DeleteFolderFieldType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DeleteItemFieldType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DeleteRuleOperationType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DeletedOccurrenceInfoType.php28
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DirectoryEntryType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DiscoverySearchConfigurationType.php73
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DistinguishedFolderIdType.php51
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DistinguishedGroupByType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/DistributionListType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/Duration.php38
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/EffectiveRightsType.php86
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/EmailAddressAttributedValueType.php35
-rwxr-xr-xmodules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/EmailAddressDictionaryEntryType.php76
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/EmailAddressDictionaryType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/EmailAddressType.php64
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/EncryptedSharedFolderDataType.php40
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/EndDateRecurrenceRangeType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ExchangeImpersonationType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ExcludesType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ExcludesValueType.php40
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ExistsType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ExtendedAttributeType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ExtendedPropertyAttributedValueType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ExtendedPropertyType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FailedSearchMailboxType.php52
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FieldOrderType.php55
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FieldURIOrConstantType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FileAttachmentType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FindFolderParentType.php77
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FindItemParentType.php88
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FindMessageTrackingSearchResultType.php103
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FolderChangeDescriptionType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FolderChangeType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FolderIdType.php39
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FolderResponseShapeType.php39
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FolderType.php32
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ForwardItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FractionalPageViewType.php41
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FreeBusyResponseType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FreeBusyView.php57
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/FreeBusyViewOptionsType.php46
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/GroupAttendeeConflictData.php64
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/GroupByType.php51
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/GroupedItemsType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ImAddressDictionaryEntryType.php39
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ImAddressDictionaryType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ImGroupType.php74
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ImItemListType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IndexedPageViewType.php48
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IndividualAttendeeConflictData.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/InstalledAppType.php173
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/InternetHeaderType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IntervalRecurrencePatternBaseType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/InvalidRecipientType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IsEqualToType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IsGreaterThanOrEqualToType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IsGreaterThanType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IsLessThanOrEqualToType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IsLessThanType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/IsNotEqualToType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ItemAttachmentType.php104
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ItemChangeDescriptionType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ItemChangeType.php66
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ItemIdType.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ItemResponseShapeType.php77
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ItemType.php443
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/KeywordStatisticsSearchResultType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailTips.php120
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailTipsServiceConfiguration.php85
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailboxData.php49
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailboxHoldResultType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailboxHoldStatusType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailboxQueryType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailboxSearchScopeType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MailboxStatisticsSearchResultType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ManagedFolderInformationType.php108
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MeetingCancellationMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MeetingMessageType.php94
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MeetingRequestMessageType.php423
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MeetingResponseMessageType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MemberType.php51
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MembersListType.php28
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MessageTrackingReportType.php82
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MessageType.php148
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MimeContentType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ModifiedEventType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MonthlyRegeneratingPatternType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MovedCopiedEventType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/MultipleOperandBooleanExpressionType.php143
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/NoEndRecurrenceRangeType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/NonIndexableItemDetailResultType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/NonIndexableItemDetailType.php102
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/NonIndexableItemStatisticType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/NotType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/NotificationType.php120
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/NumberedRecurrenceRangeType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/OccurrenceInfoType.php62
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/OccurrenceItemIdType.php50
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/OccurrencesRangeType.php57
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/OpenAsAdminOrSystemServiceType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/OrType.php20
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/OutOfOfficeMailTip.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PathToExtendedFieldType.php134
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PathToIndexedFieldType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PathToUnindexedFieldType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PeriodType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PermissionSetType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PermissionType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PersonaAttributionType.php85
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PersonaPhoneNumberType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PersonaPostalAddressType.php158
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PersonaResponseShapeType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PersonaType.php972
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PhoneCallIdType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PhoneCallInformationType.php64
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PhoneNumberAttributedValueType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PhoneNumberDictionaryEntryType.php39
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PhoneNumberDictionaryType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PhysicalAddressDictionaryEntryType.php75
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PhysicalAddressDictionaryType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PostItemType.php99
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PostReplyItemBaseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PostReplyItemType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PostalAddressAttributedValueType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PreviewItemMailboxType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PreviewItemResponseShapeType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PrivateCatalogAddInsType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProposeNewTimeType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRuleActionType.php40
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRuleAndType.php65
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRuleArgumentType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRuleConditionType.php69
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRuleRecipientIsType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRuleSenderDepartmentsType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRuleType.php69
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ProtectionRulesServiceConfiguration.php50
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PullSubscriptionRequestType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/PushSubscriptionRequestType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/QueryStringType.php56
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecipientTrackingEventType.php130
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurrencePatternBaseType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurrenceRangeBaseType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurrenceType.php113
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurringDateTransitionType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurringDayTransitionType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurringMasterItemIdRanges.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurringMasterItemIdType.php41
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RecurringTimeTransitionType.php33
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ReferenceItemResponseType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RegeneratingPatternBaseType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RelativeMonthlyRecurrencePatternType.php38
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RelativeYearlyRecurrencePatternType.php48
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ReminderItemActionType.php49
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ReminderType.php105
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RemoveItemType.php19
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ReplyAllToItemType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ReplyBody.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ReplyToItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RequestAttachmentIdType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RequestServerVersion.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ResolutionType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ResponseObjectCoreType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ResponseObjectType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RestrictionType.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RetentionPolicyTagType.php101
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RoomType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RootItemIdType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RuleActionsType.php140
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RuleOperationErrorType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RuleOperationType.php13
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RulePredicateDateRangeType.php41
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RulePredicateSizeRangeType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RulePredicatesType.php369
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RuleType.php100
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/RuleValidationErrorType.php58
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SearchExpressionType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SearchFolderType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SearchMailboxesResultType.php117
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SearchParametersType.php47
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SearchPreviewItemType.php221
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SearchableMailboxType.php81
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SeekToConditionPageViewType.php53
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SendNotificationResultType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SerializableTimeZone.php54
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SerializableTimeZoneTime.php97
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SerializedSecurityContextType.php54
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ServerVersionInfo.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/ServiceConfiguration.php19
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SetFolderFieldType.php60
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SetItemFieldType.php114
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SetRuleOperationType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SidAndAttributesType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SingleRecipientType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SmartResponseBaseType.php122
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SmartResponseType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SmtpDomain.php39
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SmtpDomainList.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/StreamingSubscriptionRequest.php48
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/StringArrayAttributedValueType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/StringAttributedValueType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/StringType.php23
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/Suggestion.php58
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SuggestionDayResult.php48
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SuggestionsResponseType.php35
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SuggestionsViewOptionsType.php100
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SuppressReadReceiptType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SyncFolderHierarchyChangesType.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SyncFolderHierarchyCreateOrUpdateType.php61
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SyncFolderHierarchyDeleteType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SyncFolderItemsChangesType.php57
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SyncFolderItemsCreateOrUpdateType.php115
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SyncFolderItemsDeleteType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/SyncFolderItemsReadFlagType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TargetFolderIdType.php43
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TaskRecurrenceType.php57
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TaskType.php243
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TasksFolderType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TentativelyAcceptItemType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TimeChangeType.php71
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TimeZoneContextType.php27
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TimeZoneDefinitionType.php62
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TimeZoneType.php54
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TooBigGroupAttendeeConflictData.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TrackingPropertyType.php37
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TransitionTargetType.php28
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TransitionType.php28
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/TwoOperandExpressionType.php24
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UnifiedMessageServiceConfiguration.php48
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UnknownAttendeeConflictData.php17
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UploadItemType.php73
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserConfigurationDictionaryEntryType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserConfigurationDictionaryObjectType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserConfigurationDictionaryType.php25
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserConfigurationNameType.php26
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserConfigurationType.php68
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserIdType.php67
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserMailboxType.php34
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/UserOofSettings.php71
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/WeeklyRecurrencePatternType.php36
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/WeeklyRegeneratingPatternType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/WellKnownResponseObjectType.php18
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/WorkingHours.php42
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/WorkingPeriod.php45
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/Type/YearlyRegeneratingPatternType.php16
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/assets/messages.xsd4523
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/assets/services.wsdl3624
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpEws/assets/types.xsd9779
-rw-r--r--modules-available/locationinfo/exchange-includes/jamesiarmes/PhpNtlm/SoapClient.php226
-rw-r--r--modules-available/locationinfo/frontend/frontendscript.js4
-rw-r--r--modules-available/locationinfo/hooks/runmode/config.json3
-rw-r--r--modules-available/locationinfo/inc/coursebackend.inc.php7
-rw-r--r--modules-available/locationinfo/inc/coursebackend/coursebackend_davinci.inc.php22
-rwxr-xr-xmodules-available/locationinfo/inc/coursebackend/coursebackend_exchange.inc.php242
-rw-r--r--modules-available/locationinfo/inc/coursebackend/coursebackend_hisinone.inc.php147
-rwxr-xr-xmodules-available/locationinfo/inc/coursebackend/exchange.todo203
-rw-r--r--modules-available/locationinfo/inc/infopanel.inc.php9
-rw-r--r--modules-available/locationinfo/inc/locationinfo.inc.php23
-rw-r--r--modules-available/locationinfo/inc/splittime.php.txt80
-rw-r--r--modules-available/locationinfo/lang/de/backend-exchange.json14
-rw-r--r--modules-available/locationinfo/lang/de/permissions.json8
-rw-r--r--modules-available/locationinfo/lang/de/template-tags.json10
-rw-r--r--modules-available/locationinfo/lang/en/backend-exchange.json14
-rw-r--r--modules-available/locationinfo/lang/en/permissions.json8
-rw-r--r--modules-available/locationinfo/lang/en/template-tags.json10
-rw-r--r--modules-available/locationinfo/page.inc.php166
-rw-r--r--modules-available/locationinfo/permissions/permissions.json20
-rw-r--r--modules-available/locationinfo/style.css10
-rw-r--r--modules-available/locationinfo/templates/ajax-config-location.html14
-rw-r--r--modules-available/locationinfo/templates/ajax-config-server.html10
-rwxr-xr-xmodules-available/locationinfo/templates/frontend-default.html93
-rw-r--r--modules-available/locationinfo/templates/frontend-summary.html245
-rw-r--r--modules-available/locationinfo/templates/page-config-panel-default.html95
-rw-r--r--modules-available/locationinfo/templates/page-config-panel-summary.html71
-rw-r--r--modules-available/locationinfo/templates/page-config-panel-url.html25
-rw-r--r--modules-available/locationinfo/templates/page-locations.html14
-rw-r--r--modules-available/locationinfo/templates/page-panels.html55
-rw-r--r--modules-available/locationinfo/templates/page-servers.html103
-rw-r--r--modules-available/locationinfo/templates/page-tabs.html6
-rw-r--r--modules-available/locationinfo/templates/server-prop-bool.html6
-rw-r--r--modules-available/locationinfo/templates/server-prop-dropdown.html6
-rw-r--r--modules-available/locationinfo/templates/server-prop-generic.html6
-rw-r--r--modules-available/locations/config.json4
-rw-r--r--modules-available/locations/inc/location.inc.php4
-rw-r--r--modules-available/locations/lang/de/messages.json1
-rw-r--r--modules-available/locations/lang/de/permissions.json14
-rw-r--r--modules-available/locations/lang/de/template-tags.json5
-rw-r--r--modules-available/locations/lang/en/messages.json1
-rw-r--r--modules-available/locations/lang/en/permissions.json14
-rw-r--r--modules-available/locations/lang/en/template-tags.json5
-rw-r--r--modules-available/locations/page.inc.php328
-rw-r--r--modules-available/locations/permissions/permissions.json32
-rw-r--r--modules-available/locations/templates/location-subnets.html44
-rw-r--r--modules-available/locations/templates/locations.html50
-rw-r--r--modules-available/locations/templates/subnets.html8
-rw-r--r--modules-available/main/config.json3
-rw-r--r--modules-available/main/install.inc.php15
-rw-r--r--modules-available/main/lang/de/categories.json3
-rw-r--r--modules-available/main/lang/de/template-tags.json4
-rw-r--r--modules-available/main/lang/en/categories.json3
-rw-r--r--modules-available/main/page.inc.php5
-rw-r--r--modules-available/minilinux/config.json4
-rw-r--r--modules-available/minilinux/lang/de/permissions.json4
-rw-r--r--modules-available/minilinux/lang/de/template-tags.json5
-rw-r--r--modules-available/minilinux/lang/en/permissions.json4
-rw-r--r--modules-available/minilinux/lang/en/template-tags.json5
-rw-r--r--modules-available/minilinux/page.inc.php6
-rw-r--r--modules-available/minilinux/permissions/permissions.json8
-rw-r--r--modules-available/minilinux/templates/filelist.html6
-rw-r--r--modules-available/news/config.json8
-rw-r--r--modules-available/news/lang/de/permissions.json9
-rw-r--r--modules-available/news/lang/de/template-tags.json1
-rw-r--r--modules-available/news/lang/en/permissions.json9
-rw-r--r--modules-available/news/lang/en/template-tags.json1
-rw-r--r--modules-available/news/page.inc.php442
-rw-r--r--modules-available/news/permissions/permissions.json23
-rw-r--r--modules-available/news/templates/page-news.html20
-rw-r--r--modules-available/permissionmanager/api.inc.php7
-rw-r--r--modules-available/permissionmanager/clientscript.js45
-rw-r--r--modules-available/permissionmanager/config.json10
-rw-r--r--modules-available/permissionmanager/hooks/translation-global.inc.php38
-rw-r--r--modules-available/permissionmanager/inc/getpermissiondata.inc.php55
-rw-r--r--modules-available/permissionmanager/inc/permissiondbupdate.inc.php110
-rw-r--r--modules-available/permissionmanager/inc/permissionutil.inc.php225
-rw-r--r--modules-available/permissionmanager/install.inc.php137
-rw-r--r--modules-available/permissionmanager/lang/de/permissions.json7
-rw-r--r--modules-available/permissionmanager/lang/de/template-tags.json36
-rw-r--r--modules-available/permissionmanager/lang/en/permissions.json7
-rw-r--r--modules-available/permissionmanager/lang/en/template-tags.json36
-rw-r--r--modules-available/permissionmanager/page.inc.php218
-rw-r--r--modules-available/permissionmanager/permissions/permissions.json17
-rw-r--r--modules-available/permissionmanager/style.css85
-rw-r--r--modules-available/permissionmanager/templates/_page.html29
-rw-r--r--modules-available/permissionmanager/templates/header-menu.html25
-rw-r--r--modules-available/permissionmanager/templates/locationstable.html56
-rw-r--r--modules-available/permissionmanager/templates/page-permission-denied.html21
-rw-r--r--modules-available/permissionmanager/templates/role-filter-selectize.html6
-rw-r--r--modules-available/permissionmanager/templates/roleeditor.html96
-rw-r--r--modules-available/permissionmanager/templates/rolestable.html45
-rw-r--r--modules-available/permissionmanager/templates/treenode.html23
-rw-r--r--modules-available/permissionmanager/templates/treepanel.html4
-rw-r--r--modules-available/permissionmanager/templates/userstable.html40
-rw-r--r--modules-available/rebootcontrol/config.json9
-rw-r--r--modules-available/rebootcontrol/inc/rebootcontrol.inc.php65
-rw-r--r--modules-available/rebootcontrol/inc/rebootqueries.inc.php4
-rw-r--r--modules-available/rebootcontrol/lang/de/module.json1
-rw-r--r--modules-available/rebootcontrol/lang/de/permissions.json5
-rw-r--r--modules-available/rebootcontrol/lang/de/template-tags.json11
-rw-r--r--modules-available/rebootcontrol/lang/en/module.json1
-rw-r--r--modules-available/rebootcontrol/lang/en/permissions.json5
-rw-r--r--modules-available/rebootcontrol/lang/en/template-tags.json11
-rw-r--r--modules-available/rebootcontrol/page.inc.php130
-rw-r--r--modules-available/rebootcontrol/permissions/permissions.json11
-rw-r--r--modules-available/rebootcontrol/style.css13
-rw-r--r--modules-available/rebootcontrol/templates/_page.html256
-rw-r--r--modules-available/rebootcontrol/templates/header.html79
-rw-r--r--modules-available/rebootcontrol/templates/status.html26
-rw-r--r--modules-available/rebootcontrol/templates/task-list.html33
-rw-r--r--modules-available/roomplanner/baseconfig/getconfig.inc.php21
-rw-r--r--modules-available/roomplanner/clientscript.js1
-rw-r--r--modules-available/roomplanner/config.json11
-rw-r--r--modules-available/roomplanner/hooks/runmode/config.json3
-rw-r--r--modules-available/roomplanner/inc/pvsgenerator.inc.php1
-rw-r--r--modules-available/roomplanner/js/grid.js139
-rw-r--r--modules-available/roomplanner/lang/de/module.json4
-rw-r--r--modules-available/roomplanner/lang/de/permissions.json3
-rw-r--r--modules-available/roomplanner/lang/en/module.json4
-rw-r--r--modules-available/roomplanner/lang/en/permissions.json3
-rw-r--r--modules-available/roomplanner/page.inc.php47
-rw-r--r--modules-available/roomplanner/permissions/permissions.json5
-rw-r--r--modules-available/roomplanner/style.css12
-rw-r--r--modules-available/roomplanner/templates/footer.html60
-rw-r--r--modules-available/roomplanner/templates/header.html49
-rw-r--r--modules-available/roomplanner/templates/item-selector.html314
-rw-r--r--modules-available/roomplanner/templates/main-roomplan.html18
-rw-r--r--modules-available/roomplanner/templates/page.html369
-rw-r--r--modules-available/runmode/baseconfig/getconfig.inc.php14
-rw-r--r--modules-available/runmode/config.json9
-rw-r--r--modules-available/runmode/inc/runmode.inc.php14
-rw-r--r--modules-available/runmode/lang/de/messages.json1
-rw-r--r--modules-available/runmode/lang/de/module.json4
-rw-r--r--modules-available/runmode/lang/de/permissions.json3
-rw-r--r--modules-available/runmode/lang/de/template-tags.json1
-rw-r--r--modules-available/runmode/lang/en/messages.json1
-rw-r--r--modules-available/runmode/lang/en/module.json4
-rw-r--r--modules-available/runmode/lang/en/permissions.json3
-rw-r--r--modules-available/runmode/lang/en/template-tags.json1
-rw-r--r--modules-available/runmode/page.inc.php286
-rw-r--r--modules-available/runmode/permissions/permissions.json5
-rw-r--r--modules-available/runmode/templates/machine-selector.html32
-rw-r--r--modules-available/runmode/templates/module-machine-list.html4
-rw-r--r--modules-available/serversetup-bwlp-ipxe/api.inc.php252
-rw-r--r--modules-available/serversetup-bwlp-ipxe/config.json8
-rw-r--r--modules-available/serversetup-bwlp-ipxe/hooks/bootup.inc.php11
-rw-r--r--modules-available/serversetup-bwlp-ipxe/hooks/ipxe-update.inc.php10
-rw-r--r--modules-available/serversetup-bwlp-ipxe/hooks/main-warning.inc.php (renamed from modules-available/serversetup-bwlp/hooks/main-warning.inc.php)0
-rw-r--r--modules-available/serversetup-bwlp-ipxe/inc/bootentry.inc.php258
-rw-r--r--modules-available/serversetup-bwlp-ipxe/inc/ipxe.inc.php453
-rw-r--r--modules-available/serversetup-bwlp-ipxe/inc/ipxemenu.inc.php142
-rw-r--r--modules-available/serversetup-bwlp-ipxe/inc/localboot.inc.php15
-rw-r--r--modules-available/serversetup-bwlp-ipxe/inc/menuentry.inc.php177
-rw-r--r--modules-available/serversetup-bwlp-ipxe/inc/pxelinux.inc.php302
-rw-r--r--modules-available/serversetup-bwlp-ipxe/install.inc.php89
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/de/messages.json20
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/de/module.json19
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/de/permissions.json11
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/de/template-tags.json75
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/en/messages.json20
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/en/module.json19
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/en/permissions.json11
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/en/template-tags.json75
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/pt/messages.json (renamed from modules-available/serversetup-bwlp/lang/pt/messages.json)0
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/pt/module.json (renamed from modules-available/serversetup-bwlp/lang/en/module.json)0
-rw-r--r--modules-available/serversetup-bwlp-ipxe/lang/pt/template-tags.json (renamed from modules-available/serversetup-bwlp/lang/pt/template-tags.json)0
-rw-r--r--modules-available/serversetup-bwlp-ipxe/page.inc.php829
-rw-r--r--modules-available/serversetup-bwlp-ipxe/permissions/permissions.json29
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/bootentry-list.html83
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/download.html53
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/heading.html3
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/ipaddress.html44
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/ipxe-new-boot-entry.html165
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/ipxe_update.html54
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/localboot.html59
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/menu-assign-location.html69
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/menu-edit.html368
-rw-r--r--modules-available/serversetup-bwlp-ipxe/templates/menu-list.html100
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/config.json3
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/hooks/ipxe-update.inc.php9
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/hooks/main-warning.inc.php6
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/inc/ipxe.inc.php224
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/de/messages.json (renamed from modules-available/serversetup-bwlp/lang/de/messages.json)0
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/de/module.json (renamed from modules-available/serversetup-bwlp/lang/de/module.json)0
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/de/permissions.json6
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/de/template-tags.json (renamed from modules-available/serversetup-bwlp/lang/de/template-tags.json)6
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/en/messages.json (renamed from modules-available/serversetup-bwlp/lang/en/messages.json)0
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/en/module.json (renamed from modules-available/serversetup-bwlp/lang/pt/module.json)0
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/en/permissions.json6
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/en/template-tags.json (renamed from modules-available/serversetup-bwlp/lang/en/template-tags.json)6
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/pt/messages.json3
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/pt/module.json3
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/lang/pt/template-tags.json38
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/page.inc.php (renamed from modules-available/serversetup-bwlp/page.inc.php)44
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/permissions/permissions.json14
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/templates/heading.html (renamed from modules-available/serversetup-bwlp/templates/heading.html)0
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/templates/ipaddress.html (renamed from modules-available/serversetup-bwlp/templates/ipaddress.html)7
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/templates/ipxe.html (renamed from modules-available/serversetup-bwlp/templates/ipxe.html)18
-rw-r--r--modules-available/serversetup-bwlp-pxelinux/templates/ipxe_update.html38
-rw-r--r--modules-available/serversetup-bwlp/config.json3
-rw-r--r--modules-available/serversetup-bwlp/inc/ipxe.inc.php102
-rw-r--r--modules-available/serversetup-bwlp/lang/de/permissions.json5
-rw-r--r--modules-available/serversetup-bwlp/lang/en/permissions.json5
-rw-r--r--modules-available/serversetup-bwlp/permissions/permissions.json5
-rw-r--r--modules-available/serversetup-bwlp/style.css12
-rw-r--r--modules-available/serversetup-bwlp/templates/ipxe_update.html20
-rw-r--r--modules-available/session/config.json3
-rw-r--r--modules-available/statistics/api.inc.php137
-rw-r--r--modules-available/statistics/config.json12
-rw-r--r--modules-available/statistics/hooks/cron.inc.php32
-rw-r--r--modules-available/statistics/inc/filter.inc.php49
-rw-r--r--modules-available/statistics/inc/filterset.inc.php82
-rw-r--r--modules-available/statistics/inc/parser.inc.php36
-rw-r--r--modules-available/statistics/inc/statistics.inc.php17
-rw-r--r--modules-available/statistics/install.inc.php17
-rw-r--r--modules-available/statistics/lang/de/permissions.json13
-rw-r--r--modules-available/statistics/lang/de/template-tags.json4
-rw-r--r--modules-available/statistics/lang/en/permissions.json13
-rw-r--r--modules-available/statistics/lang/en/template-tags.json4
-rw-r--r--modules-available/statistics/page.inc.php267
-rw-r--r--modules-available/statistics/pages/projectors.inc.php4
-rw-r--r--modules-available/statistics/permissions/permissions.json31
-rw-r--r--modules-available/statistics/style.css32
-rw-r--r--modules-available/statistics/templates/clientlist.html25
-rw-r--r--modules-available/statistics/templates/cpumodels.html4
-rw-r--r--modules-available/statistics/templates/filterbox.html17
-rw-r--r--modules-available/statistics/templates/id44.html2
-rw-r--r--modules-available/statistics/templates/kvmstate.html2
-rw-r--r--modules-available/statistics/templates/machine-hdds.html6
-rw-r--r--modules-available/statistics/templates/machine-main.html44
-rw-r--r--modules-available/statistics/templates/machine-notes.html7
-rw-r--r--modules-available/statistics/templates/memory.html2
-rw-r--r--modules-available/statistics/templates/summary.html4
-rw-r--r--modules-available/statistics_reporting/config.json9
-rw-r--r--modules-available/statistics_reporting/inc/queries.inc.php12
-rw-r--r--modules-available/statistics_reporting/lang/de/template-tags.json2
-rw-r--r--modules-available/statistics_reporting/lang/en/template-tags.json2
-rw-r--r--modules-available/statistics_reporting/lang/pt/template-tags.json3
-rw-r--r--modules-available/statistics_reporting/page.inc.php4
-rw-r--r--modules-available/statistics_reporting/permissions/permissions.json36
-rw-r--r--modules-available/summernote/config.json17
-rw-r--r--modules-available/support/config.json4
-rw-r--r--modules-available/sysconfig/addmodule_adauth.inc.php25
-rw-r--r--modules-available/sysconfig/addmodule_custommodule.inc.php4
-rw-r--r--modules-available/sysconfig/addmodule_ldapauth.inc.php24
-rw-r--r--modules-available/sysconfig/api.inc.php8
-rw-r--r--modules-available/sysconfig/config.json4
-rw-r--r--modules-available/sysconfig/inc/configmodule.inc.php2
-rw-r--r--modules-available/sysconfig/inc/configmodule/adauth.inc.php2
-rw-r--r--modules-available/sysconfig/inc/configmodule/ldapauth.inc.php2
-rw-r--r--modules-available/sysconfig/inc/configmodulebaseldap.inc.php6
-rw-r--r--modules-available/sysconfig/inc/configtgz.inc.php51
-rw-r--r--modules-available/sysconfig/lang/de/permissions.json8
-rw-r--r--modules-available/sysconfig/lang/de/template-tags.json10
-rw-r--r--modules-available/sysconfig/lang/en/permissions.json8
-rw-r--r--modules-available/sysconfig/lang/en/template-tags.json8
-rw-r--r--modules-available/sysconfig/page.inc.php44
-rw-r--r--modules-available/sysconfig/permissions/permissions.json20
-rw-r--r--modules-available/sysconfig/templates/ad-selfsearch.html2
-rw-r--r--modules-available/sysconfig/templates/ad-start.html10
-rw-r--r--modules-available/sysconfig/templates/ad_ldap-checkconnection.html2
-rw-r--r--modules-available/sysconfig/templates/ad_ldap-checkcredentials.html2
-rw-r--r--modules-available/sysconfig/templates/ad_ldap-homedir.html15
-rw-r--r--modules-available/sysconfig/templates/ldap-start.html10
-rw-r--r--modules-available/sysconfig/templates/list-configs.html21
-rw-r--r--modules-available/sysconfig/templates/list-modules.html24
-rw-r--r--modules-available/sysconfig/templates/sshconfig-start.html2
-rw-r--r--modules-available/sysconfignew/config.json4
-rw-r--r--modules-available/syslog/api.inc.php39
-rw-r--r--modules-available/syslog/config.json8
-rw-r--r--modules-available/syslog/hooks/cron.inc.php21
-rw-r--r--modules-available/syslog/lang/de/messages.json4
-rw-r--r--modules-available/syslog/lang/de/permissions.json4
-rw-r--r--modules-available/syslog/lang/de/template-tags.json11
-rw-r--r--modules-available/syslog/lang/en/messages.json4
-rw-r--r--modules-available/syslog/lang/en/permissions.json4
-rw-r--r--modules-available/syslog/lang/en/template-tags.json11
-rw-r--r--modules-available/syslog/page.inc.php41
-rw-r--r--modules-available/syslog/permissions/permissions.json11
-rw-r--r--modules-available/syslog/templates/heading.html68
-rw-r--r--modules-available/syslog/templates/page-syslog.html1
-rw-r--r--modules-available/systemstatus/config.json8
-rw-r--r--modules-available/systemstatus/lang/de/permissions.json13
-rw-r--r--modules-available/systemstatus/lang/de/template-tags.json2
-rw-r--r--modules-available/systemstatus/lang/en/permissions.json13
-rw-r--r--modules-available/systemstatus/page.inc.php21
-rw-r--r--modules-available/systemstatus/permissions/permissions.json35
-rw-r--r--modules-available/systemstatus/templates/_page.html13
-rw-r--r--modules-available/translation/config.json4
-rw-r--r--modules-available/translation/page.inc.php75
-rw-r--r--modules-available/translation/templates/edit.html6
-rw-r--r--modules-available/usermanagement/config.json6
-rw-r--r--modules-available/vmstore/baseconfig/getconfig.inc.php6
-rw-r--r--modules-available/vmstore/config.json4
-rw-r--r--modules-available/vmstore/lang/de/permissions.json4
-rw-r--r--modules-available/vmstore/lang/de/template-tags.json6
-rw-r--r--modules-available/vmstore/lang/en/permissions.json4
-rw-r--r--modules-available/vmstore/lang/en/template-tags.json4
-rw-r--r--modules-available/vmstore/page.inc.php22
-rw-r--r--modules-available/vmstore/permissions/permissions.json10
-rw-r--r--modules-available/vmstore/templates/page-vmstore.html16
-rw-r--r--modules-available/webinterface/config.json4
-rw-r--r--modules-available/webinterface/lang/de/permissions.json7
-rw-r--r--modules-available/webinterface/lang/en/permissions.json7
-rw-r--r--modules-available/webinterface/page.inc.php22
-rw-r--r--modules-available/webinterface/permissions/permissions.json19
-rw-r--r--modules-available/webinterface/style.css7
-rw-r--r--modules-available/webinterface/templates/customization.html11
-rw-r--r--modules-available/webinterface/templates/heading.html20
-rw-r--r--modules-available/webinterface/templates/https.html102
-rw-r--r--modules-available/webinterface/templates/passwords.html23
-rw-r--r--script/slx-fixes.js19
-rw-r--r--script/taskmanager.js11
-rw-r--r--style/default.css47
1257 files changed, 81413 insertions, 4517 deletions
diff --git a/TODO b/TODO
deleted file mode 100644
index a1a4a559..00000000
--- a/TODO
+++ /dev/null
@@ -1,5 +0,0 @@
-fix translations path (lang/<lang>/...) for de, pt
-fix translations page for templates/modules
-fix sql setup scripts for c3sl's new stuff
-fix support page
-rework/fix c3sl's partition / user config variables (baseconfig)
diff --git a/api.php b/api.php
index 880285be..df54d7f5 100644
--- a/api.php
+++ b/api.php
@@ -28,11 +28,19 @@ if (!empty($_REQUEST['do'])) {
$module = preg_replace('/[^a-z0-9]/', '', $_REQUEST['do']);
} elseif (!empty($argv[1])) {
$module = preg_replace('/[^a-z0-9]/', '', $argv[1]);
- $argc = count($argv) - 1;
+ $argc = count($argv);
for ($i = 2; $i < $argc; ++$i) {
if (substr($argv[$i], 0, 2) === '--') {
- $_GET[substr($argv[$i], 2)] = $argv[$i+1];
- ++$i;
+ // Handle --arg=value and --arg value
+ $key = substr($argv[$i], 2);
+ if (($pos = strpos($key, '=')) !== false) {
+ $val = substr($key, $pos + 1);
+ $key = substr($key, 0, $pos);
+ $_REQUEST[$key] = $_GET[$key] = $val;
+ } elseif ($i + 1 < $argc) {
+ $_REQUEST[$key] = $_GET[$key] = $argv[$i + 1];
+ ++$i;
+ }
}
}
} else {
diff --git a/inc/dashboard.inc.php b/inc/dashboard.inc.php
index 3db42efb..d576a8f1 100644
--- a/inc/dashboard.inc.php
+++ b/inc/dashboard.inc.php
@@ -68,7 +68,7 @@ class Dashboard
'url' => urlencode($_SERVER['REQUEST_URI']),
'langs' => Dictionary::getLanguages(true),
'user' => User::getName(),
- 'warning' => User::getName() !== false && User::getLastSeenEvent() < Property::getLastWarningId(),
+ 'warning' => User::getName() !== false && User::hasPermission('.eventlog.*') && User::getLastSeenEvent() < Property::getLastWarningId(),
'needsSetup' => User::getName() !== false && Property::getNeedsSetup()
));
}
@@ -103,5 +103,10 @@ class Dashboard
{
self::$subMenu[] = array('url' => $url, 'name' => $name);
}
+
+ public static function getSubmenus()
+ {
+ return self::$subMenu;
+ }
} \ No newline at end of file
diff --git a/inc/database.inc.php b/inc/database.inc.php
index 082b13b6..3b2414b5 100644
--- a/inc/database.inc.php
+++ b/inc/database.inc.php
@@ -77,6 +77,19 @@ class Database
}
/**
+ * Fetch the first column of the query as a plain list-of-values array.
+ *
+ * @return array|bool List of values representing first column of query
+ */
+ public static function queryColumnArray($query, $args = array(), $ignoreError = null)
+ {
+ $res = self::simpleQuery($query, $args, $ignoreError);
+ if ($res === false)
+ return false;
+ return $res->fetchAll(PDO::FETCH_COLUMN, 0);
+ }
+
+ /**
* Execute the given query and return the number of rows affected.
* Mostly useful for UPDATEs or INSERTs
*
@@ -132,7 +145,7 @@ class Database
if (!isset(self::$statements[$query])) {
self::$statements[$query] = self::$dbh->prepare($query);
} else {
- self::$statements[$query]->closeCursor();
+ //self::$statements[$query]->closeCursor();
}
$start = microtime(true);
if (self::$statements[$query]->execute($args) === false) {
diff --git a/inc/dictionary.inc.php b/inc/dictionary.inc.php
index ee196f59..935d1f4e 100644
--- a/inc/dictionary.inc.php
+++ b/inc/dictionary.inc.php
@@ -17,6 +17,8 @@ class Dictionary
{
self::$languages = array();
foreach (glob('lang/??', GLOB_ONLYDIR) as $lang) {
+ if (!file_exists($lang . '/name.txt') && !file_exists($lang . '/flag.png'))
+ continue;
$lang = basename($lang);
if ($lang === '..')
continue;
@@ -28,10 +30,15 @@ class Dictionary
if ($lang !== false && in_array($lang, self::$languages)) {
setcookie('lang', $lang, time() + 60 * 60 * 24 * 30 * 12);
$url = Request::get('url');
- if ($url === false && isset($_SERVER['HTTP_REFERER']))
+ if ($url === false && isset($_SERVER['HTTP_REFERER'])) {
$url = $_SERVER['HTTP_REFERER'];
- if ($url === false)
- $url = '?do=Main';
+ }
+ $parts = parse_url($url);
+ if ($url === false || $parts === false || empty($parts['query'])) {
+ $url = '?do=main';
+ } else {
+ $url = '?' . $parts['query'];
+ }
Util::redirect($url);
}
@@ -191,6 +198,8 @@ class Dictionary
foreach (self::$languages as $lang) {
if (file_exists("lang/$lang/name.txt")) {
$name = file_get_contents("lang/$lang/name.txt");
+ } else {
+ $name = false;
}
if (!isset($name) || $name === false) {
$name = $lang;
diff --git a/inc/event.inc.php b/inc/event.inc.php
index 66601607..4e68ab6d 100644
--- a/inc/event.inc.php
+++ b/inc/event.inc.php
@@ -24,6 +24,17 @@ class Event
Property::clearList('cron.key.status');
Property::clearList('cron.key.blocked');
+ // Hooks
+ foreach (Hook::load('bootup') as $hook) {
+ // Isolate for local vars
+ $fun = function() use ($hook) {
+ include_once($hook->file);
+ };
+ $fun();
+ }
+
+ // TODO: Modularize (hooks)
+
// Tasks: fire away
$mountStatus = false;
$mountId = Trigger::mount();
@@ -98,8 +109,7 @@ class Event
public static function serverIpChanged()
{
error_log('Server ip changed');
- global $tidIpxe;
- $tidIpxe = Trigger::ipxe();
+ Trigger::ipxe();
if (Module::isAvailable('sysconfig')) { // TODO: Modularize events
ConfigModule::serverIpChanged();
}
@@ -111,6 +121,8 @@ class Event
public static function activeConfigChanged()
{
$task = Trigger::ldadp();
+ if ($task === false)
+ return;
TaskmanagerCallback::addCallback($task, 'ldadpStartup');
}
diff --git a/inc/module.inc.php b/inc/module.inc.php
index 7610c720..6d160787 100644
--- a/inc/module.inc.php
+++ b/inc/module.inc.php
@@ -35,7 +35,7 @@ class Module
if ($module === false)
return false;
if ($activate) {
- $module->activate();
+ $module->activate(1, true);
}
return !$module->hasMissingDependencies();
}
@@ -139,9 +139,11 @@ class Module
*/
private $category = false;
+ private $clientPlugin = false;
private $depsMissing = false;
private $depsChecked = false;
private $activated = false;
+ private $directActivation = false;
private $dependencies = array();
private $name;
/**
@@ -165,6 +167,9 @@ class Module
if (isset($json['category']) && is_string($json['category'])) {
$this->category = $json['category'];
}
+ if (isset($json['client-plugin'])) {
+ $this->clientPlugin = (bool)$json['client-plugin'];
+ }
$this->name = $name;
}
@@ -184,21 +189,33 @@ class Module
return new $class();
}
- public function activate($depth = 1)
+ public function activate($depth, $direct)
{
- if ($this->activated !== false || $this->depsMissing)
- return $this->activated !== false;
+ if ($this->depsMissing)
+ return false;
+ if ($this->activated !== false && ($this->directActivation || !$direct))
+ return true;
+ if ($depth === null && $direct === null) {
+ // This is the current page, always load its scripts
+ $this->clientPlugin = true;
+ $direct = true;
+ }
+ if ($this->activated === false) {
+ spl_autoload_register(function ($class) {
+ $file = 'modules/' . $this->name . '/inc/' . preg_replace('/[^a-z0-9]/', '', strtolower($class)) . '.inc.php';
+ if (!file_exists($file))
+ return;
+ require_once $file;
+ });
+ }
$this->activated = $depth;
- spl_autoload_register(function($class) {
- $file = 'modules/' . $this->name . '/inc/' . preg_replace('/[^a-z0-9]/', '', strtolower($class)) . '.inc.php';
- if (!file_exists($file))
- return;
- require_once $file;
- });
+ if ($direct) {
+ $this->directActivation = true;
+ }
foreach ($this->dependencies as $dep) {
$get = self::get($dep);
if ($get !== false) {
- $get->activate($depth + 1);
+ $get->activate($depth + 1, $direct && $this->clientPlugin);
}
}
return true;
@@ -263,26 +280,26 @@ class Module
return 'modules/' . $this->name;
}
- public function getScripts($externalOnly)
+ public function getScripts()
{
- if (!$externalOnly) {
- if (!isset($this->scripts['clientscript.js']) && file_exists($this->getDir() . '/clientscript.js')) {
- $this->scripts['clientscript.js'] = false;
+ if ($this->directActivation && $this->clientPlugin) {
+ if (!in_array('clientscript.js', $this->scripts) && file_exists($this->getDir() . '/clientscript.js')) {
+ $this->scripts[] = 'clientscript.js';
}
- return array_keys($this->scripts);
+ return $this->scripts;
}
- return array_keys(array_filter($this->scripts));
+ return [];
}
- public function getCss($externalOnly)
+ public function getCss()
{
- if (!$externalOnly) {
- if (!isset($this->css['style.css']) && file_exists($this->getDir() . '/style.css')) {
- $this->css['style.css'] = false;
+ if ($this->directActivation && $this->clientPlugin) {
+ if (!in_array('style.css', $this->css) && file_exists($this->getDir() . '/style.css')) {
+ $this->css[] = 'style.css';
}
- return array_keys($this->css);
+ return $this->css;
}
- return array_keys(array_filter($this->css));
+ return [];
}
}
diff --git a/inc/paginate.inc.php b/inc/paginate.inc.php
index cdb4adf1..b212e252 100644
--- a/inc/paginate.inc.php
+++ b/inc/paginate.inc.php
@@ -65,8 +65,6 @@ class Paginate
$countQuery = preg_replace('/ORDER\s+BY\s.*?(\sASC|\sDESC|$)/is', '', $this->query);
$countQuery = preg_replace('/SELECT\s.*?\sFROM\s/is', 'SELECT Count(*) AS rowcount FROM ', $countQuery);
$countRes = Database::queryFirst($countQuery, $args);
- $args['limit_start'] = $this->currentPage;
- $args['limit_count'] = $this->perPage;
$query = $this->query . ' LIMIT ' . ($this->currentPage * $this->perPage) . ', ' . $this->perPage;
$retval = Database::simpleQuery($query, $args);
$this->totalRows = (int)$countRes['rowcount'];
diff --git a/inc/permission.inc.php b/inc/permission.inc.php
index d04e3c3b..aaef6ba6 100644
--- a/inc/permission.inc.php
+++ b/inc/permission.inc.php
@@ -15,5 +15,41 @@ class Permission
return self::$permissions[$permission];
}
+
+ // TODO: Doc/Refactor
+ public static function addGlobalTags(&$array, $locationid, $disabled, $noneAvailDisabled = null)
+ {
+ if (Module::get('permissionmanager') === false)
+ return;
+ $one = false;
+ foreach ($disabled as $perm) {
+ if (User::hasPermission($perm, $locationid)) {
+ $one = true;
+ continue;
+ }
+ if (strpos($perm, '.') === false) {
+ $array[$perm] = ['disabled' => 'disabled', 'readonly' => 'readonly'];
+ continue;
+ }
+ $temp =& $array;
+ foreach (explode('.', $perm) as $sub) {
+ if (empty($sub) || $sub === '*')
+ continue;
+ $temp =& $temp[$sub];
+ }
+ $temp = ['disabled' => 'disabled', 'readonly' => 'readonly'];
+ }
+ if (!$one && !is_null($noneAvailDisabled)) {
+ $array[$noneAvailDisabled]['disabled'] = true;
+ }
+ }
+
+ public static function moduleHasPermissions($moduleId)
+ {
+ if (Module::get('permissionmanager') === false)
+ return true;
+ return file_exists('modules/' . $moduleId . '/permissions/permissions.json');
+ }
+
}
diff --git a/inc/property.inc.php b/inc/property.inc.php
index 56adb823..b69be1f8 100644
--- a/inc/property.inc.php
+++ b/inc/property.inc.php
@@ -168,7 +168,7 @@ class Property
if (!Taskmanager::isFinished($task)) {
$task = Taskmanager::waitComplete($task['id'], 5000);
}
- if ($task['statusCode'] !== TASK_FINISHED || !isset($task['data']['content'])) {
+ if ($task['statusCode'] !== Taskmanager::TASK_FINISHED || !isset($task['data']['content'])) {
return isset($task['data']['error']) ? $task['data']['error'] : 'Timeout';
}
$data = json_decode($task['data']['content'], true);
diff --git a/inc/render.inc.php b/inc/render.inc.php
index 0ce39dbe..4da0567e 100644
--- a/inc/render.inc.php
+++ b/inc/render.inc.php
@@ -84,7 +84,7 @@ class Render
';
// Include any module specific styles
foreach ($modules as $module) {
- $files = $module->getCss($module !== $pageModule);
+ $files = $module->getCss();
foreach ($files as $file) {
echo '<link href="', $module->getDir(), '/', $file, '" rel="stylesheet" media="screen">';
}
@@ -113,7 +113,7 @@ class Render
<script src="script/slx-fixes.js"></script>
';
foreach ($modules as $module) {
- $files = $module->getScripts($module !== $pageModule);
+ $files = $module->getScripts();
foreach ($files as $file) {
echo '<script src="', $module->getDir(), '/', $file, '"></script>';
}
@@ -213,7 +213,7 @@ class Render
* @param string $module name of module to load template from; defaults to currently active module
* @return string Rendered template
*/
- public static function parse($template, $params = false, $module = false)
+ public static function parse($template, $params = false, $module = false, $lang = false)
{
if ($module === false && class_exists('Page')) {
$module = Page::getModule()->getIdentifier();
@@ -228,7 +228,7 @@ class Render
}
// Now find all language tags in this array
if (preg_match_all('/{{\s*(lang_.+?)\s*}}/', $html, $out) > 0) {
- $dictionary = Dictionary::getArray($module, 'template-tags');
+ $dictionary = Dictionary::getArray($module, 'template-tags', $lang);
$fallback = false;
foreach ($out[1] as $tag) {
if ($fallback === false && empty($dictionary[$tag])) {
diff --git a/inc/taskmanager.inc.php b/inc/taskmanager.inc.php
index cdc90f55..dab950ed 100644
--- a/inc/taskmanager.inc.php
+++ b/inc/taskmanager.inc.php
@@ -6,6 +6,13 @@
class Taskmanager
{
+ const NO_SUCH_TASK = 'NO_SUCH_TASK';
+ const TASK_FINISHED = 'TASK_FINISHED';
+ const TASK_ERROR = 'TASK_ERROR';
+ const TASK_WAITING = 'TASK_WAITING';
+ const NO_SUCH_INSTANCE = 'NO_SUCH_INSTANCE';
+ const TASK_PROCESSING = 'TASK_PROCESSING';
+
/**
* UDP socket used for communication with the task manager
* @var resource
@@ -49,7 +56,7 @@ class Taskmanager
if ($async)
return true;
$reply = self::readReply($seq);
- if ($reply === false || !is_array($reply) || !isset($reply['id']) || (isset($reply['statusCode']) && $reply['statusCode'] === NO_SUCH_TASK)) {
+ if ($reply === false || !is_array($reply) || !isset($reply['id']) || (isset($reply['statusCode']) && $reply['statusCode'] === Taskmanager::NO_SUCH_TASK)) {
self::addErrorMessage($reply);
return false;
}
@@ -82,15 +89,22 @@ class Taskmanager
/**
* Checks whether the given task id corresponds to a known task in the taskmanager.
* Returns true iff the taskmanager is reachable and the status of the task
- * is different from NO_SUCH_TASK.
+ * is different from Taskmanager::NO_SUCH_INSTANCE/_TASK.
+ * If you pass an array it is assumed that it was already queried and is evaluated
+ * directly.
*
- * @param string $taskid a task id
+ * @param string|array $taskid a task id or a task array returned by ::status or ::submit
* @return boolean true if taskid exists in taskmanager
*/
- public static function isTask($taskid)
+ public static function isTask($task)
{
- $task = self::status($taskid);
- return isset($task['statusCode']) && $task['statusCode'] !== NO_SUCH_TASK;
+ if ($task === false)
+ return false;
+ if (is_string($task)) {
+ $task = self::status($task);
+ }
+ return isset($task['statusCode']) && $task['statusCode'] !== Taskmanager::NO_SUCH_INSTANCE
+ && $task['statusCode'] !== Taskmanager::NO_SUCH_TASK;
}
/**
@@ -103,7 +117,7 @@ class Taskmanager
public static function waitComplete($task, $timeout = 2500)
{
if (is_array($task) && isset($task['id'])) {
- if ($task['statusCode'] !== TASK_PROCESSING && $task['statusCode'] !== TASK_WAITING) {
+ if ($task['statusCode'] !== Taskmanager::TASK_PROCESSING && $task['statusCode'] !== Taskmanager::TASK_WAITING) {
self::release($task['id']);
return $task;
}
@@ -117,7 +131,7 @@ class Taskmanager
$status = self::status($task);
if (!isset($status['statusCode']))
break;
- if ($status['statusCode'] !== TASK_PROCESSING && $status['statusCode'] !== TASK_WAITING) {
+ if ($status['statusCode'] !== Taskmanager::TASK_PROCESSING && $status['statusCode'] !== Taskmanager::TASK_WAITING) {
$done = true;
break;
}
@@ -140,7 +154,7 @@ class Taskmanager
{
if (!is_array($task) || !isset($task['statusCode']) || !isset($task['id']))
return true;
- if ($task['statusCode'] !== TASK_WAITING && $task['statusCode'] !== TASK_PROCESSING && $task['statusCode'] !== TASK_FINISHED)
+ if ($task['statusCode'] !== Taskmanager::TASK_WAITING && $task['statusCode'] !== Taskmanager::TASK_PROCESSING && $task['statusCode'] !== Taskmanager::TASK_FINISHED)
return true;
return false;
}
@@ -156,7 +170,7 @@ class Taskmanager
{
if (!is_array($task) || !isset($task['statusCode']) || !isset($task['id']))
return false;
- if ($task['statusCode'] !== TASK_WAITING && $task['statusCode'] !== TASK_PROCESSING)
+ if ($task['statusCode'] !== Taskmanager::TASK_WAITING && $task['statusCode'] !== Taskmanager::TASK_PROCESSING)
return true;
return false;
}
@@ -210,7 +224,7 @@ class Taskmanager
private static function readReply($seq)
{
$tries = 0;
- while (($bytes = socket_recvfrom(self::$sock, $buf, 90000, 0, $bla1, $bla2)) !== false || socket_last_error() === 11) {
+ while (($bytes = @socket_recvfrom(self::$sock, $buf, 90000, 0, $bla1, $bla2)) !== false || socket_last_error() === 11) {
$parts = explode(',', $buf, 2);
// Do we have compressed data?
if (substr($parts[0], 0, 3) === '+z:') {
@@ -237,7 +251,3 @@ class Taskmanager
}
}
-
-foreach (array('TASK_FINISHED', 'TASK_ERROR', 'TASK_WAITING', 'NO_SUCH_TASK', 'TASK_PROCESSING') as $i) {
- define($i, $i);
-}
diff --git a/inc/taskmanagercallback.inc.php b/inc/taskmanagercallback.inc.php
index ab8affac..8e253962 100644
--- a/inc/taskmanagercallback.inc.php
+++ b/inc/taskmanagercallback.inc.php
@@ -22,7 +22,7 @@ class TaskmanagerCallback
if (is_array($task) && isset($task['id']))
$task = $task['id'];
if (!is_string($task)) {
- EventLog::warning("addCallback: Not a valid task id: $task");
+ EventLog::warning("addCallback: Not a valid task id: $task", print_r(debug_backtrace(), true));
return;
}
$data = array(
@@ -136,7 +136,7 @@ class TaskmanagerCallback
$mod = Module::get('sysconfig');
if ($mod === false)
return;
- $mod->activate();
+ $mod->activate(1, false);
if (Taskmanager::isFailed($task)) {
ConfigModule::generateFailed($task, $args);
} else {
@@ -155,7 +155,7 @@ class TaskmanagerCallback
$mod = Module::get('sysconfig');
if ($mod === false)
return;
- $mod->activate();
+ $mod->activate(1, false);
if (Taskmanager::isFailed($task)) {
ConfigTgz::generateFailed($task, $args);
} else {
@@ -172,7 +172,8 @@ class TaskmanagerCallback
Property::setVmStoreConfig($args);
return;
}
- if ($task['data']['exitCode'] > 0) {
+ // If code is 99 then the script failed to even unmount -- don't change anything
+ if ($task['data']['exitCode'] != 99) {
// Manual mount failed with non-taskmanager related error - reset storage type to reflect situation
$data = Property::getVmStoreConfig();
if (isset($data['storetype'])) {
diff --git a/inc/trigger.inc.php b/inc/trigger.inc.php
index 2af73872..e89a9a17 100644
--- a/inc/trigger.inc.php
+++ b/inc/trigger.inc.php
@@ -20,12 +20,24 @@ class Trigger
*/
public static function ipxe()
{
- $data = Property::getBootMenu();
- $data['ipaddress'] = Property::getServerIp();
- $task = Taskmanager::submit('CompileIPxe', $data);
- if (!isset($task['id']))
- return false;
- return $task['id'];
+ $hooks = Hook::load('ipxe-update');
+ $taskId = false;
+ foreach ($hooks as $hook) {
+ $ret = function($taskId) use ($hook) {
+ $ret = include_once($hook->file);
+ if (is_string($ret))
+ return $ret;
+ return isset($taskId) ? $taskId : false;
+ };
+ $ret = $ret($taskId);
+ if (is_string($ret)) {
+ $taskId = $ret;
+ } elseif (is_array($ret) && isset($ret['id'])) {
+ $taskId = $ret['id'];
+ }
+ }
+ Property::set('ipxe-task-id', $taskId, 15);
+ return $taskId;
}
/**
@@ -127,14 +139,23 @@ class Trigger
}
if ($storetype === 'nfs') {
$addr = $vmstore['nfsaddr'];
+ $opts = 'nfsopts';
} elseif ($storetype === 'cifs') {
$addr = $vmstore['cifsaddr'];
+ $opts = 'cifsopts';
} else {
+ $opts = null;
$addr = 'null';
}
+ if (isset($vmstore[$opts])) {
+ $opts = $vmstore[$opts];
+ }else {
+ $opts = null;
+ }
return Taskmanager::submit('MountVmStore', array(
'address' => $addr,
'type' => 'images',
+ 'opts' => $opts,
'username' => $vmstore['cifsuser'],
'password' => $vmstore['cifspasswd']
));
diff --git a/inc/user.inc.php b/inc/user.inc.php
index 81091e1b..20e8cd3d 100644
--- a/inc/user.inc.php
+++ b/inc/user.inc.php
@@ -31,8 +31,19 @@ class User
if (!self::isLoggedIn())
return false;
if (Module::isAvailable("permissionmanager")) {
- $module = Page::getModule();
- $permission = $module ? $module->getIdentifier().".".$permission : $permission;
+ if ($permission{0} === '.') {
+ $permission = substr($permission, 1);
+ } else {
+ if (class_exists('Page')) {
+ $module = Page::getModule();
+ if ($module !== false) {
+ $module = $module->getIdentifier();
+ }
+ } else {
+ $module = strtolower(Request::any('do'));
+ }
+ $permission = $module ? $module . "." . $permission : $permission;
+ }
return PermissionUtil::userHasPermission(self::$user['userid'], $permission, $locationid);
}
if (self::$user['permissions'] & Permission::get('superadmin'))
@@ -40,15 +51,60 @@ class User
return (self::$user['permissions'] & Permission::get($permission)) != 0;
}
+ /**
+ * Confirm current user has the given permission, stop execution and show error message
+ * otherwise.
+ * @param string $permission Permission to check for
+ * @param null|int $locationid location this permission has to apply to, NULL if any location is sufficient
+ * @param null|string $redirect page to redirect to if permission is not given, NULL defaults to main page
+ */
+ public static function assertPermission($permission, $locationid = NULL, $redirect = NULL)
+ {
+ if (User::hasPermission($permission, $locationid))
+ return;
+ if (AJAX) {
+ Message::renderList();
+ exit;
+ }
+ if (!is_null($redirect)) {
+ Message::addError('main.no-permission');
+ Util::redirect($redirect);
+ } elseif (Module::isAvailable('permissionmanager')) {
+ if ($permission{0} !== '.') {
+ $module = Page::getModule();
+ if ($module !== false) {
+ $permission = '.' . $module->getIdentifier() . '.' . $permission;
+ }
+ }
+ Util::redirect('?do=permissionmanager&show=denied&permission=' . urlencode($permission));
+ } else {
+ Message::addError('main.no-permission');
+ Util::redirect('?do=main');
+ }
+ }
+
public static function getAllowedLocations($permission)
{
+ if (!self::isLoggedIn())
+ return [];
if (Module::isAvailable("permissionmanager")) {
- $module = Page::getModule();
- $permission = $module ? $module->getIdentifier().".".$permission : $permission;
+ if ($permission{0} === '.') {
+ $permission = substr($permission, 1);
+ } else {
+ $module = Page::getModule();
+ $permission = $module ? $module->getIdentifier() . "." . $permission : $permission;
+ }
return PermissionUtil::getAllowedLocations(self::$user['userid'], $permission);
}
- if (self::$user['permissions'] & Permission::get('superadmin'))
- return array_keys(Location::getLocationsAssoc());
+ if (self::$user['permissions'] & Permission::get('superadmin')) {
+ if (Module::isAvailable('locations')) {
+ $a = array_keys(Location::getLocationsAssoc());
+ $a[] = 0;
+ } else {
+ $a = [0];
+ }
+ return $a;
+ }
return array();
}
@@ -63,6 +119,7 @@ class User
self::$user = Database::queryFirst('SELECT * FROM user WHERE userid = :uid LIMIT 1', array(':uid' => $uid));
if (self::$user === false)
self::logout();
+ settype(self::$user['userid'], 'int');
return true;
}
return false;
diff --git a/inc/util.inc.php b/inc/util.inc.php
index 69eaf941..e459cc46 100644
--- a/inc/util.inc.php
+++ b/inc/util.inc.php
@@ -179,6 +179,13 @@ SADFACE;
$location .= '&' . implode('&', self::$redirectParams);
}
}
+ if (CONFIG_DEBUG) {
+ global $global_start;
+ $duration = microtime(true) - $global_start;
+ error_log('Redirect: ' . round($duration, 3) . 's, '
+ . Database::getQueryCount() . ' queries, '
+ . round(Database::getQueryTime(), 3) . 's query time total');
+ }
Header('Location: ' . $location);
exit(0);
}
@@ -227,18 +234,23 @@ SADFACE;
*
* @param float|int $bytes numeric value of the filesize to make readable
* @param int $decimals number of decimals to show, -1 for automatic
- * @return string human readable string representing the given filesize
+ * @param int $shift how many units to skip, i.e. if you pass in KiB or MiB
+ * @return string human readable string representing the given file size
*/
- public static function readableFileSize($bytes, $decimals = -1)
+ public static function readableFileSize($bytes, $decimals = -1, $shift = 0)
{
+ $bytes = round($bytes);
static $sz = array('Byte', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB');
$factor = (int)floor((strlen($bytes) - 1) / 3);
- if ($factor == 0) {
+ if ($factor === 0) {
$decimals = 0;
- } elseif ($decimals === -1) {
- $decimals = 2 - floor((strlen($bytes) - 1) % 3);
+ } else {
+ $bytes = $bytes / pow(1024, $factor);
+ if ($decimals === -1) {
+ $decimals = 2 - floor(strlen((int)$bytes) - 1);
+ }
}
- return sprintf("%.{$decimals}f ", $bytes / pow(1024, $factor)) . $sz[$factor];
+ return sprintf("%.{$decimals}f", $bytes) . "\xe2\x80\x89" . $sz[$factor + $shift];
}
public static function sanitizeFilename($name)
@@ -484,7 +496,7 @@ SADFACE;
settype($ts, 'int');
if ($ts === 0)
return '???';
- static $TODAY = false, $ETODAY = false, $YESTERDAY = false, $YEAR = false;
+ static $TODAY = false, $ETODAY = false, $YESTERDAY = false, $YEARCUTOFF = false;
if (!$ETODAY) $ETODAY = strtotime('today 23:59:59');
if ($ts > $ETODAY) // TODO: Do we need strings for future too?
return date('d.m.Y H:i', $ts);
@@ -494,8 +506,8 @@ SADFACE;
if (!$YESTERDAY) $YESTERDAY = strtotime('yesterday 0:00');
if ($ts >= $YESTERDAY)
return Dictionary::translate('lang_yesterday') . ' ' . date('H:i', $ts);
- if (!$YEAR) $YEAR = strtotime('this year 1/1');
- if ($ts >= $YEAR)
+ if (!$YEARCUTOFF) $YEARCUTOFF = min(strtotime('-3 month'), strtotime('this year 1/1'));
+ if ($ts >= $YEARCUTOFF)
return date('d.m. H:i', $ts);
return date('d.m.Y', $ts);
}
diff --git a/index.php b/index.php
index d7018e17..1ecd2109 100644
--- a/index.php
+++ b/index.php
@@ -79,7 +79,7 @@ abstract class Page
if (self::$module === false) {
Util::traceError('Invalid Module: ' . $name);
}
- self::$module->activate();
+ self::$module->activate(null, null);
self::$instance = self::$module->newPage();
}
@@ -104,6 +104,15 @@ spl_autoload_register(function ($class) {
if (defined('CONFIG_DEBUG') && CONFIG_DEBUG) {
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
+ if (preg_match('/^\[skip:\s*(\d+)\]\s*(.*)/is', $errstr, $out)) {
+ $errstr = $out[2];
+ $trace = debug_backtrace();
+ $idx = (int)$out[1] + 1;
+ if (count($trace) > $idx) {
+ $errfile = $trace[$idx]['file'];
+ $errline = $trace[$idx]['line'];
+ }
+ }
global $SLX_ERRORS;
$SLX_ERRORS[] = array(
'errno' => $errno,
diff --git a/install-all b/install-all
index 50efd708..362d2a4a 100755
--- a/install-all
+++ b/install-all
@@ -51,5 +51,10 @@ while true; do
fi
NEXT=$MODULE
done
+
+echo "Rebuilding config.tgz modules"
+php api.php sysconfig --action rebuild
+echo ""
+
echo "Done."
diff --git a/lang/de/messages-hardcoded.json b/lang/de/messages-hardcoded.json
deleted file mode 100644
index 692bc9bc..00000000
--- a/lang/de/messages-hardcoded.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "lang_clientSshConfig": "SSH-Konfiguration",
- "lang_configurationCompilation": "Konfiguration zusammenstellen",
- "lang_contentOf": "Inhalt von",
- "lang_createUser": "Benutzer anlegen",
- "lang_days": "Tag(e)",
- "lang_eventLog": "Server Log",
- "lang_hours": "Stunde(n)",
- "lang_location": "Lokalisierung",
- "lang_login": "Anmelden",
- "lang_moduleAdd": "Modul hinzuf\u00fcgen",
- "lang_noModuleFromThisGroup": "(Kein Modul dieser Gruppe)",
- "lang_serverConfiguration": "Serverseitige Konfiguration",
- "lang_serverStatus": "Server Status",
- "lang_status": "Status",
- "lang_titleBackup": "Sichern und Wiederherstellen",
- "lang_titleClientStatistics": "Client-Statistiken",
- "lang_titleEventLog": "Ereignisprotokoll",
- "lang_titleWebinterface": "Webschnittstelle",
- "lang_unknwonTaskManager": "Unbekannter Taskmanager-Fehler",
- "today": "Heute",
- "unused": "Ungenutzt",
- "yesterday": "Gestern"
-} \ No newline at end of file
diff --git a/lang/de/messages.json b/lang/de/messages.json
deleted file mode 100644
index a7e81351..00000000
--- a/lang/de/messages.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "ad-config-failed": "Wiederherstellen der Active Directory Konfiguration fehlgeschlagen",
- "db-update-done": "Datenbank wurde aktualisiert",
- "deleted-tag": "Tag wurde entfernt",
- "empty-archive": "Das Archiv enth\u00e4lt keine Dateien oder Verzeichnisse",
- "error-archive": "Korruptes Archiv oder nicht unterst\u00fctztes Format",
- "error-extract": "Konnte Archiv nicht nach {{0}} entpacken - {{1}}",
- "error-nodir": "Das Verzeichnis {{0}} existiert nicht.",
- "error-rename": "Konnte {{0}} nicht in {{1}} umbenennen",
- "invalid-file": "Die Datei {{0}} existiert nicht!",
- "invalid-path": "Ung\u00fcltiger Pfad.",
- "remote-parse-failed": "Parsen der empfangenen Daten fehlgeschlagen ({{0}})",
- "upload-complete": "Upload von {{0}} war erfolgreich"
-} \ No newline at end of file
diff --git a/lang/en/messages-hardcoded.json b/lang/en/messages-hardcoded.json
deleted file mode 100644
index 55ac6a50..00000000
--- a/lang/en/messages-hardcoded.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "lang_administration": "Translations",
- "lang_cities": "Cities",
- "lang_clientLog": "Client Log",
- "lang_clientSshConfig": "SSH configuration",
- "lang_configurationCompilation": "Compile configuration",
- "lang_content": "Content",
- "lang_contentOf": "Content of \"",
- "lang_createUser": "Create User",
- "lang_days": "Day(s)",
- "lang_eventLog": "Server Log",
- "lang_hours": "Hour(s)",
- "lang_login": "Login",
- "lang_modules": "Modules",
- "lang_moduleAdd": "Add Module",
- "lang_noModuleFromThisGroup": "(No module from this group)",
- "lang_server": "iPXE \/ Boot Menu",
- "lang_serverConfiguration": "Server-side Configuration",
- "lang_serverStatus": "Server",
- "lang_settings": "Settings",
- "lang_status": "Status",
- "lang_titleBackup": "Save and Restore",
- "lang_titleClientStatistics": "Client statistics",
- "lang_titleEventLog": "Event log",
- "lang_user": "Users",
- "lang_userManagement": "Management",
- "lang_users": "Users",
- "lang_variables": "Variables",
- "lang_vmLocation": "Virtual Machine",
- "lang_titleWebinterface": "Web Interface",
- "lang_unknwonTaskManager": "Unknown Task Manager error",
- "today": "Today",
- "unused": "Unused",
- "yesterday": "Yesterday"
-} \ No newline at end of file
diff --git a/lang/en/messages.json b/lang/en/messages.json
deleted file mode 100644
index edf07a85..00000000
--- a/lang/en/messages.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "ad-config-failed": "Rebuilding the Active Directory configuration failed",
- "db-update-done": "Database successfully updated",
- "deleted-tag": "Tag was successfully removed",
- "empty-archive": "The archive contains no files or directories",
- "error-archive": "Corrupted archive or unsupported format",
- "error-extract": "Could not unpack archive {{0}} to {{1}}",
- "error-nodir": "The directory {{0}} does not exist.",
- "error-rename": "Could not rename {{0}} into {{1}}",
- "invalid-file": "The file {{0}} does not exist!",
- "invalid-path": "Invalid path.",
- "remote-parse-failed": "Parsing the received data failed ({{0}})",
- "upload-complete": "Upload of {{0}} was successful"
-} \ No newline at end of file
diff --git a/lang/pt/flag.png b/lang/pt/flag.png
deleted file mode 100644
index 78c57dea..00000000
--- a/lang/pt/flag.png
+++ /dev/null
Binary files differ
diff --git a/lang/pt/messages-hardcoded.json b/lang/pt/messages-hardcoded.json
deleted file mode 100644
index 0f500e07..00000000
--- a/lang/pt/messages-hardcoded.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "lang_administration": "Tradu\u00e7\u00f5es",
- "lang_cities": "Cidades",
- "lang_clientLog": "Log dos Clientes",
- "lang_content": "Conte\u00fado",
- "lang_createUser": "Criar Usu\u00e1rio",
- "lang_days": "Dia(s)",
- "lang_eventLog": "Log dos Servidores",
- "lang_hours": "Hora(s)",
- "lang_login": "Entrar",
- "lang_modules": "M\u00f3dulos",
- "lang_server": "iPXE \/ Boot Menu",
- "lang_serverConfiguration": "Configura\u00e7\u00e3o do servidor",
- "lang_serverStatus": "Servidor",
- "lang_settings": "Configura\u00e7\u00f5es",
- "lang_status": "Status",
- "lang_titleBackup": "Salvar e Recuperar",
- "lang_titleEventLog": "Log de Eventos",
- "lang_user": "Usu\u00e1rios",
- "lang_userManagement": "Gerenciamento",
- "lang_users": "Usu\u00e1rios",
- "lang_variables": "Vari\u00e1veis",
- "lang_vmLocation": "M\u00e1quina Virtual",
- "today": "Hoje",
- "yesterday": "Ontem"
-} \ No newline at end of file
diff --git a/lang/pt/messages.json b/lang/pt/messages.json
deleted file mode 100644
index 8738840f..00000000
--- a/lang/pt/messages.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "deleted-tag": "Tag foi removida com sucesso",
- "empty-archive": "O arquivo n\u00e3o cont\u00e9m arquivos ou diret\u00f3rios",
- "error-archive": "Arquivo corrompido ou formato n\u00e3o suportado",
- "error-extract": "N\u00e3o foi poss\u00edvel descompactar arquivo {{0}} para {{1}}",
- "error-nodir": "O diret\u00f3rio {{0}} n\u00e3o existe.",
- "error-rename": "N\u00e3o foi poss\u00edvel renomear {{0}} em {{1}}",
- "invalid-file": "O arquivo {{0}} n\u00e3o existe!",
- "remote-parse-failed": "An\u00e1lise dos dados recebidos falhou ({{0}})",
- "upload-complete": "Envio de {{0}} foi bem sucedido"
-} \ No newline at end of file
diff --git a/lang/pt/name.txt b/lang/pt/name.txt
deleted file mode 100644
index 811b10b4..00000000
--- a/lang/pt/name.txt
+++ /dev/null
@@ -1 +0,0 @@
-Português \ No newline at end of file
diff --git a/modules-available/adduser/config.json b/modules-available/adduser/config.json
index 2c63c085..110f8b67 100644
--- a/modules-available/adduser/config.json
+++ b/modules-available/adduser/config.json
@@ -1,2 +1,3 @@
{
-}
+ "category": "main.content"
+} \ No newline at end of file
diff --git a/modules-available/adduser/lang/de/messages.json b/modules-available/adduser/lang/de/messages.json
index 4f62dcbf..a744ae5f 100644
--- a/modules-available/adduser/lang/de/messages.json
+++ b/modules-available/adduser/lang/de/messages.json
@@ -1,5 +1,11 @@
{
+ "adduser-success": "Benutzer erfolgreich hinzugef\u00fcgt",
+ "cannot-delete-1-self": "Sie k\u00f6nnen nicht den Benutzer mit der ID 1 oder sich selbst l\u00f6schen",
+ "db-error": "Datenbankfehler: {{0}}",
+ "password-changed": "Passwort ge\u00e4ndert",
"password-mismatch": "Passwort und Passwortbest\u00e4tigung stimmen nicht \u00fcberein",
- "adduser-disabled": "Keine ausreichenden Rechte, um weitere Benutzer hinzuzuf\u00fcgen",
- "adduser-success": "Benutzer erfolgreich hinzugef\u00fcgt"
+ "roles-updated": "Rollen aktualisiert",
+ "user-deleted": "Benutzer {{0}} (ID={1}}) gel\u00f6scht",
+ "user-edited": "Benutzerdaten wurden ge\u00e4ndert",
+ "user-not-found": "Benutzer mit ID {{0}} nicht gefunden"
} \ No newline at end of file
diff --git a/modules-available/adduser/lang/de/module.json b/modules-available/adduser/lang/de/module.json
new file mode 100644
index 00000000..e4c785b5
--- /dev/null
+++ b/modules-available/adduser/lang/de/module.json
@@ -0,0 +1,3 @@
+{
+ "module_name": "Nutzerverwaltung"
+} \ No newline at end of file
diff --git a/modules-available/adduser/lang/de/permissions.json b/modules-available/adduser/lang/de/permissions.json
new file mode 100644
index 00000000..8792ac14
--- /dev/null
+++ b/modules-available/adduser/lang/de/permissions.json
@@ -0,0 +1,6 @@
+{
+ "user.add": "Neuen Nutzer hinzuf\u00fcgen",
+ "user.edit": "Nutzer bearbeiten",
+ "user.remove": "Nutzer l\u00f6schen",
+ "user.view-list": "Nutzerliste anzeigen"
+} \ No newline at end of file
diff --git a/modules-available/adduser/lang/de/template-tags.json b/modules-available/adduser/lang/de/template-tags.json
index 99d17947..419d0e1a 100644
--- a/modules-available/adduser/lang/de/template-tags.json
+++ b/modules-available/adduser/lang/de/template-tags.json
@@ -1,6 +1,25 @@
{
+ "lang_addUser": "Nutzer hinzuf\u00fcgen",
+ "lang_assignRoles": "Rollen zuweisen",
+ "lang_changeLoginHint": "Sie k\u00f6nnen den Namen, den der Nutzer beim Login angeben muss, \u00e4ndern. Dies ist nur bei lokalen Nutzern m\u00f6glich, die nicht \u00fcber LDAP\/AD authentifiziert werden.",
+ "lang_changeOwnPasswordHint": "Ihr eigenes Passwort k\u00f6nnen Sie \u00fcber den Button \"Passwort \u00e4ndern\" im Men\u00fc \u00e4ndern.",
+ "lang_changePassword": "Neues Passwort",
+ "lang_confirmDelete": "L\u00f6schen best\u00e4tigen",
"lang_confirmation": "Wiederholen",
"lang_createUser": "Benutzer anlegen",
+ "lang_editUser": "Benutzer bearbeiten",
+ "lang_email": "E-Mail",
"lang_fullName": "Vollst\u00e4ndiger Name",
- "lang_telephone": "Telefon"
-}
+ "lang_fullnameMissing": "Kein Name angegeben",
+ "lang_login": "Login",
+ "lang_loginTooShort": "Login zu kurz",
+ "lang_name": "Name",
+ "lang_passwordTooShort": "Passwort zu kurz",
+ "lang_passwordsDontMatch": "Passworte stimmen nicht \u00fcberein",
+ "lang_phone": "Telefon",
+ "lang_role": "Rolle",
+ "lang_userDeleteConfirm": "M\u00f6chten Sie diesen Benutzer wirklich l\u00f6schen?",
+ "lang_userIdCol": "ID",
+ "lang_userManagement": "Benutzerverwaltung",
+ "lang_userlist": "Benutzerliste"
+} \ No newline at end of file
diff --git a/modules-available/adduser/lang/en/messages.json b/modules-available/adduser/lang/en/messages.json
index 3a402278..67bca6f9 100644
--- a/modules-available/adduser/lang/en/messages.json
+++ b/modules-available/adduser/lang/en/messages.json
@@ -1,5 +1,11 @@
{
+ "adduser-success": "User successfully added",
+ "cannot-delete-1-self": "Cannot delete user with ID 1 or yourself",
+ "db-error": "Database error: {{0}}",
+ "password-changed": "Password changed",
"password-mismatch": "Password and password confirmation do not match",
- "adduser-disabled": "Insufficient privileges to add more users",
- "adduser-success": "User successfully added"
+ "roles-updated": "Roles have been updated",
+ "user-deleted": "Deleted user {{0}} (ID={{1}})",
+ "user-edited": "User data has been updated",
+ "user-not-found": "User with ID {{0}} not found"
} \ No newline at end of file
diff --git a/modules-available/adduser/lang/en/module.json b/modules-available/adduser/lang/en/module.json
new file mode 100644
index 00000000..f376db34
--- /dev/null
+++ b/modules-available/adduser/lang/en/module.json
@@ -0,0 +1,3 @@
+{
+ "module_name": "User management"
+} \ No newline at end of file
diff --git a/modules-available/adduser/lang/en/permissions.json b/modules-available/adduser/lang/en/permissions.json
new file mode 100644
index 00000000..ed3d8ee3
--- /dev/null
+++ b/modules-available/adduser/lang/en/permissions.json
@@ -0,0 +1,6 @@
+{
+ "user.add": "Add new user",
+ "user.edit": "Edit user",
+ "user.remove": "Remove user",
+ "user.view-list": "Show userlist"
+} \ No newline at end of file
diff --git a/modules-available/adduser/lang/en/template-tags.json b/modules-available/adduser/lang/en/template-tags.json
index 24f8cd42..d927964e 100644
--- a/modules-available/adduser/lang/en/template-tags.json
+++ b/modules-available/adduser/lang/en/template-tags.json
@@ -1,6 +1,25 @@
{
+ "lang_addUser": "Add user",
+ "lang_assignRoles": "Assign roles",
+ "lang_changeLoginHint": "You can change the login identifier used for logging in. This is only enabled for local acounts that are not linked to LDAP\/AD servers.",
+ "lang_changeOwnPasswordHint": "You can change your own password by clicking the \"change password\" button in the menu.",
+ "lang_changePassword": "Change password",
+ "lang_confirmDelete": "Confirm delete",
"lang_confirmation": "Confirm Password",
"lang_createUser": "Create User",
+ "lang_editUser": "Edit user",
+ "lang_email": "Email",
"lang_fullName": "Full Name",
- "lang_telephone": "Telephone"
+ "lang_fullnameMissing": "Full name missing",
+ "lang_login": "Login",
+ "lang_loginTooShort": "Login too short",
+ "lang_name": "Name",
+ "lang_passwordTooShort": "Password too short",
+ "lang_passwordsDontMatch": "Passwords do not match",
+ "lang_phone": "Phone",
+ "lang_role": "Role",
+ "lang_userDeleteConfirm": "Do you want to delete this user?",
+ "lang_userIdCol": "ID",
+ "lang_userManagement": "User management",
+ "lang_userlist": "User list"
}
diff --git a/modules-available/adduser/page.inc.php b/modules-available/adduser/page.inc.php
index 87aaeef1..cffe33f9 100644
--- a/modules-available/adduser/page.inc.php
+++ b/modules-available/adduser/page.inc.php
@@ -7,52 +7,220 @@ class Page_AddUser extends Page
{
User::load();
- if (isset($_POST['action']) && $_POST['action'] === 'adduser') {
- // Check required fields
- if (empty($_POST['user']) || empty($_POST['pass1']) || empty($_POST['pass2']) || empty($_POST['fullname'])) {
- Message::addError('main.empty-field');
- Util::redirect('?do=AddUser');
- } elseif ($_POST['pass1'] !== $_POST['pass2']) {
- Message::addError('password-mismatch');
- Util::redirect('?do=AddUser');
- } elseif (!User::hasPermission('superadmin') && Database::queryFirst('SELECT userid FROM user LIMIT 1') !== false) {
- Message::addError('adduser-disabled');
- Util::redirect('?do=Session&action=login');
+ $action = Request::post(('action'), false, 'string');
+
+ if ($action === 'adduser') {
+ $this->addUser();
+ } elseif ($action === 'edituser') {
+ $this->editUser();
+ } elseif ($action === 'deleteuser') {
+ $this->deleteUser();
+ }
+ if (Request::isPost()) {
+ Util::redirect('?do=adduser');
+ }
+ }
+
+ private function addUser()
+ {
+ // Check required fields
+ $login = Request::post('login', '', 'string');
+ $pass1 = Request::post('pass1', '', 'string');
+ $pass2 = Request::post('pass2', '', 'string');
+ $fullname = Request::post('fullname', '', 'string');
+ $phone = Request::post('phone', '', 'string');
+ $email = Request::post('email', '', 'string');
+ if (empty($login) || empty($pass1) || empty($pass2) || empty($fullname)) {
+ Message::addError('main.empty-field');
+ return;
+ } elseif ($pass1 !== $pass2) {
+ Message::addError('password-mismatch');
+ return;
+ } else {
+ if (Database::queryFirst('SELECT userid FROM user LIMIT 1') !== false) {
+ User::assertPermission('user.add');
+ }
+ $data = array(
+ 'login' => $login,
+ 'pass' => Crypto::hash6($pass1),
+ 'fullname' => $fullname,
+ 'phone' => $phone,
+ 'email' => $email,
+ );
+ Database::exec('INSERT INTO user SET login = :login, passwd = :pass, fullname = :fullname, phone = :phone, email = :email', $data);
+ $id = Database::lastInsertId();
+ // Make it superadmin if first user. This method sucks as it's a race condition but hey...
+ $ret = Database::queryFirst('SELECT Count(*) AS num FROM user');
+ if ($ret !== false && $ret['num'] == 1) {
+ $ret = Database::exec('UPDATE user SET permissions = 1, userid = 1 WHERE userid = :id', ['id' => $id], true);
+ if ($ret !== false) {
+ EventLog::clear();
+ }
+ // same for permissionmanager
+ Database::exec("INSERT INTO `role_x_user` (userid, roleid) VALUES (:id, 1)", ['id' => $id], true);
+ EventLog::info('Created first user ' . $login);
} else {
- $data = array(
- 'user' => $_POST['user'],
- 'pass' => Crypto::hash6($_POST['pass1']),
- 'fullname' => $_POST['fullname'],
- 'phone' => $_POST['phone'],
- 'email' => $_POST['email'],
- );
- if (Database::exec('INSERT INTO user SET login = :user, passwd = :pass, fullname = :fullname, phone = :phone, email = :email', $data) != 1) {
- Util::traceError('Could not create new user in DB');
+ EventLog::info(User::getName() . ' created user ' . $login);
+ }
+ Message::addInfo('adduser-success');
+ $this->saveRoles($id);
+ return;
+ }
+ }
+
+ private function editUser()
+ {
+ User::assertPermission('user.edit');
+ $userid = Request::post('userid', false, 'int');
+ if ($userid === false) {
+ Message::addError('main.parameter-missing', 'userid');
+ return;
+ }
+ $user = Database::queryFirst('SELECT userid, login, fullname, phone, email
+ FROM user WHERE userid = :userid', compact('userid'));
+ if ($user === false) {
+ Message::addError('user-not-found', $userid);
+ return;
+ }
+ // Check required fields
+ $login = Request::post('login', '', 'string');
+ $pass1 = Request::post('pass1', '', 'string');
+ $pass2 = Request::post('pass2', '', 'string');
+ $fullname = Request::post('fullname', '', 'string');
+ $phone = Request::post('phone', '', 'string');
+ $email = Request::post('email', '', 'string');
+ if (empty($login) || empty($fullname)) {
+ Message::addError('main.empty-field');
+ } elseif (!(empty($pass1) && empty($pass2)) && $pass1 !== $pass2) {
+ Message::addError('password-mismatch');
+ } else {
+ $data = array(
+ 'login' => $login,
+ 'fullname' => $fullname,
+ 'phone' => $phone,
+ 'email' => $email,
+ 'userid' => $userid,
+ );
+ $ret = Database::exec('UPDATE user SET login = :login, fullname = :fullname, phone = :phone, email = :email WHERE userid = :userid', $data, true);
+ if ($ret === false) {
+ Message::addError('db-error', Database::lastError());
+ } else {
+ if ($ret > 0) {
+ Message::addSuccess('user-edited');
}
- // Make it superadmin if first user. This method sucks as it's a race condition but hey...
- $ret = Database::queryFirst('SELECT Count(*) AS num FROM user');
- if ($ret !== false && $ret['num'] == 1) {
- Database::exec('UPDATE user SET permissions = 1');
- EventLog::clear();
- EventLog::info('Created first user ' . $_POST['user']);
- } else {
- EventLog::info(User::getName() . ' created user ' . $_POST['user']);
+ if (!empty($pass1) && $userid !== User::getId()) {
+ $data = [
+ 'pass' => Crypto::hash6($pass1),
+ 'userid' => $userid,
+ ];
+ Database::exec('UPDATE user SET passwd = :pass WHERE userid = :userid', $data);
+ Message::addSuccess('password-changed');
}
- Message::addInfo('adduser-success');
- Util::redirect('?do=Session&action=login');
+ $this->saveRoles($userid);
}
}
+ Util::redirect('?do=adduser&show=edituser&userid=' . $userid);
+ }
+
+ private function deleteUser()
+ {
+ User::assertPermission('user.remove');
+ $userid = Request::post('userid', false, 'int');
+ if ($userid === false) {
+ Message::addError('main.parameter-missing', 'userid');
+ return;
+ }
+ //\\
+ $user = Database::queryFirst('SELECT userid, login
+ FROM user WHERE userid = :userid', compact('userid'));
+ if ($user === false) {
+ Message::addError('user-not-found', $userid);
+ return;
+ }
+ if ($user['userid'] == 1 || $user['userid'] == User::getId()) {
+ Message::addError('cannot-delete-1-self');
+ return;
+ }
+ Database::exec('DELETE FROM user WHERE userid = :userid', compact('userid'));
+ Message::addSuccess('user-deleted', $user['login'], $userid);
+ }
+
+ private function saveRoles($userid)
+ {
+ if (!Module::isAvailable('permissionmanager'))
+ return;
+ if (!User::hasPermission('.permissionmanager.users.edit-roles'))
+ return;
+ $roles = Request::post('roles', [], 'array');
+ $ret = PermissionDbUpdate::setRolesForUser([$userid], $roles);
+ if ($ret > 0) {
+ Message::addSuccess('roles-updated');
+ }
}
protected function doRender()
{
- // No user was added, check if current user is allowed to add a new user
- // Currently you can only add users if there is no user yet. :)
- if (!User::hasPermission('superadmin') && Database::queryFirst('SELECT userid FROM user LIMIT 1') !== false) {
- Message::addError('adduser-disabled');
- } else {
- Render::addTemplate('page-adduser', $_POST);
+ Render::addTemplate('header');
+ $hasUsers = (Database::queryFirst('SELECT userid FROM user LIMIT 1') !== false);
+ $show = Request::get('show', ($hasUsers ? 'list' : 'adduser'), 'string');
+ if ($show === 'adduser') {
+ // Can add user if: - no user exists yet; - user has explicit permission to add users
+ if ($hasUsers) {
+ User::assertPermission('user.add');
+ }
+ Render::openTag('form', ['class' => 'form-adduser', 'action' => '?do=adduser', 'method' => 'post']);
+ Render::addTemplate('page-adduser');
+ Render::addTemplate('js-add-edit');
+ if ($hasUsers) {
+ $this->showRoles();
+ }
+ Render::closeTag('form');
+ } elseif ($show === 'edituser') {
+ User::assertPermission('user.edit');
+ $userid = Request::get('userid', false, 'int');
+ if ($userid === false) {
+ Message::addError('main.parameter-missing', 'userid');
+ Util::redirect('?do=adduser&show=list');
+ }
+ $user = Database::queryFirst('SELECT userid, login, fullname, phone, email
+ FROM user WHERE userid = :userid', compact('userid'));
+ if ($user === false) {
+ Message::addError('user-not-found', $userid);
+ } else {
+ $user['password_disabled'] = User::getId() === $userid ? 'disabled' : false;
+ // TODO: LDAP -> disallow pw change, maybe other fields too?
+ Render::openTag('form', ['class' => 'form-adduser', 'action' => '?do=adduser', 'method' => 'post']);
+ Render::addTemplate('page-edituser', $user);
+ Render::addTemplate('js-add-edit');
+ $this->showRoles($userid);
+ Render::closeTag('form');
+ }
+ } elseif ($show === 'list') {
+ User::assertPermission('user.view-list');
+ $page = new Paginate('SELECT userid, login, fullname, phone, email FROM user ORDER BY login', 50);
+ $data = ['list' => $page->exec()->fetchAll(PDO::FETCH_ASSOC)];
+ foreach ($data['list'] as &$u) {
+ // Don't allow deleting user 1 and self
+ $u['hide_delete'] = $u['userid'] == 1 || $u['userid'] == User::getId();
+ if ($u['userid'] == 1) {
+ $u['userClass'] = 'slx-bold';
+ }
+ }
+ unset($u);
+ Permission::addGlobalTags($data['perms'], null, ['user.add', 'user.edit', 'user.remove']);
+ Module::isAvailable('js_stupidtable');
+ $page->render('page-userlist', $data);
}
}
+ private function showRoles($userid = false)
+ {
+ if (!Module::isAvailable('permissionmanager'))
+ return;
+ if (!User::hasPermission('.permissionmanager.users.edit-roles'))
+ return;
+ $data = ['roles' => PermissionUtil::getRoles($userid, false)];
+ Render::addTemplate('user-permissions', $data);
+ }
+
}
diff --git a/modules-available/adduser/permissions/permissions.json b/modules-available/adduser/permissions/permissions.json
new file mode 100644
index 00000000..e8fd0a5e
--- /dev/null
+++ b/modules-available/adduser/permissions/permissions.json
@@ -0,0 +1,14 @@
+{
+ "user.add": {
+ "location-aware": false
+ },
+ "user.edit": {
+ "location-aware": false
+ },
+ "user.remove": {
+ "location-aware": false
+ },
+ "user.view-list": {
+ "location-aware": false
+ }
+} \ No newline at end of file
diff --git a/modules-available/adduser/style.css b/modules-available/adduser/style.css
new file mode 100644
index 00000000..15f04b80
--- /dev/null
+++ b/modules-available/adduser/style.css
@@ -0,0 +1,19 @@
+.form-adduser {
+ max-width: 600px;
+ padding: 10px;
+ margin: 0 auto;
+}
+
+.form-adduser .form-control {
+ position: relative;
+ font-size: 16px;
+ height: auto;
+ padding: 10px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+#add-msg {
+ height: 1em;
+} \ No newline at end of file
diff --git a/modules-available/adduser/templates/header.html b/modules-available/adduser/templates/header.html
new file mode 100644
index 00000000..34011e29
--- /dev/null
+++ b/modules-available/adduser/templates/header.html
@@ -0,0 +1,3 @@
+<div class="page-header">
+ <h1>{{lang_userManagement}}</h1>
+</div> \ No newline at end of file
diff --git a/modules-available/adduser/templates/js-add-edit.html b/modules-available/adduser/templates/js-add-edit.html
new file mode 100644
index 00000000..db8d435a
--- /dev/null
+++ b/modules-available/adduser/templates/js-add-edit.html
@@ -0,0 +1,29 @@
+<script><!--
+document.addEventListener('DOMContentLoaded', function() {
+ var $login = $('#login');
+ var $pass1 = $('#pass1');
+ var $pass2 = $('#pass2');
+ var $fullname = $('#fullname');
+ var $msg = $('#add-msg');
+ var $btn = $('.save-btn');
+ if (typeof SLX_EDITUSER === 'undefined') {
+ SLX_EDITUSER = false;
+ }
+ var ev = function() {
+ var msg = '';
+ if ($login.val().length < 2) {
+ msg = '{{lang_loginTooShort}}';
+ } else if ($pass1.val() !== $pass2.val()) {
+ msg = '{{lang_passwordsDontMatch}}';
+ } else if ((!SLX_EDITUSER || $pass1.val().length > 0) && $pass1.val().length < 2) {
+ msg = '{{lang_passwordTooShort}}';
+ } else if ($fullname.val().length < 1) {
+ msg = '{{lang_fullnameMissing}}';
+ }
+ $msg.text(msg);
+ $btn.prop('disabled', !!msg);
+ };
+ $('.event-box').change(ev).keyup(ev);
+ if (SLX_EDITUSER) ev();
+});
+//--></script> \ No newline at end of file
diff --git a/modules-available/adduser/templates/page-adduser.html b/modules-available/adduser/templates/page-adduser.html
index deb911c0..08587373 100644
--- a/modules-available/adduser/templates/page-adduser.html
+++ b/modules-available/adduser/templates/page-adduser.html
@@ -1,28 +1,41 @@
-<form class="form-adduser" action="?do=AddUser" method="post">
- <input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="position:absolute;top:-2000px" tabindex="-1">
- <input type="password" name="password_fake" id="password_fake" value="" style="position:absolute;top:-2000px" tabindex="-1">
- <h2 class="form-signin-heading">{{lang_createUser}}</h2>
- <div class="row">
- <div class="col-md-4">{{lang_username}} *</div>
- <div class="col-md-4"><input type="text" name="user" value="{{user}}" class="form-control" placeholder="{{lang_username}}" autofocus></div>
+<input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="position:absolute;top:-2000px" tabindex="-1">
+<input type="password" name="password_fake" id="password_fake" value="" style="position:absolute;top:-2000px" tabindex="-1">
+<h2>{{lang_createUser}}</h2>
+<div class="row">
+ <div class="col-md-4"><label for="login">{{lang_login}} *</label></div>
+ <div class="col-md-4"><input id="login" type="text" name="login" value="{{login}}" class="form-control event-box" placeholder="{{lang_username}}" autofocus></div>
+</div>
+<br>
+<div class="row">
+ <div class="col-md-4"><label for="pass1">{{lang_password}} *</label></div>
+ <div class="col-md-4"><input id="pass1" type="password" name="pass1" class="form-control event-box" placeholder="{{lang_password}}"></div>
+ <div class="col-md-4"><input id="pass2" type="password" name="pass2" class="form-control event-box" placeholder="{{lang_confirmation}}"></div>
+</div>
+<br>
+<div class="row">
+ <div class="col-md-4"><label for="fullname">{{lang_fullName}} *</label></div>
+ <div class="col-md-4"><input id="fullname" type="text" name="fullname" value="{{fullname}}" class="form-control event-box" placeholder="{{lang_fullName}}"></div>
+</div>
+<br>
+<div class="row">
+ <div class="col-md-4"><label for="phone">{{lang_phone}}</label></div>
+ <div class="col-md-4"><input id=phone" type="text" name="phone" value="{{phone}}" class="form-control" placeholder="{{lang_phone}}"></div>
+</div>
+<br>
+<div class="row">
+ <div class="col-md-4"><label for="email">{{lang_email}}</label></div>
+ <div class="col-md-4"><input id="email" type="text" name="email" value="{{email}}" class="form-control" placeholder="{{lang_email}}"></div>
+</div>
+<br>
+<div class="row">
+ <div class="col-md-4"></div>
+ <div class="col-md-8">
+ <button class="btn btn-lg btn-primary btn-block save-btn" type="submit" disabled>
+ <span class="glyphicon glyphicon-floppy-disk"></span>
+ {{lang_createUser}}
+ </button>
+ <div id="add-msg" class="text-danger slx-bold"></div>
</div>
- <div class="row">
- <div class="col-md-4">{{lang_password}} *</div>
- <div class="col-md-4"><input type="password" name="pass1" class="form-control" placeholder="{{lang_password}}"></div>
- <div class="col-md-4"><input type="password" name="pass2" class="form-control" placeholder="{{lang_confirmation}}"></div>
- </div>
- <div class="row">
- <div class="col-md-4">{{lang_fullName}} *</div>
- <div class="col-md-4"><input type="text" name="fullname" value="{{fullname}}" class="form-control" placeholder="{{lang_fullName}}"></div>
- </div>
- <div class="row">
- <div class="col-md-4">{{lang_telephone}}</div>
- <div class="col-md-4"><input type="text" name="phone" value="{{phone}}" class="form-control" placeholder="{{lang_telephone}}"></div>
- </div>
- <div class="row">
- <div class="col-md-4">E-Mail</div>
- <div class="col-md-4"><input type="text" name="email" value="{{email}}" class="form-control" placeholder="E-Mail"></div>
- </div>
- <button class="btn btn-lg btn-primary btn-block" type="submit">{{lang_createUser}}</button>
- <input type="hidden" name="action" value="adduser">
-</form>
+</div>
+<input type="hidden" name="action" value="adduser">
+<input type="hidden" name="token" value="{{token}}"> \ No newline at end of file
diff --git a/modules-available/adduser/templates/page-edituser.html b/modules-available/adduser/templates/page-edituser.html
new file mode 100644
index 00000000..68376213
--- /dev/null
+++ b/modules-available/adduser/templates/page-edituser.html
@@ -0,0 +1,74 @@
+<input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="position:absolute;top:-2000px" tabindex="-1">
+<input type="password" name="password_fake" id="password_fake" value="" style="position:absolute;top:-2000px" tabindex="-1">
+<h2>{{lang_editUser}}</h2>
+
+<div class="row">
+ <div class="col-md-4"><label for="login">{{lang_login}}</label></div>
+ <div class="col-md-4"><input id="login" type="text" name="login" value="{{login}}" class="form-control event-box"
+ placeholder="{{lang_username}}" autofocus></div>
+</div>
+<div class="row">
+ <div class="col-md-4"></div>
+ <div class="col-md-8">
+ <p>
+ {{lang_changeLoginHint}}
+ </p>
+ </div>
+</div>
+
+<div class="row">
+ <div class="col-md-4"><label for="pass1">{{lang_changePassword}}</label></div>
+ <div class="col-md-4"><input id="pass1" {{password_disabled}} type="password" name="pass1" class="form-control event-box" placeholder="{{lang_password}}">
+ </div>
+ <div class="col-md-4"><input id="pass2" {{password_disabled}} type="password" name="pass2" class="form-control event-box"
+ placeholder="{{lang_confirmation}}"></div>
+</div>
+{{#password_disabled}}
+<div class="row">
+ <div class="col-md-4"></div>
+ <div class="col-md-8">
+ <p>
+ {{lang_changeOwnPasswordHint}}
+ </p>
+ </div>
+</div>
+{{/password_disabled}}
+<br>
+
+<div class="row">
+ <div class="col-md-4"><label for="fullname">{{lang_fullName}}</label></div>
+ <div class="col-md-4"><input id="fullname" type="text" name="fullname" value="{{fullname}}" class="form-control event-box"
+ placeholder="{{lang_fullName}}"></div>
+</div>
+<br>
+
+<div class="row">
+ <div class="col-md-4"><label for="phone">{{lang_phone}}</label></div>
+ <div class="col-md-4"><input id=phone" type="text" name="phone" value="{{phone}}" class="form-control"
+ placeholder="{{lang_phone}}"></div>
+</div>
+<br>
+
+<div class="row">
+ <div class="col-md-4"><label for="email">{{lang_email}}</label></div>
+ <div class="col-md-4"><input id="email" type="text" name="email" value="{{email}}" class="form-control" placeholder="{{lang_email}}">
+ </div>
+</div>
+<br>
+
+<div class="row">
+ <div class="col-md-4"></div>
+ <div class="col-md-8">
+ <button class="btn btn-lg btn-primary btn-block save-btn" type="submit">
+ <span class="glyphicon glyphicon-floppy-disk"></span>
+ {{lang_save}}
+ </button>
+ <div id="add-msg" class="text-danger slx-bold"></div>
+ </div>
+</div>
+<input type="hidden" name="action" value="edituser">
+<input type="hidden" name="userid" value="{{userid}}">
+<input type="hidden" name="token" value="{{token}}">
+<script>
+ const SLX_EDITUSER = true;
+</script>
diff --git a/modules-available/adduser/templates/page-userlist.html b/modules-available/adduser/templates/page-userlist.html
new file mode 100644
index 00000000..262553f6
--- /dev/null
+++ b/modules-available/adduser/templates/page-userlist.html
@@ -0,0 +1,87 @@
+<h2>{{lang_userlist}}</h2>
+
+{{{pagenav}}}
+
+<form method="get">
+ <input type="hidden" name="do" value="adduser">
+ <input type="hidden" name="show" value="edituser">
+ <table class="table stupidtable">
+ <thead>
+ <tr>
+ <th data-sort="int" class="slx-smallcol">{{lang_userIdCol}}</th>
+ <th data-sort="string">{{lang_login}}</th>
+ <th data-sort="string">{{lang_name}}</th>
+ <th data-sort="string">{{lang_phone}}</th>
+ <th data-sort="string">{{lang_email}}</th>
+ <th width="1"></th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#list}}
+ <tr>
+ <td class="text-right {{userClass}}">{{userid}}</td>
+ <td id="user-{{userid}}" class="{{userClass}}">{{login}}</td>
+ <td>{{fullname}}</td>
+ <td>{{phone}}</td>
+ <td>{{email}}</td>
+ <td class="text-nowrap">
+ <button class="btn btn-primary btn-xs" {{perms.user.edit.disabled}} type="submit" name="userid" value="{{userid}}">
+ <span class="glyphicon glyphicon-edit"></span>
+ </button>
+ {{^hide_delete}}
+ <button type="button" {{perms.user.remove.disabled}} class="btn btn-danger btn-xs del-user-btn"
+ data-target="#delete-modal" data-toggle="modal" data-user="{{userid}}">
+ <span class="glyphicon glyphicon-trash"></span>
+ </button>
+ {{/hide_delete}}
+ </td>
+ </tr>
+ {{/list}}
+ </tbody>
+ </table>
+ <div class="text-right">
+ <a class="btn btn-success {{perms.user.add.disabled}}" href="?do=adduser&amp;show=adduser">
+ <span class="glyphicon glyphicon-plus"></span>
+ {{lang_addUser}}
+ </a>
+ </div>
+</form>
+<script>
+ document.addEventListener('DOMContentLoaded', function() {
+ $('.del-user-btn').click(function (e) {
+ var uid = $(this).data('user');
+ if (!uid) {
+ alert('ERROR');
+ return false;
+ }
+ $('#delete-userid').val(uid);
+ $('#delete-user-field').text($('#user-' + uid).text());
+ });
+ });
+</script>
+
+<!-- Modals -->
+<div class ="modal fade" id="delete-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <form method="post">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ <h4 class="modal-title" id="myModalLabel">{{lang_confirmDelete}}: <span id="delete-user-field"></span></h4>
+ </div>
+ <div class="modal-body">
+ <p>{{lang_userDeleteConfirm}}</p>
+ </div>
+ <div class="modal-footer">
+ <input type="hidden" name="action" value="deleteuser">
+ <input type="hidden" name="token" value="{{token}}">
+ <button type="button" class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button>
+ <button type="submit" id="delete-userid" name="userid" value="" class="btn btn-danger">
+ <span class="glyphicon glyphicon-trash"></span>
+ {{lang_delete}}
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/modules-available/adduser/templates/user-permissions.html b/modules-available/adduser/templates/user-permissions.html
new file mode 100644
index 00000000..11ebd77a
--- /dev/null
+++ b/modules-available/adduser/templates/user-permissions.html
@@ -0,0 +1,34 @@
+<h3>{{lang_assignRoles}}</h3>
+
+<table class="table table-condensed table-hover">
+ <thead>
+ <tr>
+ <th data-sort="string">{{lang_role}}</th>
+ <th class="text-center slx-smallcol"></th>
+ </tr>
+ </thead>
+
+ <tbody>
+ {{#roles}}
+ <tr>
+ <td class="rolename">{{rolename}}</td>
+ <td class="text-center">
+ <div class="checkbox">
+ <input type="checkbox" name="roles[]" value="{{roleid}}" {{#hasRole}}checked{{/hasRole}}>
+ <label></label>
+ </div>
+ </td>
+ </tr>
+ {{/roles}}
+ </tbody>
+</table>
+
+<div class="row">
+ <div class="col-md-4"></div>
+ <div class="col-md-8">
+ <button class="btn btn-lg btn-primary btn-block save-btn" type="submit">
+ <span class="glyphicon glyphicon-floppy-disk"></span>
+ {{lang_save}}
+ </button>
+ </div>
+</div> \ No newline at end of file
diff --git a/modules-available/backup/config.json b/modules-available/backup/config.json
index 706412d0..110f8b67 100644
--- a/modules-available/backup/config.json
+++ b/modules-available/backup/config.json
@@ -1,3 +1,3 @@
{
- "category":"main.content"
-}
+ "category": "main.content"
+} \ No newline at end of file
diff --git a/modules-available/backup/page.inc.php b/modules-available/backup/page.inc.php
index 949cd7f3..985f39ee 100644
--- a/modules-available/backup/page.inc.php
+++ b/modules-available/backup/page.inc.php
@@ -16,16 +16,19 @@ class Page_Backup extends Page
Util::redirect('?do=Main');
}
$this->action = Request::post('action');
- if ($this->action === 'backup' && User::hasPermission("create")) {
+ if ($this->action === 'backup') {
+ User::assertPermission("create");
$this->backup();
- } elseif ($this->action === 'restore' && User::hasPermission("restore")) {
+ } elseif ($this->action === 'restore') {
+ User::assertPermission("restore");
$this->restore();
}
+ User::assertPermission('*');
}
protected function doRender()
{
- if ($this->action === 'restore' && User::hasPermission("restore")) {
+ if ($this->action === 'restore') { // TODO: We're in post mode, redirect with all the taskids first...
Render::addTemplate('restore', $this->templateData);
} else {
$lastBackup = (int)Property::get(self::LAST_BACKUP_PROP, 0);
@@ -34,9 +37,9 @@ class Page_Backup extends Page
} else {
$lastBackup = date('d.m.Y', $lastBackup);
}
- Render::addTemplate('_page', ['last_backup' => $lastBackup,
- "createAllowed" => User::hasPermission("create"),
- "restoreAllowed" => User::hasPermission("restore")]);
+ $params = ['last_backup' => $lastBackup];
+ Permission::addGlobalTags($params['perms'], NULL, ['create', 'restore']);
+ Render::addTemplate('_page', $params);
}
}
diff --git a/modules-available/backup/permissions/permissions.json b/modules-available/backup/permissions/permissions.json
index feeffe33..1f778ab6 100644
--- a/modules-available/backup/permissions/permissions.json
+++ b/modules-available/backup/permissions/permissions.json
@@ -1,4 +1,8 @@
-[
- "create",
- "restore"
-] \ No newline at end of file
+{
+ "create": {
+ "location-aware": false
+ },
+ "restore": {
+ "location-aware": false
+ }
+} \ No newline at end of file
diff --git a/modules-available/backup/style.css b/modules-available/backup/style.css
deleted file mode 100644
index 7b86af56..00000000
--- a/modules-available/backup/style.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.disabledPanel {
- cursor: not-allowed;
-}
-.disabledPanel > .panel-body {
- pointer-events: none;
- opacity: 0.8;
-}
diff --git a/modules-available/backup/templates/_page.html b/modules-available/backup/templates/_page.html
index 41e73091..4c6cade4 100644
--- a/modules-available/backup/templates/_page.html
+++ b/modules-available/backup/templates/_page.html
@@ -3,16 +3,16 @@
<form action="?do=Backup" method="post">
<input type="hidden" name="token" value="{{token}}">
<input type="hidden" name="action" value="backup">
- <div class="panel panel-default {{^createAllowed}}disabledPanel{{/createAllowed}}">
+ <div class="panel panel-default">
<div class="panel-heading">{{lang_backup}}</div>
- <div class="panel-body">
+ <div class="panel-body {{perms.create.disabled}}">
<p>{{lang_backupDescription}}</p>
<p class="text-right">
{{lang_lastBackup}}:
{{^last_backup}}{{lang_unknown}}{{/last_backup}}
{{last_backup}}
</p>
- <button class="btn btn-primary pull-right" type="submit"><span class="glyphicon glyphicon-save"></span> {{lang_download}}</button>
+ <button {{perms.create.disabled}} class="btn btn-primary pull-right" type="submit"><span class="glyphicon glyphicon-save"></span> {{lang_download}}</button>
</div>
</div>
</form>
@@ -20,15 +20,15 @@
<form action="?do=Backup" method="post" enctype="multipart/form-data">
<input type="hidden" name="token" value="{{token}}">
<input type="hidden" name="action" value="restore">
- <div class="panel panel-default {{^restoreAllowed}}disabledPanel{{/restoreAllowed}}">
+ <div class="panel panel-default">
<div class="panel-heading">{{lang_restore}}</div>
- <div class="panel-body">
+ <div class="panel-body {{perms.restore.disabled}}">
<p>{{lang_restoreDescription}}</p>
<div class="input-group upload-ex">
<input type="text" class="form-control" readonly placeholder="{{lang_selectFile}}">
<span class="input-group-btn">
<span class="btn btn-default btn-file">
- {{lang_browseForFile}}&hellip; <input type="file" name="backupfile">
+ {{lang_browseForFile}}&hellip; <input type="file" name="backupfile" {{perms.restore.disabled}}>
</span>
</span>
</div>
@@ -46,7 +46,7 @@
</div>
<p><i>{{lang_dozmodExplanation}}</i></p>
</div>
- <button class="btn btn-primary pull-right" type="submit"><span class="glyphicon glyphicon-open"></span> {{lang_restore}}</button>
+ <button {{perms.restore.disabled}} class="btn btn-primary pull-right" type="submit"><span class="glyphicon glyphicon-open"></span> {{lang_restore}}</button>
</div>
</div>
</form> \ No newline at end of file
diff --git a/modules-available/baseconfig/api.inc.php b/modules-available/baseconfig/api.inc.php
index a4024c5e..bc834930 100644
--- a/modules-available/baseconfig/api.inc.php
+++ b/modules-available/baseconfig/api.inc.php
@@ -16,6 +16,8 @@ class ConfigHolder
private static $context = '';
+ private static $postHooks = [];
+
public static function setContext($name)
{
self::$context = $name;
@@ -54,8 +56,26 @@ class ConfigHolder
return self::$config[$key][0]['value'];
}
+ /**
+ * @param callable $func
+ */
+ public static function addPostHook($func)
+ {
+ self::$postHooks[] = array('context' => self::$context, 'function' => $func);
+ }
+
+ public static function applyPostHooks()
+ {
+ foreach (self::$postHooks as $hook) {
+ self::$context = $hook['context'] . ':post';
+ $hook['function']();
+ }
+ self::$postHooks = [];
+ }
+
public static function getConfig()
{
+ self::applyPostHooks();
$ret = [];
foreach (self::$config as $key => $list) {
if ($list[0]['value'] === false)
@@ -67,6 +87,7 @@ class ConfigHolder
public static function outputConfig()
{
+ self::applyPostHooks();
foreach (self::$config as $key => $list) {
echo '##', $key, "\n";
foreach ($list as $pos => $item) {
@@ -119,7 +140,7 @@ foreach (glob('modules/*/baseconfig/getconfig.inc.php') as $file) {
$mod = Module::get($out[1]);
if ($mod === false)
continue;
- $mod->activate();
+ $mod->activate(1, false);
foreach ($mod->getDependencies() as $dep) {
$depFile = 'modules/' . $dep . '/baseconfig/getconfig.inc.php';
if (file_exists($depFile) && Module::isAvailable($dep)) {
diff --git a/modules-available/baseconfig/config.json b/modules-available/baseconfig/config.json
index e4d906e1..357a117e 100644
--- a/modules-available/baseconfig/config.json
+++ b/modules-available/baseconfig/config.json
@@ -1,4 +1,7 @@
{
"category": "main.settings-client",
- "dependencies" : ["js_selectize", "bootstrap_multiselect"]
-}
+ "dependencies": [
+ "js_selectize",
+ "bootstrap_multiselect"
+ ]
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/lang/de/permissions.json b/modules-available/baseconfig/lang/de/permissions.json
new file mode 100644
index 00000000..a010cebe
--- /dev/null
+++ b/modules-available/baseconfig/lang/de/permissions.json
@@ -0,0 +1,4 @@
+{
+ "edit": "Konfigurationsvariablen bearbeiten",
+ "view": "Konfigurationsvariablen anzeigen"
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/lang/en/permissions.json b/modules-available/baseconfig/lang/en/permissions.json
new file mode 100644
index 00000000..9fe69752
--- /dev/null
+++ b/modules-available/baseconfig/lang/en/permissions.json
@@ -0,0 +1,4 @@
+{
+ "edit": "Edit config variables",
+ "view": "Show config variables"
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/page.inc.php b/modules-available/baseconfig/page.inc.php
index 426d3fdd..97fb6072 100644
--- a/modules-available/baseconfig/page.inc.php
+++ b/modules-available/baseconfig/page.inc.php
@@ -13,19 +13,25 @@ class Page_BaseConfig extends Page
protected function doPreprocess()
{
User::load();
+ if (!User::isLoggedIn()) {
+ Message::addError('main.no-permission');
+ Util::redirect('?do=Main');
+ }
// Determine if we're setting global or module specific
$this->getModuleSpecific();
$newValues = Request::post('setting');
if (is_array($newValues)) {
- if (!User::hasPermission('superadmin')) {
- Message::addError('main.no-permission');
- Util::redirect('?do=baseconfig');
+ if ($this->targetModule === 'locations') {
+ User::assertPermission('edit', $this->qry_extra['field_value']);
+ } else {
+ User::assertPermission('edit', 0);
}
// Build variables for specific sub-settings
if ($this->targetModule === false) {
- // We're editing global settings - use the 'enabled' field
+ // We're editing global settings
+ // use the 'enabled' field
$qry_insert = ', enabled';
$qry_values = ', :enabled';
$qry_update = ', enabled = :enabled';
@@ -115,10 +121,6 @@ class Page_BaseConfig extends Page
protected function doRender()
{
- if (!User::hasPermission('superadmin')) {
- Message::addError('main.no-permission');
- Util::redirect('?do=Main');
- }
// Check if valid submodule mode, store name if any
if ($this->targetModule !== false) {
$this->qry_extra['subheading'] = $this->getCurrentModuleName();
@@ -127,6 +129,13 @@ class Page_BaseConfig extends Page
Util::redirect('?do=BaseConfig');
}
}
+ if ($this->targetModule === 'locations') {
+ User::assertPermission('view', $this->qry_extra['field_value']);
+ $editForbidden = !User::hasPermission('edit', $this->qry_extra['field_value']);
+ } else {
+ User::assertPermission('view', 0);
+ $editForbidden = !User::hasPermission('edit', 0);
+ }
// Get stuff that's set in DB already
if ($this->targetModule === false) {
$fields = ', enabled';
@@ -183,15 +192,13 @@ class Page_BaseConfig extends Page
if (!isset($settings[$var['catid']]['settings'][$key]['shadows'])) {
$settings[$var['catid']]['settings'][$key]['shadows'] = isset($var['shadows']) ? $var['shadows'] : null;
}
- //echo "<pre>";
- //var_dump($settings[$var['catid']]['settings'][$key]);
- //echo "</pre>";
$settings[$var['catid']]['settings'][$key] += array(
'item' => $this->makeInput(
$var['validator'],
$key,
$settings[$var['catid']]['settings'][$key]['displayvalue'],
- $settings[$var['catid']]['settings'][$key]['shadows']
+ $settings[$var['catid']]['settings'][$key]['shadows'],
+ $editForbidden
),
'description' => Util::markup(Dictionary::translateFileModule($var['module'], 'config-variables', $key)),
'setting' => $key,
@@ -218,6 +225,7 @@ class Page_BaseConfig extends Page
'override' => $this->targetModule !== false,
'categories' => array_values($settings),
'target_module' => $this->targetModule,
+ 'edit_disabled' => $editForbidden ? 'disabled' : '',
) + $this->qry_extra);
Module::isAvailable('bootstrap_switch');
}
@@ -296,13 +304,16 @@ class Page_BaseConfig extends Page
* @param string $validator
* @return boolean
*/
- private function makeInput($validator, $setting, $current, $shadows)
+ private function makeInput($validator, $setting, $current, $shadows, $disabled)
{
/* for the html snippet we need: */
$args = array('class' => 'form-control', 'name' => "setting[$setting]", 'id' => $setting);
if (!empty($shadows)) {
$args['data-shadows'] = json_encode($shadows);
}
+ if ($disabled) {
+ $args['disabled'] = true;
+ }
$inner = "";
/* -- */
@@ -360,10 +371,13 @@ class Page_BaseConfig extends Page
$output = "<$tag ";
foreach ($args as $key => $val) {
+ if ($val === true) {
+ $output .= $key . ' ';
+ }
$output .= "$key=\"" . htmlspecialchars($val) . '" ';
}
if (empty($inner)) {
- $output .= '/>';
+ $output .= '>';
} else {
$output .= '>' . $inner . "</$tag>";
}
diff --git a/modules-available/baseconfig/permissions/permissions.json b/modules-available/baseconfig/permissions/permissions.json
new file mode 100644
index 00000000..9edefdfb
--- /dev/null
+++ b/modules-available/baseconfig/permissions/permissions.json
@@ -0,0 +1,8 @@
+{
+ "view": {
+ "location-aware": true
+ },
+ "edit": {
+ "location-aware": true
+ }
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/templates/_page.html b/modules-available/baseconfig/templates/_page.html
index 89caf9f2..110ee5ec 100644
--- a/modules-available/baseconfig/templates/_page.html
+++ b/modules-available/baseconfig/templates/_page.html
@@ -29,7 +29,7 @@
{{#defaultvalue}}{{lang_defaultValue}}:{{/defaultvalue}}
{{defaultvalue}}
</div>
- <input class="bs-switch" name="override[{{setting}}]" id="CB_{{setting}}" type="checkbox" {{checked}}>
+ <input class="bs-switch" name="override[{{setting}}]" id="CB_{{setting}}" type="checkbox" {{checked}} {{edit_disabled}}>
<label for="CB_{{setting}}">
{{#override}}{{lang_enableOverride}}{{/override}}
{{^override}}{{lang_settingActive}}{{/override}}
@@ -73,7 +73,7 @@
{{#override}}
<a class="btn btn-default" href="api.php?do=baseconfig&amp;user={{userid}}&amp;module={{target_module}}&amp;value={{field_value}}&amp;force=1">Download</a>
{{/override}}
- <button class="btn btn-primary" type="submit"><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
+ <button class="btn btn-primary" type="submit" {{edit_disabled}}><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
</div>
<br/>
@@ -86,6 +86,8 @@ function updateShadows(e) {
if (!rules) return;
var currentValue = $(e).val();
for (var triggerVal in rules) {
+ if (!rules.hasOwnProperty(triggerVal))
+ continue;
var targets = rules[triggerVal];
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
@@ -95,11 +97,11 @@ function updateShadows(e) {
if (currentValue === triggerVal) {
inp.prop('disabled', true);
if (selitem) selitem.disable();
- $('#' + target + '.multilist').multiselect('disable');
+ inp.filter('.multiselect').multiselect('disable');
} else {
inp.prop('disabled', false);
if (selitem) selitem.enable();
- $('#' + target + '.multilist').multiselect('enable');
+ inp.filter('.multiselect').multiselect('enable');
}
}
}
@@ -125,6 +127,7 @@ document.addEventListener("DOMContentLoaded", function () {
buttonWidth: '100%',
buttonClass: 'form-control'
});
+ $('select.multiselect').filter(':disabled').multiselect('disable');
/* data-shadowing bindings */
var $allShadowingFields = $('[data-shadows]');
diff --git a/modules-available/baseconfig_bwidm/config.json b/modules-available/baseconfig_bwidm/config.json
index af67a188..7e6cf06a 100644
--- a/modules-available/baseconfig_bwidm/config.json
+++ b/modules-available/baseconfig_bwidm/config.json
@@ -1,3 +1,5 @@
{
- "dependencies": ["baseconfig"]
-}
+ "dependencies": [
+ "baseconfig"
+ ]
+} \ No newline at end of file
diff --git a/modules-available/baseconfig_bwidm/hooks/translation.inc.php b/modules-available/baseconfig_bwidm/hooks/translation.inc.php
index 5ccafbc4..a53500fc 100644
--- a/modules-available/baseconfig_bwidm/hooks/translation.inc.php
+++ b/modules-available/baseconfig_bwidm/hooks/translation.inc.php
@@ -20,7 +20,7 @@ $HANDLER['subsections'] = array(
* @return array
*/
$HANDLER['grep_config-variable-categories'] = function($module) {
- if (!$module->activate())
+ if (!$module->activate(1, false))
return array();
$want = BaseConfigUtil::getCategories($module);
foreach ($want as &$entry) {
@@ -35,7 +35,7 @@ $HANDLER['grep_config-variable-categories'] = function($module) {
* @return array
*/
$HANDLER['grep_config-variables'] = function($module) {
- if (!$module->activate())
+ if (!$module->activate(1, false))
return array();
$want = BaseConfigUtil::getVariables($module);
foreach ($want as &$entry) {
diff --git a/modules-available/baseconfig_bwlp/baseconfig/settings.json b/modules-available/baseconfig_bwlp/baseconfig/settings.json
index 0d4db4d4..6aab113e 100644
--- a/modules-available/baseconfig_bwlp/baseconfig/settings.json
+++ b/modules-available/baseconfig_bwlp/baseconfig/settings.json
@@ -121,6 +121,18 @@
"permissions": "2",
"validator": "regex:\/^\\d*$\/"
},
+ "SLX_SCREEN_SAVER_TIMEOUT": {
+ "catid": "power",
+ "defaultvalue": "540",
+ "permissions": "2",
+ "validator": "regex:\/^\\d*$\/"
+ },
+ "SLX_SCREEN_SAVER_GRACE_TIMEOUT": {
+ "catid": "power",
+ "defaultvalue": "15",
+ "permissions": "2",
+ "validator": "regex:\/^\\d*$\/"
+ },
"SLX_SCREEN_STANDBY_TIMEOUT": {
"catid": "power",
"defaultvalue": "600",
@@ -186,6 +198,12 @@
]
}
},
+ "SLX_PREFERRED_SOUND_OUTPUT": {
+ "catid": "sysconfig",
+ "defaultvalue": "SOUNDCARD",
+ "permissions": "2",
+ "validator": "list:HDMI|SOUNDCARD"
+ },
"SLX_PVS_DEFAULT": {
"catid": "vmchooser",
"defaultvalue": "OFF",
diff --git a/modules-available/baseconfig_bwlp/config.json b/modules-available/baseconfig_bwlp/config.json
index af67a188..7e6cf06a 100644
--- a/modules-available/baseconfig_bwlp/config.json
+++ b/modules-available/baseconfig_bwlp/config.json
@@ -1,3 +1,5 @@
{
- "dependencies": ["baseconfig"]
-}
+ "dependencies": [
+ "baseconfig"
+ ]
+} \ No newline at end of file
diff --git a/modules-available/baseconfig_bwlp/hooks/translation.inc.php b/modules-available/baseconfig_bwlp/hooks/translation.inc.php
index 5ccafbc4..a53500fc 100644
--- a/modules-available/baseconfig_bwlp/hooks/translation.inc.php
+++ b/modules-available/baseconfig_bwlp/hooks/translation.inc.php
@@ -20,7 +20,7 @@ $HANDLER['subsections'] = array(
* @return array
*/
$HANDLER['grep_config-variable-categories'] = function($module) {
- if (!$module->activate())
+ if (!$module->activate(1, false))
return array();
$want = BaseConfigUtil::getCategories($module);
foreach ($want as &$entry) {
@@ -35,7 +35,7 @@ $HANDLER['grep_config-variable-categories'] = function($module) {
* @return array
*/
$HANDLER['grep_config-variables'] = function($module) {
- if (!$module->activate())
+ if (!$module->activate(1, false))
return array();
$want = BaseConfigUtil::getVariables($module);
foreach ($want as &$entry) {
diff --git a/modules-available/baseconfig_bwlp/lang/de/config-variables.json b/modules-available/baseconfig_bwlp/lang/de/config-variables.json
index ad2abc8d..78481da9 100644
--- a/modules-available/baseconfig_bwlp/lang/de/config-variables.json
+++ b/modules-available/baseconfig_bwlp/lang/de/config-variables.json
@@ -4,13 +4,14 @@
"SLX_AUTOSTART_UUID": "ID einer Veranstaltung die automatisch gestartet werden soll. Die Veranstaltungs-ID finden Sie im Detailfenster innerhalb der bwLehrpool-Suite.\r\n\r\n*Hinweis: Diese Option ist eine tempor\u00e4re \u00dcbergangsl\u00f6sung. In sp\u00e4teren Versionen wird die Funktionalit\u00e4t einfacher erreichbar sein.*",
"SLX_BIOS_CLOCK": "Legt fest, ob und wie die interne Uhr des Rechners im Bezug auf die Systemzeit des \/MiniLinux\/ gesetzt werden soll.\r\n*off* = Die interne Uhr des Rechners wird nicht ver\u00e4ndert.\r\n*local* = Die interne Uhr wird auf die Lokalzeit gesetzt. Bevorzugt wenn z.B. noch eine native Windows-Installation auf dem PC vorhanden ist.\r\n*utc* = Die interne Uhr wird auf die \/Koordinierte Weltzeit\/ gesetzt. Dies ist die g\u00e4ngige Einstellung in einem reinen Linux-Umfeld.",
"SLX_BRIDGE_OTHER_NICS": "Sofern ein Client mehrere Netzwerkkarten besitzt, k\u00f6nnen Sie mittels dieser Option alle weiteren gefundenen Karten in die VM durchreichen.",
- "SLX_DEMO_PASS": "Passwort f\u00fcr den eingebauten *demo*-Account. Leer lassen, um das Einloggen zu verbieten.\r\nDas Passwort wird wie das root-Passwort nur gehasht an den Client \u00fcbertragen.",
+ "SLX_DEMO_PASS": "Passwort f\u00fcr den eingebauten *demo*-Account. Leer lassen, um das Einloggen zu verbieten.\r\n\/Hinweis\/: Das Passwort wird im Klartext in der lokalen Datenbank hinterlegt, jedoch immer gehasht an die Clients \u00fcbermittelt (SHA-512 mit Salt). Wenn Sie das Passwort auch im Satelliten nicht im Klartext speichern wollen, k\u00f6nnen Sie hier auch ein vorgehashtes Passwort eintragen (im *$6$....*-Format).",
"SLX_JUMBO_FRAMES": "Setzt die MTU auf den Clients auf 9000, statt wie \u00fcblich 1500. Da dies mit alten\/schlechten Routern oder Switches zu Problemen f\u00fchren k\u00f6nnte, ist diese Option standardm\u00e4\u00dfig deaktiviert.",
"SLX_LOGOUT_TIMEOUT": "Zeit in Sekunden, die eine Benutzersitzung ohne Aktion sein darf, bevor sie beendet wird.Feld leer lassen, um die Funktion zu deaktivieren.",
"SLX_NET_DOMAIN": "DNS-Dom\u00e4ne, in die sich die Clients eingliedern, sofern der DHCP Server keine solche vorgibt.",
"SLX_NET_SEARCH": "Per Leerzeichen getrennte Liste von Suchdom\u00e4nen, die der Client verwenden soll, sofern der DHCP-Server keine Vorgabe macht.",
"SLX_NTP_SERVER": "Adresse des NTP-Zeitservers. Es k\u00f6nnen mehrere Server mit Leerzeichen getrennt angegeben werden.Die Server werden der Reihe nach angefragt, bis ein antwortender Server gefunden wird.",
"SLX_PASSTHROUGH_USB_ID": "Geben Sie hier eindeutige IDs von USB-Ger\u00e4ten an, die direkt in die VMs weitergereicht werden sollen. Das erwartete Format ist *vendorID:productID* , als jeweils vierstellige Hexadezimalzahlen, beispielsweise *1234:abcd* .\r\nMehrere IDs k\u00f6nnen als leerzeichengetrennte Liste angegeben werden.",
+ "SLX_PREFERRED_SOUND_OUTPUT": "Bevorzugte Ausgabemethode f\u00fcr Sound. Standardm\u00e4\u00dfig werden dedizierte Soundkarten bevorzugt, da die Ausgabe \u00fcber HDMI mitunter Probleme bereiten kann, besonders wenn im Betrieb Bildschirme an- oder abgesteckt werden.",
"SLX_PRINT_USER_PREFIX": "Pr\u00e4fix, was im Authentifizierungsdialog der PrinterGUI dem Benutzernamen vorangestellt wird.\r\nWenn das Drucksystem auf einem AD-Server l\u00e4uft und der Dom\u00e4nenname vorangestellt werden muss, tragen Sie hier *domain\\* ein. Achten Sie auf die Angabe des Backslashes, er wird nicht automatisch angeh\u00e4ngt. Falls das Drucksystem mit dem reinen Benutzernamen zurecht kommt, k\u00f6nnen Sie das Feld leer lassen.",
"SLX_PROXY_BLACKLIST": "Adressen bzw. Adressbereiche, f\u00fcr die der Proxyserver nicht verwendet werden soll (z.B. der Adressbereich der Einrichtung). G\u00fcltige Angaben sind einzelne IP-Adressen, sowie IP-Bereiche in CIDR-Notation (z.B. 1.2.0.0\/16). Mehrere Angaben k\u00f6nnen durch Leerzeichen getrennt werden.",
"SLX_PROXY_IP": "Die Adresse des zu verwendenden Proxy Servers.",
@@ -21,6 +22,8 @@
"SLX_REBOOT_SCHEDULE": "Feste Uhrzeit, zu der sich die Rechner neustarten, auch wenn noch ein Benutzer aktiv ist.\r\nMehrere Zeitpunkte k\u00f6nnen durch Leerzeichen getrennt angegeben werden.",
"SLX_REMOTE_LOG_SESSIONS": "Legt fest, ob Logins und Logouts der Benutzer an den Satelliten gemeldet werden sollen.\r\n*yes* = Mit Benutzerkennung loggen\r\n*anonymous* = Anonym loggen\r\n*no* = Nicht loggen",
"SLX_ROOT_PASS": "Das root-Passwort des Grundsystems. Wird nur f\u00fcr Diagnosezwecke am Client ben\u00f6tigt.\r\nFeld leer lassen, um root-Logins zu verbieten.\r\n\/Hinweis\/: Das Passwort wird im Klartext in der lokalen Datenbank hinterlegt, jedoch immer gehasht an die Clients \u00fcbermittelt (SHA-512 mit Salt). Wenn Sie das Passwort auch im Satelliten nicht im Klartext speichern wollen, k\u00f6nnen Sie hier auch ein vorgehashtes Passwort eintragen (im *$6$....*-Format).",
+ "SLX_SCREEN_SAVER_GRACE_TIMEOUT": "Wenn sich der Bildschirmschoner nach dem konfigurierten Timeout automatisch aktiviert, kann er f\u00fcr die hier angegebene Zeit (in Sekunden) durch Tastendruck oder Mausbewegen wieder deaktiviert werden, ohne dass das Benutzerkennwort angefordert wird.",
+ "SLX_SCREEN_SAVER_TIMEOUT": "Zeit in Sekunden, nach der sich bei Nutzerinaktivit\u00e4t der Bildschirmschoner aktiviert. Der Bildschirmschoner sperrt zugleich die Sitzung und fordert zum Entsperren das Nutzerkennwort an.",
"SLX_SCREEN_STANDBY_TIMEOUT": "Zeit in Sekunden, nach der der Bildschirm bei Inaktivit\u00e4t des Rechners in den Standby-Modus versetzt wird.",
"SLX_SHUTDOWN_SCHEDULE": "Feste Uhrzeit, zu der sich die Rechner ausschalten, auch wenn noch ein Benutzer aktiv ist.\r\nMehrere Zeitpunkte k\u00f6nnen durch Leerzeichen getrennt angegeben werden.",
"SLX_SHUTDOWN_TIMEOUT": "Zeit in Sekunden, nach der ein Rechner abgeschaltet wird, sofern kein Benutzer angemeldet ist.\r\nFeld leer lassen, um die Funktion zu deaktivieren.",
diff --git a/modules-available/baseconfig_bwlp/lang/en/config-variables.json b/modules-available/baseconfig_bwlp/lang/en/config-variables.json
index c56f171d..9fd65053 100644
--- a/modules-available/baseconfig_bwlp/lang/en/config-variables.json
+++ b/modules-available/baseconfig_bwlp/lang/en/config-variables.json
@@ -4,13 +4,14 @@
"SLX_AUTOSTART_UUID": "ID of a lecture which is automatically started. The lecture-ID is found in the detail window of a lecture in the bwLehrpool-Suite. \r\n\r\n*This solution is only temporary. In later versions this feature will probably be moved to another section*",
"SLX_BIOS_CLOCK": "Specifies whether and how the internal clock of the computer should be set in relation to the system time of the \/MiniLinux\/.\r\n*off* = The internal clock of the computer is not changed.\r\n*local* = The internal clock is set to local time. Preferably if, for example, there is still a native Windows installation available on the PC.\r\n*utc* = The internal clock is set to the \/Coordinated Universal Time\/. This is the most common setup in a pure Linux environment.",
"SLX_BRIDGE_OTHER_NICS": "If enabled, additional network cards installed in the Client will be bridged to the VM. ",
- "SLX_DEMO_PASS": "Password for the *demo* account. Leave empty to disallow logging in as the demo user.\r\nLike the root password, the demo user's password will be sent to the client in its hashed form.",
+ "SLX_DEMO_PASS": "Password for the *demo* account. Leave empty to disallow logging in as the demo user.\r\n\/Hint\/: The password SHA-512-with-salt hashed before it's being sent to the client. It's only stored in clear text on the Satellite Server. If you want to have it hashed on the server too, you can supply a pre-hashed password in \/$6$...$...\/-format.",
"SLX_JUMBO_FRAMES": "Increases the MTU on the clients from 1500 to 9000. As this can lead to issues with old\/bad routers and switches, this option is disabled by default.",
"SLX_LOGOUT_TIMEOUT": "Time in seconds, in which a user session may remain without action before it is terminated.Leave field blank to disable the function.",
"SLX_NET_DOMAIN": "DNS domain in which the client integrate, provided the DHCP server does not specifies such.",
"SLX_NET_SEARCH": "Space separated list of DNS search domains to use in case the DHCP server doesn't supply any.",
"SLX_NTP_SERVER": "Address of the NTP time server. Multiple servers can be specified separated by spaces.The servers are queried in sequence until a responding server is found.",
"SLX_PASSTHROUGH_USB_ID": "Specify IDs of USB devices that should be passed through to the VM directly.\r\nThe expected format is *vendorID:productID* , where each ID is a 4-digit hexadecimal number, e.g. *1234:abcd* \r\nMultiple IDs can be given as a space-separated list.",
+ "SLX_PREFERRED_SOUND_OUTPUT": "Preferred sound output method.\r\nDefaults to dedicated sound card, since using HDMI can be unreliable, especially if screens get (un)plugged while the (virtual) machine is running.",
"SLX_PRINT_USER_PREFIX": "Prefix to add to the user name in the authentication dialog of PrinterGUI.\r\nIf your print server belongs to a Windows domain and requires the domain name prefixed, set this field to *domainname\\*. Note the trailing backslash, it will not be inserted automatically. If your print server just wants the plain user name, this field should be left blank.",
"SLX_PROXY_BLACKLIST": "Address or addresses ranges in which the proxy server is not used (for example the address range of the device). Valid entries are individual IP addresses and IP ranges in CIDR notation (for example 1.2.0.0\/16). Multiple selections can be separated by spaces.",
"SLX_PROXY_IP": "The address to use for the proxy server.",
@@ -20,7 +21,9 @@
"SLX_PVS_DEFAULT": "Set whether the \"Join PVS\" checkbox in vmChooser is checked by default.",
"SLX_REBOOT_SCHEDULE": "Fixed time to reboot the computer, even if there is a user active.\r\nSeveral times can be specified, separated by spaces.",
"SLX_REMOTE_LOG_SESSIONS": "Determines whether logins and logouts of the users should be reported to the satellite.\r\n*yes* = log with user ID\r\n*anonymous* = anonymous logging\r\n*no* = no logging",
- "SLX_ROOT_PASS": "The root password of the client system. Only required for diagnostic purposes on the client.Leave field blank to disallow root logins.\r\n\/Hint\/: The password SHA-512-with-salt hashed before it's being sent to the client. It's only stored in clear text on the Satellite Server. If you want to have it hashed on the server too, you can supply a pre-hashed passoword in \/$6$...$...\/-format.",
+ "SLX_ROOT_PASS": "The root password of the client system. Only required for diagnostic purposes on the client.Leave field blank to disallow root logins.\r\n\/Hint\/: The password SHA-512-with-salt hashed before it's being sent to the client. It's only stored in clear text on the Satellite Server. If you want to have it hashed on the server too, you can supply a pre-hashed password in \/$6$...$...\/-format.",
+ "SLX_SCREEN_SAVER_GRACE_TIMEOUT": "If the screen saver activates after the configured timeout, the user can disable it again by just moving the mouse or pressing a key, without entering their password again. This is called the screen saver grace period, which is configurable in seconds.",
+ "SLX_SCREEN_SAVER_TIMEOUT": "Timeout for screen saver activation. If the user is idle for this long (in seconds), the screen saver will activate and lock the screen, so the user password is required to unlock the screen again.",
"SLX_SCREEN_STANDBY_TIMEOUT": "Time in seconds after which the screen will enter power saving mode, if the client is not in use.",
"SLX_SHUTDOWN_SCHEDULE": "Fixed time to turn off the computer, even if there is a user active.\r\nSeveral times can be specified, separated by spaces.",
"SLX_SHUTDOWN_TIMEOUT": "Time in seconds after which a computer is switched off, if no user is logged on.\r\nLeave blank to disable the function.",
diff --git a/modules-available/baseconfig_partitions_cdn/config.json b/modules-available/baseconfig_partitions_cdn/config.json
index a355eef3..fd4c6f4b 100644
--- a/modules-available/baseconfig_partitions_cdn/config.json
+++ b/modules-available/baseconfig_partitions_cdn/config.json
@@ -1,4 +1,6 @@
{
- "category": "main.settings-client",
- "dependencies": [ "baseconfig" ]
-}
+ "category": "main.settings-client",
+ "dependencies": [
+ "baseconfig"
+ ]
+} \ No newline at end of file
diff --git a/modules-available/baseconfig_partitions_cdn/lang/de/permissions.json b/modules-available/baseconfig_partitions_cdn/lang/de/permissions.json
new file mode 100644
index 00000000..d5805e3d
--- /dev/null
+++ b/modules-available/baseconfig_partitions_cdn/lang/de/permissions.json
@@ -0,0 +1,7 @@
+{
+ "show": "Zeige Partitionen. Wird nicht benötigt, wenn Nutzer eine der anderen Rechte hat.",
+ "partitions.add": "Füge eine neue Partition hinzu.",
+ "partitions.delete": "Lösche eine Partition.",
+ "partitions.edit": "Speichere Änderungen an Partitionen.",
+ "partitions.reset": "Setze Partitionen auf Standardwerte zurück."
+} \ No newline at end of file
diff --git a/modules-available/baseconfig_partitions_cdn/lang/en/permissions.json b/modules-available/baseconfig_partitions_cdn/lang/en/permissions.json
new file mode 100644
index 00000000..f751a839
--- /dev/null
+++ b/modules-available/baseconfig_partitions_cdn/lang/en/permissions.json
@@ -0,0 +1,7 @@
+{
+ "show": "Show Partitions. Not needed if User has any of the other permissions.",
+ "partitions.add": "Add a new partition.",
+ "partitions.delete": "Delete a partition.",
+ "partitions.edit": "Save changes of partitions.",
+ "partitions.reset": "Reset partitions to default."
+} \ No newline at end of file
diff --git a/modules-available/baseconfig_partitions_cdn/lang/en/template-tags.json b/modules-available/baseconfig_partitions_cdn/lang/en/template-tags.json
index 04ce6c80..472e5870 100644
--- a/modules-available/baseconfig_partitions_cdn/lang/en/template-tags.json
+++ b/modules-available/baseconfig_partitions_cdn/lang/en/template-tags.json
@@ -1,9 +1,9 @@
{
"lang_areYouSureNoUndo": "Are you sure? This cannot be undone!",
- "lang_confirm": "Would you like to save the settings on [ \/srv\/openslx\/www\/boot\/config ] ?",
+ "lang_confirm": "Would you like to save the settings on \/srv\/openslx\/www\/boot\/config?",
"lang_create": "Create",
"lang_discardChanges": "Discard Changes",
- "lang_explanationText": "Here you can configure what kind of partitions will be created on the client computers, and where they will be mounted",
+ "lang_explanationText": "Here you can configure what kind of partitions will be created on the client computers, and where they will be mounted.",
"lang_helpId": "Partition Id",
"lang_helpMountPoint": "Must be a directory: \/example\/directory\/",
"lang_helpOptions": "Currently, only option 'bootable' is available",
diff --git a/modules-available/baseconfig_partitions_cdn/page.inc.php b/modules-available/baseconfig_partitions_cdn/page.inc.php
index a1d1445f..b61ea448 100644
--- a/modules-available/baseconfig_partitions_cdn/page.inc.php
+++ b/modules-available/baseconfig_partitions_cdn/page.inc.php
@@ -10,23 +10,39 @@ class Page_BaseConfig_Partitions_CDN extends Page
$action = Request::post('action');
if($action == 'new_partition') {
- $this->addPartition();
+ if (User::hasPermission("partitions.add")) {
+ $this->addPartition();
+ }
}
if($action == 'reset') {
- $this->resetConfig();
+ if (User::hasPermission("partitions.reset")) {
+ $this->resetConfig();
+ }
}
$deletePartition = Request::get('deletePartition');
if($deletePartition !== false) { // TODO: CSRF: Actions that change/update/delete anything should be POST
- $this->deletePartition($deletePartition);
+ if (User::hasPermission("partitions.delete")) {
+ $this->deletePartition($deletePartition);
+ }
}
- $this->updatePartitions();
+ if(User::hasPermission("partitions.edit")) {
+ $this->updatePartitions();
+ }
}
protected function doRender()
{
- if (!User::hasPermission('baseconfig_local')) {
+ if (!User::isLoggedIn()) {
+ Message::addError('main.no-permission');
+ Util::redirect('?do=Main');
+ }
+
+ $hasAnyRight = User::hasPermission("partitions.add") || User::hasPermission("partitions.delete")
+ || User::hasPermission("partitions.edit") || User::hasPermission("partitions.reset");
+
+ if (!(User::hasPermission("show") || $hasAnyRight)) {
Message::addError('main.no-permission');
Util::redirect('?do=Main');
}
@@ -48,7 +64,11 @@ class Page_BaseConfig_Partitions_CDN extends Page
Render::addTemplate('_page', array(
'partitions' => $partitions,
- 'user' => User::getId()
+ 'user' => User::getId(),
+ 'allowedToAdd' => User::hasPermission("partitions.add"),
+ 'allowedToDelete' => User::hasPermission("partitions.delete"),
+ 'allowedToEdit' => User::hasPermission("partitions.edit"),
+ 'allowedToReset' => User::hasPermission("partitions.reset")
));
}
@@ -92,9 +112,9 @@ class Page_BaseConfig_Partitions_CDN extends Page
private function updatePartitions(){
$partitions = array();
foreach($_POST as $key => $value){
- if(substr($key,0,9) == 'partition'){
- $id = substr($key,10,1);
- $type = substr($key,12);
+
+ if (substr($key, 0, 9) == 'partition') {
+ list($key, $id, $type) = explode("-", $key);
$partitions[$id][$type] = $value;
}
}
@@ -111,6 +131,8 @@ class Page_BaseConfig_Partitions_CDN extends Page
Database::exec('UPDATE setting_partition SET partition_id=:partition_id, size=:size, mount_point=:mount_point,
options=:options WHERE id=:id AND user=:user;', $data);
}
+
+
if (!empty($partitions)) {
Message::addSuccess('partitions-updated');
Util::redirect('?do=BaseConfig_Partitions_CDN');
@@ -129,5 +151,6 @@ class Page_BaseConfig_Partitions_CDN extends Page
Database::exec ( "INSERT INTO setting_partition SET partition_id = '40', size = '20G', mount_point = '/cache/export/dnbd3', user = :user", $data );
Database::exec ( "INSERT INTO setting_partition SET partition_id = '41', size = '5G', mount_point = '/home', user = :user", $data );
Database::exec ( "INSERT INTO setting_partition SET partition_id = '82', size = '1G', user = :user", $data );
+ Util::redirect('?do=BaseConfig_Partitions_CDN');
}
} \ No newline at end of file
diff --git a/modules-available/baseconfig_partitions_cdn/permissions/permissions.json b/modules-available/baseconfig_partitions_cdn/permissions/permissions.json
new file mode 100644
index 00000000..3acd5230
--- /dev/null
+++ b/modules-available/baseconfig_partitions_cdn/permissions/permissions.json
@@ -0,0 +1,17 @@
+{
+ "partitions.add": {
+ "location-aware": false
+ },
+ "partitions.delete": {
+ "location-aware": false
+ },
+ "partitions.edit": {
+ "location-aware": false
+ },
+ "partitions.reset": {
+ "location-aware": false
+ },
+ "show": {
+ "location-aware": false
+ }
+} \ No newline at end of file
diff --git a/modules-available/baseconfig_partitions_cdn/style.css b/modules-available/baseconfig_partitions_cdn/style.css
new file mode 100644
index 00000000..d55e5e5b
--- /dev/null
+++ b/modules-available/baseconfig_partitions_cdn/style.css
@@ -0,0 +1,4 @@
+.missingInput {
+ border-color: rgba(255, 0, 0, 0.8);
+ box-shadow: 0 1px 1px rgba(255, 0, 0, 0.075) inset, 0 0 8px rgba(255, 0, 0, 0.6);
+} \ No newline at end of file
diff --git a/modules-available/baseconfig_partitions_cdn/templates/_page.html b/modules-available/baseconfig_partitions_cdn/templates/_page.html
index 71cbb7db..2cb3f2a6 100644
--- a/modules-available/baseconfig_partitions_cdn/templates/_page.html
+++ b/modules-available/baseconfig_partitions_cdn/templates/_page.html
@@ -21,7 +21,7 @@
<input name='partition-{{id}}-options' type='text' class='form-control' size='30' value='{{options}}' placeholder='{{lang_partitionOptions}}'/>
</div>
<div class='col-sm-1 col-md-2'>
- <a class='btn btn-danger' href='?do=BaseConfig_Partitions_CDN&amp;deletePartition={{id}}&amp;token={{token}}'>
+ <a class='btn btn-danger btn-sm {{allowedToDelete}}disabled{{allowedToDelete}}' href='?do=BaseConfig_Partitions_CDN&amp;deletePartition={{id}}&amp;token={{token}}'>
<span class='glyphicon glyphicon-trash'></span>
</a>
</div>
@@ -30,16 +30,16 @@
{{/partitions}}
<div class='list-group-item clearfix'>
<div class="pull-right">
- <a class='btn btn-success ' data-toggle='modal' data-target='#add-partition'>
+ <button {{^allowedToAdd}}disabled{{/allowedToAdd}} type="button" class='btn btn-success' data-toggle='modal' data-target='#add-partition'>
<span class='glyphicon glyphicon-plus'></span> {{lang_newPartition}}
- </a>
+ </button>
</div>
</div>
</div>
<div class="pull-right">
- <a class="btn btn-default" data-toggle="modal" data-target="#downloadModal"><span class="glyphicon glyphicon-download-alt"></span> Download</a>
+ <button type="button" class="btn btn-default" data-toggle="modal" data-target="#downloadModal"><span class="glyphicon glyphicon-download-alt"></span> Download</button>
<button class="btn btn-warning" type="reset"><span class="glyphicon glyphicon-refresh"></span> {{lang_discardChanges}}</button>
- <button class="btn btn-primary" type="submit"><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
+ <button {{^allowedToEdit}}disabled{{/allowedToEdit}} class="btn btn-primary" type="submit"><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
</div>
<div class ="modal fade" id="downloadModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
@@ -49,8 +49,10 @@
{{lang_confirm}}
</div>
<div class="modal-footer">
- <button type="button" onclick="saveConfig(false)" class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button>
- <button type="button" onclick="saveConfig(true)" class="btn btn-sm btn-danger" name="download"> Download</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button>
+ <button type="button" onclick="saveConfig()" class="btn btn-primary" name="download">
+ <span class="glyphicon glyphicon-download-alt"></span> Download
+ </button>
</div>
</div>
</div>
@@ -60,7 +62,7 @@
<form method="post" action="?do=BaseConfig_Partitions_CDN">
<input type="hidden" name="token" value="{{token}}">
<input type="hidden" name="action" value="reset">
- <button class="btn btn-danger" type="button" data-toggle="modal" data-target="#resetDefaultModal">{{lang_resetDefault}}</button>
+ <button {{^allowedToReset}}disabled{{/allowedToReset}} class="btn btn-danger" type="button" data-toggle="modal" data-target="#resetDefaultModal">{{lang_resetDefault}}</button>
<div class ="modal fade" id="resetDefaultModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" style="width: 400px" role="document">
@@ -70,7 +72,7 @@
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button>
- <button type="submit" class="btn btn-sm btn-danger" name="resetDefault"> {{lang_resetDefault}}</button>
+ <button type="submit" class="btn btn-danger" name="resetDefault"> {{lang_resetDefault}}</button>
</div>
</div>
</div>
@@ -78,7 +80,7 @@
</form>
<!-- Create Partition Window -->
-<form action="?do=BaseConfig_Partitions_CDN" method="post">
+<form id="createPartitionForm" action="?do=BaseConfig_Partitions_CDN" method="post">
<div class="modal fade" id="add-partition" tabindex="-1" role="dialog">
<div class="modal-dialog">
@@ -89,12 +91,12 @@
<div class="modal-body">
<div class="input-group">
- <span class="input-group-addon" style="min-width:140px;">{{lang_partitionId}}</span>
+ <span class="input-group-addon" style="min-width:140px;">{{lang_partitionId}} *</span>
<input name="new-partition-id" class="form-control" type="text">
</div>
<p class="help-block">{{lang_helpId}}</p>
<div class="input-group">
- <span class="input-group-addon" style="min-width:140px;">{{lang_partitionSize}}</span>
+ <span class="input-group-addon" style="min-width:140px;">{{lang_partitionSize}} *</span>
<input name="new-partition-size" class="form-control" type="text">
</div>
<p class="help-block">{{lang_helpSize}}</p>
@@ -111,8 +113,10 @@
</div>
<div class="modal-footer">
- <a class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</a>
- <input type="submit" class="btn btn-primary" value="{{lang_create}}">
+ <button class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button>
+ <button type="submit" class="btn btn-success">
+ <span class='glyphicon glyphicon-plus'></span> {{lang_create}}
+ </button>
</div>
</div>
</div>
@@ -120,12 +124,28 @@
<input type="hidden" name="action" value="new_partition">
<input type="hidden" name="token" value="{{token}}">
</form>
+
<script type="text/javascript">
- function saveConfig(download){
- if(download)
- window.location = 'api.php?do=baseconfig&user={{user}}&save=true';
- else
- window.location = 'api.php?do=baseconfig&user={{user}}';
- }
+ document.addEventListener("DOMContentLoaded", function () {
+ $("#createPartitionForm").submit(function () {
+ var input1 = $("input[name=new-partition-id]");
+ var input2 = $("input[name=new-partition-size]");
+ var id = $.trim(input1.val());
+ var size = $.trim(input2.val());
+ if (!id) {
+ input1.addClass("missingInput");
+ }
+ if (!size) {
+ input2.addClass("missingInput");
+ }
+ if (!id || !size) {
+ return false;
+ }
+ });
+ });
+
+ function saveConfig(){
+ window.location = 'api.php?do=baseconfig&user={{user}}&save=true';
+ }
</script> \ No newline at end of file
diff --git a/modules-available/bootstrap_datepicker/config.json b/modules-available/bootstrap_datepicker/config.json
index 5a0c7960..69bb0aa9 100644
--- a/modules-available/bootstrap_datepicker/config.json
+++ b/modules-available/bootstrap_datepicker/config.json
@@ -1,9 +1,10 @@
{
- "dependencies" : [],
- "css": {
- "style.css": true
- },
- "scripts": {
- "clientscript.js": true
- }
-}
+ "dependencies": [],
+ "css": [
+ "style.css"
+ ],
+ "scripts": [
+ "clientscript.js"
+ ],
+ "client-plugin": true
+} \ No newline at end of file
diff --git a/modules-available/bootstrap_dialog/config.json b/modules-available/bootstrap_dialog/config.json
index 5a0c7960..69bb0aa9 100644
--- a/modules-available/bootstrap_dialog/config.json
+++ b/modules-available/bootstrap_dialog/config.json
@@ -1,9 +1,10 @@
{
- "dependencies" : [],
- "css": {
- "style.css": true
- },
- "scripts": {
- "clientscript.js": true
- }
-}
+ "dependencies": [],
+ "css": [
+ "style.css"
+ ],
+ "scripts": [
+ "clientscript.js"
+ ],
+ "client-plugin": true
+} \ No newline at end of file
diff --git a/modules-available/bootstrap_multiselect/config.json b/modules-available/bootstrap_multiselect/config.json
index 5a0c7960..69bb0aa9 100644
--- a/modules-available/bootstrap_multiselect/config.json
+++ b/modules-available/bootstrap_multiselect/config.json
@@ -1,9 +1,10 @@
{
- "dependencies" : [],
- "css": {
- "style.css": true
- },
- "scripts": {
- "clientscript.js": true
- }
-}
+ "dependencies": [],
+ "css": [
+ "style.css"
+ ],
+ "scripts": [
+ "clientscript.js"
+ ],
+ "client-plugin": true
+} \ No newline at end of file
diff --git a/modules-available/bootstrap_switch/config.json b/modules-available/bootstrap_switch/config.json
index de4d37b4..3cf0d162 100644
--- a/modules-available/bootstrap_switch/config.json
+++ b/modules-available/bootstrap_switch/config.json
@@ -1,8 +1,9 @@
{
- "css": {
- "style.css": true
- },
- "scripts": {
- "clientscript.js": true
- }
+ "css": [
+ "style.css"
+ ],
+ "scripts": [
+ "clientscript.js"
+ ],
+ "client-plugin": true
} \ No newline at end of file
diff --git a/modules-available/bootstrap_timepicker/config.json b/modules-available/bootstrap_timepicker/config.json
index 5a0c7960..69bb0aa9 100644
--- a/modules-available/bootstrap_timepicker/config.json
+++ b/modules-available/bootstrap_timepicker/config.json
@@ -1,9 +1,10 @@
{
- "dependencies" : [],
- "css": {
- "style.css": true
- },
- "scripts": {
- "clientscript.js": true
- }
-}
+ "dependencies": [],
+ "css": [
+ "style.css"
+ ],
+ "scripts": [
+ "clientscript.js"
+ ],
+ "client-plugin": true
+} \ No newline at end of file
diff --git a/modules-available/citymanagement/config.json b/modules-available/citymanagement/config.json
index e87cbf7d..b356dfc6 100644
--- a/modules-available/citymanagement/config.json
+++ b/modules-available/citymanagement/config.json
@@ -1,4 +1,4 @@
{
- "category":"citymanagement.cities",
- "permission":"0"
-}
+ "category": "citymanagement.cities",
+ "permission": "0"
+} \ No newline at end of file
diff --git a/modules-available/dnbd3/config.json b/modules-available/dnbd3/config.json
index f84a4170..9670ded9 100644
--- a/modules-available/dnbd3/config.json
+++ b/modules-available/dnbd3/config.json
@@ -1,4 +1,7 @@
{
- "category":"main.settings-server",
- "dependencies":["locations","runmode"]
-}
+ "category": "main.settings-server",
+ "dependencies": [
+ "locations",
+ "runmode"
+ ]
+} \ No newline at end of file
diff --git a/modules-available/dnbd3/hooks/main-warning.inc.php b/modules-available/dnbd3/hooks/main-warning.inc.php
index e38048e1..5f8a844f 100644
--- a/modules-available/dnbd3/hooks/main-warning.inc.php
+++ b/modules-available/dnbd3/hooks/main-warning.inc.php
@@ -1,6 +1,6 @@
<?php
-if (Dnbd3::isEnabled()) {
+if (Dnbd3::isEnabled() && User::hasPermission('.dnbd3.access-page')) {
$res = Database::simpleQuery('SELECT s.fixedip, s.lastseen AS dnbd3lastseen, s.errormsg, m.clientip, m.hostname
FROM dnbd3_server s
LEFT JOIN machine m USING (machineuuid)
diff --git a/modules-available/dnbd3/hooks/runmode/config.json b/modules-available/dnbd3/hooks/runmode/config.json
index 5db53f0b..683e0280 100644
--- a/modules-available/dnbd3/hooks/runmode/config.json
+++ b/modules-available/dnbd3/hooks/runmode/config.json
@@ -3,6 +3,7 @@
"configHook": "Dnbd3Util::runmodeConfigHook",
"noSysconfig": true,
"systemdDefaultTarget": "dnbd3-proxy",
- "allowGenericEditor": false,
- "deleteUrlSnippet": "dummyparam="
+ "allowGenericEditor": true,
+ "deleteUrlSnippet": "dummyparam=",
+ "permission": ".dnbd3.configure.proxy"
} \ No newline at end of file
diff --git a/modules-available/dnbd3/inc/dnbd3util.inc.php b/modules-available/dnbd3/inc/dnbd3util.inc.php
index 95b6ffe2..33581b77 100644
--- a/modules-available/dnbd3/inc/dnbd3util.inc.php
+++ b/modules-available/dnbd3/inc/dnbd3util.inc.php
@@ -103,6 +103,7 @@ class Dnbd3Util {
*/
public static function runmodeConfigHook($machineUuid, $mode, $modeData)
{
+ $self = Property::getServerIp();
// Get all directly assigned locations
$res = Database::simpleQuery('SELECT locationid FROM dnbd3_server
INNER JOIN dnbd3_server_x_location USING (serverid)
@@ -124,10 +125,20 @@ class Dnbd3Util {
}
$res = Database::simpleQuery('SELECT startaddr, endaddr FROM subnet WHERE locationid IN (:locs)',
array('locs' => array_values($recursiveLocs)));
+ // Coalesce overlapping ranges
+ $floatIp = ip2long($self); // Float for 32bit php :/
+ if (PHP_INT_SIZE === 4) {
+ $floatIp = (float)sprintf('%u', $floatIp); // Float for 32bit php :/
+ }
+ $ranges = [['startaddr' => $floatIp, 'endaddr' => $floatIp]];
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ settype($row['startaddr'], PHP_INT_SIZE === 4 ? 'float' : 'int');
+ settype($row['endaddr'], PHP_INT_SIZE === 4 ? 'float' : 'int');
+ self::mergeRanges($ranges, $row);
+ }
// Got subnets, build whitelist
- // TODO: Coalesce overlapping ranges
$opt = '';
- while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ foreach ($ranges as $row) {
$opt .= ' ' . self::range2Cidr($row['startaddr'], $row['endaddr']);
}
if (!empty($opt)) {
@@ -141,7 +152,6 @@ class Dnbd3Util {
WHERE s.machineuuid <> :uuid OR s.machineuuid IS NULL', array('uuid' => $machineUuid));
$public = array();
$private = array();
- $self = Property::getServerIp();
$public[$self] = $self;
while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
$ip = $row['fixedip'] ? $row['fixedip'] : $row['clientip'];
@@ -188,13 +198,47 @@ class Dnbd3Util {
*/
private static function range2Cidr($start, $end)
{
- $bin = decbin((int)$start ^ (int)$end);
+ if (PHP_INT_SIZE > 4) {
+ $bin = decbin((int)$start ^ (int)$end);
+ } else {
+ $bin = decbin((int)(float)$start ^ (int)(float)$end);
+ }
if ($bin === '0')
return long2ip($start);
$mask = 32 - strlen($bin);
return long2ip($start) . '/' . $mask;
}
+ private static function mergeRanges(&$ranges, $row)
+ {
+ if ($row['startaddr'] >= $row['endaddr'])
+ return; // Don't even bother
+ foreach (array_keys($ranges) as $key) {
+ if ($row['startaddr'] <= $ranges[$key]['startaddr'] && $row['endaddr'] >= $ranges[$key]['endaddr']) {
+ // Fully dominated
+ unset($ranges[$key]);
+ continue; // Might partially overlap with additional ranges, keep going
+ }
+ if ($ranges[$key]['startaddr'] <= $row['startaddr'] && $ranges[$key]['endaddr'] >= $row['startaddr']) {
+ // $row['startaddr'] lies within existing range
+ if ($ranges[$key]['startaddr'] <= $row['endaddr'] && $ranges[$key]['endaddr'] >= $row['endaddr'])
+ return; // Fully in existing range, do nothing
+ // $row['endaddr'] seems to extend range we're checking against but $row['startaddr'] lies within this range, update and keep going
+ $row['startaddr'] = $ranges[$key]['startaddr'];
+ unset($ranges[$key]);
+ continue;
+ }
+ // Last possibility: $row['startaddr'] is before range, $row['endaddr'] within range
+ if ($ranges[$key]['startaddr'] <= $row['endaddr'] && $ranges[$key]['endaddr'] >= $row['endaddr']) {
+ // $row['startaddr'] must lie before range start, otherwise we'd have hit the case above
+ $row['endaddr'] = $ranges[$key]['endaddr'];
+ unset($ranges[$key]);
+ continue;
+ }
+ }
+ $ranges[] = $row;
+ }
+
public static function defaultRunmodeConfig()
{
return array(
diff --git a/modules-available/dnbd3/lang/de/permissions.json b/modules-available/dnbd3/lang/de/permissions.json
new file mode 100644
index 00000000..15d17336
--- /dev/null
+++ b/modules-available/dnbd3/lang/de/permissions.json
@@ -0,0 +1,8 @@
+{
+ "access-page": "Seite sehen",
+ "configure.external": "Externen Proxy bearbeiten",
+ "configure.proxy": "Automatischen Proxy bearbeiten",
+ "refresh": "Serverliste aktualisieren",
+ "toggle-usage": "Aktivieren\/Deaktivieren",
+ "view.details": "Proxydetails anzeigen"
+} \ No newline at end of file
diff --git a/modules-available/dnbd3/lang/de/template-tags.json b/modules-available/dnbd3/lang/de/template-tags.json
index 5406f1b5..22c74b7d 100644
--- a/modules-available/dnbd3/lang/de/template-tags.json
+++ b/modules-available/dnbd3/lang/de/template-tags.json
@@ -10,12 +10,14 @@
"lang_client": "Client",
"lang_clientCount": "Clients",
"lang_clientList": "Liste der Clients",
+ "lang_clients": "Clients",
"lang_clientsByLocation": "Clients nach Raum\/Ort",
"lang_comment": "Kommentar",
+ "lang_complete": "Komplett",
"lang_count": "Anzahl",
"lang_disabled": "Deaktiviert",
"lang_diskFree": "Freier Speicher",
- "lang_dnbd3IntroText": "DNBD3 ist ein verteiltes Speichersystem speziell f\u00fcr die Anforderungen von bwLehrpool. Erst in Verbindung mit mindestens einem Proxy (zus\u00e4tzlich zum Satellitenserver) kann das System seine Geschwindigkeitsvorteile gegen\u00fcber NFS\/CIFS ausspielen. F\u00fcr schlecht angebundene Poolr\u00e4ume empfiehlt sich jeweils ein eigener Proxy-Server.\r\nBitte beachten Sie die Hinweise im Wiki.",
+ "lang_dnbd3IntroText": "DNBD3 ist ein verteiltes Speichersystem speziell f\u00fcr die Anforderungen von bwLehrpool. Erst in Verbindung mit mindestens einem Proxy (zus\u00e4tzlich zum Satellitenserver) kann das System seine Geschwindigkeitsvorteile gegen\u00fcber NFS\/CIFS ausspielen. F\u00fcr schlecht angebundene Poolr\u00e4ume empfiehlt sich jeweils ein eigener Proxy-Server. Bitte beachten Sie die Hinweise im Wiki.",
"lang_dnbd3Management": "DNBD3 Verwaltung",
"lang_dnbd3Status": "DNBD3 Status",
"lang_editProxyHeading": "Proxy-Einstellungen bearbeiten",
@@ -24,11 +26,13 @@
"lang_enterIpOfServer": "Bitte geben Sie die IP-Adresse des hinzuzuf\u00fcgenden Servers ein",
"lang_externalServer": "Externer DNBD3-Server",
"lang_externalServerAdd": "Externen Server hinzuf\u00fcgen",
- "lang_externalServerHelp": "Ein externer Server wird nicht \u00fcber den Satellitenserver konfiguriert und verwaltet. Das Installieren, Einrichten und ggf. Aktualisieren der DNBD3-Serversoftware muss manuell durchgef\u00fchrt werden.\r\nDies bietet mehr Flexibilit\u00e4t bei der Konfiguration und Anpassung, z.B. bei der Verwendung von RAID- oder bcache-Setups, oder wenn der DNBD3-Server auf einer Maschine laufen soll, die noch andere Services bereitstellt.\r\nWeitere Informationen dazu finden Sie im Wiki.",
- "lang_firewallInfo": "Wird ein Proxy auf einen oder mehrere R\u00e4ume beschr\u00e4nkt, werden Clients aus anderen R\u00e4umen diesen Proxy nicht verwenden. Technisch ist der Zugriff aus anderen R\u00e4umen jedoch trotzdem noch m\u00f6glich. Mit aktivieren dieser Option wird der Zugriff aus anderen R\u00e4umen per Firewall verhindert.",
- "lang_firewalled": "Zugriff auf zugewiesene R\u00e4ume beschr\u00e4nken",
+ "lang_externalServerHelp": "Ein externer Server wird nicht \u00fcber den Satellitenserver konfiguriert und verwaltet. Das Installieren, Einrichten und ggf. Aktualisieren der DNBD3-Serversoftware muss manuell durchgef\u00fchrt werden. Dies bietet mehr Flexibilit\u00e4t bei der Konfiguration und Anpassung, z.B. bei der Verwendung von RAID- oder bcache-Setups, oder wenn der DNBD3-Server auf einer Maschine laufen soll, die noch andere Services bereitstellt. Weitere Informationen dazu finden Sie im Wiki.",
+ "lang_firewallInfo": "Wird ein Proxy auf einen oder mehrere R\u00e4ume beschr\u00e4nkt, werden Clients aus anderen R\u00e4umen diesen Proxy nicht verwenden. Technisch ist der Zugriff aus anderen R\u00e4umen jedoch trotzdem noch m\u00f6glich. Mit Aktivieren dieser Option wird der Zugriff aus anderen R\u00e4umen per Firewall verhindert.",
+ "lang_firewalled": "Zugriff zus\u00e4tzlich per Firewall auf zugewiesene R\u00e4ume beschr\u00e4nken",
"lang_flags": "Flags",
"lang_global": "Global",
+ "lang_image": "Image",
+ "lang_imageList": "Image-Liste",
"lang_lastSeen": "Letzte Aktivit\u00e4t",
"lang_latency": "Latenz",
"lang_location": "Ort",
@@ -36,7 +40,9 @@
"lang_manageAccessTo": "Zugriff auf Server festlegen:",
"lang_managedServer": "Automatisch konfigurierter DNBD3-Proxy",
"lang_managedServerAdd": "Automatisch konfigurierten Proxy hinzuf\u00fcgen",
- "lang_managedServerHelp": "Automatisch konfigurierte DNBD3-Proxies booten wie gew\u00f6hnliche bwLehrpool-Clients via PXE \u00fcber den Satelliten-Server. Sobald ein bwLehrpool-Client als DNBD3-Proxy konfiguriert wird, erh\u00e4lt er beim Booten eine gesonderte Konfiguration, sodass er fortan exklusiv als DNBD3-Proxy arbeitet, und nicht mehr als Arbeitsstation zur Verf\u00fcgung steht.\r\nDer Vorteil ist, dass die Konfiguration automatisiert erfolgt, und durch w\u00f6chentliche Reboots sichergestellt wird, dass eventuelle Updates des MiniLinux angewendet werden.\r\nIn diesem Fall legen Sie bitte eine Partition mit der ID 45 auf der Festplatte des Proxy-Servers an; diese wird persistent Behandelt und im Gegensatz zur ID44-Partition nicht beim Booten formatiert. Generell sollte diese Partition so gro\u00df wie m\u00f6glich sein, abh\u00e4ngig von der Anzahl der genutzten VMs. Bei Platzmangel l\u00f6scht der Proxy automatisch die VM, die am l\u00e4ngsten nicht verwendet wurde, um neuen VMs Platz zu machen.\r\nWeitere Informationen dazu finden Sie im Wiki.",
+ "lang_managedServerHelp": "Automatisch konfigurierte DNBD3-Proxies booten wie gew\u00f6hnliche bwLehrpool-Clients via PXE \u00fcber den Satellitenserver. Sobald ein bwLehrpool-Client als DNBD3-Proxy konfiguriert wird, erh\u00e4lt er beim Booten eine gesonderte Konfiguration, sodass er fortan exklusiv als DNBD3-Proxy arbeitet, und nicht mehr als Arbeitsstation zur Verf\u00fcgung steht. Der Vorteil ist, dass die Konfiguration automatisiert erfolgt, und durch w\u00f6chentliche Reboots sichergestellt wird, dass eventuelle Updates des MiniLinux angewendet werden. In diesem Fall legen Sie bitte eine Partition mit der ID 45 auf der Festplatte des Proxy-Servers an; diese wird persistent Behandelt und im Gegensatz zur ID44-Partition nicht beim Booten formatiert. Generell sollte diese Partition so gro\u00df wie m\u00f6glich sein, abh\u00e4ngig von der Anzahl der genutzten VMs. Bei Platzmangel l\u00f6scht der Proxy automatisch die VM, die am l\u00e4ngsten nicht verwendet wurde, um neuen VMs Platz zu machen. Weitere Informationen dazu finden Sie im Wiki.",
+ "lang_manualRefresh": "Jetzt abfragen",
+ "lang_manualRefreshInfo": "Normalerweile werden die in dieser Tabelle angezeigten Daten alle 5 Minuten aktualisiert. Mit diesem Button k\u00f6nnen Sie die Daten sofort aktualisieren.",
"lang_numFails": "Fehler",
"lang_overrideIp": "Zu verwendende IP-Adresse",
"lang_overrideIpInfo": "Normalerweise wird die automatisch per DHCP zugewiesene Adresse auf dem Boot-Interface verwendet. Falls der Proxy mit weiteren Netzwerkkarten ausgestattet ist (die ebenfalls per DHCP konfiguriert werden) kann durch Angabe einer solchen Alternativadresse hier die Verwendung der entsprechenden Karte erzwungen werden.",
@@ -52,9 +58,11 @@
"lang_sessionRx": "Seit Neustart empfangen",
"lang_sessionTx": "Seit Neustart gesendet",
"lang_settings": "Einstellungen",
+ "lang_size": "Gr\u00f6\u00dfe",
"lang_storageSize": "Speichergr\u00f6\u00dfe",
"lang_test": "Testen",
"lang_txTotal": "Gesamt gesendet",
+ "lang_uplink": "Uplink",
"lang_uptime": "Aktuelle Laufzeit",
"lang_wantToDelete": "Wollen Sie diesen Server wirklich entfernen? (Rebooten\/Ausschalten muss in diesem Fall manuell vorgenommen werden)"
} \ No newline at end of file
diff --git a/modules-available/dnbd3/lang/en/permissions.json b/modules-available/dnbd3/lang/en/permissions.json
new file mode 100644
index 00000000..112deb94
--- /dev/null
+++ b/modules-available/dnbd3/lang/en/permissions.json
@@ -0,0 +1,8 @@
+{
+ "access-page": "View this page",
+ "configure.external": "Edit external proxy",
+ "configure.proxy": "Edit automatic proxy",
+ "refresh": "Refresh server list",
+ "toggle-usage": "Activate\/Deactivate",
+ "view.details": "Show proxy details"
+} \ No newline at end of file
diff --git a/modules-available/dnbd3/lang/en/template-tags.json b/modules-available/dnbd3/lang/en/template-tags.json
index 81b9d538..932b899a 100644
--- a/modules-available/dnbd3/lang/en/template-tags.json
+++ b/modules-available/dnbd3/lang/en/template-tags.json
@@ -10,8 +10,10 @@
"lang_client": "Client",
"lang_clientCount": "Clients",
"lang_clientList": "List of clients",
+ "lang_clients": "Clients",
"lang_clientsByLocation": "Clients by location",
"lang_comment": "Comment",
+ "lang_complete": "Complete",
"lang_count": "Count",
"lang_disabled": "Disabled",
"lang_diskFree": "Free space",
@@ -25,10 +27,12 @@
"lang_externalServer": "External DNBD3-Server",
"lang_externalServerAdd": "Add external server",
"lang_externalServerHelp": "An external server is not configured and managed by the satellite server. The installation, configuration and update of the DNBD3 software has to be done manually. This is a more flexible approach which is preferable for RAID or bcache setups or if the DNBD3-Server offers additional services. More information in the wiki.",
- "lang_firewallInfo": "If the proxy is restricted to one or more locations, clients from other locations won't use that specific proxy. But technically it's still possible to gain access from other locations. If you activate this setting the access from other locations is blocked with iptables.",
- "lang_firewalled": "Limit access to corresponding locations",
+ "lang_firewallInfo": "If the proxy is restricted to one or more locations, clients from other locations won't use that specific proxy, but technically it's still possible to access this proxy from other locations. If you activate this setting the access from other locations is forcefully blocked using iptables.",
+ "lang_firewalled": "Limit access to corresponding locations via firewall",
"lang_flags": "Flags",
"lang_global": "Global",
+ "lang_image": "Image",
+ "lang_imageList": "Image list",
"lang_lastSeen": "Last seen",
"lang_latency": "Latency",
"lang_location": "Location",
@@ -37,6 +41,8 @@
"lang_managedServer": "Automatically configured DNBD3-Proxy",
"lang_managedServerAdd": "Add automatically configured proxy",
"lang_managedServerHelp": "Automatically configured DNBD3-Proxies will boot like normal bwLehrpool-Clients over PXE and the satellite server. If a client is configured as proxy it will boot with a different configuration and acts exclusively as proxy. The client can therefore not be used as a normal working station.\r\nThe advantage is that you don't need to install or configure anything else. The client will reboot every week to get possible updates ot the minilinux.\r\nIf you want to use this feature, please create a partition with ID 45 on the local hard disk of the proxy server. In contrast to the ID 44 partition which is formated after every reboot, this partition is persistent. As a rule of thumb the partition should be as big as possible. If there is no space left the proxy will delete the VM which hasn't be used for the longest time. More information in the wiki.",
+ "lang_manualRefresh": "Manual refresh",
+ "lang_manualRefreshInfo": "All servers are queried every 5 minutes to update the table below. Hit the refresh button to update the table immediately.",
"lang_numFails": "Errors",
"lang_overrideIp": "IP address to use",
"lang_overrideIpInfo": "Usually the address that the DHCP server assigns to the boot interface of the proxy will be used. If the proxy has multiple interfaces (that also get an address assigned via DHCP) you can specify that address here to enforce their usage instead.",
@@ -52,9 +58,11 @@
"lang_sessionRx": "Received since boot",
"lang_sessionTx": "Sent since boot",
"lang_settings": "Settings",
+ "lang_size": "Size",
"lang_storageSize": "Storage size",
"lang_test": "Test",
"lang_txTotal": "Total sent",
+ "lang_uplink": "Uplink",
"lang_uptime": "Uptime",
"lang_wantToDelete": "Do you really want to delete this server? (Reboot\/Shutdown has to be done manually)"
} \ No newline at end of file
diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php
index 1fa38805..d8dd6cb8 100644
--- a/modules-available/dnbd3/page.inc.php
+++ b/modules-available/dnbd3/page.inc.php
@@ -11,8 +11,10 @@ class Page_Dnbd3 extends Page
Message::addError('main.no-permission');
Util::redirect('?do=Main');
}
+
$action = Request::post('action', false, 'string');
if ($action === 'refresh') {
+ User::assertPermission('refresh');
Dnbd3Util::updateServerStatus();
} elseif ($action === 'delserver') {
$this->deleteServer();
@@ -37,6 +39,7 @@ class Page_Dnbd3 extends Page
Message::addError('not-automatic-server', $server['ip']);
return;
}
+ $this->assertPermission($server);
$bgr = Request::post('bgr', false, 'bool');
$firewall = Request::post('firewall', false, 'bool');
$overrideIp = false;
@@ -73,6 +76,7 @@ class Page_Dnbd3 extends Page
private function toggleUsage()
{
+ User::assertPermission('toggle-usage');
$enabled = Request::post('enabled', false, 'bool');
$nfs = Request::post('with-nfs', false, 'bool');
$task = Dnbd3::setEnabled($enabled);
@@ -83,6 +87,7 @@ class Page_Dnbd3 extends Page
private function saveServerLocations()
{
$server = $this->getServerById();
+ $this->assertPermission($server);
$locids = Request::post('location', [], 'array');
if (empty($locids)) {
Database::exec('DELETE FROM dnbd3_server_x_location WHERE serverid = :serverid',
@@ -99,6 +104,7 @@ class Page_Dnbd3 extends Page
private function addServer()
{
+ User::assertPermission('configure.external');
$ip = Request::post('newip', false, 'string');
if ($ip === false) {
Message::addError('main.parameter-missing', 'ip');
@@ -126,6 +132,7 @@ class Page_Dnbd3 extends Page
private function deleteServer()
{
$server = $this->getServerById();
+ $this->assertPermission($server);
if ($server['fixedip'] === '<self>')
return;
if (!is_null($server['machineuuid'])) {
@@ -156,9 +163,10 @@ class Page_Dnbd3 extends Page
private function showServerList()
{
+ User::assertPermission('access-page');
$dynClients = RunMode::getForMode(Page::getModule(), 'proxy', true, true);
$res = Database::simpleQuery('SELECT s.serverid, s.machineuuid, s.fixedip, s.lastseen AS dnbd3lastseen,
- s.uptime, s.totalup, s.totaldown, s.clientcount, s.disktotal, s.diskfree, Count(sxl.locationid) AS locations,
+ s.uptime, s.totalup, s.totaldown, s.clientcount, s.disktotal, s.diskfree, GROUP_CONCAT(sxl.locationid) AS locations,
s.errormsg
FROM dnbd3_server s
LEFT JOIN dnbd3_server_x_location sxl USING (serverid)
@@ -166,8 +174,22 @@ class Page_Dnbd3 extends Page
$servers = array();
$sort = array();
$NOW = time();
+ $externalAllowed = User::hasPermission('configure.external');
+ $locsRunmode = User::getAllowedLocations('configure.proxy');
while ($server = $res->fetch(PDO::FETCH_ASSOC)) {
- if (isset($dynClients[$server['machineuuid']])) {
+ if (!is_null($server['machineuuid'])) {
+ // Auto proxy
+ if (!isset($dynClients[$server['machineuuid']])) {
+ // Not in runmode dnbd3!?
+ if ($NOW - $server['dnbd3lastseen'] > 660) {
+ // Also seems to be down - delete
+ Database::exec('DELETE FROM dnbd3_server WHERE serverid = :serverid',
+ array('serverid' => $server['serverid']));
+ continue;
+ }
+ // Not in runmode but (still?) up -- show
+ $server += ['locationid' => null, 'hostname' => '<invalid>'];
+ }
$server += $dynClients[$server['machineuuid']];
unset($dynClients[$server['machineuuid']]);
}
@@ -195,6 +217,23 @@ class Page_Dnbd3 extends Page
$server['slxOk'] = true;
}
}
+ if (is_null($server['locations'])) {
+ $server['locations'] = 0;
+ } else {
+ $locations = explode(',', $server['locations']);
+ $server['locations'] = count($locations);
+ }
+ // Permission to edit
+ if (is_null($server['machineuuid'])) {
+ if (!$externalAllowed) {
+ $server['edit_disabled'] = 'disabled';
+ }
+ } else {
+ if (!array_key_exists('locationid', $server) || !in_array($server['locationid'], $locsRunmode)) {
+ $server['edit_disabled'] = 'disabled';
+ }
+ }
+ // Array for sorting
if ($server['self']) {
$sort[] = '---';
} else {
@@ -203,66 +242,99 @@ class Page_Dnbd3 extends Page
$servers[] = $server;
}
foreach ($dynClients as $server) {
+ $server['edit_disabled'] = 'disabled';
$servers[] = $server;
$sort[] = '-' . $server['machineuuid'];
- Database::exec('INSERT INTO dnbd3_server (machineuuid) VALUES (:uuid)', array('uuid' => $server['machineuuid']));
+ Database::exec('INSERT IGNORE INTO dnbd3_server (machineuuid) VALUES (:uuid)', array('uuid' => $server['machineuuid']));
}
array_multisort($sort, SORT_ASC, $servers);
- Render::addTemplate('page-serverlist', array(
+ $data = array(
'list' => $servers,
'enabled' => Dnbd3::isEnabled(),
'enabled_checked_s' => Dnbd3::isEnabled() ? 'checked' : '',
'nfs_checked_s' => Dnbd3::hasNfsFallback() ? 'checked' : '',
'rebootcontrol' => Module::isAvailable('rebootcontrol', false)
- ));
+ );
+ Permission::addGlobalTags($data['perms'], null, ['view.details', 'refresh', 'toggle-usage', 'configure.proxy', 'configure.external']);
+ Render::addTemplate('page-serverlist', $data);
}
private function showProxyDetails()
{
+ User::assertPermission('view.details');
$server = $this->getServerById();
Render::addTemplate('page-proxy-header', $server);
- $stats = Dnbd3Rpc::query($server['ip'], 5003,true, true, false, true);
+ $stats = Dnbd3Rpc::query($server['ip'], 5003, true, true, true, true, true, true);
if (!is_array($stats) || !isset($stats['runId'])) {
Message::addError('server-unreachable');
return;
}
- $stats['bytesSent_s'] = Util::readableFileSize($stats['bytesSent']);
- $stats['bytesReceived_s'] = Util::readableFileSize($stats['bytesReceived']);
+ foreach (['bytesSent', 'bytesReceived', 'spaceTotal', 'spaceFree'] as $key) {
+ $stats[$key . '_s'] = Util::readableFileSize($stats[$key]);
+ }
+ if ($stats['spaceTotal'] > 0) {
+ $stats['percentFree'] = ($stats['spaceFree'] / $stats['spaceTotal']) * 100;
+ $stats['percentFree'] = round($stats['percentFree'], $stats['percentFree'] < 10 ? 1 : 0);
+ }
$stats['uptime_s'] = floor($stats['uptime'] / 86400) . 'd ' . gmdate('H:i:s', $stats['uptime']);
+ $stats['tab_config'] = is_string($stats['config']);
+ $stats['tab_altservers'] = is_array($stats['altservers']);
Render::addTemplate('page-proxy-stats', $stats);
- // TODO $images = Dnbd3Rpc::query($server['ip'], 5003,false, false, true);
- $confAlts = Dnbd3Rpc::query($server['ip'], 5003,false, false, false, false, true, true);
+ Render::openTag('div', ['class' => 'tab-content']);
$ips = array();
$sort = array();
foreach ($stats['clients'] as &$c) {
$c['bytesSent_s'] = Util::readableFileSize($c['bytesSent']);
$sort[] = $c['bytesSent'];
- $ips[] = preg_replace('/:\d+$/', '', $c['address']);
+ $ips[preg_replace('/:\d+$/', '', $c['address'])] = true;
}
+ $ips = array_keys($ips);
array_multisort($sort, SORT_DESC, $stats['clients']);
- Render::openTag('div', ['class' => 'row']);
// Config
- if (is_string($confAlts['config'])) {
- Render::addTemplate('page-proxy-config', $confAlts);
+ if (is_string($stats['config'])) {
+ preg_match_all('/^((?<sec>\[.*\])|(?<key>[^=]+)=(?<val>.*)|(?<other>[^\[][^=]*))$/m', $stats['config'], $out, PREG_SET_ORDER);
+ $stats['config'] = [];
+ foreach ($out as $line) {
+ if (!empty($line['sec'])) {
+ $stats['config'][] = ['class1' => 'text-primary', 'text1' => $line['sec']];
+ } elseif (!empty($line['other'])) {
+ $stats['config'][] = ['class1' => 'text-muted', 'text1' => $line['other']];
+ } else {
+ $extra = '';
+ $class2 = 'slx-bold';
+ if (in_array($line['key'], ['serverPenalty', 'clientPenalty'])) {
+ $extra = round($line['val'] / 1000, 1) . 'ms';
+ } elseif (in_array($line['key'], ['uplinkTimeout', 'clientTimeout'])) {
+ $extra = round($line['val'] / 1000, 1) . 's';
+ } elseif (in_array($line['key'], ['maxPayload', 'maxReplicationSize'])) {
+ $extra = Util::readableFilesize($line['val']);
+ } elseif ($line['val'] === 'true') {
+ $class2 .= ' text-success';
+ } elseif ($line['val'] === 'false') {
+ $class2 .= ' text-danger';
+ }
+ $stats['config'][] = ['text1' => $line['key'], 'class2' => $class2, 'text2' => $line['val'] . ' ', 'extra' => $extra];
+ }
+ }
+ Render::addTemplate('page-proxy-config', $stats);
}
- if (is_array($confAlts['altservers'])) {
- foreach ($confAlts['altservers'] as &$as) {
+ if (is_array($stats['altservers'])) {
+ foreach ($stats['altservers'] as &$as) {
$as['rtt'] = round(array_sum($as['rtt']) / count($as['rtt']) / 1000, 2);
}
unset($as);
- Render::addTemplate('page-proxy-altservers', $confAlts);
+ Render::addTemplate('page-proxy-altservers', $stats);
}
- Render::closeTag('div');
- Render::openTag('div', ['class' => 'row']);
// Count locations
- $res = Database::simpleQuery('SELECT locationid, Count(*) AS cnt FROM machine WHERE clientip IN (:ips) GROUP BY locationid', compact('ips'));
+ $res = Database::simpleQuery("SELECT locationid, Count(*) AS cnt FROM machine
+ WHERE clientip IN (:ips) AND state IN ('IDLE', 'OCCUPIED') GROUP BY locationid", compact('ips'));
$locCount = Location::getLocationsAssoc();
$locCount[0] = array(
'locationname' => '/',
'depth' => 0,
- 'recCount' => 0,
);
foreach ($locCount as &$loc) {
+ $loc['clientCount'] = 0;
$loc['recCount'] = 0;
}
$showLocs = false;
@@ -281,18 +353,27 @@ class Page_Dnbd3 extends Page
$locCount[$p]['recCount'] += $row['cnt'];
}
}
+ $locCount[0]['recCount'] += $row['cnt'];
}
if ($showLocs) {
- $locCount = array_filter($locCount, function ($v) { return isset($v['keep']); });
- Render::addTemplate('page-proxy-loclist', array('list' => array_values($locCount)));
+ $stats['loclist'] = array_values(array_filter($locCount, function ($v) { return isset($v['keep']); }));
}
Render::addTemplate('page-proxy-clients', $stats);
+ $sort1 = $sort2 = [];
+ foreach ($stats['images'] as &$image) {
+ $image['size_s'] = Util::readableFileSize($image['size']);
+ $sort1[] = $image['users'];
+ $sort2[] = $image['name'];
+ }
+ array_multisort($sort1, SORT_NUMERIC | SORT_DESC, $sort2, SORT_ASC, $stats['images']);
+ Render::addTemplate('page-proxy-images', $stats);
Render::closeTag('div');
}
private function showServerLocationEdit()
{
$server = $this->getServerById();
+ $this->assertPermission($server);
// Get selected ones
$res = Database::simpleQuery('SELECT locationid FROM dnbd3_server_x_location WHERE serverid = :serverid',
array('serverid' => $server['serverid']));
@@ -328,14 +409,14 @@ class Page_Dnbd3 extends Page
Message::addError('main.parameter-missing', 'server');
Util::redirect('?do=dnbd3');
}
- $server = Database::queryFirst('SELECT s.serverid, s.machineuuid, s.fixedip, m.clientip, m.hostname
+ $server = Database::queryFirst('SELECT s.serverid, s.machineuuid, s.fixedip, m.clientip, m.hostname, m.locationid
FROM dnbd3_server s
LEFT JOIN machine m USING (machineuuid)
WHERE s.serverid = :serverId', compact('serverId'));
if ($server === false) {
if (AJAX)
die('Invalid server id');
- Message::addError('server-non-existent', 'server');
+ Message::addError('server-non-existent', $serverId);
Util::redirect('?do=dnbd3');
}
if (!is_null($server['fixedip'])) {
@@ -348,6 +429,15 @@ class Page_Dnbd3 extends Page
return $server;
}
+ private function assertPermission($server)
+ {
+ if (isset($server['machineuuid'])) {
+ User::assertPermission('configure.proxy', $server['locationid'], '?do=dnbd3');
+ } else {
+ User::assertPermission('configure.external', null, '?do=dnbd3');
+ }
+ }
+
/*
* AJAX
*/
@@ -371,6 +461,7 @@ class Page_Dnbd3 extends Page
private function ajaxServerTest()
{
+ User::assertPermission('configure.external');
Header('Content-Type: application/json; charset=utf-8');
$ip = Request::post('ip', false, 'string');
if ($ip === false)
@@ -407,6 +498,7 @@ class Page_Dnbd3 extends Page
echo 'Not automatic server.';
return;
}
+ $this->assertPermission($server);
$rm = RunMode::getForMode(Page::getModule(), 'proxy', false, true);
if (!isset($rm[$server['machineuuid']])) {
echo 'Error: RunMode entry missing.';
@@ -423,23 +515,37 @@ class Page_Dnbd3 extends Page
if (!isset($server['machineuuid'])) {
die('Not automatic server.');
}
- if (!Module::isAvailable('rebootcontrol')) {
- die('No rebootcontrol');
- }
$uuid = $server['machineuuid'];
- $task = RebootControl::reboot([ $uuid ]);
+ $task = Request::any('taskid', false, 'string');
if ($task === false) {
- die('Taskmanager unreachable');
+ $this->assertPermission($server);
+ if (!Module::isAvailable('rebootcontrol')) {
+ die('No rebootcontrol');
+ }
+ $task = RebootControl::reboot([$uuid]);
+ if ($task === false) {
+ die('Taskmanager unreachable');
+ }
}
- $task = Taskmanager::waitComplete($task, 2000);
- if (is_array($task) && isset($task['data']) && isset($task['data']['clientStatus']) && isset($task['data']['clientStatus'][$uuid])) {
- $status = $task['data']['clientStatus'][$uuid];
+ $task = Taskmanager::waitComplete($task, 1000);
+ if (is_array($task) && isset($task['data']['clientStatus'][$uuid])) {
+ $status = [
+ 'rebootStatus' => $task['data']['clientStatus'][$uuid],
+ 'taskStatus' => $task['statusCode'],
+ 'taskId' => $task['id'],
+ ];
if (!empty($task['data']['error'])) {
- $status .= "\n --- \n" . $task['data']['error'];
+ $status['error'] = $task['data']['error'];
}
- die($status);
+ } else {
+ $status = [
+ 'rebootStatus' => 'FAILURE',
+ 'taskStatus' => 'FAILURE',
+ 'taskId' => $task['id'],
+ ];
}
- die('Unknown :-(');
+ Header('Content-Type: application/json; charset=utf-8');
+ die(json_encode($status));
}
}
diff --git a/modules-available/dnbd3/permissions/permissions.json b/modules-available/dnbd3/permissions/permissions.json
new file mode 100644
index 00000000..77a72d62
--- /dev/null
+++ b/modules-available/dnbd3/permissions/permissions.json
@@ -0,0 +1,20 @@
+{
+ "access-page": {
+ "location-aware": false
+ },
+ "toggle-usage": {
+ "location-aware": false
+ },
+ "refresh": {
+ "location-aware": false
+ },
+ "view.details": {
+ "location-aware": false
+ },
+ "configure.proxy": {
+ "location-aware": true
+ },
+ "configure.external": {
+ "location-aware": false
+ }
+} \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-altservers.html b/modules-available/dnbd3/templates/page-proxy-altservers.html
index 00a884cc..d2e520f9 100644
--- a/modules-available/dnbd3/templates/page-proxy-altservers.html
+++ b/modules-available/dnbd3/templates/page-proxy-altservers.html
@@ -1,11 +1,11 @@
-<div class="col-md-6">
+<div role="tabpanel" class="tab-pane" id="tab-altservers">
<h2>{{lang_altservers}}</h2>
<table class="table table-condensed">
<tr>
- <th>{{lang_proxyServerTHead}}</th>
- <th>{{lang_numFails}}</th>
- <th class="text-right">{{lang_latency}}</th>
- <th>{{lang_flags}}</th>
+ <th class="slx-smallcol">{{lang_proxyServerTHead}}</th>
+ <th class="slx-smallcol">{{lang_numFails}}</th>
+ <th class="text-right slx-smallcol">{{lang_latency}}</th>
+ <th class="slx-smallcol">{{lang_flags}}</th>
<th>{{lang_comment}}</th>
</tr>
{{#altservers}}
@@ -21,7 +21,7 @@
{{rtt}}&thinsp;ms
{{/isClientOnly}}
</td>
- <td>
+ <td class="text-nowrap">
{{#isClientOnly}}
[CO]
{{/isClientOnly}}
diff --git a/modules-available/dnbd3/templates/page-proxy-clients.html b/modules-available/dnbd3/templates/page-proxy-clients.html
index 9e7cec4c..6733a056 100644
--- a/modules-available/dnbd3/templates/page-proxy-clients.html
+++ b/modules-available/dnbd3/templates/page-proxy-clients.html
@@ -1,20 +1,53 @@
-<div class="col-md-6">
- <h2>{{lang_clientList}}</h2>
+<div role="tabpanel" class="tab-pane active" id="tab-clients">
+ <div class="row">
+ <div class="col-md-6">
+ {{#loclist.0}}
+ <h2>{{lang_clientsByLocation}}</h2>
- <table class="table table-condensed">
- <tr>
- <th>{{lang_client}}</th>
- <th class="text-right">{{lang_bytesSent}}</th>
- </tr>
- {{#clients}}
- <tr>
- <td>
- {{address}}
- </td>
- <td data-sort="int" data-sort-value="{{bytesSent}}" class="text-right">
- {{bytesSent_s}}
- </td>
- </tr>
- {{/clients}}
- </table>
+ <table class="table table-condensed">
+ <tr>
+ <th>{{lang_location}}</th>
+ <th class="text-right">{{lang_count}}</th>
+ <th class="text-right">{{lang_recursiveCount}}</th>
+ </tr>
+ {{#loclist}}
+ <tr>
+ <td>
+ {{#depth}}
+ <div style="display:inline-block;width:{{depth}}em"></div>
+ {{/depth}}
+ {{locationname}}
+ </td>
+ <td class="text-right">
+ {{clientCount}}
+ </td>
+ <td class="text-right">
+ {{recCount}}
+ </td>
+ </tr>
+ {{/loclist}}
+ </table>
+ {{/loclist.0}}
+ </div>
+ <div class="col-md-6">
+ <h2>{{lang_clientList}}</h2>
+
+ <table class="table table-condensed">
+ <tr>
+ <th>{{lang_client}}</th>
+ <th class="text-right">{{lang_bytesSent}}</th>
+ </tr>
+ {{#clients}}
+ <tr>
+ <td>
+ {{address}}
+ </td>
+ <td data-sort="int" data-sort-value="{{bytesSent}}" class="text-right">
+ {{bytesSent_s}}
+ </td>
+ </tr>
+ {{/clients}}
+ </table>
+ </div>
+ </div>
</div> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-config.html b/modules-available/dnbd3/templates/page-proxy-config.html
index adc73a57..f258e030 100644
--- a/modules-available/dnbd3/templates/page-proxy-config.html
+++ b/modules-available/dnbd3/templates/page-proxy-config.html
@@ -1,4 +1,18 @@
-<div class="col-md-6">
+<style>
+.tt { font-family:monospace }
+.tt .eq { margin:0 1ex }
+.tt .usel { user-select:none }
+.tt .usel::before { content: attr(data-con) }
+</style>
+<div role="tabpanel" class="tab-pane" id="tab-config">
<h2>{{lang_proxyConfig}}</h2>
- <pre>{{config}}</pre>
-</div> \ No newline at end of file
+ <div class="well tt" style="font-family:monospace">
+ {{#config}}
+ <span class="{{class1}}">{{text1}}</span>{{#text2}}<span class="eq">=</span>{{/text2}}<span class="{{class2}}">{{text2}}</span>
+ {{#extra}}
+ <span class="text-muted usel" data-con=" ; {{extra}}"></span>
+ {{/extra}}
+ <br>
+ {{/config}}
+ </div>
+</div>
diff --git a/modules-available/dnbd3/templates/page-proxy-header.html b/modules-available/dnbd3/templates/page-proxy-header.html
index 6f3f1b7f..7f3418cc 100644
--- a/modules-available/dnbd3/templates/page-proxy-header.html
+++ b/modules-available/dnbd3/templates/page-proxy-header.html
@@ -1 +1,2 @@
-<h1>{{ip}}</h1> \ No newline at end of file
+<h1>{{ip}}</h1>
+
diff --git a/modules-available/dnbd3/templates/page-proxy-images.html b/modules-available/dnbd3/templates/page-proxy-images.html
new file mode 100644
index 00000000..7e30de20
--- /dev/null
+++ b/modules-available/dnbd3/templates/page-proxy-images.html
@@ -0,0 +1,31 @@
+<div role="tabpanel" class="tab-pane" id="tab-images">
+ <h2>{{lang_imageList}}</h2>
+ <table class="table table-condensed">
+ <tr>
+ <th>{{lang_image}}</th>
+ <th class="text-right slx-smallcol">{{lang_clients}}</th>
+ <th class="text-right slx-smallcol">{{lang_size}}</th>
+ <th class="text-right slx-smallcol">{{lang_complete}}</th>
+ <th class="slx-smallcol">{{lang_uplink}}</th>
+ </tr>
+ {{#images}}
+ <tr>
+ <td class="text-nowrap">
+ {{name}}:{{rid}}
+ </td>
+ <td class="text-right text-nowrap">
+ {{users}}
+ </td>
+ <td class="text-right text-nowrap">
+ {{size_s}}
+ </td>
+ <td class="text-right text-nowrap">
+ {{complete}}&thinsp;%
+ </td>
+ <td class="text-nowrap">
+ {{uplinkServer}}
+ </td>
+ </tr>
+ {{/images}}
+ </table>
+</div> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-loclist.html b/modules-available/dnbd3/templates/page-proxy-loclist.html
deleted file mode 100644
index 67c90683..00000000
--- a/modules-available/dnbd3/templates/page-proxy-loclist.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<div class="col-md-6">
- <h2>{{lang_clientsByLocation}}</h2>
-
- <table class="table table-condensed">
- <tr>
- <th>{{lang_location}}</th>
- <th class="text-right">{{lang_count}}</th>
- <th class="text-right">{{lang_recursiveCount}}</th>
- </tr>
- {{#list}}
- <tr>
- <td>
- {{#depth}}
- <div style="display:inline-block;width:{{depth}}em"></div>
- {{/depth}}
- {{locationname}}
- </td>
- <td class="text-right">
- {{clientCount}}
- </td>
- <td class="text-right">
- {{recCount}}
- </td>
- </tr>
- {{/list}}
- </table>
-</div> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-stats.html b/modules-available/dnbd3/templates/page-proxy-stats.html
index e7811028..a866903c 100644
--- a/modules-available/dnbd3/templates/page-proxy-stats.html
+++ b/modules-available/dnbd3/templates/page-proxy-stats.html
@@ -1,9 +1,27 @@
<div class="panel panel-default">
<div class="panel-body">
- {{lang_sessionTx}}: <b>{{bytesSent_s}}</b>
- ––
- {{lang_sessionRx}}: <b>{{bytesReceived_s}}</b>
- ––
- {{lang_uptime}}: <b>{{uptime_s}}</b>
+ <div>
+ {{lang_sessionTx}}: <b>{{bytesSent_s}}</b>
+ ––
+ {{lang_sessionRx}}: <b>{{bytesReceived_s}}</b>
+ ––
+ {{lang_uptime}}: <b>{{uptime_s}}</b>
+ </div>
+ <div>
+ {{lang_storageSize}}: <b>{{spaceTotal_s}}</b>
+ ––
+ {{lang_diskFree}}: <b>{{spaceFree_s}} ({{percentFree}}&thinsp;%)</b>
+ </div>
</div>
-</div> \ No newline at end of file
+</div>
+
+<ul class="nav nav-tabs text-center" role="tablist">
+ {{#tab_config}}
+ <li role="presentation"><a href="#tab-config" role="tab" data-toggle="tab">{{lang_proxyConfig}}</a></li>
+ {{/tab_config}}
+ <li role="presentation" class="active"><a href="#tab-clients" role="tab" data-toggle="tab">{{lang_clientList}}</a></li>
+ <li role="presentation"><a href="#tab-images" role="tab" data-toggle="tab">{{lang_imageList}}</a></li>
+ {{#tab_altservers}}
+ <li role="presentation"><a href="#tab-altservers" role="tab" data-toggle="tab">{{lang_altservers}}</a></li>
+ {{/tab_altservers}}
+</ul> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-serverlist.html b/modules-available/dnbd3/templates/page-serverlist.html
index c5905dcd..65e4d6ea 100644
--- a/modules-available/dnbd3/templates/page-serverlist.html
+++ b/modules-available/dnbd3/templates/page-serverlist.html
@@ -15,14 +15,14 @@
<form method="post" action="?do=dnbd3">
<input type="hidden" name="token" value="{{token}}">
<div class="checkbox">
- <input id="enable-dnbd3" type="checkbox" name="enabled" {{enabled_checked_s}}>
+ <input id="enable-dnbd3" type="checkbox" name="enabled" {{enabled_checked_s}} {{perms.toggle-usage.disabled}}>
<label for="enable-dnbd3">{{lang_enableDnbd3}}</label>
</div>
<div class="checkbox">
- <input id="allow-nfs" type="checkbox" name="with-nfs" {{nfs_checked_s}}>
+ <input id="allow-nfs" type="checkbox" name="with-nfs" {{nfs_checked_s}} {{perms.toggle-usage.disabled}}>
<label for="allow-nfs">{{lang_allowNfsFallback}}</label>
</div>
- <button type="submit" name="action" value="toggle-usage" class="btn btn-success">
+ <button type="submit" name="action" value="toggle-usage" class="btn btn-success" {{perms.toggle-usage.disabled}}>
<span class="glyphicon glyphicon-floppy-disk"></span>
{{lang_save}}
</button>
@@ -36,7 +36,10 @@
<input type="hidden" name="action" value="refresh">
<h2>
{{lang_serverList}}
- <button id="refbtn" type="submit" class="btn btn-default"><span class="glyphicon glyphicon-refresh"></span></button>
+ <button id="refbtn" type="submit" class="btn btn-default" {{perms.refresh.disabled}} title="{{lang_manualRefreshInfo}}">
+ <span class="glyphicon glyphicon-refresh"></span>
+ {{lang_manualRefresh}}
+ </button>
</h2>
</form>
@@ -78,14 +81,18 @@
</td>
<td class="{{#self}}slx-bold{{/self}}">
{{#machineuuid}}
- <a class="pull-right btn btn-default btn-xs" href="?do=Statistics&uuid={{machineuuid}}">
+ <a class="pull-right btn btn-default btn-xs" href="?do=statistics&uuid={{machineuuid}}">
<span class="glyphicon glyphicon-eye-open"></span>
</a>
{{/machineuuid}}
+ {{^perms.view.details.disabled}}
<a href="?do=dnbd3&amp;show=proxy&amp;server={{serverid}}">
+ {{/perms.view.details.disabled}}
{{fixedip}}
<span class="small">{{clientip}}</span>
+ {{^perms.view.details.disabled}}
</a>
+ {{/perms.view.details.disabled}}
<div class="small">{{hostname}}</div>
</td>
<td data-sort="int" data-sort-default="desc" data-sort-value="{{disktotal}}">
@@ -123,7 +130,7 @@
{{#locations}}
{{locations}}
{{/locations}}
- <a href="?do=dnbd3&amp;show=locations&amp;server={{serverid}}" class="btn btn-default btn-xs">
+ <a href="?do=dnbd3&amp;show=locations&amp;server={{serverid}}" class="btn btn-default btn-xs {{edit_disabled}}">
<span class="glyphicon glyphicon-map-marker"></span>
</a>
{{/self}}
@@ -132,17 +139,19 @@
{{#machineuuid}}
{{#rebootcontrol}}
<button class="btn btn-warning btn-xs reboot-btn" type="button" data-id="{{serverid}}"
- data-toggle="modal" data-target="#server-reboot-modal" title="{{lang_reboot}}">
+ data-toggle="modal" data-target="#server-reboot-modal" title="{{lang_reboot}}"
+ {{edit_disabled}}>
<span class="glyphicon glyphicon-repeat"></span>
</button>
{{/rebootcontrol}}
<button class="btn btn-default btn-xs edit-btn" type="button" data-id="{{serverid}}"
- data-toggle="modal" data-target="#server-edit-modal" title="{{lang_settings}}">
+ data-toggle="modal" data-target="#server-edit-modal" title="{{lang_settings}}"
+ {{edit_disabled}}>
<span class="glyphicon glyphicon-cog"></span>
</button>
{{/machineuuid}}
{{^self}}
- <button class="btn btn-danger btn-xs" name="server" value="{{serverid}}"
+ <button class="btn btn-danger btn-xs" name="server" value="{{serverid}}" {{edit_disabled}}
onclick="return confirm('{{lang_wantToDelete}}')" title="{{lang_delete}}">
<span class="glyphicon glyphicon-trash"></span>
</button>
@@ -156,7 +165,7 @@
<div class="btn-toolbar pull-right">
<div class="btn-group">
- <button type="button" class="btn btn-success" data-toggle="modal" data-target="#add-modal">
+ <button type="button" class="btn btn-success" data-toggle="modal" data-target="#add-modal" {{perms.configure.external.disabled}}>
<span class="glyphicon glyphicon-plus"></span>
{{lang_externalServerAdd}}
</button>
@@ -165,7 +174,7 @@
</button>
</div>
<div class="btn-group">
- <a class="btn btn-success" href="?do=runmode&amp;module=dnbd3&amp;modeid=proxy&amp;redirect=?do=dnbd3">
+ <a class="btn btn-success {{perms.configure.proxy.disabled}}" href="?do=runmode&amp;module=dnbd3&amp;modeid=proxy&amp;redirect=?do=dnbd3">
<span class="glyphicon glyphicon-plus"></span>
{{lang_managedServerAdd}}
</a>
@@ -380,20 +389,32 @@ document.addEventListener('DOMContentLoaded', function () {
}
$t.html('<span class="glyphicon glyphicon-refresh slx-rotation"></span>');
var sid = rebootServerId;
+ var taskId = false;
+ var lastText;
var query = function() {
+ data = {"token": TOKEN, "action": "reboot", "server": sid};
+ if (taskId !== false) data['taskid'] = taskId;
$.ajax({
- "data": {"token": TOKEN, "action": "reboot", "server": sid},
+ "data": data,
"method": "POST",
- "dataType": "text",
+ "dataType": "json",
"url": "?do=dnbd3"
}).done(function (data) {
- $t.text(data);
- if (data.indexOf('REBOOTING') !== -1 || data.indexOf('CONNECTING') !== -1) {
+ if (!data || !data.taskId) return;
+ if (taskId === false) taskId = data.taskId;
+ if (data.error) data.rebootStatus += ' (' + data.error + ')';
+ if (data.rebootStatus !== lastText) {
+ $t.empty().text(data.rebootStatus);
+ }
+ if (data.taskStatus === 'TASK_PROCESSING' || data.taskStatus === 'TASK_WAITING') {
setTimeout(query, 5000);
- $t.append($('<span class="glyphicon glyphicon-refresh slx-rotation"></span>'));
+ if (data.rebootStatus !== lastText) {
+ $t.append($('<span class="glyphicon glyphicon-refresh slx-rotation"></span>'));
+ }
}
+ lastText = data.rebootStatus;
}).fail(function () {
- $.text('Failed');
+ $t.text('Failed');
});
};
query();
diff --git a/modules-available/dozmod/api.inc.php b/modules-available/dozmod/api.inc.php
index 74aaa003..74934dc9 100644
--- a/modules-available/dozmod/api.inc.php
+++ b/modules-available/dozmod/api.inc.php
@@ -17,7 +17,7 @@ if (!Module::isAvailable('locations')) {
define('LIST_URL', CONFIG_DOZMOD_URL . '/vmchooser/list');
define('VMX_URL', CONFIG_DOZMOD_URL . '/vmchooser/lecture');
-$availableRessources = ['list', 'vmx', 'test', 'netrules', 'runscript', 'netshares'];
+$availableRessources = ['list', 'vmx', 'netrules', 'runscript', 'metadata', 'netshares'];
/* BEGIN: A simple caching mechanism ---------------------------- */
@@ -216,6 +216,13 @@ function _getVmData($lecture_uuid, $subResource = false)
/** Caching wrapper around _getVmData() **/
function outputResource($lecture_uuid, $resource)
{
+ if ($resource === 'metadata') {
+ // HACK: config.tgz is compressed, don't use gzip output handler
+ @ob_end_clean();
+ Header('Content-Type: application/gzip');
+ } else {
+ Header('Content-Type: text/plain; charset=utf-8');
+ }
$key = $resource . '_' . $lecture_uuid;
if (cache_has($key)) {
cache_get_passthru($key);
@@ -268,7 +275,8 @@ if ($resource === false) {
}
if (!in_array($resource, $availableRessources)) {
- Util::traceError("unknown resource: $resource");
+ Header('HTTP/1.1 400 Bad Request');
+ die("unknown resource: $resource");
}
$ip = $_SERVER['REMOTE_ADDR'];
diff --git a/modules-available/dozmod/config.json b/modules-available/dozmod/config.json
index 706412d0..110f8b67 100644
--- a/modules-available/dozmod/config.json
+++ b/modules-available/dozmod/config.json
@@ -1,3 +1,3 @@
{
- "category":"main.content"
-}
+ "category": "main.content"
+} \ No newline at end of file
diff --git a/modules-available/dozmod/hooks/main-warning.inc.php b/modules-available/dozmod/hooks/main-warning.inc.php
index ffa87692..1778bb9d 100644
--- a/modules-available/dozmod/hooks/main-warning.inc.php
+++ b/modules-available/dozmod/hooks/main-warning.inc.php
@@ -4,8 +4,10 @@
* Show notification in main window if there are images that should be deleted and are waiting for confirmation
*/
-$res = Database::queryFirst("SELECT Count(*) AS cnt FROM sat.imageversion WHERE deletestate = 'SHOULD_DELETE'", array(), true);
-if (isset($res['cnt']) && $res['cnt'] > 0) {
- Message::addInfo('dozmod.images-pending-delete-exist', true, $res['cnt']);
-}
-unset($res);
+if (User::hasPermission('.dozmod.expiredimages.delete')) {
+ $res = Database::queryFirst("SELECT Count(*) AS cnt FROM sat.imageversion WHERE deletestate = 'SHOULD_DELETE'", array(), true);
+ if (isset($res['cnt']) && $res['cnt'] > 0) {
+ Message::addInfo('dozmod.images-pending-delete-exist', true, $res['cnt']);
+ }
+ unset($res);
+} \ No newline at end of file
diff --git a/modules-available/dozmod/lang/de/messages.json b/modules-available/dozmod/lang/de/messages.json
index 60c37927..805472d0 100644
--- a/modules-available/dozmod/lang/de/messages.json
+++ b/modules-available/dozmod/lang/de/messages.json
@@ -3,9 +3,29 @@
"delete-images": "L\u00f6schung: {{0}}",
"dozmod-error": "Fehler bei der Kommunikation mit dem bwLehrpool-Suite server: {{0}}",
"images-pending-delete-exist": "Zur L\u00f6schung markierte VM-Versionen: {{0}}",
+ "ldap-filter-created": "LDAP Filter wurde erfolgreich erstellt",
+ "ldap-filter-deleted": "LDAP Filter wurde erfolgreich gel\u00f6scht",
+ "ldap-filter-id-missing": "Fehlende LDAP Filter ID",
+ "ldap-filter-insert-failed": "LDAP filter konnte der Datenbank nicht hinzugef\u00fcgt werden",
+ "ldap-filter-save-missing-information": "Es fehlen LDAP Filter Informationen",
+ "ldap-filter-saved": "LDAP Filter wurde erfolgreich gespeichert",
+ "ldap-invalid-filter-id": "Ung\u00fcltige LDAP Filter ID",
"mail-config-saved": "Mail-Konfiguration gespeichert",
+ "networkrule-deleted": "Netzwerk-Regel gel\u00f6scht",
+ "networkrule-invalid-direction": "Ung\u00fcltige Richtung: {{0}}",
+ "networkrule-invalid-ruleid": "Nicht-existierende Regel: {{0}}",
+ "networkrule-missing-host": "Fehlende Hostangabe",
+ "networkrule-missing-port": "Fehlende Portangabe",
+ "networkrule-saved": "Netzwerk-Regel gespeichert",
+ "networkshare-deleted": "Netzlaufwerk gel\u00f6scht",
+ "networkshare-invalid-auth-type": "Ung\u00fcltiger Authentifizierungs-Typ: {{0}}",
+ "networkshare-invalid-shareid": "Nicht-existierender Share: {{0}}",
+ "networkshare-missing-path": "Fehlende Pfadangabe",
+ "networkshare-saved": "Netzlaufwerk gespeichert",
"no-expired-images": "Keine Abgelaufenen VM-Versionen",
"nothing-submitted": "Es wurde nichts \u00fcbermittelt",
+ "runscript-invalid-id": "Ung\u00fcltige Script-ID: {{0}}",
+ "runscript-saved": "Script gespeichert",
"runtimelimits-config-saved": "Einstellungen gespeichert",
"templates-saved": "Templates wurden gespeichert",
"timeout": "Zeit\u00fcberschreitung",
diff --git a/modules-available/dozmod/lang/de/module.json b/modules-available/dozmod/lang/de/module.json
index 02e8c84d..ff4519a7 100644
--- a/modules-available/dozmod/lang/de/module.json
+++ b/modules-available/dozmod/lang/de/module.json
@@ -3,8 +3,12 @@
"page_title": "Verwalten der bwLehrpool-Suite",
"submenu_actionlog": "Aktions-Log",
"submenu_expiredimages": "Abgelaufene VM-Versionen",
+ "submenu_ldapfilters": "LDAP-Filter",
"submenu_mailconfig": "Email-Konfiguration",
- "submenu_runtime": "Limits und Standardwerte",
+ "submenu_networkrules": "Netzwerk-Regeln",
+ "submenu_networkshares": "Netzlaufwerke",
+ "submenu_runscripts": "Startskripte",
+ "submenu_runtimeconfig": "Limits und Standardwerte",
"submenu_templates": "Textbausteine f\u00fcr E-Mails",
"submenu_users": "Benutzer und Berechtigungen"
} \ No newline at end of file
diff --git a/modules-available/dozmod/lang/de/permissions.json b/modules-available/dozmod/lang/de/permissions.json
index 07158a1d..8e743e5c 100644
--- a/modules-available/dozmod/lang/de/permissions.json
+++ b/modules-available/dozmod/lang/de/permissions.json
@@ -1,14 +1,21 @@
{
- "images.delete": "Zur Löschung vorgemerkete Abbilder löschen.",
- "mail.save": "Änderungen an der SMTP-Konfiguration zum Versenden von Mails speichern.",
- "mail.testmail": "Eine Test E-Mail verschicken.",
- "runtimeconfig.save": "Änderungen an der Laufzeit-Konfiguration speichern.",
- "templates.save": "E-Mail Templates speichern.",
- "templates.reset": "E-Mail Templates zurücksetzen.",
- "users.setmail": "E-Mail Benachrichtigungen für einzelne Benutzer aktivieren/deaktivieren.",
- "users.setlogin": "Anmeldungen für einzelne Benutzer aktivieren/deaktivieren.",
- "users.setsu": "Benutzer zu SuperUser ernennen.",
- "users.orglogin": "Anmeldungen für Benutzer von bestimmten Einrichtungen aktivieren/deaktivieren.",
- "log.showuser": "User Data im Aktions-Log anzeigen.",
- "log.showtarget": "Target Data im Aktions-Log anzeigen."
+ "actionlog.view": "Aktions-Log einsehen.",
+ "expiredimages.delete": "Zur L\u00f6schung vorgemerkete Abbilder l\u00f6schen.",
+ "ldapfilters.save": "LDAP Filter speichern.",
+ "ldapfilters.view": "LDAP Filter einsehen.",
+ "mailconfig.save": "\u00c4nderungen an der SMTP-Konfiguration zum Versenden von Mails speichern.",
+ "networkrules.save": "\u00c4nderungen an den Netzwerk-Regeln speichern.",
+ "networkrules.view": "Netzwerk-Regeln einsehen.",
+ "networkshares.save": "\u00c4nderungen an den Netzlaufwerken speichern.",
+ "networkshares.view": "Netzlaufwerke einsehen.",
+ "runscripts.save": "Startkripte erstellen\/bearbeiten.",
+ "runscripts.view": "Startscripte auflisten.",
+ "runtimeconfig.save": "\u00c4nderungen an der Laufzeit-Konfiguration speichern.",
+ "templates.reset": "E-Mail Templates zur\u00fccksetzen.",
+ "templates.save": "E-Mail Templates speichern.",
+ "users.setlogin": "Anmeldungen f\u00fcr einzelne Benutzer aktivieren\/deaktivieren.",
+ "users.setmail": "E-Mail Benachrichtigungen f\u00fcr einzelne Benutzer aktivieren\/deaktivieren.",
+ "users.setorglogin": "Anmeldungen f\u00fcr Benutzer von bestimmten Einrichtungen aktivieren\/deaktivieren.",
+ "users.setsu": "Benutzer zu SuperUser ernennen.",
+ "users.view": "Benutzerliste sehen."
} \ No newline at end of file
diff --git a/modules-available/dozmod/lang/de/template-tags.json b/modules-available/dozmod/lang/de/template-tags.json
index a1c23d2e..3e000676 100644
--- a/modules-available/dozmod/lang/de/template-tags.json
+++ b/modules-available/dozmod/lang/de/template-tags.json
@@ -1,8 +1,12 @@
{
"lang_actionTarget": "Aktionsziel",
+ "lang_active": "Aktiv",
+ "lang_addRule": "Netzwerk-Regel hinzuf\u00fcgen",
+ "lang_addShare": "Netzlaufwerk hinzuf\u00fcgen",
"lang_allowLoginByDefault": "Login standardm\u00e4\u00dfig erlauben",
"lang_allowLoginDescription": "Wenn diese Option aktiviert ist, k\u00f6nnen sich alle Mitarbeiter der Einrichtung \u00fcber die bwLehrpool-Suite anmelden und VMs\/Veranstaltungen verwalten. Wenn Sie diese Option deaktivieren, m\u00fcssen Sie in der Untersektion \"Benutzer und Berechtigungen\" jeden Benutzer nach dem ersten Loginversuch manuell freischalten.",
"lang_asteriskRequired": "Felder mit (*) sind erforderlich",
+ "lang_authMethod": "Authentifizierung",
"lang_blockCount": "Anzahl Bl\u00f6cke",
"lang_bwlehrpoolsuite": "bwLehrpool-Suite",
"lang_canLoginOrganization": "Nutzer dieser Einrichtung k\u00f6nnen sich am Satelliten anmelden",
@@ -20,7 +24,11 @@
"lang_descriptionPermissionConfig": "Dies sind die Berechtigungen, die ein Benutzer standardm\u00e4\u00dfig f\u00fcr fremde VMs\/Veranstaltungen hat. Sie werden angewandt, wenn der Besitzer keine anderweitigen Berechtigungen w\u00e4hlt.",
"lang_descriptionRuntimeLimits": "Hier k\u00f6nnen Sie verschiedene Limits festlegen, z.B. wie lange eine VM nach dem Hochladen g\u00fcltig ist. Nach Ablauf dieses Zeitraums ist der Verantwortliche gezwungen, eine neue Version der VM hochzuladen. Damit k\u00f6nnen Sie das Ansammeln nicht mehr ben\u00f6tigter VMs eind\u00e4mmen. Weiterhin k\u00f6nnen Sie die maximale Anzahl gleichzeitiger Transfers pro Benutzer einschr\u00e4nken.\r\n\r\nVer\u00e4nderte Einstellungen wirken sich nicht auf bereits bestehende VMs aus.",
"lang_description_delete_images": "Diese Liste zeigt VMs, die entweder abgelaufen sind, oder deren Datei besch\u00e4digt, verschoben oder gel\u00f6scht wurde. Diese Images sind zur Zeit im Lehrpool nicht verf\u00fcgbar, ihre endg\u00fcltige L\u00f6schung muss aber manuell best\u00e4tigt werden, um gr\u00f6\u00dfere Katastrophen durch Softwarefehler, verstellte Systemuhren etc. zu vermeiden.",
+ "lang_direction": "Richtung",
"lang_dozmodLogHeading": "bwLehrpool-Suite Aktionslog",
+ "lang_editNetworkrule": "Netzwerk-Regel bearbeiten",
+ "lang_editNetworkshare": "Netzlaufwerk bearbeiten",
+ "lang_editScript": "Startscript bearbeiten",
"lang_email": "EMail",
"lang_emailNotifications": "EMail-Benachrichtigungen aktiviert",
"lang_error": "Fehler",
@@ -30,50 +38,85 @@
"lang_hasNewer": "Neuere Version existiert",
"lang_hash": "Hash",
"lang_heading": "Zu l\u00f6schende VM-Versionen",
+ "lang_hidden": "Versteckt",
"lang_host": "Host",
"lang_image": "VM",
"lang_lastEditor": "Zuletzt bearbeitet von",
"lang_lastLogin": "Letzte Anmeldung",
"lang_latestVersion": "Neuste Version",
+ "lang_ldapFilterAdd": "LDAP-Filter hinzuf\u00fcgen",
+ "lang_ldapFilterAttribute": "Attribut",
+ "lang_ldapFilterDeleteConfirmation": "Wollen Sie diesen LDAP-Filter wirklich l\u00f6schen?",
+ "lang_ldapFilterDescription": "Dies sind die Filter, die ein Benutzer in der bwLehrpool-Suite Veranstaltungen hinzuf\u00fcgen kann.",
+ "lang_ldapFilterEdit": "LDAP-Filter bearbeiten",
+ "lang_ldapFilterName": "Filtername",
+ "lang_ldapFilterValue": "Wert",
+ "lang_ldapfilters": "LDAP-Filter",
+ "lang_ldapfiltersIntro": "Hier k\u00f6nnen Sie Vorgaben f\u00fcr veranstaltungsspezifische LDAP-Filter machen. LDAP-Filter sind einfache Attributsfilter, die clientseitig Anwendung finden. Die hier definierten Filter werden in der bwLehrpool-Suite als Vorschl\u00e4ge aufgelistet und k\u00f6nnen mittels Checkbox aktiviert werden. Alternativ k\u00f6nnen in der bwLehrpool-Suite auch eigene Filter angelegt werden.",
"lang_lecture": "Veranstaltung",
"lang_lecturePermissionAdmin": "Administration",
"lang_lecturePermissionEdit": "Bearbeiten",
"lang_loadDefaults": "Alle Texte auf Auslieferungszustand zur\u00fccksetzen",
+ "lang_loggedInUser": "Angemeldeter Nutzer",
"lang_mailConfig": "SMTP-Konfiguration zum Versenden von Mails",
- "lang_mailConfigHeadline": "EMail-Konfiguration",
"lang_mailDescription": "F\u00fcllen Sie die folgenden Felder aus, wenn sie m\u00f6chten, dass Dozierende per Mail benachrichtigt werden, falls eine von ihnen genutzte oder erstellte VM oder Veranstaltung abl\u00e4uft. Um diese Funktion zu deaktivieren, lassen Sie eines der mit (*) gekennzeichneten Felder leer. Wenn das hier angegebene E-Mail-Konto nur zum Versenden von Mails genutzt wird, sollten Sie einen Auto-Responder einrichten f\u00fcr den Fall, dass ein Dozierender auf eine der automatisch generierten Mails antwortet (bzw. eine explizit angegebene Reply-To Adresse ignoriert).",
"lang_mailTemplates": "E-Mail Templates",
"lang_maxImageValidity": "G\u00fcltigkeitsdauer neuer VM-Versionen (Tage)",
"lang_maxLectureVisibility": "Sp\u00e4testes Enddatum einer Veranstaltung (Tage in der Zukunft)",
"lang_maxLocationsPerLecture": "Max. explizite Orte pro Veranstaltung",
"lang_maxTransfers": "Maximale Zahl gleichzeitiger Up-\/Downloads pro Benutzer",
+ "lang_minimized": "Minimiert",
"lang_miscOptions": "Verschiedene Einstellungen",
"lang_modified": "Modifiziert",
+ "lang_name": "Name",
+ "lang_networkrules": "Netzwerk-Regeln",
+ "lang_networkrulesIntro": "Hier k\u00f6nnen Sie vordefinierte Regelsets f\u00fcr das Firewalling verwalten. Nutzer der bwLehrpool-Suite k\u00f6nnen auf diese Regelsets zur\u00fcckgreifen, um den Netzwerkzugriff ihrer Veranstaltungen einzuschr\u00e4nken.",
+ "lang_networkshares": "Netzlaufwerke",
+ "lang_networksharesIntro": "Hier k\u00f6nnen Sie vordefinierte Netzlaufwerke anlegen, die den Nutzern der bwLehrpool-Suite zur Auswahl gestellt werden. Es ist den Nutzern der bwLehrpool-Suite weiterhin m\u00f6glich, komplett eigene Netzwerkfreigaben zu definieren. Die Angaben hier sollen lediglich das Hinzuf\u00fcgen h\u00e4ufig genutzter Laufwerke vereinfachen, bzw. das \u00c4ndern eines Netzwerkpfades vereinfachen, da in diesem Fall nur der Zentrale Eintrag hier angepasst werden muss, und nicht mehr wie zuvor jede Veranstaltung einzeln.",
+ "lang_none": "(Keiner)",
+ "lang_normal": "Normal",
"lang_organization": "Einrichtung",
- "lang_organizationList": "Liste der Einrichtungen",
"lang_organizationListHeader": "Nutzungsrechte f\u00fcr den Satelliten festlegen",
"lang_os": "Betriebssystem",
"lang_owner": "Besitzer",
- "lang_passwordplaceholder": "SMTP Passwort",
+ "lang_passwordplaceholder": "SMTP-Passwort",
+ "lang_path": "Pfad",
"lang_placeholders": "Platzhalter",
"lang_port": "Port",
+ "lang_printer": "Drucker",
"lang_reallyResetTemplates": "Sind Sie sicher, dass Sie alle Texte l\u00f6schen und auf die Standardwerte zur\u00fccksetzen wollen?",
"lang_replaceWithOriginal": "Originaltext in Textbox laden",
"lang_replyTo": "Reply-To Adresse",
+ "lang_ruleDeleteConfirm": "Soll dieses Regelset wirklich gel\u00f6scht werden?",
+ "lang_runScriptAdd": "Skript hinzuf\u00fcgen",
+ "lang_runScriptDeleteConfirmation": "Skript wirklich l\u00f6schen?",
"lang_runtimeConfig": "Laufzeit-Konfiguration",
- "lang_runtimeConfigHeadline": "Laufzeit-Konfiguration",
"lang_runtimeConfigLimits": "Beschr\u00e4nkungen",
+ "lang_scriptContent": "Skriptinhalt",
+ "lang_scriptExtension": "Dateinamenerweiterung",
+ "lang_scriptExtensionHead": "Erweiterung",
+ "lang_scriptIsGlobal": "Skript ist global, wird in jeder Veranstaltung ausgef\u00fchrt",
+ "lang_scriptIsGlobalHead": "Global",
+ "lang_scriptIsPredefined": "Skript ist ein vordefiniertes Skript, das in der bwLehrpool-Suite zur Auswahl steht",
+ "lang_scriptPassCredentials": "Benutzername\/Passwort an dieses Skript \u00fcbergeben",
+ "lang_scriptPassCredentialsHead": "User\/Pass",
+ "lang_scriptVisibility": "Anzeigemodus",
+ "lang_scriptVisibilityHead": "Anzeige",
+ "lang_scriptsHead": "Startskripte f\u00fcr Virtuelle Umgebungen",
+ "lang_scriptsIntro": "Hier k\u00f6nnen Sie Startskripte definieren, die entweder global bei jedem Start einer Veranstaltung ausgef\u00fchrt werden, oder den Nutzerinnen der bwLehrpool-Suite zur Vorauswahl zur Verf\u00fcgung gestellt werden.",
"lang_senderAddress": "Absenderadresse",
"lang_senderName": "Absender Anzeigename",
+ "lang_shareDeleteConfirm": "Wollen Sie dieses Netzlaufwerk wirklich l\u00f6schen?",
"lang_size": "Gr\u00f6\u00dfe",
"lang_spaceWastedDuplication": "Potentiell durch mehrfach vorkommende Bl\u00f6cke belegter Speicherplatz",
+ "lang_specificUser": "Spezifischer Nutzer",
"lang_ssl": "SSL-Modus",
"lang_sslExplicit": "Explizites SSL (\"STARTTLS\")",
"lang_sslImplicit": "Implizites SSL",
"lang_sslNone": "Kein SSL",
- "lang_subHeading": "Images, die abgelaufen oder besch\u00e4digt sind",
"lang_superUser": "Ist SuperUser (darf alle Veranstaltungen und VMs bearbeiten\/l\u00f6schen)",
"lang_system": "System",
+ "lang_target": "Ziel",
"lang_template": "Template",
"lang_templatePageDescription": "Hier k\u00f6nnen Sie die Textbausteine bearbeiten, aus denen die Mails generiert werden, die der bwLehrpool-Server bez\u00fcglich Virtueller Maschinen und Veranstaltungen versendet. Diese Funktionalit\u00e4t unterst\u00fctzt zur Zeit keine Internationalisierung.",
"lang_test": "Test-Mail senden",
@@ -83,10 +126,9 @@
"lang_updateTime": "Letzte Bearbeitung",
"lang_user": "Benutzername",
"lang_userId": "Benutzer-ID",
- "lang_userList": "Benutzerliste",
"lang_userListDescription": "Hier k\u00f6nnen Sie individuelle Nutzer zu \"Super-Usern\" machen. Diese haben in der bwLehrpool-Suite auf alle Veranstaltungen und VMs Vollzugriff, unabh\u00e4ngig von den gesetzten Berechtigungen. Au\u00dferdem k\u00f6nnen Sie hier Benutzer vom Zugriff mittels der bwLehrpool-Suite ausschlie\u00dfen.",
"lang_userListHeader": "Dem Satelliten bekannte Benutzer",
- "lang_usernameplaceholder": "SMTP Benutzername",
+ "lang_usernameplaceholder": "SMTP-Benutzername",
"lang_version": "Version vom",
"lang_when": "Wann"
-}
+} \ No newline at end of file
diff --git a/modules-available/dozmod/lang/en/messages.json b/modules-available/dozmod/lang/en/messages.json
index 6d7ea0ac..2d813efc 100644
--- a/modules-available/dozmod/lang/en/messages.json
+++ b/modules-available/dozmod/lang/en/messages.json
@@ -3,9 +3,29 @@
"delete-images": "Delete: {{0}}",
"dozmod-error": "Error communicating with the bwLehrpool-Suite server: {{0}}",
"images-pending-delete-exist": "VMs marked for deletion: {{0}}",
+ "ldap-filter-created": "LDAP filter was successfully created",
+ "ldap-filter-deleted": "LDAP filter successfully deleted",
+ "ldap-filter-id-missing": "LDAP filter id was missing",
+ "ldap-filter-insert-failed": "LDAP filter could not be inserted into the database",
+ "ldap-filter-save-missing-information": "LDAP filter information is missing",
+ "ldap-filter-saved": "Successfully modified LDAP filter",
+ "ldap-invalid-filter-id": "Invalid LDAP filter id",
"mail-config-saved": "Mail config saved",
+ "networkrule-deleted": "Network rule deleted",
+ "networkrule-invalid-direction": "Invalid direction: {{0}}",
+ "networkrule-invalid-ruleid": "Invalid rule id: {{0}}",
+ "networkrule-missing-host": "Missing host",
+ "networkrule-missing-port": "Missing port",
+ "networkrule-saved": "Network rule saved",
+ "networkshare-deleted": "Network share deleted",
+ "networkshare-invalid-auth-type": "Invalid auth type: {{0}}",
+ "networkshare-invalid-shareid": "Invalid share id: {{0}}",
+ "networkshare-missing-path": "Missing network path",
+ "networkshare-saved": "Network share saved",
"no-expired-images": "No expired VMs",
"nothing-submitted": "There was nothing submitted",
+ "runscript-invalid-id": "Invalid script id: {{0}}",
+ "runscript-saved": "Script has been saved",
"runtimelimits-config-saved": "Configuration saved successfully",
"templates-saved": "Templates saved successfully",
"timeout": "Timeout",
diff --git a/modules-available/dozmod/lang/en/module.json b/modules-available/dozmod/lang/en/module.json
index 17a2b838..5bcee464 100644
--- a/modules-available/dozmod/lang/en/module.json
+++ b/modules-available/dozmod/lang/en/module.json
@@ -3,8 +3,12 @@
"page_title": "Manage the bwLehrpool-Suite",
"submenu_actionlog": "action log",
"submenu_expiredimages": "Expired VM versions",
+ "submenu_ldapfilters": "LDAP filters",
"submenu_mailconfig": "email configuration",
- "submenu_runtime": "limits and defaults",
+ "submenu_networkrules": "Network Rules",
+ "submenu_networkshares": "Network Shares",
+ "submenu_runscripts": "Startup scripts",
+ "submenu_runtimeconfig": "limits and defaults",
"submenu_templates": "templates",
"submenu_users": "users and permissions"
} \ No newline at end of file
diff --git a/modules-available/dozmod/lang/en/permissions.json b/modules-available/dozmod/lang/en/permissions.json
index 923a8461..b0fbb071 100644
--- a/modules-available/dozmod/lang/en/permissions.json
+++ b/modules-available/dozmod/lang/en/permissions.json
@@ -1,14 +1,21 @@
{
- "images.delete": "Delete images marked for deletion.",
- "mail.save": "Save SMTP configuration for sending mails.",
- "mail.testmail": "Send a testmail.",
- "runtimeconfig.save": "Save limits and defaults of a runtime configuration.",
- "templates.save": "Save email templates.",
- "templates.reset": "Reset email templates.",
- "users.setmail": "Enable/Disable Email Notification.",
- "users.setlogin": "Enable/Disable Login.",
- "users.setsu": "Set User to superuser.",
- "users.orglogin": "Enalbe/Disable Login for Users from certain organisations.",
- "log.showuser": "Show User Data in Log.",
- "log.showtarget": "Show Target Data in Log."
+ "actionlog.view": "View action log.",
+ "expiredimages.delete": "Delete images marked for deletion.",
+ "ldapfilters.save": "Save LDAP filter.",
+ "ldapfilters.view": "View LDAP filters. ",
+ "mailconfig.save": "Save SMTP configuration for sending mails.",
+ "networkrules.save": "Save network rules.",
+ "networkrules.view": "View network rules.",
+ "networkshares.save": "Save network drives.",
+ "networkshares.view": "View network drives.",
+ "runscripts.save": "Save startup scripts.",
+ "runscripts.view": "View startup scripts.",
+ "runtimeconfig.save": "Save limits and defaults of a runtime configuration.",
+ "templates.reset": "Reset email templates.",
+ "templates.save": "Save email templates.",
+ "users.setlogin": "Enable\/Disable Login.",
+ "users.setmail": "Enable\/Disable Email Notification.",
+ "users.setorglogin": "Enalbe\/Disable Login for Users from certain organisations.",
+ "users.setsu": "Set User to superuser.",
+ "users.view": "View user list."
} \ No newline at end of file
diff --git a/modules-available/dozmod/lang/en/template-tags.json b/modules-available/dozmod/lang/en/template-tags.json
index f12e4ab8..c33d872b 100644
--- a/modules-available/dozmod/lang/en/template-tags.json
+++ b/modules-available/dozmod/lang/en/template-tags.json
@@ -1,8 +1,12 @@
{
"lang_actionTarget": "Action target",
+ "lang_active": "Active",
+ "lang_addRule": "Add Network Rule",
+ "lang_addShare": "Add Network Share",
"lang_allowLoginByDefault": "Allow all staff members to login and use the bwLehrpool-Suite",
"lang_allowLoginDescription": "If this option is enabled, all members of the organization marked as staff or employee are allowed to login to this server and manage VMs\/courses. Otherwise, new users need to be individually allowed access after their first login attempt by visiting the sub page \"users and permissions\" in this web interface.",
"lang_asteriskRequired": "Fields marked with (*) are required",
+ "lang_authMethod": "Authentication",
"lang_blockCount": "Block count",
"lang_bwlehrpoolsuite": "bwLehrpool-Suite",
"lang_canLoginOrganization": "Users from this organization can login",
@@ -20,60 +24,99 @@
"lang_descriptionPermissionConfig": "These are the default permissions being used for VMs and lectures if the owner does not specify any.",
"lang_descriptionRuntimeLimits": "Here you can define some limits, e.g. how long a newly uploaded VM will be valid. This should make sure that you don't end up with a lot of old, unused VMs over time.\r\n\r\nModified settings won't apply for already existing VMs.",
"lang_description_delete_images": "This is a list of VMs that either expired, or where the disk image is damaged or missing. These VMs are not available in bwLehrpool currently, but you have to manually confirm the deletion of the disk images for safety reasons (clock skew etc.)",
+ "lang_direction": "Direction",
"lang_dozmodLogHeading": "bwLehrpool-Suite action log",
+ "lang_editNetworkrule": "Edit Network Rule",
+ "lang_editNetworkshare": "Edit Network Share",
+ "lang_editScript": "Edit start script",
"lang_email": "E-Mail",
"lang_emailNotifications": "E-Mail notifications enabled",
"lang_error": "Error",
"lang_event": "Event",
"lang_fileSize": "File size",
"lang_followingPlaceholdersUnused": "The following placeholders are not being used",
- "lang_hasNewer": "Newer version exists",
+ "lang_hasNewer": "newer version exists",
"lang_hash": "Hash",
"lang_heading": "Images Marked for Deletion",
+ "lang_hidden": "Hidden",
"lang_host": "Host",
"lang_image": "VM",
"lang_lastEditor": "Edited by",
"lang_lastLogin": "Last login",
"lang_latestVersion": "latest version",
+ "lang_ldapFilterAdd": "Add LDAP filter",
+ "lang_ldapFilterAttribute": "Attribute",
+ "lang_ldapFilterDeleteConfirmation": "Do you really want to delete this LDAP filter.",
+ "lang_ldapFilterDescription": "These are the LDAP filters that can be applied to lectures in the bwLehrpool-Suite.",
+ "lang_ldapFilterEdit": "Edit LDAP filter",
+ "lang_ldapFilterName": "Filter name",
+ "lang_ldapFilterValue": "Value",
+ "lang_ldapfilters": "LDAP filters",
+ "lang_ldapfiltersIntro": "This is the list of predefined lecture filters, based on LDAP attributes. These filters can be applied client side to only show lectures to specific user groups. These predefined filters are shown in the bwLehrpool-Suite when editing a lecture, and can be activated by a simple check box. Users of the bwLehrpool-Suite can either make use of these predefined filters, or add custom ones if desired.",
"lang_lecture": "Lecture",
"lang_lecturePermissionAdmin": "Administrate",
"lang_lecturePermissionEdit": "Edit",
"lang_loadDefaults": "Reset all templates to their defaults",
+ "lang_loggedInUser": "Logged in User",
"lang_mailConfig": "SMTP configuration for sending mails",
- "lang_mailConfigHeadline": "Email Configuration",
"lang_mailDescription": "Fill in the following fields if you want to notify tutors\/professors\/lecturers about expiring VMs and lectures. If you leave one of the required fields blank, the feature will be disabled.",
"lang_mailTemplates": "E-Mail Templates",
"lang_maxImageValidity": "New VM validity (days)",
"lang_maxLectureVisibility": "Max time lecture end date may lie in the future (days)",
"lang_maxLocationsPerLecture": "Max. explicit locations per lecture",
"lang_maxTransfers": "Max concurrent transfers per user",
+ "lang_minimized": "Minimized",
"lang_miscOptions": "Misc options",
"lang_modified": "modified",
+ "lang_name": "Name",
+ "lang_networkrules": "Network Rules",
+ "lang_networkrulesIntro": "This is where you can create predefined rulesets for the lecture-based firewalling. bwLehrpool-Suite users can select those rulesets to limit network access of their lectures.",
+ "lang_networkshares": "Network Shares",
+ "lang_networksharesIntro": "This is the list of predefined network shares. bwLehrpool-Suite users can still add custom network shares to their lectures, however having commonly used network shares as predefined entries should be much more convenient. Another advantage is that changing the path of a network share centrally avoids having to edit a dozen lectures' configuration manually.",
+ "lang_none": "(none)",
+ "lang_normal": "Normal",
"lang_organization": "Organization",
- "lang_organizationList": "List of Organizations",
"lang_organizationListHeader": "Set access permissions for organizations",
"lang_os": "Operating System",
"lang_owner": "Owner",
"lang_passwordplaceholder": "SMTP Password",
+ "lang_path": "Path",
"lang_placeholders": "Placeholders",
"lang_port": "Port",
+ "lang_printer": "Printer",
"lang_reallyResetTemplates": "Are you sure you want to reset all texts to their default values?",
"lang_replaceWithOriginal": "load original text into text box",
"lang_replyTo": "Reply-To address",
+ "lang_ruleDeleteConfirm": "Do you want to delete this ruleset?",
+ "lang_runScriptAdd": "Add run-script",
+ "lang_runScriptDeleteConfirmation": "Do you want to delete this run-script?",
"lang_runtimeConfig": "Limits and Defaults",
- "lang_runtimeConfigHeadline": "Configure Limits and Defaults for bwLehrpool-Suite",
"lang_runtimeConfigLimits": "Limitations",
+ "lang_scriptContent": "Script content",
+ "lang_scriptExtension": "Script extension",
+ "lang_scriptExtensionHead": "Extension",
+ "lang_scriptIsGlobal": "Global script, will execute in every lecture environment",
+ "lang_scriptIsGlobalHead": "Global",
+ "lang_scriptIsPredefined": "Predefined script, selectable by bwLehrpool-Suite users for individual lectures",
+ "lang_scriptPassCredentials": "Pass username and password to this script",
+ "lang_scriptPassCredentialsHead": "User\/Pass",
+ "lang_scriptVisibility": "Display mode",
+ "lang_scriptVisibilityHead": "Display",
+ "lang_scriptsHead": "Run-scripts for lecture environments",
+ "lang_scriptsIntro": "Here you can define scripts that will either forcefully run at startup of a lecture, or are selectable by bwLehrpool-Suite users.",
"lang_senderAddress": "Sender address",
"lang_senderName": "Sender's display name",
+ "lang_shareDeleteConfirm": "Do you really want to delete this network share?",
"lang_size": "Size",
"lang_spaceWastedDuplication": "Potentially wasted space by duplicate blocks",
+ "lang_specificUser": "Specific User",
"lang_ssl": "SSL mode",
"lang_sslExplicit": "Explicit SSL (\"STARTTLS\")",
"lang_sslImplicit": "Implicit SSL",
"lang_sslNone": "No SSL",
- "lang_subHeading": "Expired or damaged images",
"lang_superUser": "Is super user (can edit\/delete all lectures and VMs)",
"lang_system": "System",
+ "lang_target": "Target",
"lang_template": "Template",
"lang_templatePageDescription": "Here you can edit text fragments that are used to compose the information and reminder mails sent by the bwLehrpool server, e.g. when a lecture or VM is about to expire.",
"lang_test": "Send test mail",
@@ -83,10 +126,9 @@
"lang_updateTime": "Last update",
"lang_user": "User name",
"lang_userId": "User id",
- "lang_userList": "User List",
"lang_userListDescription": "Here you can promote \"super users\", which will have all permissions in the bwLehrpool-Suite. You can also ban users from accessing this server via the bwLehrpool-Suite.",
"lang_userListHeader": "Users known to this satellite",
"lang_usernameplaceholder": "SMTP Username",
"lang_version": "Version timestamp",
"lang_when": "When"
-}
+} \ No newline at end of file
diff --git a/modules-available/dozmod/page.inc.php b/modules-available/dozmod/page.inc.php
index b58d57aa..67b791d1 100644
--- a/modules-available/dozmod/page.inc.php
+++ b/modules-available/dozmod/page.inc.php
@@ -2,25 +2,37 @@
class Page_DozMod extends Page
{
- /** @var \Page sub page classes */
- private $subPage = false;
+ /** @var bool true if we have a proper subpage */
+ private $haveSubPage = false;
+
+ private $validSections = ['expiredimages', 'mailconfig', 'templates', 'runtimeconfig', 'users', 'actionlog', 'networkshares', 'ldapfilters', 'runscripts', 'networkrules'];
+
+ private $section;
private function setupSubPage()
{
- if ($this->subPage !== false)
+ if ($this->haveSubPage !== false)
return;
/* different pages for different sections */
- $section = Request::any('section', 'mailconfig', 'string');
- /* instantiate sub pages */
- if ($section === 'templates') {
- $this->subPage = new Page_mail_templates();
- }
- if ($section === 'users') {
- $this->subPage = new Page_dozmod_users();
- }
- if ($section === 'actionlog') {
- $this->subPage = new Page_dozmod_log();
- }
+ $this->section = Request::any('section', false, 'string');
+ if ($this->section === 'blockstats') // HACK HACK
+ return;
+ if ($this->section === false) {
+ foreach ($this->validSections as $this->section) {
+ if (User::hasPermission($this->section . '.*'))
+ break;
+ }
+ } elseif (!in_array($this->section, $this->validSections)) {
+ Util::traceError('Invalid section: ' . $this->section);
+ }
+ // Check permissions
+ User::assertPermission($this->section . '.*');
+ $include = 'modules/' . Page::getModule()->getIdentifier() . '/pages/' . $this->section . '.inc.php';
+ if (!file_exists($include))
+ return;
+
+ require_once $include;
+ $this->haveSubPage = true;
}
protected function doPreprocess()
@@ -32,117 +44,45 @@ class Page_DozMod extends Page
Util::redirect('?do=Main');
}
- /* add sub-menus */
- Dashboard::addSubmenu('?do=dozmod&section=expiredimages', Dictionary::translate('submenu_expiredimages', true));
- Dashboard::addSubmenu('?do=dozmod&section=mailconfig', Dictionary::translate('submenu_mailconfig', true));
- Dashboard::addSubmenu('?do=dozmod&section=templates', Dictionary::translate('submenu_templates', true));
- Dashboard::addSubmenu('?do=dozmod&section=runtimeconfig', Dictionary::translate('submenu_runtime', true));
- Dashboard::addSubmenu('?do=dozmod&section=users', Dictionary::translate('submenu_users', true));
- Dashboard::addSubmenu('?do=dozmod&section=actionlog', Dictionary::translate('submenu_actionlog', true));
-
$this->setupSubPage();
- if ($this->subPage !== false) {
- $this->subPage->doPreprocess();
- return;
- }
-
- /* execute actions */
- $action = Request::post('action', false, 'string');
+ if ($this->haveSubPage !== false) {
+ SubPage::doPreprocess();
+ }
+ // Catch unhandled POST redirect
+ if (Request::isPost()) {
+ Util::redirect('?do=dozmod&section=' . $this->section);
+ }
+
+ /* Leave this here for translation module
+ Dictionary::translate('submenu_expiredimages', true);
+ Dictionary::translate('submenu_mailconfig', true);
+ Dictionary::translate('submenu_templates', true);
+ Dictionary::translate('submenu_runtimeconfig', true);
+ Dictionary::translate('submenu_users', true);
+ Dictionary::translate('submenu_actionlog', true);
+ Dictionary::translate('submenu_networkshares', true);
+ Dictionary::translate('submenu_ldapfilters', true);
+ Dictionary::translate('submenu_runscripts', true);
+ Dictionary::translate('submenu_networkrules', true);
+ */
- if ($action === 'mail') {
- if (User::hasPermission("mail.save")) {
- $this->mailHandler();
- }
- } elseif ($action === 'runtime') {
- if (User::hasPermission("runtimeconfig.save")) {
- $this->runtimeHandler();
- }
- } elseif ($action === 'delimages') {
- if (User::hasPermission("images.delete")) {
- $result = $this->handleDeleteImages();
- if (!empty($result)) {
- Message::addInfo('delete-images', $result);
- }
- Util::redirect('?do=DozMod');
+ /* add sub-menus */
+ foreach ($this->validSections as $section) {
+ if (User::hasPermission($section . '.*')) {
+ Dashboard::addSubmenu('?do=dozmod&section=' . $section, Dictionary::translate('submenu_' . $section, true));
}
- } elseif ($action !== false) {
- Util::traceError('Invalid action: ' . $action);
}
}
protected function doRender()
{
/* different pages for different sections */
- if ($this->subPage !== false) {
- $this->subPage->doRender();
+ if ($this->haveSubPage !== false) {
+ SubPage::doRender();
return;
}
- $section = Request::get('section', false, 'string');
-
- if ($section === false || $section === 'expiredimages') {
- $expiredImages = $this->loadExpiredImages();
- if ($section === false && empty($expiredImages)) {
- $section = 'mailconfig';
- } else {
- $section = 'expiredimages';
- }
- }
-
- if ($section === 'expiredimages') {
- if (empty($expiredImages)) {
- Message::addSuccess('no-expired-images');
- } else {
- Render::addTemplate('images-delete', array('images' => $expiredImages, 'allowedDelete' => User::hasPermission("images.delete")));
- }
- }
- if ($section === 'mailconfig') {
- // Mail config
- $mailConf = Database::queryFirst('SELECT value FROM sat.configuration WHERE parameter = :param', array('param' => 'mailconfig'));
- if ($mailConf != null) {
- $mailConf = @json_decode($mailConf['value'], true);
- if (is_array($mailConf)) {
- $mailConf['set_' . $mailConf['ssl']] = 'selected="selected"';
- }
- }
- $mailConf['allowedSave'] = User::hasPermission('mail.save');
- $mailConf['allowedTest'] = User::hasPermission('mail.testmail');
- Render::addTemplate('mailconfig', $mailConf);
- }
- if ($section === 'runtimeconfig') {
- // Runtime config
- $runtimeConf = Database::queryFirst('SELECT value FROM sat.configuration WHERE parameter = :param', array('param' => 'runtimelimits'));
- if ($runtimeConf !== false) {
- $runtimeConf = json_decode($runtimeConf['value'], true);
-
- /* convert some value to corresponding "selected" texts */
- if ($runtimeConf['defaultLecturePermissions']['edit']) {
- $runtimeConf['defaultLecturePermissions']['edit'] = 'checked';
- }
- if ($runtimeConf['defaultLecturePermissions']['admin']) {
- $runtimeConf['defaultLecturePermissions']['admin'] = 'checked';
- }
- if ($runtimeConf['defaultImagePermissions']['edit']) {
- $runtimeConf['defaultImagePermissions']['edit'] = 'checked';
- }
- if ($runtimeConf['defaultImagePermissions']['admin']) {
- $runtimeConf['defaultImagePermissions']['admin'] = 'checked';
- }
- if ($runtimeConf['defaultImagePermissions']['link']) {
- $runtimeConf['defaultImagePermissions']['link'] = 'checked';
- }
- if ($runtimeConf['defaultImagePermissions']['download']) {
- $runtimeConf['defaultImagePermissions']['download'] = 'checked';
- }
-
- if ($runtimeConf['allowLoginByDefault']) {
- $runtimeConf['allowLoginByDefault'] = 'checked';
- }
- }
- $runtimeConf['allowedSave'] = User::hasPermission("runtimeconfig.save");
- Render::addTemplate('runtimeconfig', $runtimeConf);
- }
- if ($section === 'blockstats') {
+ if ($this->section === 'blockstats') {
$this->showBlockStats();
}
@@ -164,73 +104,19 @@ class Page_DozMod extends Page
Render::addTemplate('blockstats', $data);
}
- private function loadExpiredImages()
- {
- $res = Database::simpleQuery("SELECT b.displayname,"
- . " own.firstname, own.lastname, own.email,"
- . " v.imageversionid, v.createtime, v.filesize, v.deletestate,"
- . " lat.expiretime AS latexptime, lat.deletestate AS latdelstate"
- . " FROM sat.imageversion v"
- . " INNER JOIN sat.imagebase b ON (b.imagebaseid = v.imagebaseid)"
- . " INNER JOIN sat.user own ON (b.ownerid = own.userid)"
- . " LEFT JOIN sat.imageversion lat ON (b.latestversionid = lat.imageversionid)"
- . " WHERE v.deletestate <> 'KEEP'"
- . " ORDER BY b.displayname ASC, v.createtime ASC");
- $NOW = time();
- $rows = array();
- while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
- if ($row['latexptime'] > $NOW && $row['latdelstate'] === 'KEEP') {
- $row['hasNewerClass'] = 'glyphicon-ok green';
- $row['checked'] = 'checked';
- } else {
- $row['hasNewerClass'] = 'glyphicon-remove red';
- }
- if ($row['deletestate'] === 'WANT_DELETE') {
- $row['name_extra_class'] = 'slx-strike';
- }
- $row['version'] = date('d.m.Y H:i:s', $row['createtime']);
- $row['rawfilesize'] = $row['filesize'];
- $row['filesize'] = Util::readableFileSize($row['filesize']);
- $rows[] = $row;
- }
- return $rows;
- }
-
- private function cleanMailArray()
- {
- $keys = array('host', 'port', 'ssl', 'senderAddress', 'replyTo', 'username', 'password', 'serverName');
- $data = array();
- foreach ($keys as $key) {
- $data[$key] = Request::post($key, '');
- settype($data[$key], 'string');
- if (is_numeric($data[$key])) {
- settype($data[$key], 'int');
- }
- }
- return $data;
- }
-
protected function doAjax()
{
User::load();
-
$this->setupSubPage();
- if ($this->subPage !== false) {
- $this->subPage->doAjax();
+
+ if ($this->haveSubPage !== false) {
+ SubPage::doAjax();
return;
}
$action = Request::post('action');
- if ($action === 'mail') {
- if (User::hasPermission("mail.testmail")) {
- $this->handleTestMail();
- }
- } elseif ($action === 'delimages') {
- if (User::hasPermission("images.delete")) {
- die($this->handleDeleteImages());
- }
- } elseif ($action === 'getblockinfo') {
+ if ($action === 'getblockinfo') {
$this->ajaxGetBlockInfo();
}
}
@@ -264,125 +150,4 @@ class Page_DozMod extends Page
die(Render::parse('blockstats-details', $data));
}
- private function handleDeleteImages()
- {
- $images = Request::post('images', false);
- if (is_array($images)) {
- foreach ($images as $image => $val) {
- if (strtolower($val) !== 'on')
- continue;
- Database::exec("UPDATE sat.imageversion SET deletestate = 'WANT_DELETE'"
- . " WHERE deletestate = 'SHOULD_DELETE' AND imageversionid = :imageversionid", array(
- 'imageversionid' => $image
- ));
- }
- if (!empty($images)) {
- $ret = Download::asStringPost('http://127.0.0.1:9080/do/delete-images', false, 10, $code);
- if ($code == 999) {
- $ret .= "\nConnection to DMSD failed.";
- }
- return $ret;
- }
- }
- return false;
- }
-
- private function handleTestMail()
- {
- $do = Request::post('button');
- if ($do === 'test') {
- // Prepare array
- $data = $this->cleanMailArray();
- Header('Content-Type: text/plain; charset=utf-8');
- $data['recipient'] = Request::post('recipient', '');
- if (!preg_match('/.+@.+\..+/', $data['recipient'])) {
- $result = 'No recipient given!';
- } else {
- $result = Download::asStringPost('http://127.0.0.1:9080/do/mailtest', $data, 10, $code);
- if ($code == 999) {
- $result .= "\nTimeout.";
- } elseif ($code != 200) {
- $result .= "\nReturn code $code";
- }
- }
- die($result);
- }
- }
-
- private function mailHandler()
- {
- // Check action
- $do = Request::post('button');
- if ($do === 'save') {
- // Prepare array
- $data = $this->cleanMailArray();
- $data = json_encode($data);
- Database::exec('INSERT INTO sat.configuration (parameter, value)'
- . ' VALUES (:param, :value)'
- . ' ON DUPLICATE KEY UPDATE value = VALUES(value)', array(
- 'param' => 'mailconfig',
- 'value' => $data
- ));
- Message::addSuccess('mail-config-saved');
- } else {
- Message::addError('main.invalid-action', $do);
- }
- Util::redirect('?do=DozMod&section=mailconfig');
- }
-
- private function runtimeHandler()
- {
- // Check action
- $do = Request::post('button');
- if ($do === 'save') {
- $data = [];
- $data['defaultLecturePermissions'] = Request::post('defaultLecturePermissions', NULL, "array");
- $data['defaultImagePermissions'] = Request::post('defaultImagePermissions', NULL, "array");
-
- $params = [
- 'int' => [
- 'maxImageValidityDays' => array('min' => 7, 'max' => 9999),
- 'maxLectureValidityDays' => array('min' => 7, 'max' => 9999),
- 'maxLocationsPerLecture' => array('min' => 0, 'max' => 999),
- 'maxTransfers' => array('min' => 1, 'max' => 10),
- ],
- 'bool' => [
- 'allowLoginByDefault' => array('default' => true)
- ],
- ];
- foreach ($params as $type => $list) {
- foreach ($list as $field => $limits) {
- $default = isset($limits['default']) ? $limits['default'] : false;
- $value = Request::post($field, $default);
- settype($value, $type);
- if (isset($limits['min']) && $value < $limits['min']) {
- $value = $limits['min'];
- }
- if (isset($limits['max']) && $value > $limits['max']) {
- $value = $limits['max'];
- }
- $data[$field] = $value;
- }
- }
-
- /* ensure types */
- settype($data['defaultLecturePermissions']['edit'], 'boolean');
- settype($data['defaultLecturePermissions']['admin'], 'boolean');
- settype($data['defaultImagePermissions']['edit'], 'boolean');
- settype($data['defaultImagePermissions']['admin'], 'boolean');
- settype($data['defaultImagePermissions']['link'], 'boolean');
- settype($data['defaultImagePermissions']['download'], 'boolean');
-
- $data = json_encode($data);
- Database::exec('INSERT INTO sat.configuration (parameter, value)'
- . ' VALUES (:param, :value)'
- . ' ON DUPLICATE KEY UPDATE value = VALUES(value)', array(
- 'param' => 'runtimelimits',
- 'value' => $data
- ));
- Message::addSuccess('runtimelimits-config-saved');
- }
- Util::redirect('?do=DozMod&section=runtimeconfig');
- }
-
}
diff --git a/modules-available/dozmod/inc/pagedozmodlog.inc.php b/modules-available/dozmod/pages/actionlog.inc.php
index 80441cd1..a014ddf7 100644
--- a/modules-available/dozmod/inc/pagedozmodlog.inc.php
+++ b/modules-available/dozmod/pages/actionlog.inc.php
@@ -1,25 +1,26 @@
<?php
-class Page_dozmod_log extends Page
+class SubPage
{
- private $action;
- private $uuid;
+ private static $action;
+ private static $uuid;
- protected function doPreprocess()
+ public static function doPreprocess()
{
- $this->action = Request::get('action', '', 'string');
- if ($this->action !== '' && $this->action !== 'showtarget' && $this->action !== 'showuser') {
- Util::traceError('Invalid action for actionlog: "' . $this->action . '"');
+ User::assertPermission("actionlog.view");
+ self::$action = Request::get('action', '', 'string');
+ if (self::$action !== '' && self::$action !== 'showtarget' && self::$action !== 'showuser') {
+ Util::traceError('Invalid action for actionlog: "' . self::$action . '"');
}
- $this->uuid = Request::get('uuid', '', 'string');
+ self::$uuid = Request::get('uuid', '', 'string');
}
- protected function doRender()
+ public static function doRender()
{
Render::addTemplate('actionlog-header');
- if ($this->action === '') {
- $this->generateLog("SELECT al.dateline, al.targetid, al.description,"
+ if (self::$action === '') {
+ self::generateLog("SELECT al.dateline, al.targetid, al.description,"
. " img.displayname AS imgname, tu.firstname AS tfirstname, tu.lastname AS tlastname, l.displayname AS lecturename,"
. " al.userid AS uuserid, usr.firstname AS ufirstname, usr.lastname AS ulastname"
. " FROM sat.actionlog al"
@@ -28,62 +29,58 @@ class Page_dozmod_log extends Page
. " LEFT JOIN sat.user tu ON (tu.userid = al.targetid)"
. " LEFT JOIN sat.lecture l ON (l.lectureid = targetid)"
. " ORDER BY al.dateline DESC LIMIT 500", array(), true, true);
- } elseif ($this->action === 'showuser') {
- if (User::hasPermission("log.showuser")) {
- $this->listUser();
- }
+ } elseif (self::$action === 'showuser') {
+ self::listUser();
} else {
- if (User::hasPermission("log.showtarget")) {
- $this->listTarget();
- }
+ self::listTarget();
}
}
- private function listUser()
+ private static function listUser()
{
// Query user
$user = Database::queryFirst('SELECT userid, firstname, lastname, email, lastlogin,'
. ' organization.displayname AS orgname FROM sat.user'
. ' LEFT JOIN sat.organization USING (organizationid)'
. ' WHERE userid = :uuid'
- . ' LIMIT 1', array('uuid' => $this->uuid));
+ . ' LIMIT 1', array('uuid' => self::$uuid));
if ($user === false) {
- Message::addError('unknown-userid', $this->uuid);
+ Message::addError('unknown-userid', self::$uuid);
Util::redirect('?do=dozmod&section=actionlog');
}
// Mangle date and render
$user['lastlogin_s'] = date('d.m.Y H:i', $user['lastlogin']);
Render::addTemplate('actionlog-user', $user);
// Finally add the actionlog
- $this->generateLog("SELECT al.dateline, al.targetid, al.description,"
+ self::generateLog("SELECT al.dateline, al.targetid, al.description,"
. " img.displayname AS imgname, usr.firstname AS tfirstname, usr.lastname AS tlastname, l.displayname AS lecturename"
. " FROM sat.actionlog al"
. " LEFT JOIN sat.imagebase img ON (img.imagebaseid = targetid)"
. " LEFT JOIN sat.user usr ON (usr.userid = targetid)"
. " LEFT JOIN sat.lecture l ON (l.lectureid = targetid)"
. " WHERE al.userid = :uuid"
- . " ORDER BY al.dateline DESC LIMIT 500", array('uuid' => $this->uuid), false, true);
+ . " ORDER BY al.dateline DESC LIMIT 500", array('uuid' => self::$uuid), false, true);
}
- private function listTarget()
+ private static function listTarget()
{
// We have to guess what kind of target it is
- if (!$this->addImageHeader()
- && !$this->addLectureHeader()) {
- Message::addError('unknown-targetid', $this->uuid);
+ if (!self::addImageHeader()
+ && !self::addLectureHeader()) {
+ Message::addError('unknown-targetid', self::$uuid);
// Keep going, there might still be log entries for a deleted uuid
}
// Finally add the actionlog
- $this->generateLog("SELECT al.dateline, al.userid AS uuserid, al.description,"
+ self::generateLog("SELECT al.dateline, al.userid AS uuserid, al.description,"
. " usr.firstname AS ufirstname, usr.lastname AS ulastname"
. " FROM sat.actionlog al"
. " LEFT JOIN sat.user usr ON (usr.userid = al.userid)"
. " WHERE al.targetid = :uuid"
- . " ORDER BY al.dateline DESC LIMIT 500", array('uuid' => $this->uuid), true, false);
+ . " ORDER BY al.dateline DESC LIMIT 500", array('uuid' => self::$uuid), true, false);
}
- private function addImageHeader()
+ private static function addImageHeader()
{
$image = Database::queryFirst('SELECT o.userid AS ouserid, o.firstname AS ofirstname, o.lastname AS olastname,'
. ' u.userid AS uuserid, u.firstname AS ufirstname, u.lastname AS ulastname,'
@@ -94,7 +91,7 @@ class Page_dozmod_log extends Page
. ' LEFT JOIN sat.user u ON (img.updaterid = u.userid)'
. ' LEFT JOIN sat.operatingsystem os ON (img.osid = os.osid)'
. ' WHERE img.imagebaseid = :uuid'
- . ' LIMIT 1', array('uuid' => $this->uuid));
+ . ' LIMIT 1', array('uuid' => self::$uuid));
if ($image !== false) {
// Mangle date and render
$image['createtime_s'] = date('d.m.Y H:i', $image['createtime']);
@@ -105,7 +102,7 @@ class Page_dozmod_log extends Page
return $image !== false;
}
- private function addLectureHeader()
+ private static function addLectureHeader()
{
$lecture = Database::queryFirst('SELECT o.userid AS ouserid, o.firstname AS ofirstname, o.lastname AS olastname,'
. ' u.userid AS uuserid, u.firstname AS ufirstname, u.lastname AS ulastname,'
@@ -117,7 +114,7 @@ class Page_dozmod_log extends Page
. ' LEFT JOIN sat.imageversion ver ON (ver.imageversionid = l.imageversionid)'
. ' LEFT JOIN sat.imagebase img ON (img.imagebaseid = ver.imagebaseid)'
. ' WHERE l.lectureid = :uuid'
- . ' LIMIT 1', array('uuid' => $this->uuid));
+ . ' LIMIT 1', array('uuid' => self::$uuid));
if ($lecture !== false) {
// Mangle date and render
$lecture['createtime_s'] = date('d.m.Y H:i', $lecture['createtime']);
@@ -128,7 +125,7 @@ class Page_dozmod_log extends Page
return $lecture !== false;
}
- private function generateLog($query, $params, $showActor, $showTarget)
+ private static function generateLog($query, $params, $showActor, $showTarget)
{
// query action log
$res = Database::simpleQuery($query, $params);
@@ -155,9 +152,12 @@ class Page_dozmod_log extends Page
$data['showTarget'] = true;
}
- $data['allowedShowUser'] = User::hasPermission("log.showuser");
- $data['allowedShowTarget'] = User::hasPermission("log.showtarget");
Render::addTemplate('actionlog-log', $data);
}
+ public static function doAjax()
+ {
+
+ }
+
} \ No newline at end of file
diff --git a/modules-available/dozmod/pages/expiredimages.inc.php b/modules-available/dozmod/pages/expiredimages.inc.php
new file mode 100644
index 00000000..2b5a2274
--- /dev/null
+++ b/modules-available/dozmod/pages/expiredimages.inc.php
@@ -0,0 +1,97 @@
+<?php
+
+class SubPage
+{
+
+ public static function doPreprocess()
+ {
+ $action = Request::post('action', false, 'string');
+
+ if ($action === 'delimages') {
+ if (User::hasPermission("expiredimages.delete")) {
+ $result = self::handleDeleteImages();
+ if (!empty($result)) {
+ Message::addInfo('delete-images', $result);
+ }
+ Util::redirect('?do=DozMod');
+ }
+ }
+ }
+
+ private static function handleDeleteImages()
+ {
+ $images = Request::post('images', false);
+ if (is_array($images)) {
+ foreach ($images as $image => $val) {
+ if (strtolower($val) !== 'on')
+ continue;
+ Database::exec("UPDATE sat.imageversion SET deletestate = 'WANT_DELETE'"
+ . " WHERE deletestate = 'SHOULD_DELETE' AND imageversionid = :imageversionid", array(
+ 'imageversionid' => $image
+ ));
+ }
+ if (!empty($images)) {
+ $ret = Download::asStringPost('http://127.0.0.1:9080/do/delete-images', false, 10, $code);
+ if ($code == 999) {
+ $ret .= "\nConnection to DMSD failed.";
+ }
+ return $ret;
+ }
+ }
+ return false;
+ }
+
+ private static function loadExpiredImages()
+ {
+ $res = Database::simpleQuery("SELECT b.displayname,"
+ . " own.firstname, own.lastname, own.email,"
+ . " v.imageversionid, v.createtime, v.filesize, v.deletestate,"
+ . " lat.expiretime AS latexptime, lat.deletestate AS latdelstate"
+ . " FROM sat.imageversion v"
+ . " INNER JOIN sat.imagebase b ON (b.imagebaseid = v.imagebaseid)"
+ . " INNER JOIN sat.user own ON (b.ownerid = own.userid)"
+ . " LEFT JOIN sat.imageversion lat ON (b.latestversionid = lat.imageversionid)"
+ . " WHERE v.deletestate <> 'KEEP'"
+ . " ORDER BY b.displayname ASC, v.createtime ASC");
+ $NOW = time();
+ $rows = array();
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ if ($row['latexptime'] > $NOW && $row['latdelstate'] === 'KEEP') {
+ $row['hasNewerClass'] = 'glyphicon-ok green';
+ $row['checked'] = 'checked';
+ } else {
+ $row['hasNewerClass'] = 'glyphicon-remove red';
+ }
+ if ($row['deletestate'] === 'WANT_DELETE') {
+ $row['name_extra_class'] = 'slx-strike';
+ }
+ $row['version'] = date('d.m.Y H:i:s', $row['createtime']);
+ $row['rawfilesize'] = $row['filesize'];
+ $row['filesize'] = Util::readableFileSize($row['filesize']);
+ $rows[] = $row;
+ }
+ return $rows;
+ }
+
+ public static function doRender()
+ {
+ $expiredImages = self::loadExpiredImages();
+
+ if (empty($expiredImages)) {
+ Message::addSuccess('no-expired-images');
+ } else {
+ Render::addTemplate('images-delete', array('images' => $expiredImages, 'allowedDelete' => User::hasPermission("expiredimages.delete")));
+ }
+ }
+
+ public static function doAjax()
+ {
+ $action = Request::post('action');
+ if ($action === 'delimages') {
+ User::assertPermission("expiredimages.delete");
+ die(self::handleDeleteImages());
+ }
+ die('Huh?');
+ }
+
+}
diff --git a/modules-available/dozmod/pages/ldapfilters.inc.php b/modules-available/dozmod/pages/ldapfilters.inc.php
new file mode 100644
index 00000000..d0ae41b8
--- /dev/null
+++ b/modules-available/dozmod/pages/ldapfilters.inc.php
@@ -0,0 +1,119 @@
+<?php
+
+class SubPage
+{
+ private static $show;
+
+ public static function doPreprocess()
+ {
+ self::$show = Request::any('show', false, 'string');
+ $action = Request::post('action');
+
+ if ($action === 'deleteFilter') {
+ User::assertPermission("ldapfilters.save");
+ self::deleteLdapFilter();
+ } else if ($action === 'saveFilter') {
+ User::assertPermission("ldapfilters.save");
+ self::saveLdapFilter();
+ }
+ User::assertPermission("ldapfilters.view");
+ }
+
+ public static function doRender()
+ {
+ if (self::$show === false) {
+ // Get all ldapfilters from the sat db.
+ $ldapfilters = Database::queryAll("SELECT filterid, filtername, filterkey, filtervalue FROM sat.presetlecturefilter
+ WHERE filtertype ='LDAP' ORDER BY filtername ASC");
+
+ $data = array(
+ 'ldapfilters' => $ldapfilters,
+ 'hasEditPermission' => User::hasPermission('ldapfilters.save')
+ );
+
+ Render::addTemplate('ldapfilters', $data);
+ } else if (self::$show === 'edit') {
+ $filterid = Request::get('filterid', false, 'int');
+
+ if ($filterid === false) {
+ Render::addTemplate('ldapfilter-add', array(
+ 'filterid' => 0
+ ));
+ } else {
+ $ldapfilter = Database::queryFirst("SELECT filterid, filtername, filterkey, filtervalue FROM sat.presetlecturefilter
+ WHERE filterid = :id AND filtertype = 'LDAP'", array( 'id' => $filterid));
+ // TODO: Show error if not exists
+
+ Render::addTemplate('ldapfilter-add', $ldapfilter);
+ }
+ }
+ }
+
+ private static function deleteLdapFilter() {
+ User::assertPermission('ldapfilters.save');
+ $filterid = Request::post('filterid', false, 'int');
+ if ($filterid === false) {
+ Message::addError('ldap-filter-id-missing');
+ return;
+ }
+ $res = Database::exec("DELETE FROM sat.presetlecturefilter WHERE filterid = :id AND filtertype = 'LDAP'", array('id' => $filterid));
+ if ($res !== 1) {
+ Message::addWarning('ldap-invalid-filter-id', $filterid);
+ } else {
+ Message::addSuccess('ldap-filter-deleted');
+ }
+ }
+
+ private static function saveLdapFilter() {
+ $filterid = Request::post('filterid', '', 'int');
+ $filtername = Request::post('filtername', false, 'string');
+ $filterattribute = Request::post('attribute', false, 'string');
+ $filtervalue = Request::post('value', false, 'string');
+
+ if ($filtername === false || $filterattribute === false || $filtervalue === false) {
+ Message::addError('ldap-filter-save-missing-information');
+ return;
+ }
+
+ if ($filterid === 0) {
+ // Insert filter in the db.
+ $res = Database::exec("INSERT INTO sat.presetlecturefilter (filtertype, filtername, filterkey, filtervalue)
+ VALUES ('LDAP', :filtername, :attribute, :value)", array(
+ 'filtername' => $filtername,
+ 'attribute' => $filterattribute,
+ 'value' => $filtervalue
+ ));
+
+ if ($res !== 1) {
+ Message::addError('ldap-filter-insert-failed');
+ } else {
+ Message::addSuccess('ldap-filter-created');
+ }
+
+ } else {
+ // Update filter in the db.
+ $res = Database::exec("UPDATE sat.presetlecturefilter SET
+ filtername = :filtername, filterkey = :attribute, filtervalue = :value
+ WHERE filterid = :filterid AND filtertype = 'LDAP'", array(
+ 'filterid' => $filterid,
+ 'filtername' => $filtername,
+ 'attribute' => $filterattribute,
+ 'value' => $filtervalue
+ ));
+
+ if ($res !== 1) {
+ Message::addError('ldap-filter-insert-failed');
+ } else {
+ Message::addSuccess('ldap-filter-saved');
+ }
+
+ }
+ Util::redirect("?do=dozmod&section=ldapfilters");
+ }
+
+ public static function doAjax()
+ {
+
+ }
+
+} \ No newline at end of file
diff --git a/modules-available/dozmod/pages/mailconfig.inc.php b/modules-available/dozmod/pages/mailconfig.inc.php
new file mode 100644
index 00000000..08205f2e
--- /dev/null
+++ b/modules-available/dozmod/pages/mailconfig.inc.php
@@ -0,0 +1,96 @@
+<?php
+
+class SubPage
+{
+
+ public static function doPreprocess()
+ {
+ $action = Request::post('action', false, 'string');
+
+ if ($action === 'mail') {
+ User::assertPermission("mailconfig.save");
+ self::mailHandler();
+ }
+ }
+
+ private static function mailHandler()
+ {
+ // Check action
+ $do = Request::post('button');
+ if ($do === 'save') {
+ // Prepare array
+ $data = self::cleanMailArray();
+ $data = json_encode($data);
+ Database::exec('INSERT INTO sat.configuration (parameter, value)'
+ . ' VALUES (:param, :value)'
+ . ' ON DUPLICATE KEY UPDATE value = VALUES(value)', array(
+ 'param' => 'mailconfig',
+ 'value' => $data
+ ));
+ Message::addSuccess('mail-config-saved');
+ } else {
+ Message::addError('main.invalid-action', $do);
+ }
+ Util::redirect('?do=DozMod&section=mailconfig');
+ }
+
+ private static function cleanMailArray()
+ {
+ $keys = array('host', 'port', 'ssl', 'senderAddress', 'replyTo', 'username', 'password', 'serverName');
+ $data = array();
+ foreach ($keys as $key) {
+ $data[$key] = Request::post($key, '');
+ settype($data[$key], 'string');
+ if (is_numeric($data[$key])) {
+ settype($data[$key], 'int');
+ }
+ }
+ return $data;
+ }
+
+ public static function doRender()
+ {
+ // Mail config
+ $mailConf = Database::queryFirst('SELECT value FROM sat.configuration WHERE parameter = :param', array('param' => 'mailconfig'));
+ if ($mailConf != null) {
+ $mailConf = @json_decode($mailConf['value'], true);
+ if (is_array($mailConf)) {
+ $mailConf['set_' . $mailConf['ssl']] = 'selected="selected"';
+ }
+ }
+ Permission::addGlobalTags($mailConf['perms'], null, ['mailconfig.save']);
+ Render::addTemplate('mailconfig', $mailConf);
+ }
+
+ public static function doAjax()
+ {
+ User::assertPermission("mailconfig.save");
+ $action = Request::post('action');
+ if ($action === 'mail') {
+ self::handleTestMail();
+ }
+ }
+
+ private static function handleTestMail()
+ {
+ $do = Request::post('button');
+ if ($do === 'test') {
+ // Prepare array
+ $data = self::cleanMailArray();
+ Header('Content-Type: text/plain; charset=utf-8');
+ $data['recipient'] = Request::post('recipient', '');
+ if (!preg_match('/.+@.+\..+/', $data['recipient'])) {
+ $result = 'No recipient given!';
+ } else {
+ $result = Download::asStringPost('http://127.0.0.1:9080/do/mailtest', $data, 10, $code);
+ if ($code == 999) {
+ $result .= "\nTimeout.";
+ } elseif ($code != 200) {
+ $result .= "\nReturn code $code";
+ }
+ }
+ die($result);
+ }
+ }
+
+}
diff --git a/modules-available/dozmod/pages/networkrules.inc.php b/modules-available/dozmod/pages/networkrules.inc.php
new file mode 100644
index 00000000..6011e3ff
--- /dev/null
+++ b/modules-available/dozmod/pages/networkrules.inc.php
@@ -0,0 +1,98 @@
+<?php
+
+class SubPage
+{
+
+ public static function doPreprocess()
+ {
+ $action = Request::post('action', '', 'string');
+
+ if ($action === 'delete') {
+ User::assertPermission('networkrules.save');
+ $ruleid = Request::post('ruleid', false, 'int');
+ if ($ruleid !== false) {
+ $res = Database::exec('DELETE FROM sat.presetnetworkrules WHERE ruleid = :ruleid', ['ruleid' => $ruleid]);
+ if ($res !== false) {
+ Message::addSuccess('networkrule-deleted');
+ }
+ }
+ } else if ($action === 'save') {
+ User::assertPermission('networkrules.save');
+ $ruleid = Request::post('ruleid', 0, 'int');
+ $rulename = Request::post('rulename', '', 'string');
+ $host = Request::post('host', '', 'string');
+ $port = Request::post('port', '', 'string');
+ $direction = Request::post('direction', '', 'string');
+
+ if (!in_array($direction, ['IN', 'OUT'], true)) {
+ Message::addError('networkrule-invalid-direction', $direction);
+ } elseif (empty($host)) {
+ Message::addError('networkrule-missing-host');
+ } elseif (empty($port)) {
+ Message::addError('networkrule-missing-port');
+ } else {
+ $data = json_encode([
+ 'host' => $host,
+ 'port' => $port,
+ 'direction' => $direction
+ ]);
+ if ($ruleid !== 0) {
+ Database::exec('UPDATE sat.presetnetworkrules SET rulename = :rulename, ruledata = :data'
+ .' WHERE ruleid = :ruleid', compact('ruleid', 'rulename', 'data'));
+ } else {
+ Database::exec('INSERT INTO sat.presetnetworkrules (rulename, ruledata)'
+ .' VALUES (:rulename, :data)', compact('rulename', 'data'));
+ }
+ Message::addSuccess('networkrule-saved');
+ }
+ }
+ if (Request::isPost()) {
+ Util::redirect('?do=dozmod&section=networkrules');
+ }
+ User::assertPermission('networkrules.view');
+ }
+
+ public static function doRender()
+ {
+ $show = Request::get('show', 'list', 'string');
+ if ($show === 'list') {
+ $res = Database::simpleQuery('SELECT ruleid, rulename, ruledata
+ FROM sat.presetnetworkrules ORDER BY rulename ASC');
+ $rows = array();
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $dec = json_decode($row['ruledata'], true);
+ if (!is_array($dec)) {
+ $dec = [];
+ }
+ $rows[] = $row + $dec;
+ }
+ Render::addTemplate('networkrules', [
+ 'networkrules' => $rows,
+ 'hasEditPermissions' => User::hasPermission('networkrules.save')
+ ]);
+ } else if ($show === 'edit') {
+ $ruleid = Request::get('ruleid', 0, 'int');
+ if ($ruleid === 0) {
+ $data = [];
+ } else {
+ $data = Database::queryFirst('SELECT ruleid, rulename, ruledata
+ FROM sat.presetnetworkrules WHERE ruleid = :ruleid', ['ruleid' => $ruleid]);
+ if ($data === false) {
+ Message::addError('networkrule-invalid-ruleid', $ruleid);
+ Util::redirect('?do=dozmod&section=networkrules');
+ }
+ $dec = json_decode($data['ruledata'], true);
+ if (is_array($dec)) {
+ $data += $dec;
+ }
+ if ($data['direction'] === 'IN') {
+ $data['inSelected'] = 'selected';
+ } else {
+ $data['outSelected'] = 'selected';
+ }
+ }
+ Render::addTemplate('networkrules-edit', $data);
+ }
+ }
+
+}
diff --git a/modules-available/dozmod/pages/networkshares.inc.php b/modules-available/dozmod/pages/networkshares.inc.php
new file mode 100644
index 00000000..659321b4
--- /dev/null
+++ b/modules-available/dozmod/pages/networkshares.inc.php
@@ -0,0 +1,108 @@
+<?php
+
+class SubPage
+{
+
+ public static function doPreprocess()
+ {
+ $action = Request::post('action', '', 'string');
+
+ if ($action === 'delete') {
+ User::assertPermission('networkshares.save');
+ $shareid = Request::post('shareid', false, 'int');
+ if ($shareid !== false) {
+ $res = Database::exec('DELETE FROM sat.presetnetworkshare WHERE shareid = :shareid', ['shareid' => $shareid]);
+ if ($res !== false) {
+ Message::addSuccess('networkshare-deleted');
+ }
+ }
+ } else if ($action === 'save') {
+ User::assertPermission('networkshares.save');
+ $shareid = Request::post('shareid', 0, 'int');
+ $sharename = Request::post('sharename', '', 'string');
+ $path = Request::post('path', false, 'string');
+ $target = Request::post('target', '', 'string');
+ $authType = Request::post('auth', '', 'string');
+ $username = Request::post('username', '', 'string');
+ $password = Request::post('password', '', 'string');
+ if (!in_array($authType, ['LOGIN_USER', 'OTHER_USER'], true)) {
+ Message::addError('networkshare-invalid-auth-type', $authType);
+ } elseif (empty($path)) {
+ Message::addError('networkshare-missing-path');
+ } else {
+ $data = json_encode([
+ 'auth' => $authType,
+ 'path' => $path,
+ 'displayname' => $sharename,
+ 'mountpoint' => $target,
+ 'username' => $username,
+ 'password' => $password,
+ ]);
+ if ($shareid !== 0) {
+ Database::exec('UPDATE sat.presetnetworkshare SET sharename = :sharename, sharedata = :data'
+ .' WHERE shareid = :shareid', compact('shareid', 'sharename', 'data'));
+ } else {
+ Database::exec('INSERT INTO sat.presetnetworkshare (sharename, sharedata, active)'
+ .' VALUES (:sharename, :data, 1)', compact('sharename', 'data'));
+ }
+ Message::addSuccess('networkshare-saved');
+ }
+ } else if ($action === 'activate' || $action === 'deactivate') {
+ User::assertPermission('networkshares.save');
+ $shareid = Request::post('shareid', false, 'int');
+ $active = ($action === 'activate' ? 1 : 0);
+ Database::exec('UPDATE sat.presetnetworkshare SET active = :active WHERE shareid = :shareid', compact('active', 'shareid'));
+ }
+ if (Request::isPost()) {
+ Util::redirect('?do=dozmod&section=networkshares');
+ }
+ User::assertPermission('networkshares.view');
+ }
+
+ public static function doRender()
+ {
+ $show = Request::get('show', 'list', 'string');
+ if ($show === 'list') {
+ $res = Database::simpleQuery('SELECT shareid, sharename, sharedata, active
+ FROM sat.presetnetworkshare ORDER BY sharename ASC');
+ $rows = array();
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $dec = json_decode($row['sharedata'], true);
+ if (!is_array($dec)) {
+ $dec = [];
+ }
+ if ($dec['auth'] === 'LOGIN_USER') {
+ $row['loginAsUser'] = true;
+ }
+ $rows[] = $row + $dec;
+ }
+ Render::addTemplate('networkshares', [
+ 'networkshares' => $rows,
+ 'hasEditPermissions' => User::hasPermission('networkshares.save')
+ ]);
+ } else if ($show === 'edit') {
+ $shareid = Request::get('shareid', 0, 'int');
+ if ($shareid === 0) {
+ $data = [];
+ } else {
+ $data = Database::queryFirst('SELECT shareid, sharename, sharedata
+ FROM sat.presetnetworkshare WHERE shareid = :shareid', ['shareid' => $shareid]);
+ if ($data === false) {
+ Message::addError('networkshare-invalid-shareid', $shareid);
+ Util::redirect('?do=dozmod&section=networkshares');
+ }
+ $dec = json_decode($data['sharedata'], true);
+ if (is_array($dec)) {
+ $data += $dec;
+ }
+ if ($data['auth'] === 'LOGIN_USER') {
+ $data['loggedInUser_selected'] = 'selected';
+ } else {
+ $data['specificUser_selected'] = 'selected';
+ }
+ }
+ Render::addTemplate('networkshares-edit', $data);
+ }
+ }
+
+}
diff --git a/modules-available/dozmod/pages/runscripts.inc.php b/modules-available/dozmod/pages/runscripts.inc.php
new file mode 100644
index 00000000..c6566c13
--- /dev/null
+++ b/modules-available/dozmod/pages/runscripts.inc.php
@@ -0,0 +1,133 @@
+<?php
+
+class SubPage
+{
+
+ public static function doPreprocess()
+ {
+ /* execute actions */
+ $action = Request::post('action', false, 'string');
+
+ if ($action === 'save') {
+ User::assertPermission("runscripts.save");
+ self::saveScript();
+ }
+
+ if (Request::isPost()) {
+ Util::redirect('?do=dozmod&section=runscripts');
+ }
+ User::assertPermission('runscripts.view');
+ }
+
+ private static function saveScript()
+ {
+ $id = Request::post('runscriptid', false, 'int');
+ $scriptname = Request::post('scriptname', '', 'string');
+ if ($id === false) {
+ Message::addError('main.parameter-missing', 'runscriptid');
+ return;
+ }
+ $data = [
+ 'scriptname' => $scriptname,
+ 'content' => Request::post('content', '', 'string'),
+ 'visibility' => Request::post('visibility', 1, 'int'),
+ 'extension' => preg_replace('/[^a-z0-9_\-~\!\$\=]/i', '', Request::post('extension', '', 'string')),
+ 'passcreds' => Request::post('passcreds', 0, 'int') !== 0,
+ 'isglobal' => Request::post('isglobal', 0, 'int') !== 0,
+ ];
+ if ($id === 0) {
+ // New entry
+ $ret = Database::exec('INSERT INTO sat.presetrunscript
+ (scriptname, content, extension, visibility, passcreds, isglobal) VALUES
+ (:scriptname, :content, :extension, :visibility, :passcreds, :isglobal)', $data);
+ $id = Database::lastInsertId();
+ } else {
+ // Edit entry
+ $data['id'] = $id;
+ Database::exec('UPDATE sat.presetrunscript SET
+ scriptname = :scriptname, content = :content, extension = :extension, visibility = :visibility,
+ passcreds = :passcreds, isglobal = :isglobal
+ WHERE runscriptid = :id', $data);
+ }
+ $oslist = Request::post('osid', false, 'array');
+ if (is_array($oslist)) {
+ $oslist = array_filter($oslist, 'is_numeric');
+ $query = Database::prepare('INSERT INTO sat.presetrunscript_x_operatingsystem
+ (runscriptid, osid) VALUES (:id, :osid)');
+ foreach ($oslist as $osid) {
+ $query->execute(['id' => $id, 'osid' => $osid]);
+ }
+ $query->closeCursor();
+ Database::exec('DELETE FROM sat.presetrunscript_x_operatingsystem
+ WHERE runscriptid = :id AND osid NOT IN (:oslist)', ['id' => $id, 'oslist' => $oslist]);
+ }
+ Message::addSuccess('runscript-saved');
+ }
+
+ public static function doRender()
+ {
+ $show = Request::get('show', 'list', 'string');
+ if ($show === 'list') {
+ $res = Database::simpleQuery('SELECT runscriptid, scriptname, extension, visibility, passcreds, isglobal
+ FROM sat.presetrunscript
+ ORDER BY scriptname ASC');
+ $rows = [];
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ if ($row['visibility'] == 0) {
+ $row['visibility'] = 'eye-close';
+ } elseif ($row['visibility'] == 1) {
+ $row['visibility'] = 'eye-open';
+ } else {
+ $row['visibility'] = 'arrow-down';
+ }
+ $rows[] = $row;
+ }
+ Render::addTemplate('runscripts-list', ['list' => $rows, 'hasEditPermission' => User::hasPermission('runscripts.save')]);
+ } elseif ($show === 'edit') {
+ // Edit
+ $id = Request::get('runscriptid', false, 'int');
+ if ($id === false) {
+ Message::addError('main.parameter-missing', 'runscriptid');
+ Util::redirect('?do=dozmod&section=runscripts');
+ }
+ if ($id === 0) {
+ $row = [
+ 'runscriptid' => 0,
+ 'visibility_1_checked' => 'checked',
+ 'isglobal_1_checked' => 'checked',
+ ];
+ } else {
+ $row = Database::queryFirst('SELECT runscriptid, scriptname, content, extension, visibility, passcreds, isglobal
+ FROM sat.presetrunscript
+ WHERE runscriptid = :runscriptid', ['runscriptid' => $id]);
+ $row['visibility_' . $row['visibility'] . '_selected'] = 'selected';
+ $row['passcreds_checked'] = $row['passcreds'] ? 'checked' : '';
+ $row['isglobal_' . $row['isglobal'] . '_checked'] = 'checked';
+ if ($row === false) {
+ Message::addError('runscript-invalid-id', $id);
+ Util::redirect('?do=dozmod&section=runscripts');
+ }
+ }
+ // Get OS
+ $row['oslist'] = [];
+ $res = Database::simpleQuery('SELECT o.osid, o.displayname, pxo.osid AS isvalid FROM sat.operatingsystem o
+ LEFT JOIN sat.presetrunscript_x_operatingsystem pxo ON (o.osid = pxo.osid AND pxo.runscriptid = :runscriptid)
+ ORDER BY o.displayname ASC', ['runscriptid' => $id]);
+ while ($osrow = $res->fetch(PDO::FETCH_ASSOC)) {
+ $row['oslist'][] = [
+ 'osid' => $osrow['osid'],
+ 'displayname' => $osrow['displayname'],
+ 'checked' => $osrow['isvalid'] ? 'checked' : '',
+ ];
+ }
+ // Output
+ Render::addTemplate('runscripts-edit', $row);
+ }
+ }
+
+ public static function doAjax()
+ {
+
+ }
+
+}
diff --git a/modules-available/dozmod/pages/runtimeconfig.inc.php b/modules-available/dozmod/pages/runtimeconfig.inc.php
new file mode 100644
index 00000000..63ba4650
--- /dev/null
+++ b/modules-available/dozmod/pages/runtimeconfig.inc.php
@@ -0,0 +1,112 @@
+<?php
+
+class SubPage
+{
+
+ public static function doPreprocess()
+ {
+ /* execute actions */
+ $action = Request::post('action', false, 'string');
+
+ if ($action === 'runtime') {
+ User::assertPermission("runtimeconfig.save");
+ self::runtimeHandler();
+ }
+ }
+
+ private static function runtimeHandler()
+ {
+ // Check action
+ $do = Request::post('button');
+ if ($do === 'save') {
+ $data = [];
+ $data['defaultLecturePermissions'] = Request::post('defaultLecturePermissions', NULL, "array");
+ $data['defaultImagePermissions'] = Request::post('defaultImagePermissions', NULL, "array");
+