Compare commits

..

No commits in common. "master" and "v2.0.0-beta.4" have entirely different histories.

565 changed files with 1634 additions and 11831 deletions

18
.gitignore vendored
View File

@ -1,11 +1,6 @@
# IDE folders
.idea
src/mibew/install/package src/mibew/install/package
src/absent_* src/absent_*
src/release* src/release*
src/upload*
src/*.po
# Do not index actual configuration files # Do not index actual configuration files
src/mibew/configs/config.yml src/mibew/configs/config.yml
@ -38,18 +33,17 @@ src/mibew/js/vendor
# Do not index node.js modules that are used for building # Do not index node.js modules that are used for building
src/node_modules src/node_modules
src/package-lock.json
# Do not index compiled js files of the core # Do not index compiled js files of the core
src/mibew/js/compiled/* src/mibew/js/compiled/*
!src/mibew/js/compiled/.keep !src/mibew/js/compiled/.keep
# Do not index compiled files of chat styles # Do not index compiled files of chat styles
src/mibew/styles/chats/*/templates_compiled/client_side/* src/mibew/styles/chats/default/templates_compiled/client_side/*
!src/mibew/styles/chats/*/templates_compiled/client_side/.keep !src/mibew/styles/chats/default/templates_compiled/client_side/.keep
src/mibew/styles/chats/*/js/compiled/* src/mibew/styles/chats/default/js/compiled/*
!src/mibew/styles/chats/*/js/compiled/.keep !src/mibew/styles/chats/default/js/compiled/.keep
# Do not index compiled files of page styles # Do not index compiled files of page styles
src/mibew/styles/pages/*/templates_compiled/client_side/* src/mibew/styles/pages/default/templates_compiled/client_side/*
!src/mibew/styles/pages/*/templates_compiled/client_side/.keep !src/mibew/styles/pages/default/templates_compiled/client_side/.keep

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "src/i18n"]
path = src/i18n
url = git@github.com:Mibew/i18n.git

View File

@ -1,12 +0,0 @@
### Environment
* Mibew Messenger version:
* OS:
* Web server:
* PHP:
* PHP extensions:
* MySQL:
### Expected behavior
### Actual behavior
### Steps to reproduce the behavior

View File

@ -1 +0,0 @@
./src/mibew/LICENSE.txt

View File

@ -1,8 +0,0 @@
Fixes # .
Changes proposed in this pull request:
-
-
-
@Mibew/core-developers

View File

