Code refactoring

a lot of small fixes (Closes #173)
Added login field (ownCloud package)
This commit is contained in:
RainLoop Team 2014-05-24 02:14:16 +04:00
parent a059b3d063
commit fed896776f
129 changed files with 1016 additions and 804 deletions

View file

@ -273,6 +273,8 @@ module.exports = function (grunt) {
"dev/Models/FolderModel.js", "dev/Models/FolderModel.js",
"dev/Models/AccountModel.js", "dev/Models/AccountModel.js",
"dev/Models/IdentityModel.js", "dev/Models/IdentityModel.js",
"dev/Models/FilterConditionModel.js",
"dev/Models/FilterModel.js",
"dev/Models/OpenPgpKeyModel.js", "dev/Models/OpenPgpKeyModel.js",
"dev/ViewModels/PopupsFolderClearViewModel.js", "dev/ViewModels/PopupsFolderClearViewModel.js",
@ -310,6 +312,7 @@ module.exports = function (grunt) {
"dev/Settings/Accounts.js", "dev/Settings/Accounts.js",
"dev/Settings/Identity.js", "dev/Settings/Identity.js",
"dev/Settings/Identities.js", "dev/Settings/Identities.js",
"dev/Settings/Filters.js",
"dev/Settings/Security.js", "dev/Settings/Security.js",
"dev/Settings/Social.js", "dev/Settings/Social.js",
"dev/Settings/ChangePassword.js", "dev/Settings/ChangePassword.js",
@ -475,7 +478,7 @@ module.exports = function (grunt) {
releasesPath = grunt.config('cfg.releasesPath'), releasesPath = grunt.config('cfg.releasesPath'),
devVersion = grunt.config('cfg.devVersion'), devVersion = grunt.config('cfg.devVersion'),
versionFull = version + '.' + release, versionFull = version + '.' + release,
versionOwn = '1.1', versionOwn = grunt.config('pkg.ownCloudPackageVersion'),
dist = releasesPath + '/' + versionFull + '/owncloud/' dist = releasesPath + '/' + versionFull + '/owncloud/'
; ;
@ -489,12 +492,14 @@ module.exports = function (grunt) {
grunt.file.write(dist + 'appinfo/info.xml', grunt.file.write(dist + 'appinfo/info.xml',
content.replace('<version>0.0.0</version>', '<version>' + versionOwn + '</version>')); content.replace('<version>0.0.0</version>', '<version>' + versionOwn + '</version>'));
grunt.file.write(dist + 'VERSION', versionOwn);
grunt.config.set('cfg.releaseFolder', versionFull); grunt.config.set('cfg.releaseFolder', versionFull);
grunt.config.set('cfg.releaseSrcPath', dist); grunt.config.set('cfg.releaseSrcPath', dist);
grunt.config.set('cfg.releaseZipFile', 'rainloop-owncloud-app-' + versionOwn + '.zip'); grunt.config.set('cfg.releaseZipFile', 'rainloop-owncloud-app-' + versionOwn + '.zip');
}); });
grunt.registerTask('rainloop-clear', 'RainLoop Webmail clear task', function () { grunt.registerTask('rainloop-clean', 'RainLoop Webmail clean task', function () {
var releaseSrcPath = grunt.config('cfg.releaseSrcPath'); var releaseSrcPath = grunt.config('cfg.releaseSrcPath');
if ('' !== releaseSrcPath) if ('' !== releaseSrcPath)
{ {
@ -517,9 +522,9 @@ module.exports = function (grunt) {
// --- // ---
grunt.registerTask('default', ['less', 'concat', 'cssmin', 'jshint', 'rlmin']); grunt.registerTask('default', ['less', 'concat', 'cssmin', 'jshint', 'rlmin']);
grunt.registerTask('build', ['default', 'rainloop', 'compress:build', 'md5:build', 'rainloop-clear']); grunt.registerTask('build', ['default', 'rainloop', 'compress:build', 'md5:build', 'rainloop-clean']);
grunt.registerTask('fast', ['less', 'concat']); grunt.registerTask('fast', ['less', 'concat']);
grunt.registerTask('owncloud', ['rainloop-owncloud', 'compress:own', 'md5:build', 'rainloop-clear']); grunt.registerTask('owncloud', ['rainloop-owncloud', 'compress:own', 'md5:build', 'rainloop-clean']);
// aliases // aliases
grunt.registerTask('u', ['uglify']); grunt.registerTask('u', ['uglify']);

View file

@ -1,5 +0,0 @@
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule /.well-known/carddav /index.php/dav [R,L]
</IfModule>

View file

@ -1,14 +0,0 @@
<VirtualHost *:80>
AcceptPathInfo On
ServerName dav.mydomain.com
DocumentRoot /var/www/mydomain.com
RewriteEngine On
RewriteRule /.well-known/carddav /index.php/dav [R,L]
<Directory "/var/www/mydomain.com">
Options None
Options +FollowSymlinks
AllowOverride All
</Directory>
</VirtualHost>

View file

@ -1,14 +0,0 @@
<VirtualHost *:80>
AcceptPathInfo On
ServerName mydomain.com
DocumentRoot /var/www/mydomain.com
RewriteEngine On
RewriteRule /.well-known/carddav /index.php/dav [R,L]
<Directory "/var/www/mydomain.com">
Options None
Options +FollowSymlinks
AllowOverride All
</Directory>
</VirtualHost>

View file

@ -1,43 +0,0 @@
server {
listen 80;
server_name dav.mydomain.com;
root /var/www/mydomain.com;
access_log /var/log/nginx/dav.mydomain.com.access.log;
error_log /var/log/nginx/dav.mydomain.com.error.log;
index index.php;
charset utf-8;
log_not_found off;
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location = /humans.txt { access_log off; log_not_found off; }
location ~ /\.ht { access_log off; log_not_found off; deny all; return 404; }
location ^~ /data { access_log off; log_not_found off; deny all; return 404; }
# rewrite for carddav autoprovision
rewrite ^/.well-known/carddav / redirect;
rewrite ^(.*)$ /index.php/dav$1 last;
# php for carddav only
location ~ /index\.php/dav/.*$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000; # unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/[^?]*).*$;
fastcgi_index index.php;
fastcgi_param SCRIPT_NAME index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
}

View file

@ -1,48 +0,0 @@
server {
listen 80;
server_name mydomain.com;
root /var/www/mydomain.com;
access_log /var/log/nginx/mydomain.com.access.log;
error_log /var/log/nginx/mydomain.com.error.log;
index index.php index.html;
charset utf-8;
log_not_found off;
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location = /humans.txt { access_log off; log_not_found off; }
location ~ /\.ht { access_log off; log_not_found off; deny all; return 404; }
location ^~ /data { access_log off; log_not_found off; deny all; return 404; }
# rewrite for carddav autoprovision
rewrite ^/.well-known/carddav /index.php/dav/ redirect;
# php for carddav
location ~ /index\.php/dav/.*$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000; # unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/[^?]*).*$;
fastcgi_index index.php;
fastcgi_param SCRIPT_NAME index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
# php (other)
location ~ \.php {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000; # unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

View file

@ -25,5 +25,5 @@ external_sso_key = "super-secret-key"
ownCloud: ownCloud:
1) In the Apps > Enable 'RainLoop' plugin 1) In the Apps > Enable 'RainLoop' plugin
2) In the Settings > Admin > Enter "RainLoop Webmail URL" and "SSO key" 2) In the Settings > Admin > Enter "RainLoop Webmail URL" and "SSO key"
3) In the Settings > Personal > Type your mail server email and password 3) In the Settings > Personal > Type your mail server email (login) and password

View file

@ -1 +1 @@
1.1 0.0

View file

@ -23,6 +23,7 @@ if (isset($_POST['appname'], $_POST['rainloop-password'], $_POST['rainloop-email
$sPostLogin = isset($_POST['rainloop-login']) ? $_POST['rainloop-login'] : ''; $sPostLogin = isset($_POST['rainloop-login']) ? $_POST['rainloop-login'] : '';
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-email', $sPostEmail); OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-email', $sPostEmail);
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-login', $sPostLogin);
$sPass = $_POST['rainloop-password']; $sPass = $_POST['rainloop-password'];
if ('******' !== $sPass && '' !== $sPass) if ('******' !== $sPass && '' !== $sPass)

View file

@ -8,6 +8,9 @@
<input type="text" id="rainloop-email" name="rainloop-email" <input type="text" id="rainloop-email" name="rainloop-email"
value="<?php echo $_['rainloop-email']; ?>" placeholder="<?php p($l->t('Email')); ?>" /> value="<?php echo $_['rainloop-email']; ?>" placeholder="<?php p($l->t('Email')); ?>" />
<input type="text" id="rainloop-email" name="rainloop-login"
value="<?php echo $_['rainloop-login']; ?>" placeholder="<?php p($l->t('Login (optional)')); ?>" />
<input type="password" id="rainloop-password" name="rainloop-password" <input type="password" id="rainloop-password" name="rainloop-password"
value="<?php echo $_['rainloop-password']; ?>" placeholder="<?php p($l->t('Password')); ?>" /> value="<?php echo $_['rainloop-password']; ?>" placeholder="<?php p($l->t('Password')); ?>" />

View file

@ -58,9 +58,9 @@
<param name="plugin-name" value="directadmin-change-password"/> <param name="plugin-name" value="directadmin-change-password"/>
</antcall> </antcall>
</target> </target>
<target name="ispmanager-change-password"> <target name="ispconfig-change-password">
<antcall target="_build_plugin_"> <antcall target="_build_plugin_">
<param name="plugin-name" value="ispmanager-change-password"/> <param name="plugin-name" value="ispconfig-change-password"/>
</antcall> </antcall>
</target> </target>
<target name="poppassd-change-password"> <target name="poppassd-change-password">
@ -94,5 +94,5 @@
</antcall> </antcall>
</target> </target>
</project> </project>

View file

@ -5,7 +5,6 @@
*/ */
function AdminSecurity() function AdminSecurity()
{ {
this.csrfProtection = ko.observable(!!RL.settingsGet('UseTokenProtection'));
this.capaOpenPGP = ko.observable(RL.capa(Enums.Capa.OpenPGP)); this.capaOpenPGP = ko.observable(RL.capa(Enums.Capa.OpenPGP));
this.capaTwoFactorAuth = ko.observable(RL.capa(Enums.Capa.TwoFactor)); this.capaTwoFactorAuth = ko.observable(RL.capa(Enums.Capa.TwoFactor));
@ -28,13 +27,13 @@ function AdminSecurity()
this.adminPasswordUpdateSuccess(false); this.adminPasswordUpdateSuccess(false);
this.adminPasswordNewError(false); this.adminPasswordNewError(false);
}, this); }, this);
this.adminPasswordNew2.subscribe(function () { this.adminPasswordNew2.subscribe(function () {
this.adminPasswordUpdateError(false); this.adminPasswordUpdateError(false);
this.adminPasswordUpdateSuccess(false); this.adminPasswordUpdateSuccess(false);
this.adminPasswordNewError(false); this.adminPasswordNewError(false);
}, this); }, this);
this.saveNewAdminPasswordCommand = Utils.createCommand(this, function () { this.saveNewAdminPasswordCommand = Utils.createCommand(this, function () {
if (this.adminPasswordNew() !== this.adminPasswordNew2()) if (this.adminPasswordNew() !== this.adminPasswordNew2())
@ -78,12 +77,6 @@ AdminSecurity.prototype.onNewAdminPasswordResponse = function (sResult, oData)
AdminSecurity.prototype.onBuild = function () AdminSecurity.prototype.onBuild = function ()
{ {
this.csrfProtection.subscribe(function (bValue) {
RL.remote().saveAdminConfig(Utils.emptyFunction, {
'TokenProtection': bValue ? '1' : '0'
});
});
this.capaOpenPGP.subscribe(function (bValue) { this.capaOpenPGP.subscribe(function (bValue) {
RL.remote().saveAdminConfig(Utils.emptyFunction, { RL.remote().saveAdminConfig(Utils.emptyFunction, {
'CapaOpenPGP': bValue ? '1' : '0' 'CapaOpenPGP': bValue ? '1' : '0'

View file

@ -1072,6 +1072,11 @@ RainLoopApp.prototype.bootstart = function ()
Utils.removeSettingsViewModel(SettingsThemes); Utils.removeSettingsViewModel(SettingsThemes);
} }
if (!RL.capa(Enums.Capa.Filters))
{
Utils.removeSettingsViewModel(SettingsFilters);
}
if (!bGoogle && !bFacebook && !bTwitter) if (!bGoogle && !bFacebook && !bTwitter)
{ {
Utils.removeSettingsViewModel(SettingsSocialScreen); Utils.removeSettingsViewModel(SettingsSocialScreen);

View file

@ -37,6 +37,7 @@ Enums.Capa = {
'Prefetch': 'PREFETCH', 'Prefetch': 'PREFETCH',
'Gravatar': 'GRAVATAR', 'Gravatar': 'GRAVATAR',
'Themes': 'THEMES', 'Themes': 'THEMES',
'Filters': 'FILTERS',
'AdditionalAccounts': 'ADDITIONAL_ACCOUNTS', 'AdditionalAccounts': 'ADDITIONAL_ACCOUNTS',
'AdditionalIdentities': 'ADDITIONAL_IDENTITIES' 'AdditionalIdentities': 'ADDITIONAL_IDENTITIES'
}; };
@ -278,6 +279,34 @@ Enums.Layout = {
'BottomPreview': 2 'BottomPreview': 2
}; };
/**
* @enum {number}
*/
Enums.FilterConditionField = {
'From': 0,
'To': 1,
'Subject': 2
};
/**
* @enum {number}
*/
Enums.FilterConditionType = {
'contains': 0,
'NotContains': 1,
'EqualTo': 2,
'NotEqualTo': 3
};
/**
* @enum {number}
*/
Enums.FiltersAction = {
'None': 0,
'Move': 1,
'Delete': 2
};
/** /**
* @enum {number} * @enum {number}
*/ */
@ -345,7 +374,7 @@ Enums.Notification = {
'NewPasswordShort': 132, 'NewPasswordShort': 132,
'NewPasswordWeak': 133, 'NewPasswordWeak': 133,
'NewPasswordForbidden': 134, 'NewPasswordForbidden': 134,
'ContactsSyncError': 140, 'ContactsSyncError': 140,
'CantGetMessageList': 201, 'CantGetMessageList': 201,
@ -374,13 +403,13 @@ Enums.Notification = {
'CantDeletePackage': 702, 'CantDeletePackage': 702,
'InvalidPluginPackage': 703, 'InvalidPluginPackage': 703,
'UnsupportedPluginPackage': 704, 'UnsupportedPluginPackage': 704,
'LicensingServerIsUnavailable': 710, 'LicensingServerIsUnavailable': 710,
'LicensingExpired': 711, 'LicensingExpired': 711,
'LicensingBanned': 712, 'LicensingBanned': 712,
'DemoSendMessageError': 750, 'DemoSendMessageError': 750,
'AccountAlreadyExists': 801, 'AccountAlreadyExists': 801,
'MailServerError': 901, 'MailServerError': 901,

View file

@ -80,7 +80,7 @@ ko.bindingHandlers.tooltip3 = {
$document.click(function () { $document.click(function () {
$oEl.tooltip('hide'); $oEl.tooltip('hide');
}); });
Globals.tooltipTrigger.subscribe(function () { Globals.tooltipTrigger.subscribe(function () {
$oEl.tooltip('hide'); $oEl.tooltip('hide');
}); });

View file

@ -0,0 +1,8 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
* @constructor
*/
function FilterConditionModel()
{
}

36
dev/Models/FilterModel.js Normal file
View file

@ -0,0 +1,36 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
* @constructor
*/
function FilterModel()
{
this.enabled = ko.observable(true);
this.conditions = ko.observableArray([]);
this.action = ko.observable(Enums.FiltersAction.None);
}
FilterModel.prototype.deleteCondition = function (oCondition)
{
this.conditions.remove(oCondition);
};
FilterModel.prototype.addCondition = function ()
{
this.conditions.push(new FilterConditionModel());
};
FilterModel.prototype.parse = function (oItem)
{
var bResult = false;
if (oItem && 'Object/Filter' === oItem['@Object'])
{
this.name(Utils.pString(oItem['Name']));
bResult = true;
}
return bResult;
};

31
dev/Settings/Filters.js Normal file
View file

@ -0,0 +1,31 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
/**
* @constructor
*/
function SettingsFilters()
{
// var oData = RL.data();
this.filters = ko.observableArray([]);
this.filters.loading = ko.observable(false);
}
Utils.addSettingsViewModel(SettingsFilters, 'SettingsFilters', 'SETTINGS_LABELS/LABEL_FILTERS_NAME', 'filters');
//SettingsFilters.prototype.onBuild = function ()
//{
//};
SettingsFilters.prototype.deleteFilter = function (oFilter)
{
this.filters.remove(oFilter);
};
SettingsFilters.prototype.addFilter = function ()
{
var oFilter = new FilterModel();
oFilter.addCondition();
this.filters.push(oFilter);
};

View file

@ -37,6 +37,7 @@
right: 0; right: 0;
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;
min-width: 100px;
// padding: 5px; // padding: 5px;
.content { .content {

View file

@ -1,24 +1,24 @@
.nano:before, .nano:after { .nano:before, .nano:after {
display: none; display: none;
content: ""; content: "";
position: absolute; position: absolute;
left: 0; left: 0;
width: 100%; width: 100%;
height: 2px; height: 10px;
z-index: 102; z-index: 102;
-webkit-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5); -webkit-box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5); -moz-box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5); box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
} }
.nano:before { .nano:before {
top: -2px; top: -10px;
} }
.nano:after { .nano:after {
bottom: -2px; bottom: -10px;
} }
.nano.nano-scrolllimit-top:before, .nano.nano-scrolllimit-bottom:after { .nano.nano-scrolllimit-top:before, .nano.nano-scrolllimit-bottom:after {
display: block; display: block;
} }

View file

@ -190,6 +190,7 @@ html.cssanimations {
height: 15px; height: 15px;
background-color: #ddd; background-color: #ddd;
margin: 0 5px; margin: 0 5px;
.box-shadow(0px 0px 3px rgba(0, 0, 0, 0.3));
border-radius: 100%; border-radius: 100%;
display: inline-block; display: inline-block;
@ -209,7 +210,7 @@ html.cssanimations {
-webkit-animation-delay: -0.16s; -webkit-animation-delay: -0.16s;
animation-delay: -0.16s; animation-delay: -0.16s;
} }
} }
@-webkit-keyframes bouncedelay { @-webkit-keyframes bouncedelay {

View file

@ -122,6 +122,8 @@ html.rgba.textshadow {
.tooltip { .tooltip {
font-size: 14px; font-size: 14px;
z-index: 2000 !important; z-index: 2000 !important;
overflow: hidden;
text-overflow: ellipsis;
&.in { &.in {
.opacity(100); .opacity(100);
@ -130,17 +132,20 @@ html.rgba.textshadow {
.tooltip-class { .tooltip-class {
} }
.tooltip-inner {
max-width: 400px;
text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
padding: 5px 10px;
.border-radius(2px);
}
.tooltip-big { .tooltip-big {
font-size: 18px; font-size: 18px;
padding: 0 10px; padding: 0 10px;
white-space: nowrap;
} }
} }
.tooltip-inner {
padding: 5px 10px;
.border-radius(2px);
}
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match // Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child { .btn-group > .btn:first-child {
-webkit-border-top-left-radius: @btnBorderRadius; -webkit-border-top-left-radius: @btnBorderRadius;

View file

@ -9,7 +9,7 @@ function AbstractSystemDropDownViewModel()
KnoinAbstractViewModel.call(this, 'Right', 'SystemDropDown'); KnoinAbstractViewModel.call(this, 'Right', 'SystemDropDown');
var oData = RL.data(); var oData = RL.data();
this.accounts = oData.accounts; this.accounts = oData.accounts;
this.accountEmail = oData.accountEmail; this.accountEmail = oData.accountEmail;
this.accountsLoading = oData.accountsLoading; this.accountsLoading = oData.accountsLoading;
@ -37,7 +37,7 @@ AbstractSystemDropDownViewModel.prototype.accountClick = function (oAccount, oEv
self.accountsLoading(false); self.accountsLoading(false);
}, 1000); }, 1000);
} }
return true; return true;
}; };

View file

@ -2,7 +2,7 @@
"name": "RainLoop", "name": "RainLoop",
"title": "RainLoop Webmail", "title": "RainLoop Webmail",
"version": "1.6.7", "version": "1.6.7",
"release": "102", "release": "106",
"description": "Simple, modern & fast web-based email client", "description": "Simple, modern & fast web-based email client",
"homepage": "http://rainloop.net", "homepage": "http://rainloop.net",
"main": "Gruntfile.js", "main": "Gruntfile.js",
@ -36,6 +36,7 @@
"plugins" "plugins"
], ],
"readmeFilename": "README.md", "readmeFilename": "README.md",
"ownCloudPackageVersion": "1.2",
"engines": { "engines": {
"node": ">= 0.8.0" "node": ">= 0.8.0"
}, },

View file

@ -1,6 +1,6 @@
<?php <?php
class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface class IspConfigChangePasswordDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface
{ {
/** /**
* @var string * @var string
@ -16,7 +16,7 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
* @var string * @var string
*/ */
private $sPassword = ''; private $sPassword = '';
/** /**
* @var string * @var string
*/ */
@ -26,13 +26,13 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
* @var \MailSo\Log\Logger * @var \MailSo\Log\Logger
*/ */
private $oLogger = null; private $oLogger = null;
/** /**
* @param string $sDsn * @param string $sDsn
* @param string $sUser * @param string $sUser
* @param string $sPassword * @param string $sPassword
* *
* @return \IspManagerChangePasswordDriver * @return \IspConfigChangePasswordDriver
*/ */
public function SetConfig($sDsn, $sUser, $sPassword) public function SetConfig($sDsn, $sUser, $sPassword)
{ {
@ -44,9 +44,9 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
} }
/** /**
* @param string $aDomains * @param string $sAllowedEmails
* *
* @return \IspManagerChangePasswordDriver * @return \IspConfigChangePasswordDriver
*/ */
public function SetAllowedEmails($sAllowedEmails) public function SetAllowedEmails($sAllowedEmails)
{ {
@ -57,7 +57,7 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
/** /**
* @param \MailSo\Log\Logger $oLogger * @param \MailSo\Log\Logger $oLogger
* *
* @return \IspManagerChangePasswordDriver * @return \IspConfigChangePasswordDriver
*/ */
public function SetLogger($oLogger) public function SetLogger($oLogger)
{ {
@ -140,12 +140,12 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
{ {
$sSalt = ''; $sSalt = '';
$sBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $sBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
for ($iIndex = 0; $iIndex < 8; $iIndex++) for ($iIndex = 0; $iIndex < 8; $iIndex++)
{ {
$sSalt .= $sBase64[\rand(0, 63)]; $sSalt .= $sBase64[\rand(0, 63)];
} }
return \crypt($sPassword, '$1$'.$sSalt.'$'); return \crypt($sPassword, '$1$'.$sSalt.'$');
} }
} }

View file

@ -1 +1 @@
Plugin that adds functionality to change the email account password (ISPmanager). Plugin that adds functionality to change the email account password (ISPConfig).

View file

@ -0,0 +1 @@
1.1

View file

@ -1,6 +1,6 @@
<?php <?php
class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin class IspconfigChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
{ {
public function Init() public function Init()
{ {
@ -22,7 +22,7 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
{ {
return 'The PHP exention PDO (mysql) must be installed to use this plugin'; return 'The PHP exention PDO (mysql) must be installed to use this plugin';
} }
return ''; return '';
} }
@ -42,9 +42,9 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
if (!empty($sDsn) && 0 < \strlen($sUser) && 0 < \strlen($sPassword)) if (!empty($sDsn) && 0 < \strlen($sUser) && 0 < \strlen($sPassword))
{ {
include_once __DIR__.'/IspManagerChangePasswordDriver.php'; include_once __DIR__.'/IspConfigChangePasswordDriver.php';
$oProvider = new IspManagerChangePasswordDriver(); $oProvider = new IspConfigChangePasswordDriver();
$oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetLogger($this->Manager()->Actions()->Logger());
$oProvider->SetConfig($sDsn, $sUser, $sPassword); $oProvider->SetConfig($sDsn, $sUser, $sPassword);
$oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', ''))));
@ -60,7 +60,7 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
public function configMapping() public function configMapping()
{ {
return array( return array(
\RainLoop\Plugins\Property::NewInstance('pdo_dsn')->SetLabel('ISPmanager PDO dsn') \RainLoop\Plugins\Property::NewInstance('pdo_dsn')->SetLabel('ISPConfig PDO dsn')
->SetDefaultValue('mysql:host=127.0.0.1;dbname=dbispconfig'), ->SetDefaultValue('mysql:host=127.0.0.1;dbname=dbispconfig'),
\RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User') \RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User')
->SetDefaultValue('root'), ->SetDefaultValue('root'),

View file

@ -1 +0,0 @@
1.0

View file

@ -60,7 +60,7 @@ class HtmlUtils
{ {
$sHtmlAttrs = $aMatch[1]; $sHtmlAttrs = $aMatch[1];
} }
$aMatch = array(); $aMatch = array();
if (preg_match('/<body([^>]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1])) if (preg_match('/<body([^>]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1]))
{ {
@ -71,7 +71,7 @@ class HtmlUtils
$sHtml = \preg_replace('/<\/body>/im', '', $sHtml); $sHtml = \preg_replace('/<\/body>/im', '', $sHtml);
$sHtml = \preg_replace('/<html([^>]*)>/im', '', $sHtml); $sHtml = \preg_replace('/<html([^>]*)>/im', '', $sHtml);
$sHtml = \preg_replace('/<\/html>/im', '', $sHtml); $sHtml = \preg_replace('/<\/html>/im', '', $sHtml);
return $sHtml; return $sHtml;
} }
@ -83,8 +83,8 @@ class HtmlUtils
public static function ClearTags($sHtml) public static function ClearTags($sHtml)
{ {
$aRemoveTags = array( $aRemoveTags = array(
'head', 'link', 'base', 'meta', 'title', 'style', 'script', 'bgsound', 'head', 'link', 'base', 'meta', 'title', 'style', 'script', 'bgsound', 'keygen', 'source',
'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset' 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio'
); );
$aToRemove = array( $aToRemove = array(
@ -116,6 +116,7 @@ class HtmlUtils
'/on(DblClick)/si', '/on(DblClick)/si',
'/on(Error)/si', '/on(Error)/si',
'/on(Focus)/si', '/on(Focus)/si',
'/on(FormChange)/si',
'/on(KeyDown)/si', '/on(KeyDown)/si',
'/on(KeyPress)/si', '/on(KeyPress)/si',
'/on(KeyUp)/si', '/on(KeyUp)/si',
@ -418,7 +419,7 @@ class HtmlUtils
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement)
{ {
$sTagNameLower = \strtolower($oElement->tagName); $sTagNameLower = \strtolower($oElement->tagName);
// convert body attributes to styles // convert body attributes to styles
if ('body' === $sTagNameLower) if ('body' === $sTagNameLower)
{ {
@ -429,7 +430,7 @@ class HtmlUtils
'bottommargin' => '', 'bottommargin' => '',
'rightmargin' => '' 'rightmargin' => ''
); );
if (isset($oElement->attributes)) if (isset($oElement->attributes))
{ {
foreach ($oElement->attributes as $sAttributeName => /* @var $oAttributeNode \DOMNode */ $oAttributeNode) foreach ($oElement->attributes as $sAttributeName => /* @var $oAttributeNode \DOMNode */ $oAttributeNode)
@ -451,7 +452,7 @@ class HtmlUtils
if (\is_array($aItem)) if (\is_array($aItem))
{ {
$oElement->removeAttribute($aItem[0]); $oElement->removeAttribute($aItem[0]);
switch ($sIndex) switch ($sIndex)
{ {
case 'text': case 'text':
@ -484,7 +485,7 @@ class HtmlUtils
{ {
$oElement->setAttribute('src', 'javascript:false'); $oElement->setAttribute('src', 'javascript:false');
} }
if (\in_array($sTagNameLower, array('a', 'form', 'area'))) if (\in_array($sTagNameLower, array('a', 'form', 'area')))
{ {
$oElement->setAttribute('target', '_blank'); $oElement->setAttribute('target', '_blank');
@ -500,12 +501,22 @@ class HtmlUtils
// $oElement->removeAttribute('style'); // $oElement->removeAttribute('style');
// } // }
@$oElement->removeAttribute('id'); foreach (array(
@$oElement->removeAttribute('class'); 'id', 'class', 'contenteditable', 'designmode', 'formaction', 'data-bind', 'xmlns'
@$oElement->removeAttribute('contenteditable'); ) as $sAttr)
@$oElement->removeAttribute('designmode'); {
@$oElement->removeAttribute('data-bind'); @$oElement->removeAttribute($sAttr);
@$oElement->removeAttribute('xmlns'); }
foreach (array(
'load', 'blur', 'error', 'focus', 'formchange', 'change',
'click', 'dblclick', 'keydown', 'keypress', 'keyup',
'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover', 'mouseup',
'move', 'resize', 'resizeend', 'resizestart', 'scroll', 'select', 'submit', 'upload'
) as $sAttr)
{
@$oElement->removeAttribute('on'.$sAttr);
}
if ($oElement->hasAttribute('href')) if ($oElement->hasAttribute('href'))
{ {
@ -544,7 +555,7 @@ class HtmlUtils
{ {
$oElement->setAttribute('data-x-src', $sSrc); $oElement->setAttribute('data-x-src', $sSrc);
} }
$bHasExternals = true; $bHasExternals = true;
} }
else if ('data:image/' === \strtolower(\substr(\trim($sSrc), 0, 11))) else if ('data:image/' === \strtolower(\substr(\trim($sSrc), 0, 11)))
@ -626,7 +637,7 @@ class HtmlUtils
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement)
{ {
$sTagNameLower = \strtolower($oElement->tagName); $sTagNameLower = \strtolower($oElement->tagName);
if ($oElement->hasAttribute('data-x-src-cid')) if ($oElement->hasAttribute('data-x-src-cid'))
{ {
$sCid = $oElement->getAttribute('data-x-src-cid'); $sCid = $oElement->getAttribute('data-x-src-cid');
@ -640,7 +651,7 @@ class HtmlUtils
$oElement->setAttribute('src', 'cid:'.$sCid); $oElement->setAttribute('src', 'cid:'.$sCid);
} }
} }
if ($oElement->hasAttribute('data-x-src-location')) if ($oElement->hasAttribute('data-x-src-location'))
{ {
$sSrc = $oElement->getAttribute('data-x-src-location'); $sSrc = $oElement->getAttribute('data-x-src-location');
@ -838,10 +849,10 @@ class HtmlUtils
return $sText; return $sText;
} }
/** /**
* @param string $sText * @param string $sText
* *
* @return string * @return string
*/ */
public static function ConvertHtmlToPlain($sText) public static function ConvertHtmlToPlain($sText)
@ -937,7 +948,7 @@ class HtmlUtils
'\'', '\'',
'' ''
), $sText); ), $sText);
$sText = str_ireplace('<div>',"\n<div>", $sText); $sText = str_ireplace('<div>',"\n<div>", $sText);
$sText = strip_tags($sText, ''); $sText = strip_tags($sText, '');
$sText = preg_replace("/\n\\s+\n/", "\n", $sText); $sText = preg_replace("/\n\\s+\n/", "\n", $sText);

View file

@ -1295,7 +1295,7 @@ class Actions
$aResult['Language'] = $this->ValidateLanguage($sLanguage); $aResult['Language'] = $this->ValidateLanguage($sLanguage);
$aResult['UserLanguage'] = $bUserLanguage; $aResult['UserLanguage'] = $bUserLanguage;
$aResult['LangLink'] = APP_INDEX_FILE.'?/Lang/0/'.($bAdmin ? 'en' : $aResult['Language']).'/'.$sStaticCache.'/'; $aResult['LangLink'] = APP_INDEX_FILE.'?/Lang/0/'.($bAdmin ? 'en' : $aResult['Language']).'/'.$sStaticCache.'/';
$aResult['TemplatesLink'] = APP_INDEX_FILE.'?/Templates/0/'.$sStaticCache.'/'; $aResult['TemplatesLink'] = APP_INDEX_FILE.'?/Templates/0/'.($bAdmin ? 'Admin' : 'App').'/'.$sStaticCache.'/';
$aResult['PluginsLink'] = $sPluginsLink; $aResult['PluginsLink'] = $sPluginsLink;
$aResult['EditorDefaultType'] = 'Html' === $aResult['EditorDefaultType'] ? 'Html' : 'Plain'; $aResult['EditorDefaultType'] = 'Html' === $aResult['EditorDefaultType'] ? 'Html' : 'Plain';
@ -6079,7 +6079,10 @@ class Actions
{ {
$oConfig = $this->Config(); $oConfig = $this->Config();
$aResult = array(\RainLoop\Enumerations\Capa::PREM); $aResult = array(
\RainLoop\Enumerations\Capa::PREM,
\RainLoop\Enumerations\Capa::FILTERS
);
if ($oConfig->Get('webmail', 'allow_additional_accounts', false)) if ($oConfig->Get('webmail', 'allow_additional_accounts', false))
{ {

View file

@ -1,15 +1,16 @@
<?php <?php
namespace RainLoop\Enumerations; namespace RainLoop\Enumerations;
class Capa class Capa
{ {
const PREM = 'PREM'; const PREM = 'PREM';
const TWO_FACTOR = 'TWO_FACTOR'; const TWO_FACTOR = 'TWO_FACTOR';
const OPEN_PGP = 'OPEN_PGP'; const OPEN_PGP = 'OPEN_PGP';
const PREFETCH = 'PREFETCH'; const PREFETCH = 'PREFETCH';
const GRAVATAR = 'GRAVATAR'; const GRAVATAR = 'GRAVATAR';
const THEMES = 'THEMES'; const THEMES = 'THEMES';
const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS'; const FILTERS = 'FILTERS';
const ADDITIONAL_IDENTITIES = 'ADDITIONAL_IDENTITIES'; const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS';
} const ADDITIONAL_IDENTITIES = 'ADDITIONAL_IDENTITIES';
}

View file

@ -19,6 +19,11 @@ class ServiceActions
*/ */
protected $aPaths; protected $aPaths;
/**
* @var string
*/
protected $sQuery;
/** /**
* @param \MailSo\Base\Http $oHttp * @param \MailSo\Base\Http $oHttp
* @param \RainLoop\Actions $oActions * @param \RainLoop\Actions $oActions
@ -30,6 +35,7 @@ class ServiceActions
$this->oHttp = $oHttp; $this->oHttp = $oHttp;
$this->oActions = $oActions; $this->oActions = $oActions;
$this->aPaths = array(); $this->aPaths = array();
$this->sQuery = '';
} }
/** /**
@ -449,16 +455,18 @@ class ServiceActions
$this->oActions->verifyCacheByKey($this->sQuery); $this->oActions->verifyCacheByKey($this->sQuery);
} }
$bAdmin = false !== \strpos($this->sQuery, 'Admin');
$sCacheFileName = ''; $sCacheFileName = '';
if ($bCacheEnabled) if ($bCacheEnabled)
{ {
$sCacheFileName = 'TEMPLATES:'.$this->oActions->Plugins()->Hash().APP_VERSION; $sCacheFileName = 'TEMPLATES:'.($bAdmin ? 'Admin/' : 'App/').$this->oActions->Plugins()->Hash().APP_VERSION;
$sResult = $this->Cacher()->Get($sCacheFileName); $sResult = $this->Cacher()->Get($sCacheFileName);
} }
if (0 === \strlen($sResult)) if (0 === \strlen($sResult))
{ {
$sResult = $this->compileTemplates(false); $sResult = $this->compileTemplates($bAdmin);
if ($bCacheEnabled && 0 < \strlen($sCacheFileName)) if ($bCacheEnabled && 0 < \strlen($sCacheFileName))
{ {
$this->Cacher()->Set($sCacheFileName, $sResult); $this->Cacher()->Set($sCacheFileName, $sResult);
@ -1021,20 +1029,16 @@ class ServiceActions
/** /**
* @param bool $bAdmin = false * @param bool $bAdmin = false
* @param bool $bWrapByScriptTag = true
* *
* @return string * @return string
*/ */
private function compileTemplates($bAdmin = false, $bWrapByScriptTag = false) private function compileTemplates($bAdmin = false)
{ {
$sHtml = \RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views', $this->oActions). $sHtml = \RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views/'.($bAdmin ? 'Admin' : 'App'), $this->oActions).
\RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views/Common', $this->oActions).
$this->oActions->Plugins()->CompileTemplate($bAdmin); $this->oActions->Plugins()->CompileTemplate($bAdmin);
return return 'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml)).';';
($bWrapByScriptTag ? '<script type="text/javascript" data-cfasync="false">' : '').
'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml)).';'.
($bWrapByScriptTag ? '</script>' : '')
;
} }
/** /**

View file

@ -11,7 +11,7 @@
<!--[if lte IE 7]> <!--[if lte IE 7]>
<meta http-equiv="refresh" content="0; URL={{BaseAppIndexFile}}?/BadBrowser" /> <meta http-equiv="refresh" content="0; URL={{BaseAppIndexFile}}?/BadBrowser" />
<![endif]--> <![endif]-->
<script type="text/javascript"> <script type="text/javascript" data-cfasync="false">
function __fIncludeScr(sSrc) { function __fIncludeScr(sSrc) {
document.write(unescape('%3Csc' + 'ript data-cfasync="false" type="text/jav' + 'ascr' + 'ipt" sr' + 'c="' + sSrc + '"%3E%3C/' + 'scr' + 'ipt%3E')); document.write(unescape('%3Csc' + 'ript data-cfasync="false" type="text/jav' + 'ascr' + 'ipt" sr' + 'c="' + sSrc + '"%3E%3C/' + 'scr' + 'ipt%3E'));
} }

View file

@ -1,24 +1,24 @@
<div class="b-admin-left g-ui-user-select-none"> <div class="b-admin-left g-ui-user-select-none">
<div class="b-toolbar"> <div class="b-toolbar">
<div class="btn-group show-on-panel-disabled"> <div class="btn-group show-on-panel-disabled">
<a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }"> <a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }">
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i> <i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
</a> </a>
</div> </div>
</div> </div>
<div class="b-content thm-settings-menu opacity-on-panel-disabled"> <div class="b-content thm-settings-menu opacity-on-panel-disabled">
<div class="b-admin-menu" data-bind="foreach: menu"> <div class="b-admin-menu" data-bind="foreach: menu">
<!-- ko if: disabled --> <!-- ko if: disabled -->
<span class="e-item disabled"> <span class="e-item disabled">
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span> <span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
</span> </span>
<!-- /ko --> <!-- /ko -->
<!-- ko ifnot: disabled --> <!-- ko ifnot: disabled -->
<a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }"> <a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }">
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span> <span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
</a> </a>
<!-- /ko --> <!-- /ko -->
</div> </div>
</div> </div>
<div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div> <div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div>
</div> </div>

View file

@ -16,28 +16,41 @@
<h1 style="margin-bottom: 0;">RainLoop</h1> <h1 style="margin-bottom: 0;">RainLoop</h1>
<h4 style="margin-top: 0;"><span data-bind="text: version"></span></h4> <h4 style="margin-top: 0;"><span data-bind="text: version"></span></h4>
<h4 style="color: #aaa; font-weight: normal;">Simple, modern & fast web-based email client</h4> <h4 style="color: #aaa; font-weight: normal;">Simple, modern & fast web-based email client</h4>
<h5 style="color: #aaa; font-weight: normal; margin-top: 40px;"> <h5 style="font-weight: normal; margin-top: 40px;">
<div data-bind="visible: 'error' === statusType()"> <div data-bind="visible: 'error' === statusType()">
<i class="icon-warning" style="color: red"></i> <i class="icon-warning" style="color: red"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span data-bind="text: errorDesc">Error</span> <span data-bind="text: errorDesc"></span>
</div> </div>
<div data-bind="visible: 'available' === statusType()"> <div data-bind="visible: 'available' === statusType()">
<i class="icon-warning" style="color: blue"></i> <i class="icon-bolt" style="color: red"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
New <b data-bind="text: coreRemoteVersion"></b> version is available. New <b data-bind="text: coreRemoteVersion"></b> version is available.
<span data-bind="visible: '' !== coreRemoteRelease()"> <span data-bind="visible: '' !== coreRemoteRelease()">
(<span data-bind="text: coreRemoteRelease"></span>) (<span data-bind="text: coreRemoteRelease"></span>)
</span> </span>
<br /> <br />
<br />
<span data-bind="visible: coreUpdatable() && coreAccess()"> <span data-bind="visible: coreUpdatable() && coreAccess()">
<span class="g-ui-link" data-bind="click: updateCoreData">Update</span> <a class="btn" data-bind="click: updateCoreData">
<i class="icon-sync"></i>
&nbsp;&nbsp;
Update
</a>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
</span> </span>
<span data-bind="visible: coreAccess()"> <span data-bind="visible: coreAccess()">
<a class="g-ui-link" href="http://rainloop.net/downloads/" target="_blank">Download</a> <a class="btn" href="http://rainloop.net/downloads/" target="_blank">
<i class="icon-download"></i>
&nbsp;&nbsp;
Download
</a>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
<a class="g-ui-link" href="http://rainloop.net/changelog/" target="_blank">Changelog</a> <a class="btn" href="http://rainloop.net/changelog/" target="_blank">
<i class="icon-file-text"></i>
&nbsp;&nbsp;
Changelog
</a>
</span> </span>
</div> </div>
<div data-bind="visible: 'up-to-date' === statusType()"> <div data-bind="visible: 'up-to-date' === statusType()">

View file

@ -36,7 +36,7 @@
<div data-bind="visible: licensingProcess()"> <div data-bind="visible: licensingProcess()">
<i class="icon-spinner animated"></i> <i class="icon-spinner animated"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
checking... Checking&hellip;
</div> </div>
<div data-bind="visible: !licensingProcess()"> <div data-bind="visible: !licensingProcess()">
<div class="alert alert-block span8" style="margin-left: 0" data-bind="visible: !licensing()"> <div class="alert alert-block span8" style="margin-left: 0" data-bind="visible: !licensing()">

View file

@ -1,28 +1,28 @@
<div class="b-admin-plugin-property"> <div class="b-admin-plugin-property">
<label class="control-label"> <label class="control-label">
<span data-bind="text: Label, visible: 5 !== Type"></span> <span data-bind="text: Label, visible: 5 !== Type"></span>
</label> </label>
<div class="controls"> <div class="controls">
<!-- ko if: 0 === Type || 1 === Type --> <!-- ko if: 0 === Type || 1 === Type -->
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" /> <input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" />
<!-- /ko --> <!-- /ko -->
<!-- ko if: 3 === Type --> <!-- ko if: 3 === Type -->
<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" /> <input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" />
<!-- /ko --> <!-- /ko -->
<!-- ko if: 2 === Type --> <!-- ko if: 2 === Type -->
<textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value"></textarea> <textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value"></textarea>
<!-- /ko --> <!-- /ko -->
<!-- ko if: 4 === Type --> <!-- ko if: 4 === Type -->
<select data-bind="options: Default, value: value"></select> <select data-bind="options: Default, value: value"></select>
<!-- /ko --> <!-- /ko -->
<!-- ko if: 5 === Type --> <!-- ko if: 5 === Type -->
<label data-bind="click: function () { value(!value()); }"> <label data-bind="click: function () { value(!value()); }">
<i data-bind="css: value() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i> <i data-bind="css: value() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span data-bind="text: Label"></span> <span data-bind="text: Label"></span>
</label> </label>
<!-- /ko --> <!-- /ko -->
<span class="help-block" style="color: #ccc" data-bind="text: Desc, visible: '' !== Desc"></span> <span class="help-block" style="color: #ccc" data-bind="text: Desc, visible: '' !== Desc"></span>
</div> </div>
<br /> <br />
</div> </div>

View file

@ -3,15 +3,6 @@
<div class="legend"> <div class="legend">
Security Security
</div> </div>
<div class="control-group">
<div class="controls">
<label data-bind="click: function () { csrfProtection(!csrfProtection()); }">
<i data-bind="css: csrfProtection() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
&nbsp;&nbsp;
<abbr title="Cross-site request forgery" class="initialism">CSRF</abbr> protection
</label>
</div>
</div>
<div class="control-group"> <div class="control-group">
<div class="controls"> <div class="controls">
<label data-bind="click: function () { capaOpenPGP(!capaOpenPGP()); }"> <label data-bind="click: function () { capaOpenPGP(!capaOpenPGP()); }">
@ -36,6 +27,7 @@
</div> </div>
</div> </div>
</div> </div>
<br />
<div class="form-horizontal"> <div class="form-horizontal">
<div class="legend"> <div class="legend">
Changer Admin Password Changer Admin Password

View file

@ -1,7 +1,7 @@
<div class="e-item b-folder-system-item"> <div class="e-item b-folder-system-item">
<a class="e-link" data-bind="droppable: function (oEvent, oUi) { $root.messagesDrop($data, oUi); }, css: { 'selected': selected, 'selectable': selectable, 'print-count': 0 < printableUnreadCount().length, 'anim-action-class': actionBlink }"> <a class="e-link" data-bind="droppable: function (oEvent, oUi) { $root.messagesDrop($data, oUi); }, css: { 'selected': selected, 'selectable': selectable, 'print-count': 0 < printableUnreadCount().length, 'anim-action-class': actionBlink }">
<span class="badge pull-right count" data-bind="text: printableUnreadCount"></span> <span class="badge pull-right count" data-bind="text: printableUnreadCount"></span>
&nbsp; &nbsp;
<span class="name" data-bind="text: localName()"></span> <span class="name" data-bind="text: localName()"></span>
</a> </a>
</div> </div>

View file

@ -1,56 +1,56 @@
<style> <style>
html, body { html, body {
margin: 0; margin: 0;
padding: 0; padding: 0;
background-color: #fff; background-color: #fff;
font-family: arial, sans-serif; font-family: arial, sans-serif;
} }
.tbl {width:100%;font-family:normal 11px Tahoma, Arial, Helvetica, "sans-serif"} .tbl {width:100%;font-family:normal 11px Tahoma, Arial, Helvetica, "sans-serif"}
.tt {padding:5px;border:solid #ddd;border-width:0px 0px 1px 0px} .tt {padding:5px;border:solid #ddd;border-width:0px 0px 1px 0px}
.tv {padding:5px;border:solid #ddd;border-width:0px 0px 1px 1px} .tv {padding:5px;border:solid #ddd;border-width:0px 0px 1px 1px}
.tb {padding:15px} .tb {padding:15px}
a {color: blue; text-decoration: underline} a {color: blue; text-decoration: underline}
a:visited {color: #609} a:visited {color: #609}
a:active {color: red} a:active {color: red}
blockquote {border-left: 2px solid black; margin: 0; padding: 0px 10px} blockquote {border-left: 2px solid black; margin: 0; padding: 0px 10px}
pre {margin: 0px; padding: 0px; font-family: arial, sans-serif; background: #fff; border: none; white-space: normal} pre {margin: 0px; padding: 0px; font-family: arial, sans-serif; background: #fff; border: none; white-space: normal}
</style> </style>
<table cellpadding="0" cellspacing="0" class="tbl"> <table cellpadding="0" cellspacing="0" class="tbl">
<tbody> <tbody>
<tr> <tr>
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_FROM"></td> <td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_FROM"></td>
<td class="tv" data-bind="text: popupFrom"></td> <td class="tv" data-bind="text: popupFrom"></td>
</tr> </tr>
<tr> <tr>
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_TO"></td> <td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_TO"></td>
<td class="tv" data-bind="text: popupTo"></td> <td class="tv" data-bind="text: popupTo"></td>
</tr> </tr>
<tr data-bind="visible: '' !== popupCc"> <tr data-bind="visible: '' !== popupCc">
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_CC"></td> <td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_CC"></td>
<td class="tv" data-bind="text: popupCc"></td> <td class="tv" data-bind="text: popupCc"></td>
</tr> </tr>
<tr data-bind="visible: '' !== popupBcc"> <tr data-bind="visible: '' !== popupBcc">
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_BCC"></td> <td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_BCC"></td>
<td class="tv" data-bind="text: popupBcc"></td> <td class="tv" data-bind="text: popupBcc"></td>
</tr> </tr>
<tr data-bind="visible: '' !== popupDate"> <tr data-bind="visible: '' !== popupDate">
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_DATE"></td> <td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_DATE"></td>
<td class="tv" data-bind="text: popupDate"></td> <td class="tv" data-bind="text: popupDate"></td>
</tr> </tr>
<tr> <tr>
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_SUBJECT"></td> <td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_SUBJECT"></td>
<td class="tv" data-bind="text: popupSubject"></td> <td class="tv" data-bind="text: popupSubject"></td>
</tr> </tr>
<tr data-bind="visible: '' !== popupAttachments"> <tr data-bind="visible: '' !== popupAttachments">
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_ATTACHMENTS"></td> <td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_ATTACHMENTS"></td>
<td class="tv" data-bind="text: popupAttachments"></td> <td class="tv" data-bind="text: popupAttachments"></td>
</tr> </tr>
<tr> <tr>
<td colspan="2" class="tb"> <td colspan="2" class="tb">
<div data-bind="html: popupBody"></div> <div data-bind="html: popupBody"></div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View file

@ -1,3 +1,3 @@
<div class="settingsCustom"> <div class="settingsCustom">
CUSTOM CUSTOM
</div> </div>

View file

@ -0,0 +1,38 @@
<div class="b-settings-filters g-ui-user-select-none">
<div class="form-horizontal">
<div class="legend">
<span class="i18n" data-i18n-text="SETTINGS_FILTERS/LEGEND_FILTERS"></span>
</div>
</div>
<div class="row">
<div data-bind="foreach: filters">
<div class="filter" style="background-color: #ddd">
FILTER
<div data-bind="foreach: conditions">
COND
<br />
<span class="delete-condition" data-bind="click: function (oCondition) { $parent.deleteCondition(oCondition); }">
<i class="icon-trash"></i>
</span>
<br />
</div>
<br />
<a class="btn" data-bind="click: addCondition">
<i class="icon-plus"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="SETTINGS_FILTERS/BUTTON_ADD_CONDITION"></span>
</a>
<br />
<span class="delete-filter" data-bind="click: function (oFilter) { $parent.deleteFilter(oFilter); }">
<i class="icon-trash"></i>
</span>
</div>
<br />
</div>
</div>
<a class="btn" data-bind="click: addFilter">
<i class="icon-filter"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="SETTINGS_FILTERS/BUTTON_ADD_FILTER"></span>
</a>
</div>

View file

@ -1,24 +1,24 @@
<div class="b-settins-left g-ui-user-select-none"> <div class="b-settins-left g-ui-user-select-none">
<div class="b-toolbar"> <div class="b-toolbar">
<div class="btn-group"> <div class="btn-group">
<a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }"> <a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }">
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i> <i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
</a> </a>
</div> </div>
</div> </div>
<div class="b-content thm-settings-menu opacity-on-panel-disabled"> <div class="b-content thm-settings-menu opacity-on-panel-disabled">
<div class="b-settings-menu" data-bind="foreach: menu"> <div class="b-settings-menu" data-bind="foreach: menu">
<!-- ko if: disabled --> <!-- ko if: disabled -->
<span class="e-item disabled"> <span class="e-item disabled">
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span> <span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
</span> </span>
<!-- /ko --> <!-- /ko -->
<!-- ko ifnot: disabled --> <!-- ko ifnot: disabled -->
<a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }"> <a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }">
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span> <span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
</a> </a>
<!-- /ko --> <!-- /ko -->
</div> </div>
</div> </div>
<div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div> <div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div>
</div> </div>

View file

@ -1,14 +1,6 @@
<div class="b-system-drop-down g-ui-user-select-none"> <div class="b-system-drop-down g-ui-user-select-none">
<div class="b-toolbar"> <div class="b-toolbar">
<div class="btn-toolbar"> <div class="btn-toolbar">
<!-- <div class="btn-group pull-right">
<a class="btn btn-narrow" data-bind="click: logoutClick">
<i class="icon-power"></i>
</a>
</div>
<div class="btn-group pull-right">
&nbsp;&nbsp;&nbsp;
</div>-->
<div class="btn-group pull-right dropdown colored-toggle" data-bind="registrateBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger"> <div class="btn-group pull-right dropdown colored-toggle" data-bind="registrateBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger">
<a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown" <a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown"
data-toggle="dropdown" data-tooltip-placement="left" data-toggle="dropdown" data-tooltip-placement="left"

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