Compare commits
328 Commits
Author | SHA1 | Date | |
---|---|---|---|
d860676bba | |||
99cf1f9d65 | |||
09f32100f2 | |||
1d89b7562c | |||
fc25f35655 | |||
f15ce27cde | |||
739adf3f89 | |||
85a78c9cd1 | |||
a844768d08 | |||
e9186b3c14 | |||
39c315c09b | |||
727663d67c | |||
|
d141167c3e | ||
8f56f0ea81 | |||
6e93210976 | |||
3aa0f022d5 | |||
d819e20721 | |||
bf254a2604 | |||
e51e3ad24d | |||
19023b3cdc | |||
|
90f1001d16 | ||
2ff5ea3fb6 | |||
f3ec6dd53b | |||
7dd680cea1 | |||
1d7b27a99d | |||
d19ae22a8b | |||
17622b1d40 | |||
afa92d45cc | |||
68b0c8619e | |||
04826f394a | |||
|
71aaceba56 | ||
|
3019cdc831 | ||
559ec80248 | |||
4588710478 | |||
8597446abc | |||
01dba643ba | |||
f9fd80423f | |||
f29be662a6 | |||
|
df2ed6fdee | ||
|
47a38fab3e | ||
|
a1a798785b | ||
|
85c4caefdd | ||
11bb9a9b58 | |||
7489f0d368 | |||
69fc8b8701 | |||
86ac3dc434 | |||
e10b59ad06 | |||
dce9f2e339 | |||
56d17d567a | |||
2ef473d2c1 | |||
22a3690d67 | |||
2ff3e8c4f0 | |||
6eef9e8762 | |||
|
01eff99db9 | ||
9a0c9f42a1 | |||
9f94e73dd2 | |||
77ed17082f | |||
39d3d2b7b0 | |||
dc006e0a50 | |||
12f4cebe31 | |||
d21482ae8a | |||
f324249c8c | |||
6130b6f2af | |||
849cb79b0f | |||
150fdbd3da | |||
0b2bff871f | |||
f845cb628e | |||
3478bf187d | |||
|
821de1baec | ||
f2d9674f02 | |||
8cec341fd0 | |||
a201761bc3 | |||
63a2a71245 | |||
5a6b4e5437 | |||
4f6b2624e2 | |||
dc2e139556 | |||
5ea2f8416a | |||
36aa4f4b74 | |||
7113ab3158 | |||
96e1f4047e | |||
239e62d979 | |||
338d5a9976 | |||
36f8f68f9f | |||
da1a171fbc | |||
|
8bf1e34fce | ||
|
ccc9bdfbb0 | ||
|
5a93a16303 | ||
7cfe7d6a4d | |||
95c37f1777 | |||
547a415488 | |||
032306866a | |||
2779206a1a | |||
6e3f6a4201 | |||
5d728ed7fd | |||
16879885c5 | |||
fc965fd285 | |||
1c0b4f48c9 | |||
e94ba149df | |||
5afc23c446 | |||
003ba6f46b | |||
13729dac93 | |||
8bb1551f7a | |||
d9a8afeb57 | |||
d7c18215c5 | |||
2334a0ed0a | |||
e61706955a | |||
b77e2a9743 | |||
4f43280bd1 | |||
e7ae0845d8 | |||
0cfb7a74f5 | |||
84467fbb8d | |||
afa06b21e2 | |||
6747e2f557 | |||
2559630e8f | |||
097ee2b0d9 | |||
50c0b50abf | |||
f26af7f05d | |||
b42f5bdd0d | |||
92847d1a52 | |||
2532f3bc01 | |||
441e88dfa9 | |||
0f86f558ec | |||
621f5951c4 | |||
4e6eff55e5 | |||
03265a1fb0 | |||
9aef0fb2d4 | |||
|
3ee7fca025 | ||
845d250b88 | |||
efe6caee71 | |||
dcd5ecebfa | |||
32b9ba862b | |||
eb65ec9329 | |||
d6c18a5ef7 | |||
3ea9c6c893 | |||
4cd7bab1be | |||
95d95daa34 | |||
|
b5d05f5411 | ||
|
13ca97f10d | ||
|
4f483abe26 | ||
|
2400cd2588 | ||
|
035479f7a2 | ||
|
b969bf7717 | ||
|
463ff10744 | ||
|
2b3b897545 | ||
|
875bccb9d0 | ||
|
d753a68a9e | ||
|
ae2d6e95bb | ||
|
15c1127cb7 | ||
|
dbd2a058e2 | ||
|
9df971df14 | ||
|
34765f7180 | ||
|
cb373fb7f2 | ||
|
701c8e2251 | ||
a749909f90 | |||
6a867b4a92 | |||
|
d02b113f93 | ||
|
aee46f9e2a | ||
|
c053bfe283 | ||
|
7ff174aa86 | ||
|
ff141e42f2 | ||
|
1700b128b0 | ||
|
2261c1cfbe | ||
|
a68b9e6e9c | ||
|
02c43a147d | ||
|
483bc80180 | ||
|
71f9b1fa6a | ||
|
81c84f3702 | ||
|
ab922fd519 | ||
|
4257b6f87b | ||
|
049def144e | ||
|
acc86b9221 | ||
|
3715d2207e | ||
|
5595bd0f6e | ||
|
2a5943c058 | ||
|
9d9cbf7e81 | ||
|
3d368c6783 | ||
|
9cc2833364 | ||
|
f4e99a3d52 | ||
|
03dec2afb2 | ||
|
2bcffd5f4a | ||
|
84bd011a11 | ||
|
74bc8de4fb | ||
|
893d455a32 | ||
|
d61a9d30f7 | ||
|
d308977a00 | ||
|
8a39697351 | ||
|
c48cf51e58 | ||
|
acfd461617 | ||
|
0829a0bd2b | ||
|
36283f4f87 | ||
|
735225dea8 | ||
|
dd92249a0a | ||
|
7f290fd2b2 | ||
|
a58c7774a0 | ||
|
de5717e2f2 | ||
|
d0db10ae6e | ||
|
374e3307d9 | ||
|
7418e57075 | ||
|
32d64d8600 | ||
|
f65b49d49b | ||
|
b34f1727c0 | ||
|
bd97e06dab | ||
|
21d0e5ada6 | ||
|
419f161723 | ||
|
47ba545e4c | ||
|
2d77bc03f6 | ||
|
e43c517b49 | ||
|
1388151bf8 | ||
|
7cc810c683 | ||
|
e304901bd0 | ||
|
d70bfbcce0 | ||
|
a0a9a7f708 | ||
|
43e69a0e3a | ||
|
83e861cf9b | ||
|
3d42b81053 | ||
|
4eb81a1fd7 | ||
|
4bd0b9dd37 | ||
|
ffbd9397ab | ||
|
47b4a82da2 | ||
|
a0d3403cb5 | ||
|
f069d8d9b6 | ||
|
b1e2624702 | ||
|
a99a621a66 | ||
|
64f27e8805 | ||
|
d916b10276 | ||
|
e5833dcc75 | ||
|
5459b5ff4b | ||
|
4087a5f9bc | ||
|
8ff4c21993 | ||
|
1d69ead8f2 | ||
|
024fc33d78 | ||
|
fd24c49f5b | ||
|
a9b87cf5e7 | ||
|
d69f6463b4 | ||
|
b1113fcbe1 | ||
|
03dc8d7bbf | ||
|
03f4b241b3 | ||
|
755078d223 | ||
|
af1d15c401 | ||
|
d9f8b2366e | ||
|
2c0ebbe7c9 | ||
|
3e617ff62e | ||
|
ad270cf968 | ||
|
d97b7c45c6 | ||
|
465172329b | ||
|
68ec93abf6 | ||
|
4cd3cd3e47 | ||
|
07b1d1310b | ||
|
836ffcc62a | ||
|
d749e58621 | ||
|
e2b5238b78 | ||
|
b77ee7efb0 | ||
|
fd597941ee | ||
|
cecdbacf8a | ||
|
4524bafd0a | ||
|
3903449edc | ||
|
59e5325785 | ||
|
f82f10ee71 | ||
|
af3ebb058e | ||
|
3e5f3c254c | ||
|
fb7bddebdc | ||
|
eb71d62ffd | ||
|
79d789f98d | ||
|
10dcf26128 | ||
|
3994000200 | ||
|
828e59d53f | ||
|
63a083804c | ||
|
ade7d13151 | ||
|
cee36b75fc | ||
|
a2b897f91e | ||
|
904d5588e7 | ||
|
1f6946ec44 | ||
|
5b743ecdec | ||
|
491676f37e | ||
|
190f7914f4 | ||
|
91683c4de0 | ||
|
f8571cfa67 | ||
|
c2c0953aff | ||
|
86bfe87956 | ||
|
3cdfd8fd3c | ||
|
c1abc7376e | ||
|
95701358da | ||
|
2acc073581 | ||
|
85734d07a5 | ||
|
79d901847f | ||
|
923b9c944a | ||
|
01217e6b7d | ||
|
ecb7d3643f | ||
|
e453ed2757 | ||
|
cb85159474 | ||
|
fcb70074bf | ||
|
5bf6ed1acd | ||
|
0656e7d8f2 | ||
|
3d8cc81ced | ||
|
3988fe9724 | ||
|
9a054da64b | ||
|
42bb76d504 | ||
|
b39c9a8d33 | ||
|
9f4db8d39d | ||
|
7c65433c5f | ||
|
f9965f4d10 | ||
|
ecfe7ebfc4 | ||
|
d98d0e04d8 | ||
|
958423ef35 | ||
|
5b91e98928 | ||
|
2b31cc8d33 | ||
|
3a17dd02ab | ||
|
c37027ebb0 | ||
|
8824ee3923 | ||
|
c64d4d3525 | ||
|
dcc2f75732 | ||
|
a126c76477 | ||
|
67809dc9d9 | ||
|
461f9ed8e2 | ||
|
fa7330b365 | ||
|
23e6e1edb5 | ||
|
e674c47058 | ||
|
a5736fc53f | ||
|
21d38e3fd9 | ||
|
eedb94d05a | ||
|
92b23e9cd8 | ||
|
35fe72e503 | ||
|
ecad44411f | ||
|
d47e4fe437 | ||
|
28443beb9e | ||
|
e2ffddf9b5 | ||
|
1628945de0 | ||
|
0b69213378 |
50
.gitignore
vendored
@ -1,55 +1,9 @@
|
||||
# IDE folders
|
||||
.idea
|
||||
|
||||
src/.idea/workspace.xml
|
||||
src/mibew/install/package
|
||||
src/absent_*
|
||||
src/release*
|
||||
src/upload*
|
||||
src/*.po
|
||||
|
||||
# Do not index actual configuration files
|
||||
src/mibew/configs/config.yml
|
||||
src/tests/server_side/mibew/libs/config.php
|
||||
|
||||
# Do not index avatars
|
||||
src/mibew/files/avatar/*
|
||||
!src/mibew/files/avatar/.keep
|
||||
|
||||
# Do not index cache files
|
||||
src/mibew/cache/*
|
||||
!src/mibew/cache/.keep
|
||||
!src/mibew/cache/.htaccess
|
||||
|
||||
# Do not index plugins
|
||||
src/mibew/plugins/*
|
||||
!src/mibew/plugins/.keep
|
||||
|
||||
# Do not index custom locales
|
||||
src/mibew/locales/*
|
||||
!src/mibew/locales/en/
|
||||
|
||||
# Do not index composer files
|
||||
src/composer.phar
|
||||
src/composer.lock
|
||||
|
||||
# Do not index third-party libraries
|
||||
src/mibew/vendor
|
||||
src/mibew/js/vendor
|
||||
|
||||
# Do not index node.js modules that are used for building
|
||||
src/node_modules
|
||||
src/package-lock.json
|
||||
|
||||
# Do not index compiled js files of the core
|
||||
src/mibew/js/compiled/*
|
||||
!src/mibew/js/compiled/.keep
|
||||
|
||||
# Do not index compiled files of chat styles
|
||||
src/mibew/styles/chats/*/templates_compiled/client_side/*
|
||||
!src/mibew/styles/chats/*/templates_compiled/client_side/.keep
|
||||
src/mibew/styles/chats/*/js/compiled/*
|
||||
!src/mibew/styles/chats/*/js/compiled/.keep
|
||||
|
||||
# Do not index compiled files of page styles
|
||||
src/mibew/styles/pages/*/templates_compiled/client_side/*
|
||||
!src/mibew/styles/pages/*/templates_compiled/client_side/.keep
|
||||
!src/mibew/locales/names/
|
||||
|
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
||||
[submodule "src/i18n"]
|
||||
path = src/i18n
|
||||
url = git@github.com:Mibew/i18n.git
|
@ -1,12 +0,0 @@
|
||||
### Environment
|
||||
* Mibew Messenger version:
|
||||
* OS:
|
||||
* Web server:
|
||||
* PHP:
|
||||
* PHP extensions:
|
||||
* MySQL:
|
||||
### Expected behavior
|
||||
|
||||
### Actual behavior
|
||||
|
||||
### Steps to reproduce the behavior
|
@ -1,8 +0,0 @@
|
||||
Fixes # .
|
||||
|
||||
Changes proposed in this pull request:
|
||||
-
|
||||
-
|
||||
-
|
||||
|
||||
@Mibew/core-developers
|
@ -1,4 +0,0 @@
|
||||
{
|
||||
"directory": "./mibew/js/vendor",
|
||||
"analytics": false
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
{
|
||||
"extends": "eslint:recommended",
|
||||
"rules": {
|
||||
"indent": ["error", 4, {"SwitchCase": 1}],
|
||||
"no-trailing-spaces": "error",
|
||||
"semi": ["error", "always"],
|
||||
"guard-for-in": "error",
|
||||
"no-unused-vars": ["error", {"caughtErrors": "none", "args": "none"}]
|
||||
},
|
||||
"globals": {
|
||||
"Mibew": true,
|
||||
"MibewAPI": true,
|
||||
"MibewAPIInteraction": true,
|
||||
"MibewAPIChatInteraction": true,
|
||||
"MibewAPIUsersInteraction": true,
|
||||
"MibewAPIExecutionContext": true,
|
||||
"Handlebars": true,
|
||||
"_": true,
|
||||
"Backbone": true,
|
||||
"jQuery": true,
|
||||
"vex": true,
|
||||
"validator": true
|
||||
},
|
||||
"env":{
|
||||
"browser": true
|
||||
}
|
||||
}
|
1
src/.idea/.name
Normal file
@ -0,0 +1 @@
|
||||
messenger
|
31
src/.idea/codeStyleSettings.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectCodeStyleSettingsManager">
|
||||
<option name="PER_PROJECT_SETTINGS">
|
||||
<value>
|
||||
<option name="OTHER_INDENT_OPTIONS">
|
||||
<value>
|
||||
<option name="INDENT_SIZE" value="4" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="true" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</value>
|
||||
</option>
|
||||
<XML>
|
||||
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
|
||||
</XML>
|
||||
<codeStyleSettings language="PHP">
|
||||
<indentOptions>
|
||||
<option name="USE_TAB_CHARACTER" value="true" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
</value>
|
||||
</option>
|
||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
|
13
src/.idea/encodings.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false">
|
||||
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/mibew/locales/be/properties" charset="windows-1251" />
|
||||
<file url="file://$PROJECT_DIR$/mibew/locales/bg/properties" charset="windows-1251" />
|
||||
<file url="file://$PROJECT_DIR$/mibew/locales/ca/properties" charset="ISO-8859-1" />
|
||||
<file url="file://$PROJECT_DIR$/mibew/locales/ru/properties" charset="windows-1251" />
|
||||
<file url="file://$PROJECT_DIR$/mibew/locales/sp/properties" charset="ISO-8859-1" />
|
||||
<file url="file://$PROJECT_DIR$/mibew/locales/ua/properties" charset="windows-1251" />
|
||||
</component>
|
||||
</project>
|
||||
|
11
src/.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0" is_locked="false">
|
||||
<option name="myName" value="Project Default" />
|
||||
<option name="myLocal" value="false" />
|
||||
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
||||
<option name="processCode" value="true" />
|
||||
<option name="processLiterals" value="true" />
|
||||
<option name="processComments" value="true" />
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
7
src/.idea/inspectionProfiles/profiles_settings.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="PROJECT_PROFILE" value="Project Default" />
|
||||
<option name="USE_PROJECT_PROFILE" value="true" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
15
src/.idea/messenger.iml
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module-library">
|
||||
<library name="PHP">
|
||||
<CLASSES />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
</component>
|
||||
</module>
|
||||
|
8
src/.idea/misc.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectResources">
|
||||
<default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" />
|
||||
</project>
|
||||
|
9
src/.idea/modules.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/messenger.iml" filepath="$PROJECT_DIR$/.idea/messenger.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
|
80
src/.idea/projectCodeStyle.xml
Normal file
@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CodeStyleSettingsManager">
|
||||
<option name="PER_PROJECT_SETTINGS">
|
||||
<value>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="js">
|
||||
<option name="INDENT_SIZE" value="4" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="false" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="jsp">
|
||||
<option name="INDENT_SIZE" value="4" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="false" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="php">
|
||||
<option name="INDENT_SIZE" value="4" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="false" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="sass">
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="false" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="sql">
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="false" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="xml">
|
||||
<option name="INDENT_SIZE" value="4" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="false" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="yml">
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||
<option name="TAB_SIZE" value="4" />
|
||||
<option name="USE_TAB_CHARACTER" value="false" />
|
||||
<option name="SMART_TABS" value="false" />
|
||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
</value>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
|
5
src/.idea/scopes/scope_settings.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<component name="DependencyValidationManager">
|
||||
<state>
|
||||
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
|
||||
</state>
|
||||
</component>
|
7
src/.idea/vcs.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"name": "mibew",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"underscore": "1.8.2",
|
||||
"json": "https://github.com/douglascrockford/JSON-js.git#c98948ae1944a28e2e8ebc3717894e580aeaaa05",
|
||||
"jquery": "1.11.3",
|
||||
"backbone": "1.1.2",
|
||||
"marionette": "2.4.1",
|
||||
"handlebars": "4.3.0",
|
||||
"vex": "2.3.2",
|
||||
"validator-js": "3.40.0"
|
||||
},
|
||||
"resolutions": {
|
||||
"underscore": "1.8.2"
|
||||
}
|
||||
}
|
56
src/check_translation.pl
Executable file
@ -0,0 +1,56 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
sub read_transl($) {
|
||||
my($from) = @_;
|
||||
my %translation = ();
|
||||
open(IN, "mibew/locales/$from/properties");
|
||||
while(<IN>) {
|
||||
chomp;
|
||||
if(/^([\w\.]+)=(.*)$/) {
|
||||
if($1 ne "encoding" && $1 ne "output_charset" && $1 ne "output_encoding") {
|
||||
$translation{$1} = $2;
|
||||
}
|
||||
} else {
|
||||
die "wrong line in $from: $_\n";
|
||||
}
|
||||
}
|
||||
close(IN);
|
||||
return %translation;
|
||||
}
|
||||
|
||||
%tr_en = read_transl("en");
|
||||
|
||||
@all_keys = keys %tr_en;
|
||||
|
||||
sub check_transl($%) {
|
||||
my($name,%tr) = @_;
|
||||
print "checking $name...\n";
|
||||
my @totransl = ();
|
||||
for $key (@all_keys) {
|
||||
unless(exists $tr{$key}) {
|
||||
push @totransl, "$key=".$tr_en{$key};
|
||||
}
|
||||
}
|
||||
for $key(keys %tr) {
|
||||
unless(exists $tr_en{$key}) {
|
||||
print "unknown key in $name: $key\n";
|
||||
}
|
||||
}
|
||||
if($#totransl >= 0) {
|
||||
print "@{[$#totransl+1]} lines absent in locales/$name/properties\n";
|
||||
open(OUT, "> absent_$name");
|
||||
for(sort @totransl) {
|
||||
print OUT "$_\n";
|
||||
}
|
||||
close(OUT);
|
||||
}
|
||||
}
|
||||
|
||||
check_transl("ru", read_transl("ru"));
|
||||
check_transl("fr", read_transl("fr"));
|
||||
check_transl("de", read_transl("de"));
|
||||
check_transl("sp", read_transl("sp"));
|
||||
check_transl("it", read_transl("it"));
|
||||
check_transl("pl", read_transl("pl"));
|
||||
check_transl("zh-tw", read_transl("zh-tw"));
|
||||
|
5
src/compile_js
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd mibew/js/source
|
||||
ant
|
||||
rm -rf bin
|
@ -1,51 +0,0 @@
|
||||
{
|
||||
"name": "mibew/mibew",
|
||||
"version": "3.6.0",
|
||||
"description": "Mibew Messenger - open-source live support application",
|
||||
"type": "project",
|
||||
"homepage": "https://mibew.org",
|
||||
"license": "Apache-2.0",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Mibew Messenger Project",
|
||||
"homepage": "https://mibew.org/credits"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"email": "support@mibew.org",
|
||||
"issues": "https://github.com/mibew/mibew/issues",
|
||||
"forum": "https://mibew.org/forums",
|
||||
"source": "https://github.com/mibew/mibew"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/mibew/handlebars.php"
|
||||
},
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/mibew/handlebars.php-helpers"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"mibew/handlebars.php": "~0.10.5",
|
||||
"mibew/handlebars.php-helpers": "1.*",
|
||||
"symfony/http-foundation": "4.4.*",
|
||||
"symfony/routing": "4.4.*",
|
||||
"symfony/config": "4.4.*",
|
||||
"symfony/yaml": "^5.2",
|
||||
"symfony/translation": "2.6.*",
|
||||
"tedivm/stash": "0.12.*",
|
||||
"mibew/html5": "1.1.*",
|
||||
"vierbergenlars/php-semver": "3.0.*",
|
||||
"swiftmailer/swiftmailer": "~5.4.0",
|
||||
"ua-parser/uap-php": "^3.9",
|
||||
"true/punycode": "~1.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"squizlabs/php_codesniffer": "3.*"
|
||||
},
|
||||
"config": {
|
||||
"vendor-dir": "mibew/vendor"
|
||||
}
|
||||
}
|
245
src/compute_resources.pl
Executable file
@ -0,0 +1,245 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use Digest::MD5 qw(md5 md5_hex md5_base64);
|
||||
|
||||
@rules = (
|
||||
["redirect(ed)?\\.tpl", 1],
|
||||
["\\.tpl", 0],
|
||||
|
||||
["view/license.php", 0],
|
||||
["view/themes.php", 2],
|
||||
["view/translate.php", 2],
|
||||
["view/translatelist.php", 2],
|
||||
["view/settings.php", 2],
|
||||
["view/updates.php", 2],
|
||||
["view/features.php", 2],
|
||||
["view/performance.php", 2],
|
||||
["view/avatar.php", 2],
|
||||
["view/permissions.php", 2],
|
||||
["view/agent.php", 2],
|
||||
["view/agents.php", 2],
|
||||
["view/group.php", 2],
|
||||
["view/groupmembers.php", 2],
|
||||
["view/groups.php", 2],
|
||||
["view/operator_groups.php", 2],
|
||||
["view/gen_button.php", 2],
|
||||
["view/install_err.php", 2],
|
||||
["view/install_index.php", 2],
|
||||
["view/.*\\.php", 1],
|
||||
|
||||
["install/.*\\.php", 2],
|
||||
|
||||
["operator/themes.php", 2],
|
||||
["operator/translate.php", 2],
|
||||
["operator/settings.php", 2],
|
||||
["operator/updates.php", 2],
|
||||
["operator/features.php", 2],
|
||||
["operator/performance.php", 2],
|
||||
["operator/avatar.php", 2],
|
||||
["operator/permissions.php", 2],
|
||||
["operator/operator.php", 2],
|
||||
["operator/operators.php", 2],
|
||||
["operator/group.php", 2],
|
||||
["operator/groupmembers.php", 2],
|
||||
["operator/groups.php", 2],
|
||||
["operator/opgroups.php", 2],
|
||||
["operator/getcode.php", 2],
|
||||
["operator/.*\\.php", 1],
|
||||
|
||||
["mibew/client.php", 0],
|
||||
["mibew/leavemessage.php", 0],
|
||||
["mibew/captcha.php", 0],
|
||||
["mibew/license.php", 0],
|
||||
["mibew/mail.php", 0],
|
||||
|
||||
["libs/operator_settings.php", 2],
|
||||
["mibew/libs/chat.php", 0],
|
||||
["libs/pagination.php", 1],
|
||||
["libs/settings.php", 2],
|
||||
["libs/groups.php", 2],
|
||||
["libs/demothread.php", 2],
|
||||
|
||||
["mibew/thread.php", 0],
|
||||
["mibew/b.php", 0],
|
||||
["mibew/button.php", 0],
|
||||
["mibew/index.php", 0],
|
||||
|
||||
["mibew/libs/.*\\.php", 1],
|
||||
);
|
||||
|
||||
%messagekeys = (
|
||||
"localeid" => 0,
|
||||
"output_charset" => 0,
|
||||
"output_encoding" => 0,
|
||||
"harderrors.header" => 0,
|
||||
|
||||
"errors.required" => 0,
|
||||
"errors.wrong_field" => 0,
|
||||
"errors.file.move.error" => 2,
|
||||
"errors.invalid.file.type" => 2,
|
||||
"errors.file.size.exceeded" => 2,
|
||||
|
||||
"permission.admin" => 1,
|
||||
"permission.takeover" => 1,
|
||||
"permission.viewthreads" => 1,
|
||||
|
||||
"chat.thread.state_chatting_with_agent" => 1,
|
||||
"chat.thread.state_closed" => 1,
|
||||
"chat.thread.state_loading" => 1,
|
||||
"chat.thread.state_wait" => 1,
|
||||
"chat.thread.state_wait_for_another_agent" => 1,
|
||||
|
||||
"clients.queue.chat" => 1,
|
||||
"clients.queue.prio" => 1,
|
||||
"clients.queue.wait" => 1,
|
||||
);
|
||||
|
||||
|
||||
$mibewPath = "mibew";
|
||||
|
||||
%urls = ();
|
||||
|
||||
%usermessages = ();
|
||||
%operatormessages = ();
|
||||
$current_level = 0;
|
||||
|
||||
sub usemsg($) {
|
||||
my ($m) = @_;
|
||||
$messagekeys{$m} = exists $messagekeys{$m} && $messagekeys{$m} < $current_level ? $messagekeys{$m} : $current_level;
|
||||
if($current_level == -1) {
|
||||
print " .. $m\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub file_content($) {
|
||||
my $input = $_[0];
|
||||
open( IN1, "< $input" ) or die "cannot find file $input";
|
||||
my $oldslash = $/;
|
||||
$/ = EOI;
|
||||
$content = <IN1>;
|
||||
close( IN1 );
|
||||
if($content =~ s/\r//g) {
|
||||
open( OUT1, "> $input") or die "cannot fix $input";
|
||||
print OUT1 $content;
|
||||
close(OUT1);
|
||||
}
|
||||
$/ = $oldslash;
|
||||
return $content;
|
||||
}
|
||||
|
||||
sub process_tpl($) {
|
||||
my ($filename) = @_;
|
||||
my $m = file_content($filename);
|
||||
while( $m =~ /\${msg:([\w\.]+)(,[\w\.]+)?}/g ) {
|
||||
usemsg($1);
|
||||
}
|
||||
while( $m =~ /\${url:([\w\.]+)(,[\w\.]+)?}/g ) {
|
||||
usemsg($1);
|
||||
$urls{"%$1"} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
sub process_php($) {
|
||||
my ($source) = @_;
|
||||
my $content = file_content($source);
|
||||
$content =~ s/<\?xml version=\\"1\.0\\" encoding=\\"UTF-8\\"\?>//;
|
||||
|
||||
while( $content =~ s/<\?(?!xml)(.*?)\?>//s ) {
|
||||
my $inner = $1;
|
||||
while($inner =~ s/(getlocal|getstring|no_field)2?_?\((.*?)[,\)]//s) {
|
||||
my $firstarg = $2;
|
||||
if( $firstarg =~ /^["']([\w\.]+)['"]$/) {
|
||||
usemsg($1);
|
||||
} elsif($firstarg =~ /^\$\w+$/ || $firstarg eq '"$var.header"' || $firstarg eq '"permission.$permid"' || $firstarg eq '$threadstate_key[$thread[\'istate\']]') {
|
||||
# skip
|
||||
} else {
|
||||
print "> unknown: $firstarg\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub file_checksum($) {
|
||||
my ($source) = @_;
|
||||
if($source =~ /\.(png|gif|jpg|ico|wav)$/ || $source =~ /config\.php$/) {
|
||||
return "-";
|
||||
}
|
||||
|
||||
my $content = file_content($source);
|
||||
return md5_hex($content);
|
||||
}
|
||||
|
||||
@allsources = ();
|
||||
|
||||
sub process_one($) {
|
||||
my($source) = @_;
|
||||
push @allsources, $source unless $source =~ /$mibewPath\/locales/ && $source !~ /$mibewPath\/locales\/(en|names)/ || $source =~ /\/package$/;
|
||||
|
||||
if($source !~ /\.(php|tpl)$/) {
|
||||
return;
|
||||
}
|
||||
|
||||
$current_level = -1;
|
||||
|
||||
A: foreach $rule (@rules) {
|
||||
my $key = $$rule[0];
|
||||
if($source =~ /$key/) {
|
||||
$current_level = $$rule[1];
|
||||
last A;
|
||||
}
|
||||
}
|
||||
if($current_level < 0 || $current_level > 2) {
|
||||
print "not detected for: $source\n";
|
||||
$current_level = 0;
|
||||
}
|
||||
|
||||
if($source =~ /\.php$/) {
|
||||
# print "$source ($current_level)\n";
|
||||
process_php($source);
|
||||
} elsif($source =~ /\.tpl$/) {
|
||||
process_tpl($source);
|
||||
} else {
|
||||
#print ". $source\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub process_files($) {
|
||||
my($from) = @_;
|
||||
opendir(DIR, $from) || die "can't opendir $from: $!";
|
||||
my @content = readdir(DIR);
|
||||
closedir DIR;
|
||||
|
||||
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess") } @content) {
|
||||
process_one("$from/$_");
|
||||
}
|
||||
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
||||
process_files("$from/$_");
|
||||
}
|
||||
}
|
||||
|
||||
process_files($mibewPath);
|
||||
|
||||
# fix
|
||||
$messagekeys{'page.analysis.userhistory.title'} = 1;
|
||||
$messagekeys{'errors.failed.uploading.file'} = 2;
|
||||
|
||||
|
||||
open( OUT, "> $mibewPath/locales/names/level1") or die "cannot write file, $!";
|
||||
for $key(sort grep { $messagekeys{$_} == 0 } keys %messagekeys) {
|
||||
print OUT "$key\n";
|
||||
}
|
||||
close( OUT );
|
||||
|
||||
open( OUT, "> $mibewPath/locales/names/level2") or die "cannot write file, $!";
|
||||
for $key(sort grep { $messagekeys{$_} == 1 } keys %messagekeys) {
|
||||
print OUT "$key\n";
|
||||
}
|
||||
close( OUT );
|
||||
|
||||
open( OUT, "> $mibewPath/install/package") or die "cannot write file, $!";
|
||||
for $key(sort @allsources) {
|
||||
$digest = file_checksum($key);
|
||||
$key =~ s/$mibewPath\///;
|
||||
print OUT "$key $digest\n";
|
||||
}
|
||||
close( OUT );
|
743
src/gulpfile.js
@ -1,743 +0,0 @@
|
||||
// Initialize requirements
|
||||
var fs = require('fs'),
|
||||
https = require('https'),
|
||||
exec = require('child_process').exec,
|
||||
eventStream = require('event-stream'),
|
||||
runSequence = require('gulp4-run-sequence'),
|
||||
through = require('through2'),
|
||||
lodash = require('lodash'),
|
||||
PoFile = require('pofile'),
|
||||
strftime = require('strftime'),
|
||||
del = require('del'),
|
||||
bower = require('bower'),
|
||||
gulp = require('gulp'),
|
||||
uglify = require('gulp-uglify'),
|
||||
concat = require('gulp-concat'),
|
||||
phpcs = require('gulp-phpcs'),
|
||||
order = require('gulp-order'),
|
||||
handlebars = require('gulp-handlebars'),
|
||||
handlebarsEngine = require('handlebars'),
|
||||
defineModule = require('gulp-define-module'),
|
||||
header = require('gulp-header'),
|
||||
zip = require('gulp-zip'),
|
||||
tar = require('gulp-tar'),
|
||||
gzip = require('gulp-gzip'),
|
||||
chmod = require('gulp-chmod'),
|
||||
xgettext = require('gulp-xgettext'),
|
||||
concatPo = require('gulp-concat-po'),
|
||||
rename = require('gulp-rename'),
|
||||
eslint = require('gulp-eslint'),
|
||||
removeDuplicateHeaders = require('mibew-gulp-greh'),
|
||||
mkdirp = require('mkdirp');
|
||||
|
||||
// Set global configuration
|
||||
var config = {
|
||||
mibewPath: 'mibew',
|
||||
configsPath: 'mibew/configs',
|
||||
phpVendorPath: 'mibew/vendor',
|
||||
jsVendorPath: 'mibew/js/vendor',
|
||||
pluginsPath: 'mibew/plugins',
|
||||
avatarsPath: 'mibew/files/avatar',
|
||||
cachePath: 'mibew/cache',
|
||||
jsPath: 'mibew/js',
|
||||
chatStylesPath: 'mibew/styles/chats',
|
||||
pageStylesPath: 'mibew/styles/pages',
|
||||
i18nPath: 'i18n',
|
||||
i18nPrefix: 'mibew-i18n-',
|
||||
releasePath: 'release',
|
||||
uploadPath: 'upload',
|
||||
compiledTemplatesHeader: fs.readFileSync('tools/compiled_templates_header.txt'),
|
||||
getComposerUrl: 'https://getcomposer.org/installer',
|
||||
phpBin: 'php -d "suhosin.executor.include.whitelist = phar" -d "memory_limit=512M"',
|
||||
package: require('./composer.json'),
|
||||
msginit: 'msginit',
|
||||
msgcat: 'msgcat'
|
||||
}
|
||||
config.i18nSuffix = '-' + config.package.version + '-' + strftime('%Y%m%d');
|
||||
|
||||
// Tasks for cleaning //////////////////
|
||||
|
||||
// Cleans all built files
|
||||
gulp.task('clean', function(callback) {
|
||||
return del([
|
||||
config.releasePath,
|
||||
'composer.lock',
|
||||
config.phpVendorPath,
|
||||
config.jsVendorPath,
|
||||
config.jsPath + '/compiled/**/*',
|
||||
'!' + config.jsPath + '/compiled/.keep',
|
||||
config.chatStylesPath + '/*/templates_compiled/client_side/*.js',
|
||||
config.chatStylesPath + '/*/js/compiled/*.js',
|
||||
config.pageStylesPath + '/*/templates_compiled/client_side/*.js'
|
||||
], callback);
|
||||
});
|
||||
|
||||
// Cleans temporary English translation in the release dir
|
||||
gulp.task('clean-tmp-po', function(callback) {
|
||||
return del([config.releasePath + '/translation.po'], callback);
|
||||
});
|
||||
|
||||
// Cleans temporary files of translations in the release dir
|
||||
gulp.task('clean-tmp-i18n-files', function(callback) {
|
||||
return del([
|
||||
config.releasePath + '/**/*',
|
||||
'!' + config.releasePath + '/*.zip',
|
||||
'!' + config.releasePath + '/*.tar.gz',
|
||||
'!' + config.releasePath + '/*.pot'
|
||||
], callback);
|
||||
});
|
||||
|
||||
// Cleans all files prepared for uploading to CDN
|
||||
gulp.task('clean-upload', function(callback) {
|
||||
return del([config.uploadPath], callback);
|
||||
});
|
||||
|
||||
// Cleans everything
|
||||
gulp.task('clean-all', function(callback) {
|
||||
runSequence( ['clean', 'clean-upload'],
|
||||
callback );
|
||||
});
|
||||
|
||||
|
||||
// Watcher tasks ///////////////////////
|
||||
|
||||
// Watch styles
|
||||
gulp.task('watch', function() {
|
||||
gulp.watch(config.pageStylesPath + '/**/*.handlebars', gulp.series('page-styles'));
|
||||
gulp.watch(config.chatStylesPath + '/**/js/source/**/*.js', gulp.series('chat-styles-js'));
|
||||
gulp.watch(config.chatStylesPath + '/**/*.handlebars', gulp.series('chat-styles-handlebars'));
|
||||
});
|
||||
|
||||
// Service tasks //////////////////
|
||||
|
||||
// Get and install PHP Composer
|
||||
gulp.task('get-composer', function(callback) {
|
||||
// Check whether Composer is already in place
|
||||
if (fs.existsSync('./composer.phar')) {
|
||||
callback(null);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get installer from the Internet
|
||||
https.get(config.getComposerUrl, function(response) {
|
||||
// Run PHP to install Composer
|
||||
var php = exec(config.phpBin, function(error, stdout, stderr) {
|
||||
callback(error ? stderr : null);
|
||||
});
|
||||
// Pass installer code to PHP via STDIN
|
||||
response.pipe(php.stdin);
|
||||
});
|
||||
});
|
||||
|
||||
// Install Composer dependencies excluding development ones
|
||||
gulp.task('composer-install', gulp.series('get-composer', function(callback) {
|
||||
exec(config.phpBin + ' composer.phar install --no-dev',
|
||||
function(error, stdout, stderr) {
|
||||
callback(error ? stderr : null);
|
||||
});
|
||||
}));
|
||||
|
||||
// Install all Composer dependencies
|
||||
gulp.task('composer-install-dev', gulp.series('get-composer', function(callback) {
|
||||
exec(config.phpBin + ' composer.phar install',
|
||||
function(error, stdout, stderr) {
|
||||
callback(error ? stderr : null);
|
||||
});
|
||||
}));
|
||||
|
||||
// Installs bower dependencies
|
||||
gulp.task('bower-install', function(callback) {
|
||||
bower.commands.install([], {}, {})
|
||||
.on('error', function(error) {
|
||||
callback(error);
|
||||
})
|
||||
.on('end', function() {
|
||||
// We should manually minify JavaScript files that was not minified
|
||||
// by bower packages' authors
|
||||
// TODO: This is a temproary workaround and should be removed once
|
||||
// the packages will be fixed
|
||||
var stream = eventStream.merge(
|
||||
gulp.src(config.jsVendorPath + '/backbone/backbone.js',
|
||||
{base: config.jsVendorPath})
|
||||
.pipe(uglify({preserveComments: 'some'}))
|
||||
// There are neither "@license" tag nor "!preserve" in the
|
||||
// header. Add the header manually
|
||||
.pipe(header(
|
||||
"// Backbone.js 1.1.2\n"
|
||||
+ "// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n"
|
||||
+ "// Backbone may be freely distributed under the MIT license.\n"
|
||||
+ "// For all details and documentation:\n"
|
||||
+ "// http://backbonejs.org\n"
|
||||
))
|
||||
.pipe(rename('backbone/backbone-min.js')),
|
||||
gulp.src(config.jsVendorPath + '/json/json2.js',
|
||||
{base: config.jsVendorPath})
|
||||
.pipe(uglify({preserveComments: 'some'}))
|
||||
// There are neither "@license" tag nor "!preserve" in the
|
||||
// header, add the header manually
|
||||
.pipe(header("// json2.js. Public Domain. See http://www.JSON.org/js.html\n"))
|
||||
.pipe(rename('json/json2.min.js'))
|
||||
)
|
||||
.pipe(gulp.dest(config.jsVendorPath));
|
||||
|
||||
stream
|
||||
.on('error', callback)
|
||||
.on('end', callback);
|
||||
});
|
||||
});
|
||||
|
||||
// Tasks for checking //////////////////
|
||||
|
||||
// Checks all PHP files with PHP Code Sniffer
|
||||
gulp.task('phpcs', gulp.series('composer-install-dev', function() {
|
||||
return gulp.src([
|
||||
config.mibewPath + '/**/*.php',
|
||||
'!' + config.phpVendorPath + '/**/*.*',
|
||||
'!' + config.pluginsPath + '/**/*.*',
|
||||
'!' + config.cachePath + '/**/*.*'
|
||||
], {
|
||||
// Content of the cache directory is readable only for webserver.
|
||||
// Thus we must to set "strict" option to false to prevent "EACCES"
|
||||
// errors. At the same we need to see all errors that take place.
|
||||
strict: false,
|
||||
silent: false
|
||||
})
|
||||
.pipe(phpcs({
|
||||
bin: config.phpVendorPath + '/bin/phpcs',
|
||||
standard: 'PSR2',
|
||||
warningSeverity: 0
|
||||
}))
|
||||
.pipe(phpcs.reporter('log'))
|
||||
.pipe(phpcs.reporter('fail'));
|
||||
}));
|
||||
|
||||
// Checks all JavaScript Source files with ESLint
|
||||
gulp.task('eslint', function() {
|
||||
return gulp.src(config.jsPath + '/source/**/*.js')
|
||||
.pipe(eslint())
|
||||
.pipe(eslint.format())
|
||||
.pipe(eslint.failAfterError());
|
||||
});
|
||||
|
||||
|
||||
// Restore empty English translation in the source code
|
||||
gulp.task('post-pack-cleanup', function(callback) {
|
||||
gulp.src('translation.po')
|
||||
.pipe(gulp.dest(config.mibewPath + '/locales/en/'));
|
||||
|
||||
del(['translation.po', config.releasePath + '/translation.po'], callback);
|
||||
});
|
||||
|
||||
// Tasks of compiling //////////////////
|
||||
|
||||
// Compile all JavaScript files of the Mibew Messenger Core
|
||||
gulp.task('js', function() {
|
||||
return eventStream.merge(
|
||||
getClientSideApp('default'),
|
||||
getClientSideApp('chat'),
|
||||
getClientSideApp('thread_log'),
|
||||
getClientSideApp('users'),
|
||||
gulp.src(config.jsPath + '/source/**/*.js')
|
||||
)
|
||||
.pipe(uglify({preserveComments: 'some'}))
|
||||
.pipe(removeDuplicateHeaders())
|
||||
.pipe(gulp.dest(config.jsPath + '/compiled'));
|
||||
});
|
||||
|
||||
// Compile and concatenate Handlebars templates for all chat styles
|
||||
gulp.task('chat-styles-handlebars', function() {
|
||||
return getChildDirs(config.chatStylesPath)
|
||||
.then(function (dirs) {
|
||||
return Promise.all(dirs.map(function (dir) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
gulp.src(config.chatStylesPath + '/' + dir
|
||||
+ '/templates_src/client_side/**/*.handlebars')
|
||||
.pipe(handlebars({
|
||||
// Use specific version of Handlebars.js
|
||||
handlebars: handlebarsEngine
|
||||
}))
|
||||
.pipe(wrapHandlebarsTemplate())
|
||||
.pipe(concat('templates.js'))
|
||||
.pipe(uglify({preserveComments: 'some'}))
|
||||
.pipe(header(config.compiledTemplatesHeader))
|
||||
.pipe(gulp.dest(config.chatStylesPath + '/' + dir
|
||||
+ '/templates_compiled/client_side'))
|
||||
.on('end', resolve)
|
||||
.on('error', reject);
|
||||
});
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
// Compile and concatenate js files for all chat styles
|
||||
gulp.task('chat-styles-js', function() {
|
||||
return getChildDirs(config.chatStylesPath)
|
||||
.then(function (dirs) {
|
||||
return Promise.all(dirs.map(function (dir) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
gulp.src(config.chatStylesPath + '/' + dir
|
||||
+ '/js/source/**/*.js')
|
||||
.pipe(concat('scripts.js'))
|
||||
.pipe(uglify({preserveComments: 'some'}))
|
||||
.pipe(gulp.dest(config.chatStylesPath + '/' + dir
|
||||
+ '/js/compiled'))
|
||||
.on('end', resolve)
|
||||
.on('error', reject);
|
||||
});
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
// Performs all job related to pages styles
|
||||
gulp.task('page-styles', function() {
|
||||
return getChildDirs(config.pageStylesPath)
|
||||
.then(function (dirs) {
|
||||
return Promise.all(dirs.map(function (dir) {
|
||||
return new Promise(function(resolve, reject){
|
||||
gulp.src(config.pageStylesPath + '/' + dir
|
||||
+ '/templates_src/client_side/**/*.handlebars')
|
||||
.pipe(handlebars({
|
||||
// Use specific version of Handlebars.js
|
||||
handlebars: handlebarsEngine
|
||||
}))
|
||||
.pipe(wrapHandlebarsTemplate())
|
||||
.pipe(concat('templates.js'))
|
||||
.pipe(uglify({preserveComments: 'some'}))
|
||||
.pipe(header(config.compiledTemplatesHeader))
|
||||
.pipe(gulp.dest(config.pageStylesPath + '/' + dir
|
||||
+ '/templates_compiled/client_side'))
|
||||
.on('end', resolve)
|
||||
.on('error', reject);
|
||||
});
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
// Performs all job related to chat styles
|
||||
gulp.task('chat-styles', gulp.series('chat-styles-handlebars', 'chat-styles-js'));
|
||||
|
||||
// Prepares ready to use development version of Mibew Messenger without
|
||||
// packing or validating it
|
||||
gulp.task('rebuild', function(callback) {
|
||||
runSequence(
|
||||
'clean',
|
||||
['js', 'chat-styles', 'page-styles', 'composer-install',
|
||||
'bower-install'],
|
||||
callback
|
||||
);
|
||||
});
|
||||
|
||||
// Tasks for localization issues ///////
|
||||
|
||||
// Generate POT-file based upon the source code
|
||||
gulp.task('generate-pot', function() {
|
||||
return eventStream.merge(
|
||||
gulp.src([
|
||||
config.mibewPath + '/**/*.php',
|
||||
'!' + config.phpVendorPath + '/**/*.*',
|
||||
'!' + config.pluginsPath + '/**/*.*',
|
||||
'!' + config.cachePath + '/**/*.*'
|
||||
], {
|
||||
// Content of the cache directory is readable only for
|
||||
// webserver. Thus we must to set "strict" option to false
|
||||
// to prevent "EACCES" errors. At the same we need to see all
|
||||
// errors that take place.
|
||||
strict: false,
|
||||
silent: false
|
||||
})
|
||||
.pipe(xgettext({
|
||||
language: 'PHP',
|
||||
keywords: [
|
||||
{name: 'getlocal'},
|
||||
{name: 'no_field'},
|
||||
{name: 'wrong_field'},
|
||||
{name: 'failed_uploading_file', singular: 2}
|
||||
]
|
||||
})),
|
||||
gulp.src(config.jsPath + '/source/**/*.js', {base: config.mibewPath})
|
||||
.pipe(xgettext({
|
||||
language: 'JavaScript',
|
||||
keywords: [
|
||||
{name: 'trans'}
|
||||
]
|
||||
})),
|
||||
gulp.src([
|
||||
config.chatStylesPath + '/default/templates_src/**/*.handlebars',
|
||||
config.pageStylesPath + '/default/templates_src/**/*.handlebars'
|
||||
], {base: config.mibewPath})
|
||||
.pipe(xgettextHandlebars())
|
||||
)
|
||||
.pipe(concatPo(config.i18nPrefix + 'translation'
|
||||
+ config.i18nSuffix + '.pot',
|
||||
{
|
||||
headers: {
|
||||
'Project-Id-Version': 'Mibew Messenger '
|
||||
+ config.package.version,
|
||||
'Report-Msgid-Bugs-To': config.package.support.email,
|
||||
'POT-Creation-Date': strftime('%Y-%m-%d %H:%M%z'),
|
||||
'PO-Revision-Date': '',
|
||||
'Last-Translator': '',
|
||||
'Language-Team': '',
|
||||
'Content-Type': 'text/plain; charset=UTF-8'
|
||||
}
|
||||
})
|
||||
)
|
||||
.pipe(gulp.dest(config.releasePath));
|
||||
});
|
||||
|
||||
// Generate temporary English translation to be used in the release
|
||||
gulp.task('generate-tmp-po', gulp.series('generate-pot', function(callback) {
|
||||
return exec(config.msginit + ' --no-translator --no-wrap -i '
|
||||
+ config.releasePath + '/' + config.i18nPrefix + 'translation'
|
||||
+ config.i18nSuffix + '.pot' + ' -l en -o '
|
||||
+ config.releasePath + '/translation.po',
|
||||
function(error, stdout, stderr) {
|
||||
callback(error ? stderr : null);
|
||||
});
|
||||
}));
|
||||
|
||||
// Generate complete translations (that includes missed strings) to be used
|
||||
// in the release
|
||||
gulp.task('generate-pos', gulp.series('generate-tmp-po', function(callback) {
|
||||
|
||||
return getChildDirs(config.i18nPath + '/translations')
|
||||
.then(function (dirs) {
|
||||
return Promise.all(dirs.map(function (dir) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
mkdirp(config.releasePath + '/' + dir, function (error) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
exec(config.msgcat + ' ' + config.i18nPath + '/translations/'
|
||||
+ dir + '/translation.po ' + config.releasePath
|
||||
+ '/translation.po --no-location --no-wrap --use-first'
|
||||
+ ' -o ' + config.releasePath + '/' + dir
|
||||
+ '/translation.po',
|
||||
function(error, stdout, stderr) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
|
||||
var sources = [
|
||||
config.i18nPath + '/translations/' + dir + '/**/*',
|
||||
'!' + config.i18nPath + '/translations/' + dir
|
||||
+ '/translation.po'
|
||||
];
|
||||
|
||||
gulp.src(sources)
|
||||
.pipe(gulp.dest(config.releasePath + '/' + dir))
|
||||
.on('error', reject)
|
||||
.on('end', resolve);
|
||||
});
|
||||
}));
|
||||
});
|
||||
}));
|
||||
|
||||
// Packaging tasks /////////////////////
|
||||
|
||||
// Pack sources for release as .zip and .tar.gz archives
|
||||
gulp.task('pack-sources', gulp.series('composer-install', 'bower-install', function() {
|
||||
gulp.src(config.mibewPath + '/locales/en/translation.po')
|
||||
.pipe(gulp.dest('.'));
|
||||
gulp.src(config.releasePath + '/translation.po')
|
||||
.pipe(gulp.dest(config.mibewPath + '/locales/en/'));
|
||||
|
||||
var sources = [
|
||||
config.mibewPath + '/**/*',
|
||||
// Exclude user's config
|
||||
'!' + config.configsPath + '/config.yml',
|
||||
// Exclude cache files but not the ".keep" file.
|
||||
'!' + config.cachePath + '/**/!(.keep)',
|
||||
// Exclude avatars but not the ".keep" file.
|
||||
'!' + config.avatarsPath + '/!(.keep)',
|
||||
// Exclude plugins but not the ".keep" file.
|
||||
'!' + config.pluginsPath + '/!(.keep)',
|
||||
'!' + config.pluginsPath + '/*/**/*',
|
||||
// Exclude Git repositories that can be shipped with third-party libs
|
||||
'!' + config.phpVendorPath + '/**/.git',
|
||||
'!' + config.phpVendorPath + '/**/.git/**/*',
|
||||
// Exclude vendors binaries
|
||||
'!' + config.phpVendorPath + '/bin/**/*',
|
||||
// Exclude JavaScript sources
|
||||
'!' + config.jsPath + '/source/**/*',
|
||||
// Actually we does not need backbone.babysitter and backbone.wreqr
|
||||
// dependencies because they embed into marionette.js. So we exclude
|
||||
// "backbone.babysitter" and "backbone.wreqr" directories and all their
|
||||
// contents.
|
||||
'!' + config.jsVendorPath + '/backbone.babysitter{,/**}',
|
||||
'!' + config.jsVendorPath + '/backbone.wreqr{,/**}',
|
||||
// Exclude dot files within third-party JS libraries.
|
||||
'!' + config.jsVendorPath + '/**/.*',
|
||||
// Exclude config files of various package systems
|
||||
'!' + config.jsVendorPath + '/**/{bower,component,package,composer}.json',
|
||||
// Exclude config files of various build systems
|
||||
'!' + config.jsVendorPath + '/**/Gruntfile.*',
|
||||
'!' + config.jsVendorPath + '/**/gulpfile.*',
|
||||
'!' + config.jsVendorPath + '/**/Makefile',
|
||||
// Exclude HTML files from third-party JS libraries. Such files can be
|
||||
// used for docs or for tests, we need none of them.
|
||||
'!' + config.jsVendorPath + '/**/*.html',
|
||||
// There are too many useless files in Vex.js library. Exclude them.
|
||||
'!' + config.jsVendorPath + '/vex/sass{,/**}',
|
||||
'!' + config.jsVendorPath + '/vex/docs{,/**}',
|
||||
'!' + config.jsVendorPath + '/vex/docs{,/**}',
|
||||
'!' + config.jsVendorPath + '/vex/coffee{,/**}'
|
||||
];
|
||||
var srcOptions = {
|
||||
// Dot files (.htaccess, .keep, etc.) must be included in the package
|
||||
dot: true,
|
||||
// Content of the cache directory is readable only for webserver. Thus
|
||||
// we must to set "strict" option to false to prevent "EACCES" errors.
|
||||
// At the same we need to see all errors that take place.
|
||||
strict: false,
|
||||
silent: false,
|
||||
// Preserve root directory name (i.e. 'mibew/')
|
||||
base: '.'
|
||||
}
|
||||
var version = config.package.version;
|
||||
|
||||
return eventStream.merge(
|
||||
gulp.src(sources, srcOptions)
|
||||
.pipe(zip('mibew-' + version + '.zip')),
|
||||
gulp.src(sources, srcOptions)
|
||||
.pipe(tar('mibew-' + version + '.tar'))
|
||||
.pipe(gzip())
|
||||
)
|
||||
.pipe(chmod(644))
|
||||
.pipe(gulp.dest(config.releasePath));
|
||||
}));
|
||||
|
||||
// Pack translations for release as .zip and .tar.gz archives
|
||||
gulp.task('pack-i18n', function(callback) {
|
||||
return getChildDirs(config.i18nPath + '/translations')
|
||||
.then(function (dirs) {
|
||||
return Promise.all(dirs.map(function (dir) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
|
||||
var srcOptions = {
|
||||
base: config.releasePath
|
||||
};
|
||||
|
||||
eventStream.merge(
|
||||
gulp.src(config.releasePath + '/' + dir
|
||||
+ '/**/*', srcOptions)
|
||||
.pipe(zip(config.i18nPrefix + dir
|
||||
+ config.i18nSuffix + '.zip')),
|
||||
gulp.src(config.releasePath + '/' + dir
|
||||
+ '/**/*', srcOptions)
|
||||
.pipe(tar(config.i18nPrefix + dir
|
||||
+ config.i18nSuffix + '.tar'))
|
||||
.pipe(gzip())
|
||||
)
|
||||
.pipe(chmod(644))
|
||||
.pipe(gulp.dest(config.releasePath))
|
||||
.on('error', reject)
|
||||
.on('end', resolve);
|
||||
|
||||
});
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
// Tasks of releasing //////////////////
|
||||
|
||||
// Prepare release of Mibew Messenger
|
||||
gulp.task('prepare-release', function(callback) {
|
||||
runSequence(
|
||||
'clean',
|
||||
['phpcs', 'js', 'chat-styles', 'page-styles', 'generate-pot',
|
||||
'generate-tmp-po'],
|
||||
'pack-sources',
|
||||
'post-pack-cleanup',
|
||||
callback
|
||||
);
|
||||
});
|
||||
|
||||
// Prepare releases of translations for Mibew Messenger
|
||||
gulp.task('prepare-i18n-release', function(callback) {
|
||||
runSequence( 'clean-tmp-po',
|
||||
'generate-pos',
|
||||
'pack-i18n',
|
||||
'clean-tmp-i18n-files',
|
||||
callback
|
||||
);
|
||||
});
|
||||
|
||||
// Mirror prepared releases of Mibew Messenger and its translations in a form
|
||||
// intended for uploading into the CDN
|
||||
gulp.task('prepare-for-upload', function(callback) {
|
||||
gulp.src(config.releasePath + '/mibew-' + config.package.version + '.*')
|
||||
.pipe(gulp.dest(config.uploadPath + '/core/' + config.package.version + '/'));
|
||||
|
||||
gulp.src(config.releasePath + '/mibew-i18n-translation-' + config.package.version + '-*.pot')
|
||||
.pipe(gulp.dest(config.uploadPath + '/i18n/_pot/' + config.package.version + '/'));
|
||||
|
||||
return getChildDirs(config.i18nPath + '/translations')
|
||||
.then(function (dirs) {
|
||||
return Promise.all(dirs.map(function (dir) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
gulp.src(config.releasePath + '/mibew-i18n-' + dir + '-' + config.package.version + '-*.*')
|
||||
.pipe(gulp.dest(config.uploadPath + '/i18n/' + dir + '/' + config.package.version + '/'))
|
||||
.on('error', reject)
|
||||
.on('end', resolve);
|
||||
});
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
// Perform all preparations before uploading the release of Mibew Messenger and
|
||||
// its translations into the CDN
|
||||
gulp.task('prepare-all', function(callback) {
|
||||
runSequence('clean-all', 'prepare-release', 'prepare-i18n-release',
|
||||
'prepare-for-upload', callback);
|
||||
});
|
||||
|
||||
// Prepare release archives of the development version of Mibew Messenger
|
||||
gulp.task('default', function(callback) {
|
||||
runSequence(
|
||||
'clean',
|
||||
['js', 'chat-styles', 'page-styles', 'generate-tmp-po'],
|
||||
'pack-sources',
|
||||
['post-pack-cleanup', 'clean-tmp-po'],
|
||||
callback
|
||||
);
|
||||
});
|
||||
|
||||
/**
|
||||
* Loads and prepare js file for a client side application with the specified
|
||||
* name.
|
||||
*
|
||||
* @param {String} name Application name.
|
||||
* @returns A files stream that can be piped to any gulp plugin.
|
||||
*/
|
||||
var getClientSideApp = function(name) {
|
||||
var appSource = config.jsPath + '/source/' + name;
|
||||
|
||||
return gulp.src(appSource + '/**/*.js')
|
||||
.pipe(order(
|
||||
[
|
||||
appSource + '/init.js',
|
||||
// The following line is equivalent to
|
||||
// gulp.src([appSource + '/*.js', '!' + appSource + '/app.js']);
|
||||
appSource + '/!(app).js',
|
||||
appSource + '/models/**/base*.js',
|
||||
appSource + '/models/**/*.js',
|
||||
appSource + '/collections/**/base*.js',
|
||||
appSource + '/collections/**/*.js',
|
||||
appSource + '/model_views/**/base*.js',
|
||||
appSource + '/model_views/**/*.js',
|
||||
appSource + '/collection_views/**/base*.js',
|
||||
appSource + '/collection_views/**/*.js',
|
||||
appSource + '/regions/**/base*.js',
|
||||
appSource + '/regions/**/*.js',
|
||||
appSource + '/layouts/**/base*.js',
|
||||
appSource + '/layouts/**/*.js',
|
||||
appSource + '/**/base*.js',
|
||||
// The following line is equivalent to
|
||||
// gulp.src([appSource + '/**/*.js', '!' + appSource + '/app.js']);
|
||||
'!' + appSource + '/app.js',
|
||||
appSource + '/app.js'
|
||||
],
|
||||
{base: process.cwd()}
|
||||
))
|
||||
.pipe(concat(name + '_app.js'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a handlebars template with a function and attach it to the
|
||||
* Handlebars.templates object.
|
||||
*
|
||||
* @returns {Function} A function that can be used in pipe() method of a file
|
||||
* stream right after gulp-handlebars plugin.
|
||||
*/
|
||||
var wrapHandlebarsTemplate = function() {
|
||||
return defineModule('plain', {
|
||||
wrapper: '(function() {\n'
|
||||
+ 'var templates = Handlebars.templates = Handlebars.templates || {};\n'
|
||||
+ 'Handlebars.templates["<%= relative %>"] = <%= handlebars %>;\n'
|
||||
+ '})()',
|
||||
context: function(context) {
|
||||
return {relative: context.file.relative.replace(/\.js$/, '').replace(/\\/g, '/')};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts gettext messages from handlebars templates.
|
||||
*
|
||||
* @returns {Function} A function that can be used in pipe() method of a file
|
||||
* stream.
|
||||
*/
|
||||
var xgettextHandlebars = function() {
|
||||
var helperRegExp = /\{{2}l10n\s*('|")(.*?[^\\])\1.*?\}{2}/g;
|
||||
|
||||
return through.obj(function (file, enc, callback) {
|
||||
var po = new PoFile();
|
||||
match = false,
|
||||
contents = file.contents.toString();
|
||||
|
||||
while (match = helperRegExp.exec(contents)) {
|
||||
// Try to find item in the .po file by its name
|
||||
var item = lodash.find(po.items, function(item) {
|
||||
return match[2] === item.msgid;
|
||||
});
|
||||
|
||||
var line = contents.substr(0, match.index).split(/\r?\n|\r/g).length;
|
||||
|
||||
if (!item) {
|
||||
// There is no such item, create new one
|
||||
item = new PoFile.Item();
|
||||
item.msgid = match[2].replace(/\\'/g, "'").replace(/\\"/g, '"');
|
||||
po.items.push(item);
|
||||
}
|
||||
|
||||
// Add new reference
|
||||
item.references.push(file.relative + ':' + line);
|
||||
}
|
||||
|
||||
// Update file contents
|
||||
file.contents = Buffer.from(po.toString());
|
||||
this.push(file);
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves list of all dirs which are placed in the specified one.
|
||||
*
|
||||
* @param {String} srcDir A dir to search.
|
||||
* @returns Promise A promise which will be resolved with list of child dirs or
|
||||
* rejected with the occured error.
|
||||
*/
|
||||
var getChildDirs = function(srcDir) {
|
||||
return (new Promise(function(resolve, reject) {
|
||||
fs.readdir(srcDir, function (err, files) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(files);
|
||||
}
|
||||
});
|
||||
})).then(function (files) {
|
||||
// Replace all files that are not a directory with nulls.
|
||||
return Promise.all(files.map(function (file) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
fs.lstat(srcDir + '/' + file, function (err, stat) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(stat.isDirectory() ? file : null);
|
||||
}
|
||||
});
|
||||
});
|
||||
}));
|
||||
}).then(function(dirs) {
|
||||
// Remove all nulls from the array.
|
||||
return dirs.filter(function (dir) {
|
||||
return null !== dir;
|
||||
});
|
||||
});
|
||||
}
|
1
src/i18n
@ -1 +0,0 @@
|
||||
Subproject commit 55868d9973f531c3550575481bde4233cc625b91
|
@ -1,14 +1,12 @@
|
||||
# Set default handler for incoming requests
|
||||
DirectoryIndex index.php
|
||||
|
||||
# Disable directory listing
|
||||
Options -Indexes
|
||||
|
||||
# Follow symbolic links in the directory
|
||||
Options +FollowSymLinks
|
||||
|
||||
<IfModule mod_negotiation.c>
|
||||
# Forbid apache to guess file extensions
|
||||
Options -MultiViews
|
||||
</IfModule>
|
||||
|
||||
# Disable mod_security for Apache 1.x
|
||||
<IfModule mod_security.c>
|
||||
SecFilterEngine Off
|
||||
@ -25,40 +23,3 @@ Options +FollowSymLinks
|
||||
php_value mbstring.http_output pass
|
||||
php_flag session.auto_start off
|
||||
</IfModule>
|
||||
|
||||
# Redirect requests to the front controller
|
||||
<IfModule mod_rewrite.c>
|
||||
# Use the front controller as a default handler
|
||||
DirectoryIndex index.php
|
||||
|
||||
RewriteEngine On
|
||||
|
||||
# Use separate front controller for the system installator
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteRule ^install(/(.*))?$ install.php [QSA,L]
|
||||
|
||||
# Rewrite all other requests for files and directories that do not exist to
|
||||
# the main front controller
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteRule ^(.*)$ index.php [QSA,L]
|
||||
</IfModule>
|
||||
|
||||
<IfModule !mod_rewrite.c>
|
||||
# There is no mod_rewrite in the system. For the root Mibew Messenger
|
||||
# directory index_fallback.php should be loaded first to activate
|
||||
# old-fashioned URLs. For all other directories index.php is just a
|
||||
# directory index file.
|
||||
DirectoryIndex index_fallback.php index.php
|
||||
</IfModule>
|
||||
|
||||
# Deny access to internal system files
|
||||
<FilesMatch "\.(yml|po|ini|handlebars|keep)$">
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
|
||||
# Deny access to CLI cron worker from the outside
|
||||
<Files "cron.php">
|
||||
Deny from all
|
||||
</Files>
|
||||
|
75
src/mibew/README
Normal file
@ -0,0 +1,75 @@
|
||||
Mibew Messenger
|
||||
Copyright 2005-2014 the original author or authors.
|
||||
|
||||
REQUIREMENTS
|
||||
|
||||
* Apache web server 1.3.34 or above
|
||||
* MySQL database 5.0 or above
|
||||
* PHP 4.x or above with MySQL support
|
||||
|
||||
INSTALLATION
|
||||
|
||||
1. Create folder with name 'mibew' in the root of your website.
|
||||
|
||||
2. Upload all files contained in this archive (retaining the directory
|
||||
structure) into the created folder.
|
||||
|
||||
3. Make sure that the user, under which the web server is running (for
|
||||
instance, www), is able to access and read all files in mibew folder
|
||||
and all of its subfolders.
|
||||
|
||||
On *nix systems the simplest way is to use this pair of commands:
|
||||
|
||||
find -type f | xargs chmod 0644
|
||||
find -type d | xargs chmod 0755
|
||||
|
||||
4. Add a MySQL database to be used with Mibew Messenger (for instance, with
|
||||
the name 'mibew').
|
||||
|
||||
5. Edit mibew/libs/config.php to specify the information needed to connect
|
||||
to the database.
|
||||
|
||||
6. Using your web browser visit http://<yourdomain>/mibew/install/ and
|
||||
hit 'Create tables'.
|
||||
|
||||
7. Remove mibew/install/ directory from your server.
|
||||
|
||||
8. On *nix platforms change the owner of mibew/images/avatar folder
|
||||
to the user, under which the web server is running (for instance, www):
|
||||
|
||||
chown www mibew/images/avatar
|
||||
|
||||
The owner should have all rights on the folder mibew/images/avatar:
|
||||
|
||||
chmod u+rwx mibew/images/avatar
|
||||
|
||||
|
||||
9. Log in as
|
||||
user: admin
|
||||
password: <empty>
|
||||
|
||||
10. Get button code and set it up on your site.
|
||||
|
||||
11. Change your password and name.
|
||||
|
||||
12. Wait for your visitors on the 'Pending users' page.
|
||||
|
||||
UPDATE
|
||||
|
||||
1. Backup your mibew/libs/config.php
|
||||
|
||||
2. Backup your mibew/images/avatar folder.
|
||||
|
||||
3. Delete all items in mibew folder on the server.
|
||||
|
||||
4. Upload all files contained in the downloaded archive (retaining the
|
||||
directory structure) into mibew folder.
|
||||
|
||||
5. Restore the MySQL database settings in mibew/libs/config.php
|
||||
|
||||
6. Visit http://<yourdomain>/mibew/install/ and follow the instructions
|
||||
to update the database tables (if needed).
|
||||
|
||||
7. Remove mibew/install/ directory from your server.
|
||||
|
||||
8. Restore contents of mibew/images/avatar folder.
|
@ -1,56 +0,0 @@
|
||||
Mibew Messenger
|
||||
Copyright 2005-2023 the original author or authors.
|
||||
|
||||
REQUIREMENTS
|
||||
|
||||
* Apache web server 1.3.34 or above with the ability to use local .htaccess
|
||||
files (mod_rewrite module is optional, but recommended)
|
||||
* MySQL database 5.0 or above
|
||||
* PHP 7.2.5 or above with PDO, pdo_mysql, cURL, mbstring and gd extensions
|
||||
|
||||
INSTALLATION
|
||||
|
||||
1. Create folder with name 'mibew' in the root of your website.
|
||||
2. Upload all the files contained in this archive (retaining the directory
|
||||
structure) into created folder.
|
||||
Be sure to chmod the mibew folder to 0755.
|
||||
3. Add a MySQL database with the name 'mibew'
|
||||
4. Copy /mibew/configs/default_config.yml to /mibew/configs/config.yml
|
||||
5. Edit /mibew/configs/config.yml to the information needed to connect to the database
|
||||
6. Using your web browser visit http://<yourdomain>/mibew/install and
|
||||
perform step-by-step installation.
|
||||
7. Remove /mibew/install.php file from your server
|
||||
8. Logon as
|
||||
user: admin
|
||||
password: <your password>
|
||||
9. Get button code and setup it on your site.
|
||||
10. Configure periodically running tasks by setting up an automated
|
||||
process to visit the page http://<yourdomain>/cron?cron_key=<key>
|
||||
|
||||
The full URL including the secret "cron key" used to protect against
|
||||
unauthorized access can be seen on the 'General' tab at the 'Settings' page.
|
||||
11. Change your name.
|
||||
12. Wait for your visitors on 'Pending users' page.
|
||||
|
||||
On unix/linux platforms change the owner of /mibew/files/avatar and
|
||||
/mibew/cache folders to the user, under which the web server is running
|
||||
(for instance, www). The owner should have all rights on the folders
|
||||
/mibew/files/avatar and /mibew/cache
|
||||
(chmod 0700 /mibew/files/avatar && chmod 0700 /mibew/cache).
|
||||
|
||||
UPDATE
|
||||
|
||||
1. Backup your actual installation (i.e. code and database).
|
||||
2. Disable all plugins.
|
||||
3. Delete all items in your Mibew Messenger directory on the server.
|
||||
4. Unpack the archive with the official distrubition in that directory.
|
||||
5. Remove install.php file.
|
||||
6. Restore configuration (configs/ directory), plugins (plugins/ directory),
|
||||
(maybe) custom styles (if you have any), (maybe) additional
|
||||
locales (if you use any), and avatars (files/avatar/ directory) from the
|
||||
backup you've made at the step 1.
|
||||
7. Visit http://<yourdomain>/<path to your Mibew Messenger>/update and follow
|
||||
the instructions to update the database tables (if needed).
|
||||
8. Enable disabled plugins.
|
||||
|
||||
|
1
src/mibew/VERSION
Normal file
@ -0,0 +1 @@
|
||||
Mibew/1.6.12
|
@ -1 +0,0 @@
|
||||
Mibew/3.6.0
|
74
src/mibew/b.php
Normal file
@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('libs/common.php');
|
||||
require_once('libs/chat.php');
|
||||
require_once('libs/operator.php');
|
||||
require_once('libs/groups.php');
|
||||
|
||||
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
|
||||
if($referer && isset($_SESSION['threadid'])) {
|
||||
$link = connect();
|
||||
$thread = thread_by_id_($_SESSION['threadid'], $link);
|
||||
if ($thread && $thread['istate'] != $state_closed) {
|
||||
$msg = getstring2_("chat.client.visited.page", array($referer), $thread['locale'], true);
|
||||
post_message_($thread['threadid'], $kind_for_agent,$msg,$link);
|
||||
}
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
$image = verifyparam(isset($_GET['image']) ? "image" : "i", "/^\w+$/", "mibew");
|
||||
$lang = verifyparam(isset($_GET['language']) ? "language" : "lang", "/^[\w-]{2,5}$/", "");
|
||||
if(!$lang || !locale_pattern_check($lang) || !locale_exists($lang)) {
|
||||
$lang = $current_locale;
|
||||
}
|
||||
|
||||
$groupid = verifyparam( "group", "/^\d{1,10}$/", "");
|
||||
if($groupid) {
|
||||
loadsettings();
|
||||
if($settings['enablegroups'] == '1') {
|
||||
$group = group_by_id($groupid);
|
||||
if(!$group) {
|
||||
$groupid = "";
|
||||
}
|
||||
} else {
|
||||
$groupid = "";
|
||||
}
|
||||
}
|
||||
|
||||
$image_postfix = has_online_operators($groupid) ? "on" : "off";
|
||||
$filename = dirname(__FILE__) . "/locales/${lang}/button/${image}_${image_postfix}.gif";
|
||||
if (!file_exists($filename)) {
|
||||
die("no image");
|
||||
}
|
||||
$fp = fopen($filename, 'rb') or die("unable to get image");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Pragma: no-cache");
|
||||
header("Content-Type: image/gif");
|
||||
header("Content-Length: ".filesize($filename));
|
||||
if(function_exists('fpassthru')){
|
||||
@fpassthru($fp);
|
||||
} else {
|
||||
while( (!feof($fp)) && (connection_status()==0)){
|
||||
print(fread($fp, 1024*8));
|
||||
flush();
|
||||
}
|
||||
fclose($fp);
|
||||
}
|
||||
exit;
|
||||
?>
|
@ -1,7 +1,6 @@
|
||||
/*!
|
||||
* This file is a part of Mibew Messenger.
|
||||
*
|
||||
* Copyright 2005-2023 the original author or authors.
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -15,3 +14,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('b.php');
|
||||
exit;
|
||||
?>
|
@ -1,5 +1,6 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2023 the original author or authors.
|
||||
* Copyright 2005-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -14,12 +15,12 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* common controls */
|
||||
.control,
|
||||
.user-name-control-set,
|
||||
.user-name-control-change,
|
||||
.user-name-control-input-background,
|
||||
#confirm-pane .submit-button {
|
||||
display: inline;
|
||||
zoom: 1;
|
||||
}
|
||||
require_once('libs/common.php');
|
||||
require_once('libs/captcha.php');
|
||||
|
||||
$captchaCode = gen_captcha();
|
||||
$_SESSION["mibew_captcha"] = $captchaCode;
|
||||
draw_captcha($captchaCode);
|
||||
|
||||
exit;
|
||||
?>
|
182
src/mibew/client.php
Normal file
@ -0,0 +1,182 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('libs/common.php');
|
||||
require_once('libs/chat.php');
|
||||
require_once('libs/operator.php');
|
||||
require_once('libs/groups.php');
|
||||
require_once('libs/expand.php');
|
||||
require_once('libs/captcha.php');
|
||||
require_once('libs/notify.php');
|
||||
|
||||
loadsettings();
|
||||
if($settings['enablessl'] == "1" && $settings['forcessl'] == "1") {
|
||||
if(!is_secure_request()) {
|
||||
$requested = $_SERVER['PHP_SELF'];
|
||||
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['QUERY_STRING']) {
|
||||
header("Location: ".get_app_location(true,true)."/client.php?".$_SERVER['QUERY_STRING']);
|
||||
} else {
|
||||
die("only https connections are handled");
|
||||
}
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
|
||||
|
||||
$thread = NULL;
|
||||
if( isset($_SESSION['threadid']) ) {
|
||||
$thread = reopen_thread($_SESSION['threadid']);
|
||||
}
|
||||
|
||||
if( !$thread ) {
|
||||
$groupid = "";
|
||||
$groupname = "";
|
||||
if($settings['enablegroups'] == '1') {
|
||||
$groupid = verifyparam( "group", "/^\d{1,10}$/", "");
|
||||
if($groupid) {
|
||||
$group = group_by_id($groupid);
|
||||
if(!$group) {
|
||||
$groupid = "";
|
||||
} else {
|
||||
$groupname = get_group_name($group);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$visitor = visitor_from_request();
|
||||
|
||||
if(isset($_POST['survey']) && $_POST['survey'] == 'on') {
|
||||
$firstmessage = getparam("message");
|
||||
$info = getparam("info");
|
||||
$email = getparam("email");
|
||||
$referrer = urldecode(getparam("referrer"));
|
||||
if ($settings["surveyaskcaptcha"] == "1") {
|
||||
$captcha = getparam('captcha');
|
||||
$original = isset($_SESSION["mibew_captcha"])
|
||||
? $_SESSION["mibew_captcha"]
|
||||
: "";
|
||||
$survey_captcha_failed = empty($original)
|
||||
|| empty($captcha)
|
||||
|| $captcha != $original;
|
||||
unset($_SESSION['mibew_captcha']);
|
||||
}
|
||||
|
||||
if($settings['usercanchangename'] == "1" && isset($_POST['name'])) {
|
||||
$newname = getparam("name");
|
||||
if($newname != $visitor['name']) {
|
||||
$data = strtr(base64_encode(myiconv($mibew_encoding,"utf-8",$newname)), '+/=', '-_,');
|
||||
setcookie($namecookie, $data, time()+60*60*24*365);
|
||||
$visitor['name'] = $newname;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$firstmessage = NULL;
|
||||
$info = getgetparam('info');
|
||||
$email = getgetparam('email');
|
||||
$referrer = isset($_GET['url']) ? $_GET['url'] :
|
||||
(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "");
|
||||
if(isset($_GET['referrer']) && $_GET['referrer']) {
|
||||
$referrer .= "\n".$_GET['referrer'];
|
||||
}
|
||||
}
|
||||
|
||||
if(!has_online_operators($groupid)) {
|
||||
$page = array();
|
||||
setup_logo();
|
||||
setup_leavemessage($visitor['name'],$email,$firstmessage,$groupid,$groupname,$info,$referrer,can_show_captcha());
|
||||
expand("styles", getchatstyle(), "leavemessage.tpl");
|
||||
exit;
|
||||
}
|
||||
|
||||
$show_survey = $settings['enablepresurvey'] == '1'
|
||||
&& (
|
||||
!(isset($_POST['survey']) && $_POST['survey'] == 'on')
|
||||
|| ($settings["surveyaskcaptcha"] == "1" && !empty($survey_captcha_failed))
|
||||
);
|
||||
if($show_survey) {
|
||||
$page = array();
|
||||
setup_logo();
|
||||
if (!empty($survey_captcha_failed)) {
|
||||
$errors[] = getlocal('errors.captcha');
|
||||
}
|
||||
setup_survey($visitor['name'], $email, $groupid, $info, $referrer, can_show_captcha());
|
||||
expand("styles", getchatstyle(), "survey.tpl");
|
||||
exit;
|
||||
}
|
||||
|
||||
$remoteHost = get_remote_host();
|
||||
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
|
||||
|
||||
$link = connect();
|
||||
if(!check_connections_from_remote($remoteHost, $link)) {
|
||||
mysql_close($link);
|
||||
die("number of connections from your IP is exceeded, try again later");
|
||||
}
|
||||
$thread = create_thread($groupid,$visitor['name'], $remoteHost, $referrer,$current_locale,$visitor['id'], $userbrowser,$state_loading,$link);
|
||||
$_SESSION['threadid'] = $thread['threadid'];
|
||||
|
||||
if( $referrer ) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer),true),$link);
|
||||
}
|
||||
post_message_($thread['threadid'],$kind_info,getstring('chat.wait', true),$link);
|
||||
if($email) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email),true),$link);
|
||||
}
|
||||
if($info) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info),true),$link);
|
||||
}
|
||||
if($firstmessage) {
|
||||
$postedid = post_message_($thread['threadid'],$kind_user,$firstmessage,$link,$visitor['name']);
|
||||
if ($postedid) {
|
||||
commit_thread( $thread['threadid'], array('shownmessageid' => intval($postedid)), $link);
|
||||
}
|
||||
}
|
||||
notify_operators($thread, $firstmessage, $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
$threadid = $thread['threadid'];
|
||||
$token = $thread['ltoken'];
|
||||
$level = get_remote_level($_SERVER['HTTP_USER_AGENT']);
|
||||
$chatstyle = verifyparam( "style", "/^\w+$/", "");
|
||||
header("Location: $mibewroot/client.php?thread=$threadid&token=$token&level=$level".($chatstyle ? "&style=$chatstyle" : ""));
|
||||
exit;
|
||||
}
|
||||
|
||||
$token = verifyparam( "token", "/^\d{1,10}$/");
|
||||
$threadid = verifyparam( "thread", "/^\d{1,10}$/");
|
||||
$level = verifyparam( "level", "/^(ajaxed|simple|old)$/");
|
||||
|
||||
$thread = thread_by_id($threadid);
|
||||
if( !$thread || !isset($thread['ltoken']) || $token != $thread['ltoken'] ) {
|
||||
die("wrong thread");
|
||||
}
|
||||
|
||||
setup_chatview_for_user($thread, $level);
|
||||
|
||||
$pparam = verifyparam( "act", "/^(mailthread)$/", "default");
|
||||
if( $pparam == "mailthread" ) {
|
||||
expand("styles", getchatstyle(), "mail.tpl");
|
||||
} else if( $level == "ajaxed" ) {
|
||||
expand("styles", getchatstyle(), "chat.tpl");
|
||||
} else if( $level == "simple" ) {
|
||||
expand("styles", getchatstyle(), "chatsimple.tpl");
|
||||
} else if( $level == "old" ) {
|
||||
expand("styles", getchatstyle(), "nochat.tpl");
|
||||
}
|
||||
|
||||
?>
|
@ -1,336 +0,0 @@
|
||||
# This file contains current database schema that is used for installation.
|
||||
# Do not change anything in this file unless you know what you are doing!
|
||||
|
||||
# Contains information about chat groups. This table cannot be named just
|
||||
# "group" because it is reserved SQL word.
|
||||
opgroup:
|
||||
fields:
|
||||
groupid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
parent: "int DEFAULT NULL"
|
||||
vcemail: "varchar(64)"
|
||||
vclocalname: "varchar(64) NOT NULL"
|
||||
vccommonname: "varchar(64) NOT NULL"
|
||||
vclocaldescription: "varchar(1024) NOT NULL"
|
||||
vccommondescription: "varchar(1024) NOT NULL"
|
||||
iweight: "int NOT NULL DEFAULT 0"
|
||||
vctitle: "varchar(255) DEFAULT ''"
|
||||
vcchattitle: "varchar(255) DEFAULT ''"
|
||||
vclogo: "varchar(255) DEFAULT ''"
|
||||
vchosturl: "varchar(255) DEFAULT ''"
|
||||
indexes:
|
||||
parent: [parent]
|
||||
|
||||
# Contains info about chat threads
|
||||
thread:
|
||||
fields:
|
||||
# ID of the thread.
|
||||
threadid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
# Name of the user in chat.
|
||||
username: "varchar(64) NOT NULL"
|
||||
# ID of the user. This field is foreign key for {sitevisitor}.userid
|
||||
userid: "varchar(255)"
|
||||
# Name of the operator who took place in the chat.
|
||||
agentname: "varchar(64)"
|
||||
# ID of the operator who took place in the chat.
|
||||
agentid: "int NOT NULL DEFAULT 0"
|
||||
# Unix timestamp of the moment when the thread was created.
|
||||
dtmcreated: "int NOT NULL DEFAULT 0"
|
||||
# Unix timestamp of the moment when chat actually started.
|
||||
dtmchatstarted: "int NOT NULL DEFAULT 0"
|
||||
# Unix timestamp of the last thread modification.
|
||||
dtmmodified: "int NOT NULL DEFAULT 0"
|
||||
# Unix timestamp of the moment when the thread was closed.
|
||||
dtmclosed: "int NOT NULL DEFAULT 0"
|
||||
# ID of the last thread revision.
|
||||
lrevision: "int NOT NULL DEFAULT 0"
|
||||
# State of the thread. It is one of Thread::STATE_* constants.
|
||||
istate: "int NOT NULL DEFAULT 0"
|
||||
# State of invitation related with the thread. It is one of
|
||||
# Thread::INVITATION_* constants.
|
||||
invitationstate: "int NOT NULL DEFAULT 0"
|
||||
# Last token of the thread.
|
||||
ltoken: "int NOT NULL"
|
||||
# IP address of the user.
|
||||
remote: "varchar(255)"
|
||||
# Page from which chat thread was started.
|
||||
referer: "text"
|
||||
# ID of the operator who will next in the chat.
|
||||
nextagent: "int NOT NULL DEFAULT 0"
|
||||
# Code of chat locale.
|
||||
locale: "varchar(8)"
|
||||
# Unix timestamp of the last request from user's window to server.
|
||||
lastpinguser: "int NOT NULL DEFAULT 0"
|
||||
# Unix timestamp of the last request from operator's window to server.
|
||||
lastpingagent: "int NOT NULL DEFAULT 0"
|
||||
# Indicates if user typing or not. It can take two values 0 and 1.
|
||||
usertyping: "int DEFAULT 0"
|
||||
# Indicates if operator typing or not. It can take two values 0 and 1.
|
||||
agenttyping: "int DEFAULT 0"
|
||||
# ID of shown message in the chat.
|
||||
shownmessageid: "int NOT NULL DEFAULT 0"
|
||||
# User agent description that took from 'User-Agent' HTTP header.
|
||||
useragent: "varchar(255)"
|
||||
# Total count of user's messages related with the thread.
|
||||
messagecount: "varchar(16)"
|
||||
# ID of the group at Mibew Messenger side related with the thread.
|
||||
groupid: "int references {opgroup}(groupid)"
|
||||
|
||||
# Contains "by thread" statistics
|
||||
threadstatistics:
|
||||
fields:
|
||||
statid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
date: "int NOT NULL DEFAULT 0"
|
||||
threads: "int NOT NULL DEFAULT 0"
|
||||
missedthreads: "int NOT NULL DEFAULT 0"
|
||||
sentinvitations: "int NOT NULL DEFAULT 0"
|
||||
acceptedinvitations: "int NOT NULL DEFAULT 0"
|
||||
rejectedinvitations: "int NOT NULL DEFAULT 0"
|
||||
ignoredinvitations: "int NOT NULL DEFAULT 0"
|
||||
operatormessages: "int NOT NULL DEFAULT 0"
|
||||
usermessages: "int NOT NULL DEFAULT 0"
|
||||
averagewaitingtime: "FLOAT(10, 1) NOT NULL DEFAULT 0"
|
||||
averagechattime: "FLOAT(10, 1) NOT NULL DEFAULT 0"
|
||||
|
||||
requestbuffer:
|
||||
fields:
|
||||
requestid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
# Use MD5 hashes as keys
|
||||
requestkey: "char(32) NOT NULL"
|
||||
request: "text NOT NULL"
|
||||
indexes:
|
||||
requestkey: [requestkey]
|
||||
|
||||
requestcallback:
|
||||
fields:
|
||||
callbackid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
token: "varchar(64) NOT NULL DEFAULT ''"
|
||||
func: "varchar(64) NOT NULL"
|
||||
arguments: "varchar(1024)"
|
||||
indexes:
|
||||
token: [token]
|
||||
|
||||
# Contains updated translations
|
||||
translation:
|
||||
fields:
|
||||
translationid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
locale: "varchar(5) NOT NULL"
|
||||
context: "varchar(256) NOT NULL DEFAULT ''"
|
||||
source: "text COLLATE utf8_bin"
|
||||
translation: "text"
|
||||
# An artificial unique key for the record. It is needed to avoid
|
||||
# duplication of translation strings. The field contains SHA-1 hash of
|
||||
# combination of locale, context and source fields. Native MySQL unique
|
||||
# keys cannot be applied to them because "source" field has text data
|
||||
# type.
|
||||
hash: "char(40) NOT NULL"
|
||||
unique_keys:
|
||||
hash: [hash]
|
||||
|
||||
# Contains locales info
|
||||
locale:
|
||||
fields:
|
||||
# Artificial primary key.
|
||||
localeid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
# Locale code
|
||||
code: "varchar(5) NOT NULL"
|
||||
# Human readable name of the locale.
|
||||
name: "varchar(128) NOT NULL DEFAULT ''"
|
||||
# Indicates if the locale is enabled or not.
|
||||
enabled: "tinyint NOT NULL DEFAULT 0"
|
||||
# Indicates if the locale uses RTL writing.
|
||||
rtl: "tinyint NOT NULL DEFAULT 0"
|
||||
# Name of the locale which is used with PHP's setlocale to format dates.
|
||||
time_locale: "varchar(128) NOT NULL DEFAULT 'en_US'"
|
||||
# Serialized array of various date formats.
|
||||
date_format: "text"
|
||||
unique_keys:
|
||||
# Make sure locale code can be duplicated
|
||||
code: [code]
|
||||
|
||||
# Contains localized mail templates
|
||||
mailtemplate:
|
||||
fields:
|
||||
# Artificial primary key
|
||||
templateid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
# Locale code a template belongs to
|
||||
locale: "varchar(5) NOT NULL"
|
||||
# Machine name of a template
|
||||
name: "varchar(256) NOT NULL"
|
||||
# Mail subject
|
||||
subject: "varchar(1024) NOT NULL"
|
||||
# Mail body
|
||||
body: "text"
|
||||
|
||||
# Store chat thread messages
|
||||
message:
|
||||
fields:
|
||||
# Message ID.
|
||||
messageid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
# ID of the thread related with the message.
|
||||
threadid: "int NOT NULL references {thread}(threadid)"
|
||||
# Message kind. It is one of Thread::KIND_* constants.
|
||||
ikind: "int NOT NULL"
|
||||
# ID of operator who sent the message. This value will be ignored for
|
||||
# system messages and messages which sent by users.
|
||||
agentid: "int NOT NULL DEFAULT 0"
|
||||
# Message text body.
|
||||
tmessage: "text NOT NULL"
|
||||
# Name of the plugin which sent the message. If message was not sent by
|
||||
# a plugin this field equals to an empty string.
|
||||
plugin: "varchar(256) NOT NULL DEFAULT ''"
|
||||
# Arbitrary serialized data related with message.
|
||||
data: "text"
|
||||
# Unix timestamp when message was created.
|
||||
dtmcreated: "int NOT NULL DEFAULT 0"
|
||||
# Name of the message sender.
|
||||
tname: "varchar(64)"
|
||||
indexes:
|
||||
idx_agentid: [agentid]
|
||||
|
||||
# Contains info about operators
|
||||
operator:
|
||||
fields:
|
||||
operatorid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
vclogin: "varchar(64) NOT NULL"
|
||||
vcpassword: "varchar(64) NOT NULL"
|
||||
vclocalename: "varchar(64) NOT NULL"
|
||||
vccommonname: "varchar(64) NOT NULL"
|
||||
vcemail: "varchar(64)"
|
||||
dtmlastvisited: "int NOT NULL DEFAULT 0"
|
||||
# Current status of an operator: 0 - online, 1 - away
|
||||
istatus: "int DEFAULT 0"
|
||||
idisabled: "int DEFAULT 0"
|
||||
vcavatar: "varchar(255)"
|
||||
# Operators privileges bitmask.
|
||||
iperm: "int DEFAULT 0"
|
||||
dtmrestore: "int NOT NULL DEFAULT 0"
|
||||
vcrestoretoken: "varchar(64)"
|
||||
# Use to start chat with specified operator.
|
||||
code: "varchar(64) DEFAULT ''"
|
||||
|
||||
# Contains "by operator" statistics
|
||||
operatorstatistics:
|
||||
fields:
|
||||
statid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||
date: "int NOT NULL DEFAULT 0"
|
||||
operatorid: "int NOT NULL"
|
||||
threads: "int NOT NULL DEFAULT 0"
|
||||
messages: "int NOT NULL DEFAULT 0"
|
||||
averagelength: "FLOAT(10, 1) NOT NULL DEFAULT 0"
|
||||
sentinvitations: "int NOT NULL DEFAULT 0"
|
||||
acceptedinvitations: "int NOT NULL DEFAULT 0"
|
||||
rejectedinvitations: "int NOT NULL DEFAULT 0"
|
||||
ignoredinvitations: "int NOT NULL DEFAULT 0"
|
||||
indexes:
|
||||
operatorid: [operatorid]
|
||||
|
||||
revision:
|
||||
fields:
|
||||
id: "INT NOT NULL PRIMARY KEY"
|
||||
|
||||
# Contains relations between operators and groups
|
||||
operatortoopgroup:
|
||||
fields:
|
||||
groupid: "int NOT NULL references {opgroup}(groupid)"
|
||||
operatorid: "int NOT NULL references {operator}(operatorid)"
|
||||
indexes:
|
||||
groupid: [groupid]
|
||||
operatorid: [operatorid]
|
||||
|
||||
# Contains banned visitors
|
||||
ban:
|
||||
fields:
|
||||
banid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
dtmcreated: "int NOT NULL DEFAULT 0"
|
||||
dtmtill: "int NOT NULL DEFAULT 0"
|
||||
address: "varchar(255)"
|
||||
comment: "varchar(255)"
|
||||
|
||||
# Contains dynamic configs
|
||||
config:
|
||||
fields:
|
||||
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
vckey: "varchar(255)"
|
||||
vcvalue: "varchar(255)"
|
||||
|
||||
# Contains canned messages
|
||||
cannedmessage:
|
||||
fields:
|
||||
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
locale: "varchar(8)"
|
||||
groupid: "int references {opgroup}(groupid)"
|
||||
vctitle: "varchar(100) NOT NULL DEFAULT ''"
|
||||
vcvalue: "varchar(1024) NOT NULL"
|
||||
|
||||
sitevisitor:
|
||||
fields:
|
||||
visitorid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
userid: "varchar(255) NOT NULL"
|
||||
username: "varchar(64)"
|
||||
firsttime: "int NOT NULL DEFAULT 0"
|
||||
lasttime: "int NOT NULL DEFAULT 0"
|
||||
entry: "text NOT NULL"
|
||||
details: "text NOT NULL"
|
||||
invitations: "INT NOT NULL DEFAULT 0"
|
||||
chats: "INT NOT NULL DEFAULT 0"
|
||||
threadid: "INT references {thread}(threadid) on delete set null"
|
||||
indexes:
|
||||
threadid: [threadid]
|
||||
|
||||
visitedpage:
|
||||
fields:
|
||||
pageid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
address: "varchar(1024)"
|
||||
visittime: "int NOT NULL DEFAULT 0"
|
||||
visitorid: "INT"
|
||||
# Indicates if path included in 'by page' statistics
|
||||
calculated: "tinyint NOT NULL DEFAULT 0"
|
||||
indexes:
|
||||
visitorid: [visitorid]
|
||||
|
||||
# Contains "by page" statistics
|
||||
visitedpagestatistics:
|
||||
fields:
|
||||
pageid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
date: "int NOT NULL DEFAULT 0"
|
||||
address: "varchar(1024)"
|
||||
visits: "int NOT NULL DEFAULT 0"
|
||||
chats: "int NOT NULL DEFAULT 0"
|
||||
sentinvitations: "int NOT NULL DEFAULT 0"
|
||||
acceptedinvitations: "int NOT NULL DEFAULT 0"
|
||||
rejectedinvitations: "int NOT NULL DEFAULT 0"
|
||||
ignoredinvitations: "int NOT NULL DEFAULT 0"
|
||||
|
||||
# Contains info about installed plugins
|
||||
plugin:
|
||||
fields:
|
||||
# Artificial ID
|
||||
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
# Plugin name in "<Vendor>:<Name>" format.
|
||||
name: "varchar(255) NOT NULL"
|
||||
# Installed version of the plugin.
|
||||
version: "varchar(255) NOT NULL"
|
||||
# Indicates if the plugin is installed or not.
|
||||
installed: "tinyint NOT NULL DEFAULT 0"
|
||||
# Indicates if the plugin is enabled or not.
|
||||
enabled: "tinyint NOT NULL DEFAULT 0"
|
||||
# Indicates if the plugin is initialized or not.
|
||||
initialized: "tinyint NOT NULL DEFAULT 0"
|
||||
unique_keys:
|
||||
name: [name]
|
||||
|
||||
# Contains info about all available updates
|
||||
availableupdate:
|
||||
fields:
|
||||
# Artificial ID
|
||||
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||
# Can be either "core" or fully qualified plugin's name
|
||||
target: "varchar(255) NOT NULL"
|
||||
# The latest available version of the plugin
|
||||
version: "varchar(255) NOT NULL"
|
||||
# A URL where the new version can be downloaded
|
||||
url: "text"
|
||||
# Description of the update
|
||||
description: "text"
|
||||
unique_keys:
|
||||
target: [target]
|
@ -1,98 +0,0 @@
|
||||
# IMPORTANT: Before install Mibew Messenger copy this file to config.yml and
|
||||
# fill it with your own settings!
|
||||
|
||||
|
||||
# MySQL Database parameters
|
||||
database:
|
||||
host: ""
|
||||
port: 3306
|
||||
db: ""
|
||||
login: ""
|
||||
pass: ""
|
||||
tables_prefix: ""
|
||||
use_persistent_connection: false
|
||||
|
||||
# Mail
|
||||
## This value will be used as sender address in all e-mails Mibew Messenger send.
|
||||
mailbox: mibew@yourdomain.com
|
||||
|
||||
## Mailer parameters
|
||||
mailer:
|
||||
# This value determines what kind of mailer will be used. Possible values
|
||||
# are "mail" and "smtp".
|
||||
#
|
||||
# To use standard PHP mail function just set this option to "mail". No
|
||||
# additional configs are required in this case.
|
||||
#
|
||||
# To use SMTP-based solution set this option "smtp". This approach require
|
||||
# some extra configuration to be done (see below).
|
||||
transport: mail
|
||||
|
||||
# The lines below represents default SMTP mailer configurations. They will
|
||||
# be used only if the "transport" option is set to "smtp".
|
||||
host: localhost
|
||||
port: 25
|
||||
user: user
|
||||
pass: ""
|
||||
# The following option determines what kind of encryption should be used.
|
||||
# false means no encyption at all. Another values once can use are "ssl" and
|
||||
# "tls".
|
||||
encryption: false
|
||||
|
||||
# Cache subsystem
|
||||
cache:
|
||||
# This value determines where the cached data will be stored. Possible
|
||||
# values are "none", "file_system" and "memcached".
|
||||
#
|
||||
# If "none" is used the caching will be disabled. This option should be used
|
||||
# only if none of the other options works.
|
||||
#
|
||||
# If "file_system" is used the cached data will be stored in files within
|
||||
# the "cache/" directory. Notice, that the file system storage does not work
|
||||
# on NFS systems bucause exclusive file locks are not supported where.
|
||||
#
|
||||
# If "memcached" is used the cached data will be stored in Memcached
|
||||
# storage. Before using this kind of storage make sure PHP's memcached
|
||||
# extension is installed and enabled.
|
||||
storage: file_system
|
||||
|
||||
# The lines below represents default Memcached server configurations. They
|
||||
# will be used only if the "storage" option is set to "memcached".
|
||||
memcached_servers:
|
||||
- host: localhost
|
||||
port: 11211
|
||||
# The "weight" field is optional and can be omitted and it's only positive int number.
|
||||
weight: 1
|
||||
# Actually, one can use any number of memcached servers he wants. Just
|
||||
# add servers description like the one above.
|
||||
|
||||
# Locales
|
||||
## Native name will be used in this locale
|
||||
home_locale: en
|
||||
## If user does not provide known lang
|
||||
default_locale: en
|
||||
|
||||
# A timezone to use. Leave this value empty to use the default timezone from the
|
||||
# system settings. For the details about available timezones see
|
||||
# http://php.net/manual/en/timezones.php
|
||||
timezone: ""
|
||||
|
||||
# List of proxy's IP Mibew Messenger should trust. You should set this option
|
||||
# if you use Mibew Messenger with a load balancer or behind a proxy.
|
||||
trusted_proxies: []
|
||||
# Here is an example of what values this option can take:
|
||||
# trusted_proxies:
|
||||
# - 127.0.0.1
|
||||
# - ::1
|
||||
# - 10.0.0.0/8
|
||||
|
||||
# Plugins
|
||||
plugins: []
|
||||
|
||||
## Example of plugins configuration
|
||||
# plugins:
|
||||
# "VendorName:PluginName":
|
||||
# weight: 100
|
||||
# some_configurable_value: value
|
||||
# "VendorName:AnotherPluginName":
|
||||
# very_important_value: "$3.50"
|
@ -1,829 +0,0 @@
|
||||
# Chat actions
|
||||
chat_thread_update:
|
||||
path: /thread/update
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\ThreadController::updateAction
|
||||
|
||||
## Operator's chat
|
||||
chat_operator:
|
||||
path: /operator/chat/{thread_id}/{token}
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\OperatorChatController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
token: \d{1,10}
|
||||
|
||||
chat_operator_redirect:
|
||||
path: /operator/chat/{thread_id}/{token}/redirect
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\RedirectController::redirectAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
token: \d{1,10}
|
||||
|
||||
chat_operator_start:
|
||||
path: /operator/chat/{thread_id}
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\OperatorChatController::startAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
|
||||
chat_operator_redirection_links:
|
||||
path: /operator/chat/{thread_id}/{token}/redirection-links
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\RedirectController::showRedirectionLinksAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
token: \d{1,10}
|
||||
|
||||
## User's chat
|
||||
chat_user:
|
||||
path: /chat/{thread_id}/{token}
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\UserChatController::indexAction
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
token: \d{1,10}
|
||||
|
||||
chat_user_check:
|
||||
path: /chat/{thread_id}/{token}/check
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\UserChatController::checkAction
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
token: \d{1,10}
|
||||
|
||||
chat_user_invitation:
|
||||
path: /chat/invitation
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\UserChatController::invitationAction
|
||||
|
||||
chat_user_mail:
|
||||
path: /chat/{thread_id}/{token}/mail
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\MailController::showFormAction
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
token: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
chat_user_mail_send:
|
||||
path: /chat/{thread_id}/{token}/mail
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\MailController::submitFormAction
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
token: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
chat_user_popup_style:
|
||||
path: /chat/style/popup/{style}
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\StyleController::loadPopupStyleAction
|
||||
style: ""
|
||||
requirements:
|
||||
style: "[0-9A-Za-z_]*"
|
||||
|
||||
chat_user_popup_style_force_secure:
|
||||
path: /chat/style/popup/{style}/force_secure
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\StyleController::loadPopupStyleAction
|
||||
style: ""
|
||||
force_secure: on
|
||||
requirements:
|
||||
style: "[0-9A-Za-z_]*"
|
||||
|
||||
chat_user_start:
|
||||
path: /chat
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\UserChatController::startAction
|
||||
|
||||
chat_user_cookie_set_permission:
|
||||
path: /chat/cookies-set-permission
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Chat\UserChatController::cookieSetPermissionAction
|
||||
|
||||
# Pages that are available for all users
|
||||
button:
|
||||
path: /b
|
||||
defaults: { _controller: Mibew\Controller\ButtonController::indexAction }
|
||||
|
||||
captcha:
|
||||
path: /captcha
|
||||
defaults: { _controller: Mibew\Controller\CaptchaController::drawAction }
|
||||
|
||||
cron:
|
||||
path: /cron
|
||||
defaults: { _controller: Mibew\Controller\CronController::runAction }
|
||||
|
||||
# A set of localization constants for the client side applications is generated
|
||||
# dynamically
|
||||
js_translation:
|
||||
path: /locales/{locale}/translation.js
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\JsTranslationController::indexAction
|
||||
|
||||
widget_gateway:
|
||||
path: /widget
|
||||
defaults: { _controller: Mibew\Controller\WidgetController::indexAction }
|
||||
|
||||
# Operators' pages
|
||||
|
||||
## About page
|
||||
about:
|
||||
path: /operator/about
|
||||
defaults:
|
||||
_controller: Mibew\Controller\AboutController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
## Banned visitors
|
||||
ban_add:
|
||||
path: /operator/ban/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\BanController::showEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
methods: [GET]
|
||||
|
||||
ban_add_save:
|
||||
path: /operator/ban/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\BanController::submitEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
methods: [POST]
|
||||
|
||||
ban_delete:
|
||||
path: /operator/ban/{ban_id}/delete
|
||||
defaults:
|
||||
_controller: Mibew\Controller\BanController::deleteAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
ban_id: \d{1,10}
|
||||
|
||||
ban_edit:
|
||||
path: /operator/ban/{ban_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\BanController::showEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
ban_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
ban_edit_save:
|
||||
path: /operator/ban/{ban_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\BanController::submitEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
ban_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
bans:
|
||||
path: /operator/ban
|
||||
defaults:
|
||||
_controller: Mibew\Controller\BanController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
## Button code
|
||||
button_code:
|
||||
path: /operator/button-code
|
||||
defaults:
|
||||
_controller: Mibew\Controller\ButtonCodeController::generateAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Canned messages
|
||||
canned_message_add:
|
||||
path: /operator/canned-message/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\CannedMessageController::showEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
canned_message_add_save:
|
||||
path: /operator/canned-message/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\CannedMessageController::submitEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
canned_message_delete:
|
||||
path: /operator/canned-message/{message_id}/delete
|
||||
defaults:
|
||||
_controller: Mibew\Controller\CannedMessageController::deleteAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
message_id: \d{1,10}
|
||||
|
||||
canned_message_edit:
|
||||
path: /operator/canned-message/{message_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\CannedMessageController::showEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
message_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
canned_message_edit_save:
|
||||
path: /operator/canned-message/{message_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\CannedMessageController::submitEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
message_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
canned_messages:
|
||||
path: /operator/canned-message
|
||||
defaults:
|
||||
_controller: Mibew\Controller\CannedMessageController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Groups
|
||||
group_add:
|
||||
path: /operator/group/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\SettingsController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
group_add_save:
|
||||
path: /operator/group/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\SettingsController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
group_delete:
|
||||
path: /operator/group/{group_id}/delete
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\ManagementController::deleteAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
group_id: \d{1,10}
|
||||
|
||||
group_edit:
|
||||
path: /operator/group/{group_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\SettingsController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
group_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
group_edit_save:
|
||||
path: /operator/group/{group_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\SettingsController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
group_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
group_members:
|
||||
path: /operator/group/{group_id}/members
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\MembersController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
group_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
group_members_save:
|
||||
path: /operator/group/{group_id}/members
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\MembersController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
group_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
groups:
|
||||
path: /operator/group
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Group\ManagementController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## History
|
||||
history:
|
||||
path: /operator/history
|
||||
defaults:
|
||||
_controller: Mibew\Controller\HistoryController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
history_thread:
|
||||
path: /operator/history/thread/{thread_id}
|
||||
defaults:
|
||||
_controller: Mibew\Controller\HistoryController::threadAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
thread_id: \d{1,10}
|
||||
|
||||
history_user:
|
||||
path: /operator/history/user/{user_id}
|
||||
defaults:
|
||||
_controller: Mibew\Controller\HistoryController::userAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
requirements:
|
||||
user_id: .{0,63}
|
||||
|
||||
history_user_track:
|
||||
path: /operator/history/user-track
|
||||
defaults:
|
||||
_controller: Mibew\Controller\HistoryController::userTrackAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
## Home
|
||||
home:
|
||||
path: /
|
||||
defaults:
|
||||
_controller: Mibew\Controller\HomeController::redirectAction
|
||||
|
||||
home_operator:
|
||||
path: /operator
|
||||
defaults:
|
||||
_controller: Mibew\Controller\HomeController::dashboardAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
## Invitations
|
||||
invite:
|
||||
path: /operator/invite
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InvitationController::inviteAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
## Locales
|
||||
locale_disable:
|
||||
path: /operator/locale/{locale}/disable
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\LocaleController::disableAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
locale: "[a-z\\-]{2,5}"
|
||||
|
||||
locale_edit:
|
||||
path: /operator/locale/{locale}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\LocaleController::showEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
locale: "[a-z\\-]{2,5}"
|
||||
methods: [GET]
|
||||
|
||||
locale_edit_save:
|
||||
path: /operator/locale/{locale}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\LocaleController::submitEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
locale: "[a-z\\-]{2,5}"
|
||||
methods: [POST]
|
||||
|
||||
locale_enable:
|
||||
path: /operator/locale/{locale}/enable
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\LocaleController::enableAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
locale: "[a-z\\-]{2,5}"
|
||||
|
||||
locales:
|
||||
path: /operator/locale
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\LocaleController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Log in
|
||||
login:
|
||||
path: /operator/login
|
||||
defaults:
|
||||
_controller: Mibew\Controller\LoginController::showFormAction
|
||||
methods: [GET]
|
||||
|
||||
login_submit:
|
||||
path: /operator/login
|
||||
defaults:
|
||||
_controller: Mibew\Controller\LoginController::submitFormAction
|
||||
methods: [POST]
|
||||
|
||||
## Log out
|
||||
logout:
|
||||
path: /operator/logout
|
||||
defaults:
|
||||
_controller: Mibew\Controller\LogoutController::logoutAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
## Mail templates
|
||||
mail_template_edit:
|
||||
path: /operator/mail-template/{name}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\MailTemplateController::showEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
requirements:
|
||||
name: "[A-Za-z0-9_]+"
|
||||
|
||||
mail_template_edit_save:
|
||||
path: /operator/mail-template/{name}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\MailTemplateController::submitEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
requirements:
|
||||
name: "[A-Za-z0-9_]+"
|
||||
|
||||
mail_templates:
|
||||
path: /operator/mail-template
|
||||
defaults:
|
||||
_controller: Mibew\Controller\MailTemplateController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Operators
|
||||
operator_add:
|
||||
path: /operator/operator/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ProfileController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
operator_add_save:
|
||||
path: /operator/operator/add
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ProfileController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
operator_avatar:
|
||||
path: /operator/operator/{operator_id}/avatar
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\AvatarController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
operator_avatar_delete:
|
||||
path: /operator/operator/{operator_id}/avatar/delete
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\AvatarController::deleteAction
|
||||
_access_check: Mibew\AccessControl\Check\OperatorEditCheck
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
|
||||
operator_avatar_save:
|
||||
path: /operator/operator/{operator_id}/avatar
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\AvatarController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\OperatorEditCheck
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
operator_edit:
|
||||
path: /operator/operator/{operator_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ProfileController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
operator_edit_save:
|
||||
path: /operator/operator/{operator_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ProfileController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\OperatorEditCheck
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
operator_enable:
|
||||
path: /operator/operator/{operator_id}/enable
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ManagementController::enableAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
|
||||
operator_delete:
|
||||
path: /operator/operator/{operator_id}/delete
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ManagementController::deleteAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
|
||||
operator_disable:
|
||||
path: /operator/operator/{operator_id}/disable
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ManagementController::disableAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
|
||||
operator_groups:
|
||||
path: /operator/operator/{operator_id}/groups
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\GroupsController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
operator_groups_save:
|
||||
path: /operator/operator/{operator_id}/groups
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\GroupsController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
operator_permissions:
|
||||
path: /operator/operator/{operator_id}/permissions
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\PermissionsController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [GET]
|
||||
|
||||
operator_permissions_save:
|
||||
path: /operator/operator/{operator_id}/permissions
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\PermissionsController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
operator_id: \d{1,10}
|
||||
methods: [POST]
|
||||
|
||||
operators:
|
||||
path: /operator/operator
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Operator\ManagementController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Password recovery
|
||||
password_recovery:
|
||||
path: /operator/password-recovery
|
||||
defaults:
|
||||
_controller: Mibew\Controller\PasswordRecoveryController::indexAction
|
||||
|
||||
password_recovery_reset:
|
||||
path: /operator/password-recovery/reset
|
||||
defaults:
|
||||
_controller: Mibew\Controller\PasswordRecoveryController::resetAction
|
||||
|
||||
## Plugins
|
||||
plugin_enable:
|
||||
path: /operator/plugin/{plugin_name}/enable
|
||||
defaults:
|
||||
_controller: Mibew\Controller\PluginController::enableAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
plugin_disable:
|
||||
path: /operator/plugin/{plugin_name}/disable
|
||||
defaults:
|
||||
_controller: Mibew\Controller\PluginController::disableAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
plugin_uninstall:
|
||||
path: /operator/plugin/{plugin_name}/uninstall
|
||||
defaults:
|
||||
_controller: Mibew\Controller\PluginController::uninstallAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
plugin_update:
|
||||
path: /operator/plugin/{plugin_name}/update
|
||||
defaults:
|
||||
_controller: Mibew\Controller\PluginController::updateAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
plugins:
|
||||
path: /operator/plugin
|
||||
defaults:
|
||||
_controller: Mibew\Controller\PluginController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Settings
|
||||
settings_common:
|
||||
path: /operator/settings
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Settings\CommonController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
settings_common_save:
|
||||
path: /operator/settings
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Settings\CommonController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
settings_features:
|
||||
path: /operator/settings/features
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Settings\FeaturesController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
settings_features_save:
|
||||
path: /operator/settings/features
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Settings\FeaturesController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
settings_performance:
|
||||
path: /operator/settings/performance
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Settings\PerformanceController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
settings_performance_save:
|
||||
path: /operator/settings/performance
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Settings\PerformanceController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
## Statistics
|
||||
statistics:
|
||||
path: /operator/statistics/{type}
|
||||
defaults:
|
||||
type: "by-date"
|
||||
_controller: Mibew\Controller\StatisticsController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_VIEWSTATISTICS]
|
||||
requirements:
|
||||
type: by-date|by-operator|by-page
|
||||
|
||||
## Styles
|
||||
style_preview:
|
||||
path: /operator/style/{type}/preview
|
||||
defaults:
|
||||
_controller: Mibew\Controller\StyleController::previewAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
type: chat|invitation|page
|
||||
|
||||
## Translation
|
||||
translation_edit:
|
||||
path: /operator/translation/{string_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\TranslationController::showEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
string_id: "\\d{1,10}"
|
||||
methods: [GET]
|
||||
|
||||
translation_edit_save:
|
||||
path: /operator/translation/{string_id}/edit
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\TranslationController::submitEditFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
requirements:
|
||||
string_id: "\\d{1,10}"
|
||||
methods: [POST]
|
||||
|
||||
translation_export:
|
||||
path: /operator/translation/export
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\TranslationExportController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
translation_export_process:
|
||||
path: /operator/translation/export
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\TranslationExportController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
translation_import:
|
||||
path: /operator/translation/import
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\TranslationImportController::showFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [GET]
|
||||
|
||||
translation_import_process:
|
||||
path: /operator/translation/import
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\TranslationImportController::submitFormAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
methods: [POST]
|
||||
|
||||
translations:
|
||||
path: /operator/translation
|
||||
defaults:
|
||||
_controller: Mibew\Controller\Localization\TranslationController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Updates
|
||||
update:
|
||||
path: /update
|
||||
defaults:
|
||||
_controller: Mibew\Controller\UpdateController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
update_run:
|
||||
path: /update/run
|
||||
defaults:
|
||||
_controller: Mibew\Controller\UpdateController::runUpdateAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
update_check:
|
||||
path: /update/check
|
||||
defaults:
|
||||
_controller: Mibew\Controller\UpdateController::checkUpdatesAction
|
||||
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||
_access_permissions: [CAN_ADMINISTRATE]
|
||||
|
||||
## Users (visitors avaiting page)
|
||||
users:
|
||||
path: /operator/users
|
||||
defaults:
|
||||
_controller: Mibew\Controller\UsersController::indexAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
users_update:
|
||||
path: /operator/users/update
|
||||
defaults:
|
||||
_controller: Mibew\Controller\UsersController::updateAction
|
||||
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||
|
||||
# System routes and includes
|
||||
|
||||
# The following route is a fake and is used only to load plugins routes. It can
|
||||
# have any unique name.
|
||||
_include_pluign_routes:
|
||||
# Resource name has no meaning and can be any value.
|
||||
resource: .
|
||||
# The type actually indicates that plugins routes should be included.
|
||||
type: plugin
|
||||
|
||||
# Remove trailing slashes. This route is the last one because previous rotes can
|
||||
# (but definitely should not) have trailing slashes.
|
||||
remove_trailing_slash:
|
||||
path: /{url}
|
||||
defaults:
|
||||
_controller: Mibew\Controller\RedirectController::removeTrailingSlashAction
|
||||
requirements:
|
||||
url: .*/$
|
||||
methods: [GET]
|
@ -1,60 +0,0 @@
|
||||
# The following route is a fake and is used only to load routes of the core. It
|
||||
# can have any unique name.
|
||||
_include_core_routes:
|
||||
resource: routing.yml
|
||||
type: yaml
|
||||
|
||||
# Override the home route to allow users use <mibew root>/install.php path to
|
||||
# the installer.
|
||||
home:
|
||||
path: /
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::indexAction
|
||||
|
||||
install:
|
||||
path: /install
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::indexAction
|
||||
|
||||
install_check_requirements:
|
||||
path: /install/check-requirements
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::checkRequirementsAction
|
||||
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||
|
||||
install_check_connection:
|
||||
path: /install/check-connection
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::checkConnectionAction
|
||||
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||
|
||||
install_create_tables:
|
||||
path: /install/create-tables
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::createTablesAction
|
||||
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||
|
||||
install_set_password:
|
||||
path: /install/set-password
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::showPasswordFormAction
|
||||
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||
methods: [GET]
|
||||
|
||||
install_set_password_submit:
|
||||
path: /install/set-password
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::submitPasswordFormAction
|
||||
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||
methods: [POST]
|
||||
|
||||
install_import_locales:
|
||||
path: /install/import-locales
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::importLocalesAction
|
||||
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||
|
||||
install_done:
|
||||
path: /install/done
|
||||
defaults:
|
||||
_controller: Mibew\Controller\InstallController::doneAction
|
@ -1,52 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is a part of Mibew Messenger.
|
||||
*
|
||||
* Copyright 2005-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// Initialize libraries
|
||||
require_once(dirname(__FILE__) . '/libs/init.php');
|
||||
|
||||
use Mibew\Cache\CacheFactory;
|
||||
use Mibew\Maintenance\CronWorker;
|
||||
use Mibew\Plugin\PluginManager;
|
||||
|
||||
$configs = load_system_configs();
|
||||
|
||||
// Prepare the cache. It is initialized in the same way as in index.php
|
||||
$cache_factory = new CacheFactory($configs['cache']);
|
||||
// For now directory for cache files cannot be changed via the configs file.
|
||||
$cache_factory->setOption('path', MIBEW_FS_ROOT . '/cache/stash');
|
||||
|
||||
// Run plugins
|
||||
if (get_maintenance_mode() === false) {
|
||||
$plugin_manager = PluginManager::getInstance();
|
||||
$plugin_manager->setCache($cache_factory->getCache());
|
||||
$plugin_manager->loadPlugins($configs['plugins']);
|
||||
}
|
||||
|
||||
// Do the job.
|
||||
$worker = new CronWorker($cache_factory->getCache());
|
||||
$success = $worker->run();
|
||||
|
||||
if ($success) {
|
||||
echo("All cron jobs done\n");
|
||||
} else {
|
||||
echo("Cron job failed. Here are the errors:\n");
|
||||
foreach ($worker->getErrors() as $error) {
|
||||
echo(' ' . $error . "\n");
|
||||
}
|
||||
}
|
921
src/mibew/default.css
Normal file
@ -0,0 +1,921 @@
|
||||
/*
|
||||
* Copyright 2005-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* reset all */
|
||||
|
||||
html, body, div, h1, h2, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote, pre, form, fieldset, table, th, td { margin: 0; padding: 0; }
|
||||
table { border-collapse:collapse; border-spacing:0; }
|
||||
fieldset,img { border:0; }
|
||||
ol,ul { list-style:none; }
|
||||
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
|
||||
q:before,q:after { content:''; }
|
||||
|
||||
body {
|
||||
background: #FFFFFF url(images/header.gif) repeat-x;
|
||||
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
|
||||
font-size: 0.8em;
|
||||
line-height: 140%;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
/* 100% height with footer, 200 px sidebar */
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
min-width: 750px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #2f7599;
|
||||
}
|
||||
|
||||
#wrap400, #wrap700, #fixedwrap {
|
||||
position:relative;
|
||||
margin: 0px auto -41px;
|
||||
height:auto !important;
|
||||
height:100%;
|
||||
min-height:100%;
|
||||
}
|
||||
|
||||
#wrap400 {
|
||||
width: 100%;
|
||||
min-width:450px;
|
||||
}
|
||||
|
||||
#wrap700 {
|
||||
width: 100%;
|
||||
min-width:750px;
|
||||
}
|
||||
|
||||
#fixedwrap {
|
||||
width: 750px;
|
||||
}
|
||||
|
||||
.contentdiv {
|
||||
float:left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.contentinner {
|
||||
margin-right: 210px;
|
||||
padding: 10px 60px 10px 20px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.contentnomenu {
|
||||
padding: 10px 60px 10px 20px;
|
||||
}
|
||||
|
||||
.empty_inner {
|
||||
height:40px;
|
||||
}
|
||||
|
||||
#footer {
|
||||
background: white url(images/footer.gif) bottom repeat-x;
|
||||
font-size:11px;
|
||||
position:relative;
|
||||
|
||||
min-height: 40px;
|
||||
height:40px;
|
||||
vertical-align:middle;
|
||||
|
||||
width:100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#legal {
|
||||
clear: both;
|
||||
line-height: 30px;
|
||||
padding-top:10px;
|
||||
text-align: center;
|
||||
color: #375C69;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
#footer .flink {
|
||||
color: #2f7599;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#togglediv {
|
||||
float:right;
|
||||
padding-right:10px;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
#header {
|
||||
width: 100%;
|
||||
height: 32px;
|
||||
margin: 0px -2px 10px 0px;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
background: url(images/graydot.gif) repeat-x left bottom;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#header {
|
||||
float: left;
|
||||
}
|
||||
|
||||
img.left {
|
||||
float: left;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
img.logo {
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
#header h1 {
|
||||
font-size: 2em;
|
||||
line-height: 32px;
|
||||
color: #494949;
|
||||
margin-left: 40px;
|
||||
}
|
||||
|
||||
#header h1 a {
|
||||
color: #494949;
|
||||
}
|
||||
|
||||
#header a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#title {
|
||||
float: left;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#path {
|
||||
float: right;
|
||||
padding: 10px 20px 0px 0px;
|
||||
line-height: 22px;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
width: 185px;
|
||||
margin-left: -210px;
|
||||
margin-top: 20px;
|
||||
position:relative;
|
||||
line-height: 180%
|
||||
}
|
||||
|
||||
#sidebar ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#sidebar li {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
#sidebar li ul {
|
||||
}
|
||||
|
||||
#sidebar li li {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#sidebar h2 {
|
||||
text-transform: lowercase;
|
||||
margin-bottom: 10px;
|
||||
background: url(images/graydot.gif) repeat-x left bottom;
|
||||
font-size: 1.3em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.locales a {
|
||||
color: #2f7599;
|
||||
font-size: 1em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.locales .active a {
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.locales a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.submenu a {
|
||||
padding-left: 15px;
|
||||
color: #2f7599;
|
||||
font-size: 1em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.submenu a.inner { padding-left: 0px; }
|
||||
.submenu span.small { font-size: 80%; padding-left: 5px; }
|
||||
|
||||
.submenu .active a {
|
||||
background: url(images/li.gif) no-repeat left 1px;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.submenu .active a.inner {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.submenu a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* form, tabbed form */
|
||||
|
||||
.mform {
|
||||
background: url(images/loginbg.gif);
|
||||
clear: both;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
float: right;
|
||||
margin-left: 15px;
|
||||
display: inline;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.tabs li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.tabs a {
|
||||
display: block;
|
||||
float: left;
|
||||
padding: 2px 9px 3px 9px;
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
color: #2f7599;
|
||||
}
|
||||
|
||||
.tabs li.active a {
|
||||
background: url(images/loginbg.gif);
|
||||
border-left:1px solid #bbbbbb;border-top:1px solid #bbbbbb;border-right:1px solid #bbbbbb;
|
||||
color: #000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.formtop, .formbottom, .formtopi, .formbottomi { height: 15px;}
|
||||
.formtop { background: url(images/logincrnrt.gif) no-repeat top right;}
|
||||
.formtopi { background: url(images/logincrnlt.gif) no-repeat top left; }
|
||||
.formbottom { background: url(images/logincrnrb.gif) no-repeat bottom right; }
|
||||
.formbottomi { background: url(images/logincrnlb.gif) no-repeat bottom left; }
|
||||
.forminner { margin: 0px 15px;}
|
||||
.forminner p { margin-bottom: 1em; }
|
||||
|
||||
/* fieldForm */
|
||||
|
||||
.fieldForm {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.packedFormField {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
float:left;
|
||||
margin-right:25px;
|
||||
margin-bottom:8px;
|
||||
}
|
||||
|
||||
.packedFormField select {
|
||||
min-width: 130px;
|
||||
}
|
||||
|
||||
div.errinfo {
|
||||
color: #c13030;
|
||||
}
|
||||
|
||||
.field {
|
||||
width: 100%;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.flabel {
|
||||
position: relative;
|
||||
margin: 8px auto 2px;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.fleftlabel {
|
||||
float: left;
|
||||
width: 11em;
|
||||
}
|
||||
|
||||
.flabel span.required {
|
||||
font-size:8.0pt;
|
||||
color:red;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.field .subfield {
|
||||
padding-left: 30px;
|
||||
background: url(images/subitem.gif) no-repeat 10px 2px;
|
||||
}
|
||||
|
||||
.fieldinrow {
|
||||
min-width: 300px;
|
||||
display: inline;
|
||||
float:left;
|
||||
width: 45%;
|
||||
}
|
||||
|
||||
.fvalue {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.fvaluewithta {
|
||||
float: left;
|
||||
width: 67%;
|
||||
}
|
||||
|
||||
.fvaluewithta textarea {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.fvaluenodesc {
|
||||
}
|
||||
|
||||
.fvalueframe {
|
||||
overflow: auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.fvalueframe iframe {
|
||||
border: solid 1px #999;
|
||||
}
|
||||
|
||||
.fdescr {
|
||||
float:left;
|
||||
padding-left:10px;
|
||||
color: #676767;
|
||||
font-size: 10px;
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
.fbutton {
|
||||
background: url(images/formline.gif) repeat-x;
|
||||
margin-top: 20px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.fbutton .links {
|
||||
float: right;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.fbutton .submitbutton {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.formauth {
|
||||
}
|
||||
|
||||
textarea.wide {
|
||||
border:1px solid #878787;
|
||||
overflow:auto;
|
||||
width: 95%;
|
||||
}
|
||||
|
||||
input.formauth {
|
||||
border: 1px solid #878787;
|
||||
color: #333;
|
||||
margin-right:15px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
#formmessage {
|
||||
border: 1px solid #4C96D4;
|
||||
background-color: #E7F1F9;
|
||||
padding: 8px 11px;
|
||||
font-size: 0.85em;
|
||||
font-weight:bold;
|
||||
max-width: 700px;
|
||||
margin: -10px 2px 10px;
|
||||
color: #515151;
|
||||
}
|
||||
|
||||
#offwarn {
|
||||
border: 1px solid #4CD496;
|
||||
background-color: #E7F9F1;
|
||||
color: #515151;
|
||||
padding: 8px 11px;
|
||||
font-size: 0.85em;
|
||||
font-weight:bold;
|
||||
line-height: 140%;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#offwarn img {
|
||||
margin-top: .4em;
|
||||
float: left;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.asterisk {
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
/* tables */
|
||||
|
||||
.tabletool {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.tabletool a {
|
||||
color: #296685;
|
||||
vertical-align: top;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.tabletitle {
|
||||
background: url(images/graydot.gif) repeat-x left bottom;
|
||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||
font-size: 1.4em;
|
||||
margin: 10px 0px 20px;
|
||||
padding-bottom: 10px;
|
||||
color: #1D485E;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
table.list, table.translate, table.statistics {
|
||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.list th, table.translate th, table.statistics th {
|
||||
font-size: 1.2em;
|
||||
font-weight: normal;
|
||||
padding: 10px 8px;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
table.list th, table.translate th { color: #1D485E; }
|
||||
table.statistics th { color: #2F7598; }
|
||||
|
||||
table.list td, table.statistics td {
|
||||
color: #2f7599;
|
||||
padding: 10px 8px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
|
||||
table.translate td {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
color: #515151;
|
||||
padding: 2px 8px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
|
||||
table.list td a.man {
|
||||
background: url(images/tbliclogin.gif) no-repeat left center;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
table.list td a.mail {
|
||||
background: url(images/mail.png) no-repeat left center;
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
||||
table.list td a.xmpp {
|
||||
background: url(images/xmpp.png) no-repeat left center;
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
||||
table.list tbody tr:hover td, table.list tbody tr:hover td a, table.statistics tbody tr:hover td {
|
||||
color: #1D485E;
|
||||
}
|
||||
|
||||
/* awaiting */
|
||||
|
||||
table.awaiting {
|
||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.awaiting th {
|
||||
font-size: 1.2em;
|
||||
font-weight: normal;
|
||||
color: #1D485E;
|
||||
padding: 10px 8px;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table.awaiting th.first {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.awaiting table.inner {
|
||||
border: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.awaiting table.inner .icon {
|
||||
width: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table.awaiting td.visitor {
|
||||
color: #296685;
|
||||
border-bottom: 1px solid #ccc;
|
||||
padding: 10px 8px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.awaiting .visitor a { color: #296685; }
|
||||
.awaiting tr:hover .visitor, .awaiting tr:hover .visitor a { color: #1D485E; }
|
||||
|
||||
.awaiting tr.ban .visitor, .awaiting tr.ban .visitor a { color: #9AC8E0; }
|
||||
.awaiting tr.ban:hover .visitor, .awaiting tr.ban:hover .visitor a { color: #4C9CC8; }
|
||||
|
||||
.awaiting tr.inwait .visitor, .awaiting tr.inwait a { font-weight: bold; }
|
||||
.awaiting tr.inprio .visitor, .awaiting tr.inprio a { font-weight: bold; font-size: 1.05em; }
|
||||
.awaiting tr.inchat .visitor, .awaiting tr.inchat .visitor a { color: #777; }
|
||||
.awaiting tr.inchat:hover .visitor, .awaiting tr.inchat:hover .visitor a { color: #444; }
|
||||
.awaiting tr.inchat a { text-decoration: none; }
|
||||
|
||||
.firstmessage {
|
||||
text-align: right;
|
||||
font-size: 0.8em;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.firstmessage a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.firstmessage a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#connstatus {
|
||||
float:right;
|
||||
margin: 10px 10px;
|
||||
}
|
||||
|
||||
#connlinks {
|
||||
margin: 10px 10px;
|
||||
}
|
||||
|
||||
#connlinks a {
|
||||
color: #777;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#connlinks a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* online operators */
|
||||
|
||||
#onlineoperators {
|
||||
padding-right: 10px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
/* search */
|
||||
|
||||
#searchtext {
|
||||
float:left;
|
||||
display: inline;
|
||||
margin:7px 20px 5px 0px;
|
||||
width:75%;
|
||||
padding-right:5px;
|
||||
}
|
||||
|
||||
.searchctrl {
|
||||
float: left;
|
||||
margin:7px 20px 5px 0px;
|
||||
padding-right:5px;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#searchtext input {
|
||||
width: 100%;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#searchbutton {
|
||||
float:left;
|
||||
}
|
||||
|
||||
/* login */
|
||||
|
||||
#loginsmallpane {
|
||||
float: right;
|
||||
padding: 10px 15px 0px 0px;
|
||||
margin-right: 0px;
|
||||
line-height: 22px;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#loginsmallpane input {
|
||||
margin: 0px 3px;
|
||||
padding: 0px 2px;
|
||||
}
|
||||
|
||||
#loginsmallpane .butt {
|
||||
height: 1.3em;
|
||||
border: 0px;
|
||||
background: none;
|
||||
}
|
||||
|
||||
#loginsmallpane .butt:hover {
|
||||
background: #aaa;
|
||||
}
|
||||
|
||||
#loginintro {
|
||||
width: 400px;
|
||||
margin: 10px 30px;
|
||||
}
|
||||
|
||||
#loginpane {
|
||||
width: 400px;
|
||||
margin: 30px 30px;
|
||||
}
|
||||
|
||||
#loginpane .header h2 {
|
||||
font-size: 2em;
|
||||
margin-bottom: 0.9em;
|
||||
padding-bottom: 0.8em;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
/* nice button */
|
||||
|
||||
#confirmpane {
|
||||
width:450px;
|
||||
margin:0px auto 5px;
|
||||
padding-top: 70px;
|
||||
}
|
||||
|
||||
.nicebutton {
|
||||
border: none;
|
||||
float: left;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
.submit a {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
line-height: 35px;
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.submit {
|
||||
background: url(images/submitbg.gif) repeat-x;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
|
||||
/* thread log */
|
||||
|
||||
.logpane {
|
||||
margin: 10px 0px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.logpane .header {
|
||||
padding-bottom: 0.8em;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
.logpane .wlabel {
|
||||
width: 10em;
|
||||
float: left;
|
||||
margin-right:10px;
|
||||
}
|
||||
|
||||
.logpane .wvalue {
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* dashboard */
|
||||
|
||||
#dashboard {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dashitem {
|
||||
width:33%;
|
||||
margin: 0px 2em 5em 0px;
|
||||
padding: 5px 2em 5em;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.dashitem:hover {
|
||||
}
|
||||
|
||||
.dashitem a {
|
||||
padding-top:2px;
|
||||
padding-bottom: 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dashitem img, #dashlocalesPopup h2 img {
|
||||
float: left;
|
||||
padding-right:10px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup h2 img {
|
||||
margin-top: -3px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup .locales {
|
||||
line-height: 180%;
|
||||
margin-left:10px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup h2 {
|
||||
font-size: 1.5em;
|
||||
margin-bottom: 0.9em;
|
||||
padding: 5px 30px 0.8em 0px;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
#dashlocalesPopupClose {
|
||||
float: right;
|
||||
position:absolute;
|
||||
right:5px;
|
||||
top:5px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup {
|
||||
display:none;
|
||||
position:fixed;
|
||||
_position:absolute; /* ie6*/
|
||||
background:#FFFFFF;
|
||||
border:2px solid #2F7598;
|
||||
z-index:110;
|
||||
padding:1em 1em;
|
||||
font-size:1em;
|
||||
}
|
||||
|
||||
#backgroundPopup{
|
||||
display:none;
|
||||
position:fixed;
|
||||
_position:absolute; /* ie6*/
|
||||
height:100%;
|
||||
opacity: .5;
|
||||
width:100%;
|
||||
top:0;
|
||||
left:0;
|
||||
background:#000000;
|
||||
border:1px solid #cecece;
|
||||
z-index:101;
|
||||
}
|
||||
|
||||
/* install */
|
||||
|
||||
#install li {
|
||||
list-style-type: circle;
|
||||
list-style-position: inside;
|
||||
margin-left: 2em;
|
||||
}
|
||||
|
||||
#check-nv, #check-nm {
|
||||
color: #2f7599;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#check-nv:hover, #check-nm:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
|
||||
/* chat */
|
||||
|
||||
.message {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
color: #4F4F4F;
|
||||
padding: 15px 0px 0px 0px;
|
||||
line-height: 17px;
|
||||
}
|
||||
|
||||
.message span.time {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.message span.nuser {
|
||||
color: #B11E23;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.message span.nagent {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.message span.minf {
|
||||
color: #1E48B1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.message span.mevent {
|
||||
color: #A1A1A1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.message span.mhidden {
|
||||
color: #A1A1A1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.message span.mconn {
|
||||
color: #A1A1A1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
/* updates */
|
||||
|
||||
#news {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
margin-bottom:15px;
|
||||
padding:4px;
|
||||
}
|
||||
|
||||
.newstext {
|
||||
margin-bottom:1em;
|
||||
}
|
||||
|
||||
/* rtl rules */
|
||||
|
||||
.lrtl .dashitem img, .lrtl #dashlocalesPopup h2 img, .lrtl #offwarn img {
|
||||
float: right;
|
||||
padding-right:0px;
|
||||
padding-left:10px;
|
||||
}
|
||||
|
||||
.lrtl .fleftlabel {
|
||||
float: right;
|
||||
width: 11em;
|
||||
}
|
||||
|
||||
.lrtl .fdescr {
|
||||
float:right;
|
||||
padding-right:10px;
|
||||
}
|
||||
|
||||
|
||||
.lrtl .field .subfield {
|
||||
padding-right: 30px;
|
||||
background: url(images/subitem_rtl.gif) no-repeat 99% 2px;
|
||||
}
|
||||
|
||||
|
||||
.lrtl .fvalue {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.lrtl .logpane .wlabel {
|
||||
float: right;
|
||||
margin-left:10px;
|
||||
}
|
||||
|
||||
.lrtl .logpane .wvalue {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.lrtl .fvaluewithta {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.lrtl #togglediv {
|
||||
float:left;
|
||||
padding-left:10px;
|
||||
}
|
Before Width: | Height: | Size: 372 B After Width: | Height: | Size: 372 B |
BIN
src/mibew/images/buttons/createagent.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/mibew/images/buttons/createban.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/mibew/images/buttons/createdep.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/mibew/images/dash/blocked.gif
Normal file
After Width: | Height: | Size: 732 B |
BIN
src/mibew/images/dash/canned.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
BIN
src/mibew/images/dash/dep.gif
Normal file
After Width: | Height: | Size: 728 B |
BIN
src/mibew/images/dash/exit.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/mibew/images/dash/getcode.gif
Normal file
After Width: | Height: | Size: 604 B |
BIN
src/mibew/images/dash/history.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/mibew/images/dash/locale.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/mibew/images/dash/notifications.gif
Normal file
After Width: | Height: | Size: 690 B |
BIN
src/mibew/images/dash/operators.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/mibew/images/dash/profile.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
19
src/mibew/images/dash/readme.txt
Normal file
@ -0,0 +1,19 @@
|
||||
"34aL volume 3.1" icons set
|
||||
|
||||
Ammount of icons:
|
||||
60
|
||||
|
||||
Colors:
|
||||
Colored, grey
|
||||
|
||||
Icon Sizes:
|
||||
24x24
|
||||
|
||||
File Types:
|
||||
.ico (RGBA, 256 color, 16 color),
|
||||
.tiff (RGBA)
|
||||
.gif (indexed)
|
||||
.bmp (RGB - 1 color background),
|
||||
.png (RGBA)
|
||||
|
||||
Note: These icons are free for use.
|
BIN
src/mibew/images/dash/settings.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/mibew/images/dash/stat.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/mibew/images/dash/updates.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/mibew/images/dash/visitors.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/mibew/images/dash/warn.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 894 B After Width: | Height: | Size: 894 B |
Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 43 B After Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 49 B After Width: | Height: | Size: 49 B |
Before Width: | Height: | Size: 43 B After Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 713 B After Width: | Height: | Size: 713 B |
Before Width: | Height: | Size: 60 B After Width: | Height: | Size: 60 B |
Before Width: | Height: | Size: 377 B After Width: | Height: | Size: 377 B |
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
Before Width: | Height: | Size: 148 B After Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 199 B After Width: | Height: | Size: 199 B |
Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 142 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
BIN
src/mibew/images/mail.png
Normal file
After Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 915 B After Width: | Height: | Size: 915 B |
Before Width: | Height: | Size: 905 B After Width: | Height: | Size: 905 B |
Before Width: | Height: | Size: 906 B After Width: | Height: | Size: 906 B |
Before Width: | Height: | Size: 914 B After Width: | Height: | Size: 914 B |
Before Width: | Height: | Size: 75 B After Width: | Height: | Size: 75 B |
Before Width: | Height: | Size: 74 B After Width: | Height: | Size: 74 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 55 B After Width: | Height: | Size: 55 B |
Before Width: | Height: | Size: 89 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 43 B After Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 92 B After Width: | Height: | Size: 92 B |
Before Width: | Height: | Size: 329 B After Width: | Height: | Size: 329 B |
Before Width: | Height: | Size: 309 B After Width: | Height: | Size: 309 B |
Before Width: | Height: | Size: 554 B After Width: | Height: | Size: 554 B |
Before Width: | Height: | Size: 338 B After Width: | Height: | Size: 338 B |
Before Width: | Height: | Size: 640 B After Width: | Height: | Size: 640 B |
Before Width: | Height: | Size: 53 B After Width: | Height: | Size: 53 B |