@ -11,7 +11,7 @@ This repository contains the core of Mibew Messenger application.
## Server requirements ## Server requirements
1. A webserver or web hosting account running on any major Operating System 1. A webserver or web hosting account running on any major Operating System
2. PHP (7.2.5 and above) with PDO, pdo_mysql, cURL, mbstring and gd extensions 2. PHP (5.3.3 and above) with PDO, pdo_mysql and gd extensions
3. MySQL 5.0 and above 3. MySQL 5.0 and above
## Build from sources ## Build from sources
@ -33,39 +33,7 @@ Mibew Messenger is licensed under the terms of [Apache License, Version 2.0](htt
## Other repositories of the Mibew project ## Other repositories of the Mibew project
### Actual
1. [Mibew Messenger i18n repository](https://github.com/Mibew/i18n) 1. [Mibew Messenger i18n repository](https://github.com/Mibew/i18n)
2. [Mibew Messenger design repository](https://github.com/Mibew/design) 2. [Mibew Messenger design repository](https://github.com/Mibew/design)
3. [Mibew documentation repository](https://github.com/Mibew/docs.mibew.org) 3. [Mibew Java applications repository](https://github.com/Mibew/java)
4. [Mibew Tray repository](https://github.com/Mibew/tray)
### Obsolete
1. [Mibew Java applications repository](https://github.com/Mibew/java)
2. [Mibew Tray repository](https://github.com/Mibew/tray)
### Plugins
1. [Mibew Boilerplate plugin](https://github.com/Mibew/boilerplate-plugin) - a template for a real plugin
#### Ready for production use
1. [Mibew Advanced Button plugin](https://github.com/Mibew/advanced-button-plugin)
2. [Mibew Auto Invite plugin](https://github.com/Mibew/auto-invite-plugin)
3. [Mibew Auto Reply plugin](https://github.com/Mibew/auto-reply-plugin)
4. [Mibew Broadcast plugin](https://github.com/Mibew/broadcast-plugin)
5. [Mibew Bulk Logs Operations plugin](https://github.com/Mibew/bulk-logs-operations-plugin)
6. [Mibew Button Refresh plugin](https://github.com/Mibew/button-refresh-plugin)
7. [Mibew Emoji plugin](https://github.com/Mibew/emoji-plugin)
8. [Mibew Filter Visitors By Operator Code plugin](https://github.com/Mibew/filter-visitors-by-operator-code-plugin)
9. [Mibew First Message plugin](https://github.com/Mibew/first-message-plugin)
10. [Mibew Geo IP plugin](https://github.com/Mibew/geo-ip-plugin)
11. [Mibew Google Maps plugin](https://github.com/Mibew/google-maps-plugin)
12. [Mibew Open Street Map plugin](https://github.com/Mibew/open-street-map-plugin)
13. [Mibew Operator Status plugin](https://github.com/Mibew/mibew-operator-status-plugin)
14. [Mibew Purge History plugin](https://github.com/Mibew/purge-history-plugin)
15. [Mibew Real Ban plugin](https://github.com/Mibew/real-ban-plugin)
16. [Mibew Slack plugin](https://github.com/Mibew/mibew_slack)
17. [Mibew Title Notification plugin](https://github.com/Mibew/title-notification-plugin)
#### Not ready for production use (not stable, broken, obsolete, etc.)
1. [Mibew External API plugin](https://github.com/Mibew/external-api-plugin)

View File

@ -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
}
}

View File

@ -3,13 +3,13 @@
"private": true, "private": true,
"dependencies": { "dependencies": {
"underscore": "1.8.2", "underscore": "1.8.2",
"json": "https://github.com/douglascrockford/JSON-js.git#c98948ae1944a28e2e8ebc3717894e580aeaaa05", "json": "2012.10.08",
"jquery": "1.11.3", "jquery": "1.11.2",
"backbone": "1.1.2", "backbone": "1.1.2",
"marionette": "2.4.1", "marionette": "2.4.1",
"handlebars": "4.3.0", "handlebars": "3.0.0",
"vex": "2.3.2", "vex": "2.3.2",
"validator-js": "3.40.0" "validator-js": "3.34.0"
}, },
"resolutions": { "resolutions": {
"underscore": "1.8.2" "underscore": "1.8.2"

View File

@ -1,49 +1,39 @@
{ {
"name": "mibew/mibew", "name": "mibew/mibew",
"version": "3.6.0", "version": "2.0.0-beta.4",
"description": "Mibew Messenger - open-source live support application", "description": "Mibew Messenger - open-source live support application",
"type": "project", "type": "project",
"homepage": "https://mibew.org", "homepage": "http://mibew.org",
"license": "Apache-2.0", "license": "Apache-2.0",
"authors": [ "authors": [
{ {
"name": "Mibew Messenger Project", "name": "Mibew Messenger Project",
"homepage": "https://mibew.org/credits" "homepage": "http://mibew.org/credits"
} }
], ],
"support": { "support": {
"email": "support@mibew.org", "email": "support@mibew.org",
"issues": "https://github.com/mibew/mibew/issues", "issues": "https://github.com/mibew/mibew/issues",
"forum": "https://mibew.org/forums", "forum": "http://mibew.org/forums",
"source": "https://github.com/mibew/mibew" "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": { "require": {
"mibew/handlebars.php": "~0.10.5", "xamin/handlebars.php": "0.10.*",
"mibew/handlebars.php-helpers": "1.*", "justblackbird/handlebars.php-helpers": "~0.2.1",
"symfony/http-foundation": "4.4.*", "symfony/http-foundation": "2.6.*",
"symfony/routing": "4.4.*", "symfony/routing": "2.6.*",
"symfony/config": "4.4.*", "symfony/config": "2.6.*",
"symfony/yaml": "^5.2", "symfony/yaml": "2.6.*",
"symfony/translation": "2.6.*", "symfony/translation": "2.6.*",
"tedivm/stash": "0.12.*", "tedivm/stash": "0.12.*",
"mibew/html5": "1.1.*", "canteen/html5": "1.1.*",
"vierbergenlars/php-semver": "3.0.*", "vierbergenlars/php-semver": "3.0.*",
"swiftmailer/swiftmailer": "~5.4.0", "swiftmailer/swiftmailer": "~5.4.0",
"ua-parser/uap-php": "^3.9", "ua-parser/uap-php": "~3.4.1",
"true/punycode": "~1.1" "true/punycode": "~1.1"
}, },
"require-dev": { "require-dev": {
"squizlabs/php_codesniffer": "3.*" "squizlabs/php_codesniffer": "2.*"
}, },
"config": { "config": {
"vendor-dir": "mibew/vendor" "vendor-dir": "mibew/vendor"

View File

@ -1,14 +1,12 @@
// Initialize requirements
var fs = require('fs'), var fs = require('fs'),
https = require('https'), https = require('https'),
exec = require('child_process').exec, exec = require('child_process').exec,
eventStream = require('event-stream'), eventStream = require('event-stream'),
runSequence = require('gulp4-run-sequence'), runSequence = require('run-sequence'),
through = require('through2'), through = require('through2'),
lodash = require('lodash'), lodash = require('lodash'),
PoFile = require('pofile'), PoFile = require('pofile'),
strftime = require('strftime'), strftime = require('strftime'),
del = require('del'),
bower = require('bower'), bower = require('bower'),
gulp = require('gulp'), gulp = require('gulp'),
uglify = require('gulp-uglify'), uglify = require('gulp-uglify'),
@ -25,12 +23,9 @@ var fs = require('fs'),
chmod = require('gulp-chmod'), chmod = require('gulp-chmod'),
xgettext = require('gulp-xgettext'), xgettext = require('gulp-xgettext'),
concatPo = require('gulp-concat-po'), concatPo = require('gulp-concat-po'),
rename = require('gulp-rename'), rename = require('gulp-rename');
eslint = require('gulp-eslint'),
removeDuplicateHeaders = require('mibew-gulp-greh'),
mkdirp = require('mkdirp');
// Set global configuration // Set global configs.
var config = { var config = {
mibewPath: 'mibew', mibewPath: 'mibew',
configsPath: 'mibew/configs', configsPath: 'mibew/configs',
@ -42,83 +37,46 @@ var config = {
jsPath: 'mibew/js', jsPath: 'mibew/js',
chatStylesPath: 'mibew/styles/chats', chatStylesPath: 'mibew/styles/chats',
pageStylesPath: 'mibew/styles/pages', pageStylesPath: 'mibew/styles/pages',
i18nPath: 'i18n',
i18nPrefix: 'mibew-i18n-',
releasePath: 'release',
uploadPath: 'upload',
compiledTemplatesHeader: fs.readFileSync('tools/compiled_templates_header.txt'), compiledTemplatesHeader: fs.readFileSync('tools/compiled_templates_header.txt'),
getComposerUrl: 'https://getcomposer.org/installer', getComposerUrl: 'https://getcomposer.org/installer',
phpBin: 'php -d "suhosin.executor.include.whitelist = phar" -d "memory_limit=512M"', phpBin: 'php -d "suhosin.executor.include.whitelist = phar"',
package: require('./composer.json'), package: require('./composer.json')
msginit: 'msginit',
msgcat: 'msgcat'
} }
config.i18nSuffix = '-' + config.package.version + '-' + strftime('%Y%m%d');
// Tasks for cleaning //////////////////
// Cleans all built files // Checks all PHP files with PHP Code Sniffer.
gulp.task('clean', function(callback) { gulp.task('phpcs', ['composer-install-dev'], function() {
return del([ return gulp.src([
config.releasePath, config.mibewPath + '/**/*.php',
'composer.lock', '!' + config.phpVendorPath + '/**/*.*',
config.phpVendorPath, '!' + config.pluginsPath + '/**/*.*',
config.jsVendorPath, '!' + config.cachePath + '/**/*.*'
config.jsPath + '/compiled/**/*', ], {
'!' + config.jsPath + '/compiled/.keep', // Content of the cache directory is readable only for webserver. Thus
config.chatStylesPath + '/*/templates_compiled/client_side/*.js', // we must to set "strict" option to false to prevent "EACCES" errors.
config.chatStylesPath + '/*/js/compiled/*.js', // At the same we need to see all errors that take place.
config.pageStylesPath + '/*/templates_compiled/client_side/*.js' strict: false,
], callback); silent: false
})
.pipe(phpcs({
bin: config.phpVendorPath + '/bin/phpcs',
standard: 'PSR2',
warningSeverity: 0
}))
.pipe(phpcs.reporter('log'))
.pipe(phpcs.reporter('fail'));
}); });
// 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 // Get and install PHP Composer
gulp.task('get-composer', function(callback) { gulp.task('get-composer', function(callback) {
// Check whether Composer is already in place // Check if Composer already in place
if (fs.existsSync('./composer.phar')) { if (fs.existsSync('./composer.phar')) {
callback(null); callback(null);
return; return;
} }
// Get installer from the Internet // Get installer from the internet
https.get(config.getComposerUrl, function(response) { https.get(config.getComposerUrl, function(response) {
// Run PHP to install Composer // Run PHP to install Composer
var php = exec(config.phpBin, function(error, stdout, stderr) { var php = exec(config.phpBin, function(error, stdout, stderr) {
@ -130,20 +88,18 @@ gulp.task('get-composer', function(callback) {
}); });
// Install Composer dependencies excluding development ones // Install Composer dependencies excluding development ones
gulp.task('composer-install', gulp.series('get-composer', function(callback) { gulp.task('composer-install', ['get-composer'], function(callback) {
exec(config.phpBin + ' composer.phar install --no-dev', exec(config.phpBin + ' composer.phar install --no-dev', function(error, stdout, stderr) {
function(error, stdout, stderr) { callback(error ? stderr : null);
callback(error ? stderr : null); });
}); });
}));
// Install all Composer dependencies // Install all Composer dependencies
gulp.task('composer-install-dev', gulp.series('get-composer', function(callback) { gulp.task('composer-install-dev', ['get-composer'], function(callback) {
exec(config.phpBin + ' composer.phar install', exec(config.phpBin + ' composer.phar install', function(error, stdout, stderr) {
function(error, stdout, stderr) { callback(error ? stderr : null);
callback(error ? stderr : null); });
}); });
}));
// Installs bower dependencies // Installs bower dependencies
gulp.task('bower-install', function(callback) { gulp.task('bower-install', function(callback) {
@ -153,15 +109,14 @@ gulp.task('bower-install', function(callback) {
}) })
.on('end', function() { .on('end', function() {
// We should manually minify JavaScript files that was not minified // We should manually minify JavaScript files that was not minified
// by bower packages' authors // by bower packages' authors.
// TODO: This is a temproary workaround and should be removed once // TODO: This is a temproary workaround and should be removed once
// the packages will be fixed // the packages will be fixed.
var stream = eventStream.merge( var stream = eventStream.merge(
gulp.src(config.jsVendorPath + '/backbone/backbone.js', gulp.src(config.jsVendorPath + '/backbone/backbone.js', {base: config.jsVendorPath})
{base: config.jsVendorPath})
.pipe(uglify({preserveComments: 'some'})) .pipe(uglify({preserveComments: 'some'}))
// There are neither "@license" tag nor "!preserve" in the // There are neither "@license" tag nor "!preserve" in the
// header. Add the header manually // header. Add the header manually.
.pipe(header( .pipe(header(
"// Backbone.js 1.1.2\n" "// Backbone.js 1.1.2\n"
+ "// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n" + "// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n"
@ -170,67 +125,22 @@ gulp.task('bower-install', function(callback) {
+ "// http://backbonejs.org\n" + "// http://backbonejs.org\n"
)) ))
.pipe(rename('backbone/backbone-min.js')), .pipe(rename('backbone/backbone-min.js')),
gulp.src(config.jsVendorPath + '/json/json2.js', gulp.src(config.jsVendorPath + '/json/json2.js', {base: config.jsVendorPath})
{base: config.jsVendorPath})
.pipe(uglify({preserveComments: 'some'})) .pipe(uglify({preserveComments: 'some'}))
// There are neither "@license" tag nor "!preserve" in the // There are neither "@license" tag nor "!preserve" in the
// header, add the header manually // header. Add the header manually.
.pipe(header("// json2.js. Public Domain. See http://www.JSON.org/js.html\n")) .pipe(header("// json2.js. Public Domain. See http://www.JSON.org/js.html\n"))
.pipe(rename('json/json2.min.js')) .pipe(rename('json/json2.min.js'))
) );
.pipe(gulp.dest(config.jsVendorPath));
stream.pipe(gulp.dest(config.jsVendorPath));
stream stream
.on('error', callback) .on('error', callback)
.on('end', callback); .on('end', callback);
}); });
}); });
// Tasks for checking ////////////////// // Compile all JavaScript files of the Mibew Core
// 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() { gulp.task('js', function() {
return eventStream.merge( return eventStream.merge(
getClientSideApp('default'), getClientSideApp('default'),
@ -240,111 +150,75 @@ gulp.task('js', function() {
gulp.src(config.jsPath + '/source/**/*.js') gulp.src(config.jsPath + '/source/**/*.js')
) )
.pipe(uglify({preserveComments: 'some'})) .pipe(uglify({preserveComments: 'some'}))
.pipe(removeDuplicateHeaders())
.pipe(gulp.dest(config.jsPath + '/compiled')); .pipe(gulp.dest(config.jsPath + '/compiled'));
}); });
// Compile and concatenate Handlebars templates for all chat styles // Performs all job related with chat styles.
gulp.task('chat-styles', ['chat-styles-handlebars', 'chat-styles-js'], function() {
// This task is just a combination of other tasks. That is why there is no
// real code.
});
// Compile and concatenate handlebars files for all chat styles.
gulp.task('chat-styles-handlebars', function() { gulp.task('chat-styles-handlebars', function() {
return getChildDirs(config.chatStylesPath) // TODO: Process all available styles, not only the default one.
.then(function (dirs) { var stylePath = config.chatStylesPath + '/default';
return Promise.all(dirs.map(function (dir) {
return new Promise(function(resolve, reject) { return gulp.src(stylePath + '/templates_src/client_side/**/*.handlebars')
gulp.src(config.chatStylesPath + '/' + dir .pipe(handlebars({
+ '/templates_src/client_side/**/*.handlebars') // Use specific version of Handlebars.js
.pipe(handlebars({ handlebars: handlebarsEngine
// Use specific version of Handlebars.js }))
handlebars: handlebarsEngine .pipe(wrapHandlebarsTemplate())
})) .pipe(concat('templates.js'))
.pipe(wrapHandlebarsTemplate()) .pipe(uglify({preserveComments: 'some'}))
.pipe(concat('templates.js')) .pipe(header(config.compiledTemplatesHeader))
.pipe(uglify({preserveComments: 'some'})) .pipe(gulp.dest(stylePath + '/templates_compiled/client_side'));
.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 // Compile and concatenate js files for all chat styles.
gulp.task('chat-styles-js', function() { gulp.task('chat-styles-js', function() {
return getChildDirs(config.chatStylesPath) // TODO: Process all available styles, not only the default one.
.then(function (dirs) { var stylePath = config.chatStylesPath + '/default';
return Promise.all(dirs.map(function (dir) {
return new Promise(function(resolve, reject) { return gulp.src(stylePath + '/js/source/**/*.js')
gulp.src(config.chatStylesPath + '/' + dir .pipe(concat('scripts.js'))
+ '/js/source/**/*.js') .pipe(uglify({preserveComments: 'some'}))
.pipe(concat('scripts.js')) .pipe(gulp.dest(stylePath + '/js/compiled'));
.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 // Performs all job related with pages styles.
gulp.task('page-styles', function() { gulp.task('page-styles', function() {
return getChildDirs(config.pageStylesPath) // TODO: Process all available styles, not only the default one.
.then(function (dirs) { var stylePath = config.pageStylesPath + '/default';
return Promise.all(dirs.map(function (dir) {
return new Promise(function(resolve, reject){ return gulp.src(stylePath + '/templates_src/client_side/**/*.handlebars')
gulp.src(config.pageStylesPath + '/' + dir .pipe(handlebars({
+ '/templates_src/client_side/**/*.handlebars') // Use specific version of Handlebars.js
.pipe(handlebars({ handlebars: handlebarsEngine
// Use specific version of Handlebars.js }))
handlebars: handlebarsEngine .pipe(wrapHandlebarsTemplate())
})) .pipe(concat('templates.js'))
.pipe(wrapHandlebarsTemplate()) .pipe(uglify({preserveComments: 'some'}))
.pipe(concat('templates.js')) .pipe(header(config.compiledTemplatesHeader))
.pipe(uglify({preserveComments: 'some'})) .pipe(gulp.dest(stylePath + '/templates_compiled/client_side'));
.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 // Generate .pot files based on the sources
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() { gulp.task('generate-pot', function() {
return eventStream.merge( return eventStream.merge(
gulp.src([ gulp.src([
config.mibewPath + '/**/*.php', config.mibewPath + '/**/*.php',
'!' + config.phpVendorPath + '/**/*.*', '!' + config.phpVendorPath + '/**/*.*',
'!' + config.pluginsPath + '/**/*.*', '!' + config.pluginsPath + '/**/*.*',
'!' + config.cachePath + '/**/*.*' '!' + config.cachePath + '/**/*.*'
], { ], {
// Content of the cache directory is readable only for // Content of the cache directory is readable only for webserver.
// webserver. Thus we must to set "strict" option to false // Thus we must to set "strict" option to false to prevent "EACCES"
// to prevent "EACCES" errors. At the same we need to see all // errors. At the same we need to see all errors that take place.
// errors that take place. strict: false,
strict: false, silent: false
silent: false })
})
.pipe(xgettext({ .pipe(xgettext({
language: 'PHP', language: 'PHP',
keywords: [ keywords: [
@ -362,88 +236,27 @@ gulp.task('generate-pot', function() {
] ]
})), })),
gulp.src([ gulp.src([
config.chatStylesPath + '/default/templates_src/**/*.handlebars', config.chatStylesPath + '/default/templates_src/**/*.handlebars',
config.pageStylesPath + '/default/templates_src/**/*.handlebars' config.pageStylesPath + '/default/templates_src/**/*.handlebars'
], {base: config.mibewPath}) ], {base: config.mibewPath})
.pipe(xgettextHandlebars()) .pipe(xgettextHandlebars())
) )
.pipe(concatPo(config.i18nPrefix + 'translation' .pipe(concatPo('translation.pot', {
+ config.i18nSuffix + '.pot', headers: {
{ 'Project-Id-Version': 'Mibew Messenger ' + config.package.version,
headers: { 'Report-Msgid-Bugs-To': config.package.support.email,
'Project-Id-Version': 'Mibew Messenger ' 'POT-Creation-Date': strftime('%Y-%m-%d %H:%M%z'),
+ config.package.version, 'PO-Revision-Date': '',
'Report-Msgid-Bugs-To': config.package.support.email, 'Last-Translator': '',
'POT-Creation-Date': strftime('%Y-%m-%d %H:%M%z'), 'Language-Team': '',
'PO-Revision-Date': '', 'Content-Type': 'text/plain; charset=UTF-8'
'Last-Translator': '', }
'Language-Team': '', }))
'Content-Type': 'text/plain; charset=UTF-8' .pipe(gulp.dest('release'));
}
})
)
.pipe(gulp.dest(config.releasePath));
}); });
// Generate temporary English translation to be used in the release // Pack sources to .zip and .tar.gz archives.
gulp.task('generate-tmp-po', gulp.series('generate-pot', function(callback) { gulp.task('pack-sources', ['composer-install', 'bower-install'], function() {
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 = [ var sources = [
config.mibewPath + '/**/*', config.mibewPath + '/**/*',
// Exclude user's config // Exclude user's config
@ -486,15 +299,13 @@ gulp.task('pack-sources', gulp.series('composer-install', 'bower-install', funct
'!' + config.jsVendorPath + '/vex/coffee{,/**}' '!' + config.jsVendorPath + '/vex/coffee{,/**}'
]; ];
var srcOptions = { var srcOptions = {
// Dot files (.htaccess, .keep, etc.) must be included in the package // Dot files (.htaccess, .keep, etc.) must be included in the package.
dot: true, dot: true,
// Content of the cache directory is readable only for webserver. Thus // Content of the cache directory is readable only for webserver. Thus
// we must to set "strict" option to false to prevent "EACCES" errors. // we must to set "strict" option to false to prevent "EACCES" errors.
// At the same we need to see all errors that take place. // At the same we need to see all errors that take place.
strict: false, strict: false,
silent: false, silent: false
// Preserve root directory name (i.e. 'mibew/')
base: '.'
} }
var version = config.package.version; var version = config.package.version;
@ -505,111 +316,34 @@ gulp.task('pack-sources', gulp.series('composer-install', 'bower-install', funct
.pipe(tar('mibew-' + version + '.tar')) .pipe(tar('mibew-' + version + '.tar'))
.pipe(gzip()) .pipe(gzip())
) )
.pipe(chmod(644)) .pipe(chmod(0644))
.pipe(gulp.dest(config.releasePath)); .pipe(gulp.dest('release'));
}));
// 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 ////////////////// // Performs all tasks in the correct order.
// Prepare release of Mibew Messenger
gulp.task('prepare-release', function(callback) { gulp.task('prepare-release', function(callback) {
runSequence( runSequence(
'clean', ['phpcs', 'js', 'chat-styles', 'page-styles', 'generate-pot'],
['phpcs', 'js', 'chat-styles', 'page-styles', 'generate-pot',
'generate-tmp-po'],
'pack-sources', 'pack-sources',
'post-pack-cleanup',
callback callback
); );
}); });
// Prepare releases of translations for Mibew Messenger // Builds the sources
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) { gulp.task('default', function(callback) {
runSequence( runSequence(
'clean', ['js', 'chat-styles', 'page-styles'],
['js', 'chat-styles', 'page-styles', 'generate-tmp-po'],
'pack-sources', 'pack-sources',
['post-pack-cleanup', 'clean-tmp-po'],
callback callback
); );
}); });
/** /**
* Loads and prepare js file for a client side application with the specified * Loads and prepare js file for a client side application with the specified
* name. * name.
* *
* @param {String} name Application name. * @param {String} name Application name
* @returns A files stream that can be piped to any gulp plugin. * @returns A files stream that can be piped to any gulp plugin.
*/ */
var getClientSideApp = function(name) { var getClientSideApp = function(name) {
@ -679,7 +413,7 @@ var xgettextHandlebars = function() {
contents = file.contents.toString(); contents = file.contents.toString();
while (match = helperRegExp.exec(contents)) { while (match = helperRegExp.exec(contents)) {
// Try to find item in the .po file by its name // Try to find item in the .po file by its name.
var item = lodash.find(po.items, function(item) { var item = lodash.find(po.items, function(item) {
return match[2] === item.msgid; return match[2] === item.msgid;
}); });
@ -687,7 +421,7 @@ var xgettextHandlebars = function() {
var line = contents.substr(0, match.index).split(/\r?\n|\r/g).length; var line = contents.substr(0, match.index).split(/\r?\n|\r/g).length;
if (!item) { if (!item) {
// There is no such item, create new one // There is no such item. Create new one.
item = new PoFile.Item(); item = new PoFile.Item();
item.msgid = match[2].replace(/\\'/g, "'").replace(/\\"/g, '"'); item.msgid = match[2].replace(/\\'/g, "'").replace(/\\"/g, '"');
po.items.push(item); po.items.push(item);
@ -698,46 +432,9 @@ var xgettextHandlebars = function() {
} }
// Update file contents // Update file contents
file.contents = Buffer.from(po.toString()); file.contents = new Buffer(po.toString());
this.push(file); this.push(file);
callback(); 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 +0,0 @@
Subproject commit 55868d9973f531c3550575481bde4233cc625b91

View File

@ -4,11 +4,6 @@ Options -Indexes
# Follow symbolic links in the directory # Follow symbolic links in the directory
Options +FollowSymLinks Options +FollowSymLinks
<IfModule mod_negotiation.c>
# Forbid apache to guess file extensions
Options -MultiViews
</IfModule>
# Disable mod_security for Apache 1.x # Disable mod_security for Apache 1.x
<IfModule mod_security.c> <IfModule mod_security.c>
SecFilterEngine Off SecFilterEngine Off
@ -36,7 +31,7 @@ Options +FollowSymLinks
# Use separate front controller for the system installator # Use separate front controller for the system installator
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^install(/(.*))?$ install.php [QSA,L] RewriteRule ^install(|/(.*))$ install.php [QSA,L]
# Rewrite all other requests for files and directories that do not exist to # Rewrite all other requests for files and directories that do not exist to
# the main front controller # the main front controller
@ -46,10 +41,9 @@ Options +FollowSymLinks
</IfModule> </IfModule>
<IfModule !mod_rewrite.c> <IfModule !mod_rewrite.c>
# There is no mod_rewrite in the system. For the root Mibew Messenger # There is no mod_rewrite in the system. For the root Mibew directory
# directory index_fallback.php should be loaded first to activate # index_fallback.php should be loaded first to activate old-fashioned URLs.
# old-fashioned URLs. For all other directories index.php is just a # For all other directories index.php is just a directory index file.
# directory index file.
DirectoryIndex index_fallback.php index.php DirectoryIndex index_fallback.php index.php
</IfModule> </IfModule>
@ -57,8 +51,3 @@ Options +FollowSymLinks
<FilesMatch "\.(yml|po|ini|handlebars|keep)$"> <FilesMatch "\.(yml|po|ini|handlebars|keep)$">
Deny from all Deny from all
</FilesMatch> </FilesMatch>
# Deny access to CLI cron worker from the outside
<Files "cron.php">
Deny from all
</Files>

View File

@ -1,12 +1,12 @@
Mibew Messenger Mibew Messenger
Copyright 2005-2023 the original author or authors. Copyright 2005-2015 the original author or authors.
REQUIREMENTS REQUIREMENTS
* Apache web server 1.3.34 or above with the ability to use local .htaccess * Apache web server 1.3.34 or above with the ability to use local .htaccess
files (mod_rewrite module is optional, but recommended) files (mod_rewrite module is optional, but recommended)
* MySQL database 5.0 or above * MySQL database 5.0 or above
* PHP 7.2.5 or above with PDO, pdo_mysql, cURL, mbstring and gd extensions * PHP 5.3.3 or above with PDO, pdo_mysql and gd extensions
INSTALLATION INSTALLATION
@ -37,20 +37,3 @@ On unix/linux platforms change the owner of /mibew/files/avatar and
(for instance, www). The owner should have all rights on the folders (for instance, www). The owner should have all rights on the folders
/mibew/files/avatar and /mibew/cache /mibew/files/avatar and /mibew/cache
(chmod 0700 /mibew/files/avatar && chmod 0700 /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.

View File

@ -1 +1 @@
Mibew/3.6.0 Mibew/2.0

View File

@ -72,7 +72,7 @@ thread:
useragent: "varchar(255)" useragent: "varchar(255)"
# Total count of user's messages related with the thread. # Total count of user's messages related with the thread.
messagecount: "varchar(16)" messagecount: "varchar(16)"
# ID of the group at Mibew Messenger side related with the thread. # ID of the group at Mibew side related with the thread.
groupid: "int references {opgroup}(groupid)" groupid: "int references {opgroup}(groupid)"
# Contains "by thread" statistics # Contains "by thread" statistics
@ -104,7 +104,7 @@ requestcallback:
fields: fields:
callbackid: "int NOT NULL auto_increment PRIMARY KEY" callbackid: "int NOT NULL auto_increment PRIMARY KEY"
token: "varchar(64) NOT NULL DEFAULT ''" token: "varchar(64) NOT NULL DEFAULT ''"
func: "varchar(64) NOT NULL" function: "varchar(64) NOT NULL"
arguments: "varchar(1024)" arguments: "varchar(1024)"
indexes: indexes:
token: [token] token: [token]
@ -129,23 +129,12 @@ translation:
# Contains locales info # Contains locales info
locale: locale:
fields: fields:
# Artificial primary key. # Artificial primary key
localeid: "int NOT NULL auto_increment PRIMARY KEY" localeid: "int NOT NULL auto_increment PRIMARY KEY"
# Locale code # Locale code
code: "varchar(5) NOT NULL" code: "varchar(5) NOT NULL"
# Human readable name of the locale. # Indicates if a locale is enabled or not.
name: "varchar(128) NOT NULL DEFAULT ''"
# Indicates if the locale is enabled or not.
enabled: "tinyint NOT NULL DEFAULT 0" 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 # Contains localized mail templates
mailtemplate: mailtemplate:
@ -226,7 +215,7 @@ operatorstatistics:
revision: revision:
fields: fields:
id: "INT NOT NULL PRIMARY KEY" id: "INT NOT NULL"
# Contains relations between operators and groups # Contains relations between operators and groups
operatortoopgroup: operatortoopgroup:
@ -314,23 +303,5 @@ plugin:
installed: "tinyint NOT NULL DEFAULT 0" installed: "tinyint NOT NULL DEFAULT 0"
# Indicates if the plugin is enabled or not. # Indicates if the plugin is enabled or not.
enabled: "tinyint NOT NULL DEFAULT 0" enabled: "tinyint NOT NULL DEFAULT 0"
# Indicates if the plugin is initialized or not.
initialized: "tinyint NOT NULL DEFAULT 0"
unique_keys: unique_keys:
name: [name] 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]

View File

@ -1,5 +1,5 @@
# IMPORTANT: Before install Mibew Messenger copy this file to config.yml and # IMPORTANT: Before install mibew copy this file to config.yml and fill it with
# fill it with your own settings! # your own settings!
# MySQL Database parameters # MySQL Database parameters
@ -13,7 +13,7 @@ database:
use_persistent_connection: false use_persistent_connection: false
# Mail # Mail
## This value will be used as sender address in all e-mails Mibew Messenger send. ## This value will be used as sender address in all e-mails Mibew send.
mailbox: mibew@yourdomain.com mailbox: mibew@yourdomain.com
## Mailer parameters ## Mailer parameters
@ -61,8 +61,8 @@ cache:
memcached_servers: memcached_servers:
- host: localhost - host: localhost
port: 11211 port: 11211
# The "weight" field is optional and can be omitted and it's only positive int number. # The "weight" field is optional and can be omitted.
weight: 1 weight: 0
# Actually, one can use any number of memcached servers he wants. Just # Actually, one can use any number of memcached servers he wants. Just
# add servers description like the one above. # add servers description like the one above.
@ -77,19 +77,10 @@ default_locale: en
# http://php.net/manual/en/timezones.php # http://php.net/manual/en/timezones.php
timezone: "" 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
plugins: [] plugins: []
## Example of plugins configuration ## Exapmle of plugins configuration
# plugins: # plugins:
# "VendorName:PluginName": # "VendorName:PluginName":
# weight: 100 # weight: 100

View File

@ -49,14 +49,6 @@ chat_user:
thread_id: \d{1,10} thread_id: \d{1,10}
token: \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: chat_user_invitation:
path: /chat/invitation path: /chat/invitation
defaults: defaults:
@ -88,25 +80,11 @@ chat_user_popup_style:
requirements: requirements:
style: "[0-9A-Za-z_]*" 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: chat_user_start:
path: /chat path: /chat
defaults: defaults:
_controller: Mibew\Controller\Chat\UserChatController::startAction _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 # Pages that are available for all users
button: button:
path: /b path: /b
@ -200,24 +178,21 @@ canned_message_add:
path: /operator/canned-message/add path: /operator/canned-message/add
defaults: defaults:
_controller: Mibew\Controller\CannedMessageController::showEditFormAction _controller: Mibew\Controller\CannedMessageController::showEditFormAction
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\LoggedInCheck
_access_permissions: [CAN_ADMINISTRATE]
methods: [GET] methods: [GET]
canned_message_add_save: canned_message_add_save:
path: /operator/canned-message/add path: /operator/canned-message/add
defaults: defaults:
_controller: Mibew\Controller\CannedMessageController::submitEditFormAction _controller: Mibew\Controller\CannedMessageController::submitEditFormAction
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\LoggedInCheck
_access_permissions: [CAN_ADMINISTRATE]
methods: [POST] methods: [POST]
canned_message_delete: canned_message_delete:
path: /operator/canned-message/{message_id}/delete path: /operator/canned-message/{message_id}/delete
defaults: defaults:
_controller: Mibew\Controller\CannedMessageController::deleteAction _controller: Mibew\Controller\CannedMessageController::deleteAction
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\LoggedInCheck
_access_permissions: [CAN_ADMINISTRATE]
requirements: requirements:
message_id: \d{1,10} message_id: \d{1,10}
@ -225,8 +200,7 @@ canned_message_edit:
path: /operator/canned-message/{message_id}/edit path: /operator/canned-message/{message_id}/edit
defaults: defaults:
_controller: Mibew\Controller\CannedMessageController::showEditFormAction _controller: Mibew\Controller\CannedMessageController::showEditFormAction
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\LoggedInCheck
_access_permissions: [CAN_ADMINISTRATE]
requirements: requirements:
message_id: \d{1,10} message_id: \d{1,10}
methods: [GET] methods: [GET]
@ -235,8 +209,7 @@ canned_message_edit_save:
path: /operator/canned-message/{message_id}/edit path: /operator/canned-message/{message_id}/edit
defaults: defaults:
_controller: Mibew\Controller\CannedMessageController::submitEditFormAction _controller: Mibew\Controller\CannedMessageController::submitEditFormAction
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\LoggedInCheck
_access_permissions: [CAN_ADMINISTRATE]
requirements: requirements:
message_id: \d{1,10} message_id: \d{1,10}
methods: [POST] methods: [POST]
@ -245,8 +218,7 @@ canned_messages:
path: /operator/canned-message path: /operator/canned-message
defaults: defaults:
_controller: Mibew\Controller\CannedMessageController::indexAction _controller: Mibew\Controller\CannedMessageController::indexAction
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\LoggedInCheck
_access_permissions: [CAN_ADMINISTRATE]
## Groups ## Groups
group_add: group_add:
@ -377,27 +349,7 @@ locale_disable:
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\PermissionsCheck
_access_permissions: [CAN_ADMINISTRATE] _access_permissions: [CAN_ADMINISTRATE]
requirements: requirements:
locale: "[a-z\\-]{2,5}" 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: locale_enable:
path: /operator/locale/{locale}/enable path: /operator/locale/{locale}/enable
@ -406,7 +358,7 @@ locale_enable:
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\PermissionsCheck
_access_permissions: [CAN_ADMINISTRATE] _access_permissions: [CAN_ADMINISTRATE]
requirements: requirements:
locale: "[a-z\\-]{2,5}" locale: "[a-z\-]{2,5}"
locales: locales:
path: /operator/locale path: /operator/locale
@ -698,8 +650,7 @@ statistics:
defaults: defaults:
type: "by-date" type: "by-date"
_controller: Mibew\Controller\StatisticsController::indexAction _controller: Mibew\Controller\StatisticsController::indexAction
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\LoggedInCheck
_access_permissions: [CAN_VIEWSTATISTICS]
requirements: requirements:
type: by-date|by-operator|by-page type: by-date|by-operator|by-page
@ -721,7 +672,7 @@ translation_edit:
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\PermissionsCheck
_access_permissions: [CAN_ADMINISTRATE] _access_permissions: [CAN_ADMINISTRATE]
requirements: requirements:
string_id: "\\d{1,10}" string_id: "\d{1,10}"
methods: [GET] methods: [GET]
translation_edit_save: translation_edit_save:
@ -731,7 +682,7 @@ translation_edit_save:
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\PermissionsCheck
_access_permissions: [CAN_ADMINISTRATE] _access_permissions: [CAN_ADMINISTRATE]
requirements: requirements:
string_id: "\\d{1,10}" string_id: "\d{1,10}"
methods: [POST] methods: [POST]
translation_export: translation_export:
@ -788,13 +739,6 @@ update_run:
_access_check: Mibew\AccessControl\Check\PermissionsCheck _access_check: Mibew\AccessControl\Check\PermissionsCheck
_access_permissions: [CAN_ADMINISTRATE] _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 (visitors avaiting page)
users: users:
path: /operator/users path: /operator/users

View File

@ -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");
}
}

View File

@ -2,7 +2,7 @@
/* /*
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -24,7 +24,6 @@ use Mibew\Application;
use Mibew\Authentication\AuthenticationManager; use Mibew\Authentication\AuthenticationManager;
use Mibew\Cache\CacheFactory; use Mibew\Cache\CacheFactory;
use Mibew\Mail\MailerFactory; use Mibew\Mail\MailerFactory;
use Mibew\Plugin\PluginManager;
use Mibew\Routing\Router; use Mibew\Routing\Router;
use Mibew\Routing\Loader\CacheLoader; use Mibew\Routing\Loader\CacheLoader;
use Mibew\Routing\Loader\PluginLoader; use Mibew\Routing\Loader\PluginLoader;
@ -41,13 +40,6 @@ $cache_factory = new CacheFactory($configs['cache']);
// TODO: Evaluate possibility of using custom cache directory. // TODO: Evaluate possibility of using custom cache directory.
$cache_factory->setOption('path', MIBEW_FS_ROOT . '/cache/stash'); $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']);
}
// The main route loader which loads nothig but works as a cache proxy for other // The main route loader which loads nothig but works as a cache proxy for other
// loaders. // loaders.
$route_loader = new CacheLoader($cache_factory->getCache()); $route_loader = new CacheLoader($cache_factory->getCache());

View File

@ -2,7 +2,7 @@
/* /*
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -20,4 +20,4 @@
// Force the user to specify the entry point. This should be done only when // Force the user to specify the entry point. This should be done only when
// mod_rewrite is not used by apache. // mod_rewrite is not used by apache.
header('HTTP/1.0 301 Moved Permanently'); header('HTTP/1.0 301 Moved Permanently');
header('Location: index.php'); header('Location: index.php/');

View File

@ -2,7 +2,7 @@
/* /*
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -0,0 +1,40 @@
/*!
* This file is a part of Mibew Messenger.
*
* Copyright 2005-2015 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.
*/
(function (Mibew, $) {
Mibew.updateVersion = function(data) {
if (!data.core || !data.core.stable) {
return;
}
$(document).ready(function() {
var currentVersion = $("#current-version").html(),
core = data.core.stable;
if (currentVersion != core.version) {
if (currentVersion < core.version) {
$("#current-version").css("color", "red");
}
$("#latest-version").html(core.version + ", Download <a href=\"" + core.download + "\">" + core.title + "</a>");
} else {
$("#current-version").css("color", "green");
$("#latest-version").html(core.version);
}
});
}
})(Mibew, jQuery);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,26 +0,0 @@
/*!
* 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.
*/
(function(Mibew, $) {
$(document).ready(function(){
$('#copy-button-code').click(function(e){
$("#button-code").select();
document.execCommand('copy');
});
});
})(Mibew, jQuery);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -51,7 +51,8 @@
app.Invitation.start(options.invitationOptions); app.Invitation.start(options.invitationOptions);
break; break;
default: default:
throw new Error("Don't know how to start!"); throw new Error('Dont know how to start!');
break;
} }
}); });

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -119,7 +119,7 @@
eventArgs = { eventArgs = {
'messageData': messageData, 'messageData': messageData,
'model': false 'model': false
}; }
// Trigger event. See description of eventName and eventArgs // Trigger event. See description of eventName and eventArgs
// above. // above.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -59,7 +59,7 @@
return { return {
page: models.page.toJSON(), page: models.page.toJSON(),
user: models.user.toJSON() user: models.user.toJSON()
}; }
} }
} }
); );

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -51,7 +51,7 @@
serializeData: function() { serializeData: function() {
return { return {
page: Mibew.Objects.Models.page.toJSON() page: Mibew.Objects.Models.page.toJSON()
}; }
} }
} }
); );

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -50,7 +50,7 @@
serializeData: function() { serializeData: function() {
return { return {
page: Mibew.Objects.Models.page.toJSON() page: Mibew.Objects.Models.page.toJSON()
}; }
} }
} }
); );

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -40,6 +40,6 @@ MibewAPIChatInteraction = function() {
return [ return [
'result' 'result'
]; ];
}; }
}; }
MibewAPIChatInteraction.prototype = new MibewAPIInteraction(); MibewAPIChatInteraction.prototype = new MibewAPIInteraction();

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -49,7 +49,7 @@
*/ */
closeThread: function() { closeThread: function() {
// Show confirmation message if can // Show confirmation message if can
var confirmMessage = Mibew.Localization.trans('Are you sure that you want to leave the chat?'), var confirmMessage = Mibew.Localization.trans('Are you sure want to leave chat?'),
context = this; context = this;
if (confirmMessage !== false) { if (confirmMessage !== false) {
Mibew.Utils.confirm(confirmMessage, function(value) { Mibew.Utils.confirm(confirmMessage, function(value) {

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -45,7 +45,7 @@
), ),
/** /**
* Display history window * Dispalay history window
*/ */
showHistory: function() { showHistory: function() {
var user = Mibew.Objects.Models.user; var user = Mibew.Objects.Models.user;

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -48,15 +48,11 @@
* Move to secure chat * Move to secure chat
*/ */
secure: function() { secure: function() {
if (window.location.protocol == 'https:') { var link = this.model.get('link')
return;
}
var link = this.model.get('link');
if (link) { if (link) {
var style = Mibew.Objects.Models.page.get('style'); var style = Mibew.Objects.Models.page.get('style');
window.location.href = link.replace(/\&amp\;/g, '&') window.location.href = link.replace(/\&amp\;/g, '&')
+ (style ? ((link.indexOf('?') > -1 ? '&' : '?') + (style ? ('&style=' + style) : '');
+ 'style=' + style) : '');
} }
} }
} }

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -44,17 +44,6 @@
} }
), ),
/**
* Override Backbone.Marionette.ItemView.serializeData to pass some
* extra fields to template.
* @returns {Object} Template data
*/
serializeData: function() {
var data = this.model.toJSON();
data.user = Mibew.Objects.Models.user.toJSON();
return data;
},
/** /**
* Load and display send mail window * Load and display send mail window
*/ */

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,68 +0,0 @@
/*!
* 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.
*/
(function(Mibew, Handlebars, _) {
/**
* @class Represents Tracked path control view
*/
Mibew.Views.TrackedPathControl = Mibew.Views.Control.extend(
/** @lends Mibew.Views.TrackedPathControl.prototype */
{
/**
* Template function
* @type Function
*/
template: Handlebars.templates['chat/controls/tracked_path'],
/**
* Map ui events to view methods
* The view inherits events from
* {@link Mibew.Views.Control.prototype.events}.
* @type Object
*/
events: _.extend(
{},
Mibew.Views.Control.prototype.events,
{
'click': 'showTrackedPath'
}
),
/**
* Display tracked path window
*/
showTrackedPath: function() {
var user = Mibew.Objects.Models.user;
var link = this.model.get('link');
if (user.get('isAgent') && link) {
var winParams = Mibew.Utils.buildWindowParams(this.model.get('windowParams'));
// TODO: Kill &amp; at the server side
link = link.replace('&amp;', '&', 'g');
var newWindow = window.open(link, 'UserTrackedPath', winParams);
if (newWindow !== null) {
newWindow.focus();
newWindow.opener=window;
}
}
}
}
);
})(Mibew, Handlebars, _);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -42,7 +42,7 @@
serializeData: function() { serializeData: function() {
return { return {
page: Mibew.Objects.Models.page.toJSON() page: Mibew.Objects.Models.page.toJSON()
}; }
} }
} }
); );

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -81,7 +81,7 @@
// Update group id // Update group id
if (this.model.get('groups')) { if (this.model.get('groups')) {
values.groupId = this.ui.groupSelect.val(); values.groupId = this.ui.groupSelect.val()
} }
// Update name // Update name

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -42,7 +42,7 @@
serializeData: function() { serializeData: function() {
return { return {
page: Mibew.Objects.Models.page.toJSON() page: Mibew.Objects.Models.page.toJSON()
}; }
} }
} }
); );

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -84,9 +84,6 @@
* Get, check and post message * Get, check and post message
*/ */
postMessage: function() { postMessage: function() {
if (this.isDisabledInput()){
return;
}
var msg = this.ui.message.val(); var msg = this.ui.message.val();
// TODO: Think about it // TODO: Think about it
// Cut multiple line breaks // Cut multiple line breaks
@ -132,13 +129,6 @@
}, },
/** /**
* Check is disabled message input area
*/
isDisabledInput: function() {
return this.ui.message.attr('disabled') == 'disabled';
},
/**svn
* Clear message input area * Clear message input area
*/ */
clearInput: function() { clearInput: function() {

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -39,7 +39,7 @@
*/ */
ui: { ui: {
groupSelect: 'select[name="group"]', groupSelect: 'select[name="group"]',
groupDescription: '#group-description', groupDescription: '#groupDescription',
name: 'input[name="name"]', name: 'input[name="name"]',
email: 'input[name="email"]', email: 'input[name="email"]',
message: 'textarea[name="message"]', message: 'textarea[name="message"]',

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -58,7 +58,7 @@
// Update group id // Update group id
if (this.model.get('groups')) { if (this.model.get('groups')) {
values.groupId = this.ui.groupSelect.val(); values.groupId = this.ui.groupSelect.val()
} }
// Update name // Update name

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -57,7 +57,7 @@
* Not applicable for agents. * Not applicable for agents.
* @type Boolean * @type Boolean
*/ */
defaultName: true dafaultName: true
} }
) )
} }

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -60,7 +60,7 @@
* @returns {String} Model type * @returns {String} Model type
*/ */
getModelType: function() { getModelType: function() {
return 'SoundControl'; return 'SoundControl'
} }
} }
); );

View File

@ -1,63 +0,0 @@
/*!
* 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.
*/
(function(Mibew, _){
/**
* @class Tracked path control model
*/
Mibew.Models.TrackedPathControl = Mibew.Models.Control.extend(
/** @lends Mibew.Models.TrackedPathControl.prototype */
{
/**
* A list of default model values.
*
* The model inherits defaults from
* {@link Mibew.Models.Control.prototype.defaults}.
* @type Object
*/
defaults: _.extend(
{},
Mibew.Models.Control.prototype.defaults,
{
/**
* An URL of the tracked path page or false by default.
* @type String|Boolean
*/
link: false,
/**
* Params string for tracked path popup window
* @type String
*/
windowParams: ''
}
),
/**
* Returns model type
* @returns {String} Model type
*/
getModelType: function() {
return 'TrackedPathControl';
}
}
);
})(Mibew, _);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -53,7 +53,7 @@
* @returns {String} Model type * @returns {String} Model type
*/ */
getModelType: function() { getModelType: function() {
return 'StatusMessage'; return 'StatusMessage'
}, },
/** /**

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -55,7 +55,7 @@
* @returns {String} Model type * @returns {String} Model type
*/ */
getModelType: function() { getModelType: function() {
return 'StatusTyping'; return 'StatusTyping'
}, },
/** /**

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -61,18 +61,6 @@
* @param Object attributes Attributes hash for test * @param Object attributes Attributes hash for test
*/ */
validate: function(attributes) { validate: function(attributes) {
// Check visitor's name
if (this.get('canChangeName') && typeof attributes.name != 'undefined') {
var trimmedName = attributes.name
// Remove leading spaces from the name
.replace(/^\s+/, '')
// Remove trailing spaces from the name
.replace(/\s+$/, '');
if (trimmedName.length === 0) {
return Mibew.Localization.trans('Name is required.');
}
}
// Check email // Check email
if (this.get('showEmail')) { if (this.get('showEmail')) {
if (typeof attributes.email != 'undefined') { if (typeof attributes.email != 'undefined') {

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -101,15 +101,6 @@
windowParams: options.windowsParams.history windowParams: options.windowsParams.history
}); });
ctrlsCollection.add(controls.history); ctrlsCollection.add(controls.history);
if (options.links.tracked) {
controls.tracked_path = new Mibew.Models.TrackedPathControl({
weight: 170,
link: options.links.tracked,
windowParams: options.windowsParams.trackedPath
});
ctrlsCollection.add(controls.tracked_path);
}
} }
// Create toggle sound button // Create toggle sound button
@ -234,7 +225,7 @@
"user": (! user.get('isAgent')) "user": (! user.get('isAgent'))
} }
} }
]; ]
}, },
function(args) { function(args) {
// Check if there was an error // Check if there was an error
@ -267,7 +258,7 @@
// Restart server updater because module just started and there are no // Restart server updater because module just started and there are no
// reasons to wait refresh time to get results of previous request // reasons to wait refresh time to get results of previous request
Mibew.Objects.server.restartUpdater(); Mibew.Objects.server.restartUpdater();
}); })
// Add module finalizer // Add module finalizer
chat.addFinalizer(function() { chat.addFinalizer(function() {

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -78,7 +78,7 @@
"user": true "user": true
} }
} }
]; ]
}, },
function() {} function() {}
) )
@ -90,7 +90,7 @@
// Restart server updater because module just started and there are no // Restart server updater because module just started and there are no
// reasons to wait refresh time to get results of previous request // reasons to wait refresh time to get results of previous request
Mibew.Objects.server.restartUpdater(); Mibew.Objects.server.restartUpdater();
}); })
// Add module finalizer // Add module finalizer
invitation.addFinalizer(function() { invitation.addFinalizer(function() {

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -38,6 +38,6 @@
// Just close the window. // Just close the window.
window.close(); window.close();
} }
}; }
})(Mibew); })(Mibew);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,7 +17,7 @@
*/ */
/** /**
* @namespace Holds all Mibew Messenger functionality * @namespace Holds all Mibew functionality
*/ */
var Mibew = Mibew || {}; var Mibew = Mibew || {};
@ -57,28 +57,12 @@ var Mibew = Mibew || {};
* omitted a session cookie will be created. * omitted a session cookie will be created.
*/ */
Mibew.Utils.createCookie = function(name, value, expires) { Mibew.Utils.createCookie = function(name, value, expires) {
if (navigator.cookieEnabled) { var domain = /([^\.]+\.[^\.]+)$/.exec(document.location.hostname);
var domain_parts = document.location.hostname.split('.').reverse(); document.cookie = "" + name + "=" + value + "; "
var domain = domain_parts[0]; + "path=/; "
var position = 0; + (domain ? ("domain=" + domain[1] + "; ") : '')
do { + (expires ? ('expires=' + expires.toUTCString() + '; ') : '');
document.cookie = "" + name + "=" + value + "; " }
+ "path=/; "
+ (document.location.protocol == 'https:' ? "SameSite=None; secure; " : '')
+ "domain=" + (Mibew.Utils.cookiesDomain || domain) + "; "
+ (expires ? ('expires=' + expires.toUTCString() + '; ') : '');
if (Mibew.Utils.readCookie(name) == value) {
if (!Mibew.Utils.cookiesDomain) {
Mibew.Utils.cookiesDomain = domain;
}
}
else {
position++;
domain = domain_parts[position] + '.' + domain;
}
} while((position < domain_parts.length) && !Mibew.Utils.cookiesDomain);
}
};
/** /**
* Try to read cookie. * Try to read cookie.
@ -98,7 +82,7 @@ var Mibew = Mibew || {};
} }
} }
return value; return value;
}; }
/** /**
* Deletes cookie. * Deletes cookie.
@ -107,7 +91,7 @@ var Mibew = Mibew || {};
*/ */
Mibew.Utils.deleteCookie = function(name) { Mibew.Utils.deleteCookie = function(name) {
Mibew.Utils.createCookie(name, '', (new Date(0))); Mibew.Utils.createCookie(name, '', (new Date(0)));
}; }
/** /**
* Sets correct prototypes chain. * Sets correct prototypes chain.
@ -135,7 +119,7 @@ var Mibew = Mibew || {};
ctor.prototype = new Tmp(); ctor.prototype = new Tmp();
Tmp.prototype = null; Tmp.prototype = null;
ctor.prototype.constructor = ctor; ctor.prototype.constructor = ctor;
}; }
})(); })();
/** /**
@ -185,7 +169,7 @@ var Mibew = Mibew || {};
document.getElementsByTagName('head')[0].appendChild(styleSheet); document.getElementsByTagName('head')[0].appendChild(styleSheet);
return styleSheet; return styleSheet;
}; }
/** /**
* Loads JavaScript file and attach it to DOM. * Loads JavaScript file and attach it to DOM.
@ -205,7 +189,7 @@ var Mibew = Mibew || {};
document.getElementsByTagName('head')[0].appendChild(script); document.getElementsByTagName('head')[0].appendChild(script);
return script; return script;
}; }
/** /**
* Initialize a proper chat popup. * Initialize a proper chat popup.
@ -219,8 +203,9 @@ var Mibew = Mibew || {};
Mibew.ChatPopup.init = function(options) { Mibew.ChatPopup.init = function(options) {
var canUseIFrame = (window.postMessage && options.preferIFrame), var canUseIFrame = (window.postMessage && options.preferIFrame),
Popup = canUseIFrame ? Mibew.ChatPopup.IFrame : Mibew.ChatPopup.Window; Popup = canUseIFrame ? Mibew.ChatPopup.IFrame : Mibew.ChatPopup.Window;
Mibew.Objects.ChatPopups[options.id] = new Popup(options); Mibew.Objects.ChatPopups[options.id] = new Popup(options);
}; }
/** /**
* A constructor for base (abstract) popup object. * A constructor for base (abstract) popup object.
@ -275,14 +260,7 @@ var Mibew = Mibew || {};
* @type {Boolean} * @type {Boolean}
*/ */
this.modSecurity = options.modSecurity || false; this.modSecurity = options.modSecurity || false;
}
/**
* Chat style
* @type {String}
*/
this.styleName = options.style;
};
/** /**
* Builds an URL that initializes a chat. * Builds an URL that initializes a chat.
@ -301,7 +279,7 @@ var Mibew = Mibew || {};
return this.url return this.url
+ ((this.url.indexOf('?') === -1) ? '?' : '&') + 'url=' + encodeURIComponent(href) + ((this.url.indexOf('?') === -1) ? '?' : '&') + 'url=' + encodeURIComponent(href)
+ '&referrer=' + encodeURIComponent(referrer); + '&referrer=' + encodeURIComponent(referrer);
}; }
/** /**
* Constructs IFrame popup. * Constructs IFrame popup.
@ -314,48 +292,18 @@ var Mibew = Mibew || {};
// Call parent constructor. // Call parent constructor.
BasePopup.call(this, options); BasePopup.call(this, options);
/**
* Store options in case we need some of them later.
* @type {Object}
*/
this.options = options;
/**
* Wrapper for popup iframe DOM Element.
* @type {Node}
*/
this.wrapperDiv = null;
/** /**
* Popup iframe DOM Element. * Popup iframe DOM Element.
* @type {Node} * @type {Node}
*/ */
this.iframe = null; this.iframe = null;
/**
* Toggle iframe DOM Element.
* @type {Node}
*/
this.toggleDiv = null;
/** /**
* Indicates if the popup is opened. * Indicates if the popup is opened.
* @type {Boolean} * @type {Boolean}
*/ */
this.isOpened = false; this.isOpened = false;
/**
* Indicates if the popup is minified.
* @type {Boolean}
*/
this.isMinified = false;
/**
* Indicates if cookies are blocked.
* @type {Boolean}
*/
this.cookiesBlocked = false;
// Load default styles. These styles hide the popup while real styles // Load default styles. These styles hide the popup while real styles
// are loading. // are loading.
this.attachDefaultStyles(); this.attachDefaultStyles();
@ -367,21 +315,9 @@ var Mibew = Mibew || {};
if (openedChatUrl) { if (openedChatUrl) {
// The chat was not closed so the popup should be reopened when a // The chat was not closed so the popup should be reopened when a
// new page is visited. // new page is visited.
this.safeOpen(openedChatUrl); this.open(openedChatUrl);
} }
}
// Check if it's possible to set cookies at all
var rnd = Math.random();
Mibew.Utils.createCookie('mibewCheckToken', rnd);
var checkCookiesBlock = Mibew.Utils.loadScript(options.url.split('?')[0] + '/cookies-set-permission' + '?rnd=' + rnd);
checkCookiesBlock.popup = this;
checkCookiesBlock.onload = function() {
this.popup.cookiesBlocked = false;
};
checkCookiesBlock.onerror = function() {
this.popup.cookiesBlocked = true;
};
};
// Set correct prototype chain for IFrame popup. // Set correct prototype chain for IFrame popup.
Mibew.Utils.inherits(Mibew.ChatPopup.IFrame, BasePopup); Mibew.Utils.inherits(Mibew.ChatPopup.IFrame, BasePopup);
@ -431,81 +367,26 @@ var Mibew = Mibew || {};
return; return;
} }
if (this.cookiesBlocked) { if (!this.iframe) {
// Last resort. Replace this iframe-based popup with window-based popup // Create new iframe.
// and try to open a chat in a separate window.
Mibew.Objects.ChatPopups[this.id] = new Mibew.ChatPopup.Window(this.options);
Mibew.Objects.ChatPopups[this.id].open(url);
return;
}
if (!this.wrapperDiv) {
// Create new iframe and its wrapper.
// There is a bug in IE <= 7 that make "name" attribute unchangeble // There is a bug in IE <= 7 that make "name" attribute unchangeble
// for elements that already exist. Thus a temporary div is used // for elements that already exist. Thus a temporary div is used
// here as a workaround. // here as a workaround.
this.wrapperDiv = document.createElement('div'); var tmpDiv = document.createElement('div');
this.wrapperDiv.className = 'mibew-chat-wrapper'; tmpDiv.innerHTML = '<iframe name="mibewChat' + this.id + '"></iframe>';
this.wrapperDiv.setAttribute('id', 'mibew-chat-wrapper-' + this.id);
this.wrapperDiv.style.display = 'none';
this.wrapperDiv.innerHTML = '<iframe name="mibewChat' + this.id + '"></iframe>';
this.iframe = this.wrapperDiv.getElementsByTagName('iframe')[0]; this.iframe = tmpDiv.getElementsByTagName('iframe')[0];
this.iframe.setAttribute('id', 'mibew-chat-frame-' + this.id); this.iframe.setAttribute('id', 'mibew-chat-frame-' + this.id);
this.iframe.className = 'mibew-chat-frame'; this.iframe.className = 'mibew-chat-frame';
this.iframe.setAttribute('frameBorder', 0); this.iframe.setAttribute('frameBorder', 0);
this.iframe.style.display = 'none';
document.getElementsByTagName('body')[0].appendChild(this.wrapperDiv); document.getElementsByTagName('body')[0].appendChild(this.iframe);
// Setup toggle element. As it's not a part of the iframe, it should be
// treated separately.
this.toggleDiv = document.createElement('div');
this.toggleDiv.setAttribute('id', 'mibew-chat-frame-toggle-' + this.id);
this.toggleDiv.className = 'mibew-chat-frame-toggle mibew-chat-frame-toggle-on';
Mibew.Utils.addEventListener(this.toggleDiv, 'click', function(event) {
var popups = Mibew.Objects.ChatPopups,
matches = /^mibew-chat-frame-toggle-([0-9A-Za-z]+)$/.exec(this.id);
if (matches && popups[matches[1]]) {
popups[matches[1]].toggle();
}
});
document.getElementsByTagName('body')[0].appendChild(this.toggleDiv);
} }
this.wrapperDiv.style.display = 'block'; this.iframe.style.display = 'block';
this.toggleDiv.style.display = 'block';
this.iframe.src = url || this.buildChatUrl(); this.iframe.src = url || this.buildChatUrl();
this.isOpened = true; this.isOpened = true;
}
// Store style name in case we need it during iframe reopening
Mibew.Utils.createCookie('mibew-chat-frame-style-' + this.id, this.styleName);
// Check minification status of the popup and toggle it if needed.
var minifiedPopup = Mibew.Utils.readCookie('mibew-chat-frame-minified-' + this.id);
if (minifiedPopup === 'true') {
this.toggle();
}
};
/**
* Check chat URL via special request, open the chat if check passes,
* close the popup if the check fails.
*
* @param {String} [url] The URL to open in the popup
*/
Mibew.ChatPopup.IFrame.prototype.safeOpen = function(url) {
var check = Mibew.Utils.loadScript(url + '/check', 'mibew-check-iframe-' + this.id);
check.popup = this;
check.url = url;
var style = Mibew.Utils.readCookie('mibew-chat-frame-style-' + this.id);
check.onload = function() {
this.popup.open(this.url + (style ? '?style=' + style : ''));
};
check.onerror = function() {
this.popup.close();
};
};
/** /**
* Closes the popup. * Closes the popup.
@ -516,24 +397,11 @@ var Mibew = Mibew || {};
return; return;
} }
this.wrapperDiv.style.display = 'none'; this.iframe.style.display = 'none';
this.iframe.src = ''; this.iframe.src = '';
this.isOpened = false; this.isOpened = false;
this.toggleDiv.style.display = 'none';
Mibew.Utils.deleteCookie('mibew-chat-frame-' + this.id); Mibew.Utils.deleteCookie('mibew-chat-frame-' + this.id);
Mibew.Utils.deleteCookie('mibew-chat-frame-minified-' + this.id); }
};
/**
* Toggles the popup.
*/
Mibew.ChatPopup.IFrame.prototype.toggle = function() {
this.wrapperDiv.style.display = this.isMinified ? "block" : "none";
this.isMinified = !this.isMinified;
this.toggleDiv.className = 'mibew-chat-frame-toggle mibew-chat-frame-toggle-'
+ (this.isMinified ? 'off' : 'on');
Mibew.Utils.createCookie('mibew-chat-frame-minified-' + this.id, this.isMinified);
};
/** /**
* Constructs Window popup. * Constructs Window popup.
@ -546,7 +414,7 @@ var Mibew = Mibew || {};
BasePopup.call(this, options); BasePopup.call(this, options);
this.window = null; this.window = null;
}; }
// Set correct prototype chain for Window popup. // Set correct prototype chain for Window popup.
Mibew.Utils.inherits(Mibew.ChatPopup.Window, BasePopup); Mibew.Utils.inherits(Mibew.ChatPopup.Window, BasePopup);
@ -558,10 +426,6 @@ var Mibew = Mibew || {};
* value is omitted, the chat initialization URL will be loaded. * value is omitted, the chat initialization URL will be loaded.
*/ */
Mibew.ChatPopup.Window.prototype.open = function(url) { Mibew.ChatPopup.Window.prototype.open = function(url) {
// Windows is already opened, nothing to do.
if (this.window != null && !this.window.closed) {
return;
}
this.window = window.open( this.window = window.open(
url || this.buildChatUrl(), url || this.buildChatUrl(),
'mibewChat' + this.id, 'mibewChat' + this.id,
@ -569,7 +433,7 @@ var Mibew = Mibew || {};
); );
this.window.focus(); this.window.focus();
this.window.opener = window; this.window.opener = window;
}; }
/** /**
* Closes the popup. * Closes the popup.
@ -582,7 +446,7 @@ var Mibew = Mibew || {};
this.window.close(); this.window.close();
this.window = null; this.window = null;
}; }
/** /**
* Builds window params string. * Builds window params string.
@ -604,12 +468,13 @@ var Mibew = Mibew || {};
'height=' + this.height.toString(), 'height=' + this.height.toString(),
'resizable=' + (this.resizable ? '1' : '0') 'resizable=' + (this.resizable ? '1' : '0')
].join(','); ].join(',');
}; }
// Attach a listener to window's "message" event to get the url of the chat // Attach a listener to window's "message" event to get the url of the chat
// which is opened in iframe popup. // which is opened in iframe popup.
Mibew.Utils.addEventListener(window, 'message', function(event) { Mibew.Utils.addEventListener(window, 'message', function(event) {
var matches = /^mibew-chat-started\:mibewChat([0-9A-Za-z]+)\:(.*)$/.exec(event.data); var matches = /^mibew-chat-started\:mibewChat([0-9A-Za-z]+)\:(.*)$/.exec(event.data);
if (matches) { if (matches) {
Mibew.Utils.createCookie('mibew-chat-frame-' + matches[1], matches[2]); Mibew.Utils.createCookie('mibew-chat-frame-' + matches[1], matches[2]);
} }

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -41,7 +41,7 @@
} else { } else {
return new ChildViewType(options); return new ChildViewType(options);
} }
}; }
/** /**
* @class Represents base collection view * @class Represents base collection view

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -41,7 +41,7 @@
/** /**
* Register 'urlReplace' Handlebars helper. * Register 'urlReplace' Handlebars helper.
* *
* This helper seeks URLs and replaces them by 'a' tag * This helper serch URLs and replace them by 'a' tag
*/ */
Handlebars.registerHelper('urlReplace', function(text) { Handlebars.registerHelper('urlReplace', function(text) {
return new Handlebars.SafeString( return new Handlebars.SafeString(
@ -193,17 +193,14 @@
* </code> * </code>
*/ */
Handlebars.registerHelper('replace', function(search, replacement, options) { Handlebars.registerHelper('replace', function(search, replacement, options) {
var unescapedSearch = search // Convert serch value to string and escape special regexp characters
// Allow using new line character var searchPattern = search.toString().replace(
.replace(/\\n/g, '\n') /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
// Allow using tab character "\\$&"
.replace(/\\t/g, '\t') ),
// Allow using all UTF characters in \uXXX format. re = new RegExp(searchPattern, 'g');
.replace(/\\u([A-Za-z0-9])/g, function(match, code) {
return String.fromCharCode(parseInt(code, 16));
});
return options.fn(this).split(unescapedSearch).join(replacement); return options.fn(this).replace(re, replacement);
}); });
/** /**
@ -290,7 +287,7 @@
* </code> * </code>
*/ */
Handlebars.registerHelper('override', function(name, options) { Handlebars.registerHelper('override', function(name, options) {
// We need to provide unlimited inheritance level. Rendering is started // We need to provide unlimited inheritence level. Rendering is started
// from the deepest level template. If the content is in the block // from the deepest level template. If the content is in the block
// storage it is related with the deepest level template. Thus we do not // storage it is related with the deepest level template. Thus we do not
// need to override it. // need to override it.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -26,7 +26,7 @@ var Mibew = {};
// Use Backbone.Marionette with handlebars.js // Use Backbone.Marionette with handlebars.js
Backbone.Marionette.TemplateCache.prototype.compileTemplate = function(rawTemplate) { Backbone.Marionette.TemplateCache.prototype.compileTemplate = function(rawTemplate) {
return Handlebars.compile(rawTemplate); return Handlebars.compile(rawTemplate);
}; }
// Use all handlebars template as partials too // Use all handlebars template as partials too
// We does not use Handlebars.partials property because of it can be changed // We does not use Handlebars.partials property because of it can be changed

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -47,7 +47,7 @@
return localized.replace(/\{([0-9]+)\}/g, function(match, index) { return localized.replace(/\{([0-9]+)\}/g, function(match, index) {
return placeholders[parseInt(index)] || ''; return placeholders[parseInt(index)] || '';
}); });
}; }
/** /**
* Store localization object. Can be call multiple times, localization * Store localization object. Can be call multiple times, localization
@ -56,6 +56,6 @@
*/ */
Mibew.Localization.set = function(strs) { Mibew.Localization.set = function(strs) {
_.extend(localStrings, strs); _.extend(localStrings, strs);
}; }
})(Mibew, _); })(Mibew, _);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -74,7 +74,7 @@
} }
return { return {
'class': classes.join(' ') 'class': classes.join(' ')
}; }
}, },
/** /**

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -41,8 +41,6 @@
// Pause before restarting updater using Server.restartUpdater // Pause before restarting updater using Server.restartUpdater
// function (in seconds) // function (in seconds)
reconnectPause: 1, reconnectPause: 1,
// Call on successful response
onReceiveResponse: function() {},
// Call on request timeout // Call on request timeout
onTimeout: function() {}, onTimeout: function() {},
// Call when transport error was caught // Call when transport error was caught
@ -94,7 +92,7 @@
* @type Object * @type Object
* @private * @private
*/ */
this.functions = {}; this.functions = {}
/** /**
* Id of the last registered function * Id of the last registered function
@ -109,7 +107,7 @@
* @private * @private
*/ */
this.mibewAPI = new MibewAPI(new this.options['interactionType']()); this.mibewAPI = new MibewAPI(new this.options['interactionType']());
}; }
/** /**
* Make call to the server * Make call to the server
@ -150,7 +148,7 @@
return false; return false;
} }
return true; return true;
}; }
/** /**
* Call function at every request to build functions list * Call function at every request to build functions list
@ -167,7 +165,7 @@
callbackFunction: callbackFunction callbackFunction: callbackFunction
}; };
return this.callPeriodicallyLastId; return this.callPeriodicallyLastId;
}; }
/** /**
* Stop calling function at every request. * Stop calling function at every request.
@ -179,7 +177,7 @@
if (id in this.callPeriodically) { if (id in this.callPeriodically) {
delete this.callPeriodically[id]; delete this.callPeriodically[id];
} }
}; }
/** /**
* Generates unique request token * Generates unique request token
@ -197,7 +195,7 @@
// Check token uniqueness // Check token uniqueness
} while(token in this.callbacks); } while(token in this.callbacks);
return token; return token;
}; }
/** /**
* Process request * Process request
@ -238,7 +236,7 @@
delete this.callbacks[requestObject.token]; delete this.callbacks[requestObject.token];
} }
} }
}; }
/** /**
* Process function * Process function
@ -268,7 +266,7 @@
// Add function results to the execution context // Add function results to the execution context
context.storeFunctionResults(functionObject, results); context.storeFunctionResults(functionObject, results);
}; }
/** /**
* Send the request to the server * Send the request to the server
@ -293,14 +291,14 @@
success: _.bind(self.receiveResponse, self), success: _.bind(self.receiveResponse, self),
error: _.bind(self.onError, self) error: _.bind(self.onError, self)
}); });
}; }
/** /**
* Start automatic updater * Start automatic updater
*/ */
Mibew.Server.prototype.runUpdater = function() { Mibew.Server.prototype.runUpdater = function() {
this.update(); this.update();
}; }
/** /**
* Call Mibew.Server.update after specified timeout * Call Mibew.Server.update after specified timeout
@ -312,7 +310,7 @@
_.bind(this.update, this), _.bind(this.update, this),
time * 1000 time * 1000
); );
}; }
/** /**
* Restarts the automatic updater * Restarts the automatic updater
@ -328,7 +326,7 @@
} }
// Restart updater. Try to reconnect after a while // Restart updater. Try to reconnect after a while
this.updateAfter(this.options.reconnectPause); this.updateAfter(this.options.reconnectPause);
}; }
/** /**
* Send request to server * Send request to server
@ -362,7 +360,7 @@
// Handle errors // Handle errors
this.options.onUpdateError(e); this.options.onUpdateError(e);
} }
}; }
/** /**
* Process response from the Server * Process response from the Server
@ -373,15 +371,15 @@
* @private * @private
*/ */
Mibew.Server.prototype.receiveResponse = function(data, textStatus, jqXHR) { Mibew.Server.prototype.receiveResponse = function(data, textStatus, jqXHR) {
// Call hook on successful request
this.options.onReceiveResponse();
// Do not parse empty responses // Do not parse empty responses
if (data == '') { if (data == '') {
this.updateAfter(this.options.requestsFrequency); this.updateAfter(this.options.requestsFrequency);
} }
try { try {
var packageObject = this.mibewAPI.decodePackage(data); var packageObject = this.mibewAPI.decodePackage(data);
for (var i = 0, len = packageObject.requests.length; i < len; i++) { // TODO: Try to use 'for' loop instead of 'for in' loop
// or use hasOwnProperty method
for (var i in packageObject.requests) {
this.processRequest(packageObject.requests[i]); this.processRequest(packageObject.requests[i]);
} }
} catch (e) { } catch (e) {
@ -389,7 +387,7 @@
} finally { } finally {
this.updateAfter(this.options.requestsFrequency); this.updateAfter(this.options.requestsFrequency);
} }
}; }
/** /**
* Add function that can be called by the Server * Add function that can be called by the Server
@ -405,7 +403,7 @@
} }
this.functions[functionName][this.functionsLastId] = handler; this.functions[functionName][this.functionsLastId] = handler;
return this.functionsLastId; return this.functionsLastId;
}; }
/** /**
* Remove function that can be called by Server * Remove function that can be called by Server
@ -425,7 +423,7 @@
delete this.functions[i]; delete this.functions[i];
} }
} }
}; },
/** /**
* Call on AJAX errors * Call on AJAX errors
@ -444,6 +442,6 @@
this.options.onTransportError(); this.options.onTransportError();
} }
} }
}; }
})(Mibew, MibewAPI, jQuery, _); })(Mibew, MibewAPI, $, _);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -36,7 +36,7 @@
return str; return str;
} }
return str.substring(0, 1).toUpperCase() + str.substring(1); return str.substring(0, 1).toUpperCase() + str.substring(1);
}; }
/** /**
* Cast string in camel case to dash format. * Cast string in camel case to dash format.
@ -61,7 +61,7 @@
} }
return parts.join('-'); return parts.join('-');
}; }
/** /**
* Check if email address valid or not. * Check if email address valid or not.
@ -99,10 +99,10 @@
// The regular exprassion is base on RFC 2822. It's not fully compatible // The regular exprassion is base on RFC 2822. It's not fully compatible
// with RFC but is sutabe for most real cases. // with RFC but is sutabe for most real cases.
return /^(([a-zA-Z0-9!#$%&'*+\-/=?\^_`{|}~]+(\.[a-zA-Z0-9!#$%&'*+\-/=?\^_`{|}~]+)*)|(\".+\"))$/.test(localPart); return /^(([a-zA-Z0-9!#$%&'*+\-/=?\^_`{|}~]+(\.[a-zA-Z0-9!#$%&'*+\-/=?\^_`{|}~]+)*)|(\".+\"))$/.test(localPart);
}; }
/** /**
* Play .wav, or .mp3, or .ogg sound file * Play .wav or .mp3 sound file
* @param {String} file File path (without extension) * @param {String} file File path (without extension)
*/ */
Mibew.Utils.playSound = function (file) { Mibew.Utils.playSound = function (file) {
@ -114,7 +114,6 @@
var audioTag = $("<audio>", {autoplay: true, style: "display: none"}).append( var audioTag = $("<audio>", {autoplay: true, style: "display: none"}).append(
'<source src="' + file + '.wav" type="audio/x-wav" />' + '<source src="' + file + '.wav" type="audio/x-wav" />' +
'<source src="' + file + '.mp3" type="audio/mpeg" codecs="mp3" />' + '<source src="' + file + '.mp3" type="audio/mpeg" codecs="mp3" />' +
'<source src="' + file + '.ogg" type="audio/ogg" codecs="vorbis" />' +
'<embed src="' + file + '.wav" type="audio/x-wav" hidden="true" autostart="true" loop="false" />' '<embed src="' + file + '.wav" type="audio/x-wav" hidden="true" autostart="true" loop="false" />'
); );
$('body').append(audioTag); $('body').append(audioTag);
@ -122,7 +121,7 @@
audioTag.attr('data-file', file); audioTag.attr('data-file', file);
} }
} }
}; }
/** /**
* Builds params string for window.open method. * Builds params string for window.open method.
@ -151,7 +150,7 @@
'height=' + allOptions.height, 'height=' + allOptions.height,
'resizable=' + (allOptions.resizable ? '1' : '0') 'resizable=' + (allOptions.resizable ? '1' : '0')
].join(','); ].join(',');
}; }
/** /**
* Sets default options for Vex dialogs. * Sets default options for Vex dialogs.
@ -165,41 +164,14 @@
vex.dialog.buttons.NO.text = Mibew.Localization.trans('Cancel'); vex.dialog.buttons.NO.text = Mibew.Localization.trans('Cancel');
}); });
/**
* Checks if vex dialog is already opened.
* @returns {Boolean}
*/
var isVexOpened = function () {
return (vex.getAllVexes().length > 0);
};
/**
* Sanitize message used in Vex dialog
* @type {Function}
* @param {String} message A message to sanitize.
* @returns {String}
*/
var sanitizeMessage = function(message) {
return message.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
};
/** /**
* Alerts a message. * Alerts a message.
* @param {String} message A message that should be displayed. * @param {String} message A message that should be displayed.
*/ */
Mibew.Utils.alert = function(message) { Mibew.Utils.alert = function(message) {
setVexDefaults(); setVexDefaults();
if (isVexOpened()) { vex.dialog.alert({message: message});
// Do not open alert if one already opened. }
return;
}
return vex.dialog.alert({message: sanitizeMessage(message)});
};
/** /**
* Requires user confirmation. * Requires user confirmation.
@ -211,10 +183,10 @@
Mibew.Utils.confirm = function(message, callback) { Mibew.Utils.confirm = function(message, callback) {
setVexDefaults(); setVexDefaults();
vex.dialog.confirm({ vex.dialog.confirm({
message: sanitizeMessage(message), message: message,
callback: callback callback: callback
}); });
}; }
/** /**
* Requests some info from the user. * Requests some info from the user.
@ -226,17 +198,9 @@
Mibew.Utils.prompt = function(message, callback) { Mibew.Utils.prompt = function(message, callback) {
setVexDefaults(); setVexDefaults();
vex.dialog.prompt({ vex.dialog.prompt({
message: sanitizeMessage(message), message: message,
callback: callback callback: callback
}); });
}; }
/**
* Close alert.
* @param {Object} alert instance.
*/
Mibew.Utils.closeAlert = function(alertInstance) {
var res = vex.close(alertInstance.id);
};
})(Mibew, jQuery, _, vex, validator); })(Mibew, jQuery, _, vex, validator);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,14 +17,6 @@
*/ */
(function($) { (function($) {
function updateSendEmail() {
if ($("#user-can-send-email").is(":checked")) {
$(".under-user-can-send-email").show();
} else {
$(".under-user-can-send-email").hide();
}
}
function updateSurvey() { function updateSurvey() {
if ($("#enable-presurvey").is(":checked")) { if ($("#enable-presurvey").is(":checked")) {
$(".under-survey").show(); $(".under-survey").show();
@ -57,18 +49,7 @@
} }
} }
function updatePrivacyPolicy() {
if ($("#enable-privacy-policy").is(":checked")) {
$(".under-privacy-policy").show();
} else {
$(".under-privacy-policy").hide();
}
}
$(function() { $(function() {
$("#user-can-send-email").change(function() {
updateSendEmail();
});
$("#enable-presurvey").change(function() { $("#enable-presurvey").change(function() {
updateSurvey(); updateSurvey();
}); });
@ -81,14 +62,9 @@
$("#enable-tracking").change(function() { $("#enable-tracking").change(function() {
updateTracking(); updateTracking();
}); });
$("#enable-privacy-policy").change(function() {
updatePrivacyPolicy();
});
updateSendEmail();
updateSurvey(); updateSurvey();
updateSSL(); updateSSL();
updateGroups(); updateGroups();
updateTracking(); updateTracking();
updatePrivacyPolicy();
}); });
})(jQuery); })(jQuery);

View File

@ -1,7 +1,7 @@
/*! /*!
* This file is a part of Mibew Messenger. * This file is a part of Mibew Messenger.
* *
* Copyright 2005-2023 the original author or authors. * Copyright 2005-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

Some files were not shown because too many files have changed in this diff Show More