mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-01 21:49:21 +03:00
Change build system (Grunt -> Gulp)
Remove attachments on reply (Closes #195) Do not show deleted (flag \Deleted) messages (Closes #185) Release commit
This commit is contained in:
parent
aebd47393c
commit
333c063cf1
44 changed files with 1300 additions and 772 deletions
534
build/other/Gruntfile.js
Normal file
534
build/other/Gruntfile.js
Normal file
|
|
@ -0,0 +1,534 @@
|
|||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
|
||||
/*jshint node: true */
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (grunt) {
|
||||
|
||||
grunt.initConfig({
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
cfg: {
|
||||
devVersion: "0.0.0",
|
||||
releasesPath: 'build/dist/releases',
|
||||
releaseSrcPath: '',
|
||||
releaseFolder: 'rainloop',
|
||||
releaseZipFile: 'rainloop.zip'
|
||||
},
|
||||
less: {
|
||||
development: {
|
||||
files: {
|
||||
'rainloop/v/<%= cfg.devVersion %>/static/css/less.css': 'dev/Styles/@Main.less'
|
||||
}
|
||||
}
|
||||
},
|
||||
jshint: {
|
||||
options: {
|
||||
jshintrc: '.jshintrc'
|
||||
},
|
||||
files: [
|
||||
'Gruntfile.js',
|
||||
'rainloop/v/<%= cfg.devVersion %>/static/js/app.js',
|
||||
'rainloop/v/<%= cfg.devVersion %>/static/js/admin.js'
|
||||
]
|
||||
},
|
||||
uglify: {
|
||||
options: {
|
||||
mangle: true,
|
||||
compress: true,
|
||||
preserveComments: 'some'
|
||||
},
|
||||
cookie: {
|
||||
options: {
|
||||
banner: '/*! jquery.cookie v1.4.0 (c) 2013 Klaus Hartl | MIT */\n',
|
||||
preserveComments: 'false'
|
||||
},
|
||||
src: 'vendors/jquery-cookie/jquery.cookie.js',
|
||||
dest: 'vendors/jquery-cookie/jquery.cookie-1.4.0.min.js'
|
||||
},
|
||||
ifvisible: {
|
||||
options: {
|
||||
banner: '/*!ifvisible.js v1.0.0 (c) 2013 Serkan Yersen | MIT */\n',
|
||||
preserveComments: 'false'
|
||||
},
|
||||
src: 'vendors/ifvisible/src/ifvisible.js',
|
||||
dest: 'vendors/ifvisible/ifvisible.min.js'
|
||||
},
|
||||
wakeup: {
|
||||
options: {
|
||||
banner: '/*! jQuery WakeUp plugin (c) 2013 Paul Okopny <paul.okopny@gmail.com> | MIT */\n',
|
||||
preserveComments: 'false'
|
||||
},
|
||||
src: 'vendors/jquery-wakeup/jquery.wakeup.js',
|
||||
dest: 'vendors/jquery-wakeup/jquery.wakeup.min.js'
|
||||
},
|
||||
mousewheel: {
|
||||
options: {
|
||||
banner: '/*! jquery.mousewheel v3.1.4 (c) 2013 Brandon Aaron (http://brandon.aaron.sh) | MIT */\n',
|
||||
preserveComments: 'false'
|
||||
},
|
||||
src: 'vendors/jquery-mousewheel/jquery.mousewheel.js',
|
||||
dest: 'vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js'
|
||||
},
|
||||
nano: {
|
||||
options: {
|
||||
banner: "/*! nanoScrollerJS v0.7 (c) 2013 James Florentino; modified by RainLoop Team | MIT */\n",
|
||||
preserveComments: "false"
|
||||
},
|
||||
src: 'vendors/jquery-nanoscroller/jquery.nanoscroller.js',
|
||||
dest: 'vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js'
|
||||
},
|
||||
inputosaurus: {
|
||||
options: {
|
||||
banner: "/*! Inputosaurus Text v0.1.6 (c) 2013 Dan Kielp <dan@sproutsocial.com>; modified by RainLoop Team | MIT */\n",
|
||||
preserveComments: "false"
|
||||
},
|
||||
src: 'vendors/inputosaurus/inputosaurus.js',
|
||||
dest: 'vendors/inputosaurus/inputosaurus.min.js'
|
||||
},
|
||||
pace: {
|
||||
src: 'vendors/simple-pace/simple-pace.js',
|
||||
dest: 'vendors/simple-pace/simple-pace-1.0.min.js'
|
||||
},
|
||||
rl: {
|
||||
src: 'vendors/rl/rl.js',
|
||||
dest: 'vendors/rl/rl-1.0.min.js'
|
||||
},
|
||||
min_app: {
|
||||
src: 'rainloop/v/<%= cfg.devVersion %>/static/js/app.js',
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/js/app.min.js'
|
||||
},
|
||||
min_admin: {
|
||||
src: 'rainloop/v/<%= cfg.devVersion %>/static/js/admin.js',
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/js/admin.min.js'
|
||||
}
|
||||
},
|
||||
concat: {
|
||||
js_index: {
|
||||
nonull: true,
|
||||
src: [
|
||||
"vendors/json2.min.js",
|
||||
"vendors/simple-pace/simple-pace-1.0.min.js",
|
||||
"vendors/rl/rl-1.0.min.js"
|
||||
],
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/js/boot.js'
|
||||
},
|
||||
js_openpgp: {
|
||||
nonull: true,
|
||||
src: [
|
||||
"vendors/openpgp/openpgp-0.5.1.min.js",
|
||||
],
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/js/openpgp.min.js'
|
||||
},
|
||||
js_libs: {
|
||||
nonull: true,
|
||||
options: {
|
||||
separator: '\n\n'
|
||||
},
|
||||
src: [
|
||||
"vendors/modernizr.js",
|
||||
"vendors/underscore/underscore-1.5.2.min.js",
|
||||
"vendors/jquery/jquery-1.11.1.min.js",
|
||||
"vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js",
|
||||
"vendors/jquery-cookie/jquery.cookie-1.4.0.min.js",
|
||||
"vendors/jquery-finger/jquery.finger.min.js",
|
||||
"vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js",
|
||||
"vendors/jquery-scrollstop/jquery.scrollstop.min.js",
|
||||
"vendors/jquery-lazyload/jquery.lazyload.min.js",
|
||||
"vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js",
|
||||
"vendors/jquery-wakeup/jquery.wakeup.min.js",
|
||||
"vendors/inputosaurus/inputosaurus.min.js",
|
||||
"vendors/moment/min/moment.min.js ",
|
||||
"vendors/routes/signals.min.js",
|
||||
"vendors/routes/hasher.min.js",
|
||||
"vendors/routes/crossroads.min.js",
|
||||
"vendors/knockout/knockout-3.1.0.js",
|
||||
"vendors/knockout-projections/knockout-projections-1.0.0.min.js",
|
||||
"vendors/ssm/ssm.min.js",
|
||||
"vendors/jua/jua.min.js",
|
||||
"vendors/keymaster/keymaster.js",
|
||||
"vendors/ifvisible/ifvisible.min.js",
|
||||
"vendors/jquery-magnific-popup/jquery.magnific-popup.min.js",
|
||||
"vendors/bootstrap/js/bootstrap.min.js",
|
||||
"dev/Common/_LibsEnd.js"
|
||||
],
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/js/libs.js'
|
||||
},
|
||||
js_admin: {
|
||||
nonull: true,
|
||||
options: {
|
||||
stripBanners: true,
|
||||
banner: '/*! RainLoop Webmail Admin Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */\n' +
|
||||
'(function (window, $, ko, crossroads, hasher, _) {\n',
|
||||
footer: '\n\n}(window, jQuery, ko, crossroads, hasher, _));'
|
||||
},
|
||||
src: [
|
||||
"dev/Common/_Begin.js",
|
||||
"dev/Common/_BeginA.js",
|
||||
|
||||
"dev/Common/Globals.js",
|
||||
"dev/Common/Constants.js",
|
||||
"dev/Common/Enums.js",
|
||||
"dev/Common/Utils.js",
|
||||
"dev/Common/Base64.js",
|
||||
"dev/Common/Knockout.js",
|
||||
"dev/Common/LinkBuilder.js",
|
||||
"dev/Common/Plugins.js",
|
||||
|
||||
"dev/Storages/LocalStorages/CookieDriver.js",
|
||||
"dev/Storages/LocalStorages/LocalStorageDriver.js",
|
||||
"dev/Storages/LocalStorage.js",
|
||||
|
||||
"dev/Knoin/AbstractBoot.js",
|
||||
"dev/Knoin/AbstractViewModel.js",
|
||||
"dev/Knoin/AbstractScreen.js",
|
||||
"dev/Knoin/Knoin.js",
|
||||
|
||||
"dev/Models/EmailModel.js",
|
||||
"dev/Models/ContactTagModel.js",
|
||||
|
||||
"dev/ViewModels/PopupsDomainViewModel.js",
|
||||
"dev/ViewModels/PopupsPluginViewModel.js",
|
||||
"dev/ViewModels/PopupsActivateViewModel.js",
|
||||
"dev/ViewModels/PopupsLanguagesViewModel.js",
|
||||
"dev/ViewModels/PopupsAskViewModel.js",
|
||||
|
||||
"dev/ViewModels/AdminLoginViewModel.js",
|
||||
|
||||
"dev/ViewModels/AdminMenuViewModel.js",
|
||||
"dev/ViewModels/AdminPaneViewModel.js",
|
||||
|
||||
"dev/Admin/General.js",
|
||||
"dev/Admin/Login.js",
|
||||
"dev/Admin/Branding.js",
|
||||
"dev/Admin/Contacts.js",
|
||||
"dev/Admin/Domains.js",
|
||||
"dev/Admin/Security.js",
|
||||
"dev/Admin/Social.js",
|
||||
"dev/Admin/Plugins.js",
|
||||
"dev/Admin/Packages.js",
|
||||
"dev/Admin/Licensing.js",
|
||||
"dev/Admin/About.js",
|
||||
|
||||
"dev/Storages/AbstractData.js",
|
||||
"dev/Storages/AdminData.js",
|
||||
|
||||
"dev/Storages/AbstractAjaxRemote.js",
|
||||
"dev/Storages/AdminAjaxRemote.js",
|
||||
|
||||
"dev/Storages/AbstractCache.js",
|
||||
"dev/Storages/AdminCache.js",
|
||||
|
||||
"dev/Screens/AbstractSettings.js",
|
||||
|
||||
"dev/Screens/AdminLogin.js",
|
||||
"dev/Screens/AdminSettings.js",
|
||||
|
||||
"dev/Boots/AbstractApp.js",
|
||||
"dev/Boots/AdminApp.js",
|
||||
|
||||
"dev/Common/_End.js",
|
||||
"dev/Common/_CoreEnd.js"
|
||||
],
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/js/admin.js'
|
||||
},
|
||||
js_app: {
|
||||
nonull: true,
|
||||
options: {
|
||||
stripBanners: true,
|
||||
banner: '/*! RainLoop Webmail Main Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */\n' +
|
||||
'(function (window, $, ko, crossroads, hasher, moment, Jua, _, ifvisible, key) {\n',
|
||||
footer: '\n\n}(window, jQuery, ko, crossroads, hasher, moment, Jua, _, ifvisible, key));'
|
||||
},
|
||||
src: [
|
||||
"dev/Common/_Begin.js",
|
||||
"dev/Common/_BeginW.js",
|
||||
|
||||
"dev/Common/Globals.js",
|
||||
"dev/Common/Constants.js",
|
||||
"dev/Common/Enums.js",
|
||||
"dev/Common/Utils.js",
|
||||
"dev/Common/Base64.js",
|
||||
"dev/Common/Knockout.js",
|
||||
"dev/Common/LinkBuilder.js",
|
||||
"dev/Common/Plugins.js",
|
||||
"dev/Common/NewHtmlEditorWrapper.js",
|
||||
"dev/Common/Selector.js",
|
||||
|
||||
"dev/Storages/LocalStorages/CookieDriver.js",
|
||||
"dev/Storages/LocalStorages/LocalStorageDriver.js",
|
||||
"dev/Storages/LocalStorage.js",
|
||||
|
||||
"dev/Knoin/AbstractBoot.js",
|
||||
"dev/Knoin/AbstractViewModel.js",
|
||||
"dev/Knoin/AbstractScreen.js",
|
||||
"dev/Knoin/Knoin.js",
|
||||
|
||||
"dev/Models/EmailModel.js",
|
||||
"dev/Models/ContactModel.js",
|
||||
"dev/Models/ContactPropertyModel.js",
|
||||
"dev/Models/ContactTagModel.js",
|
||||
"dev/Models/AttachmentModel.js",
|
||||
"dev/Models/ComposeAttachmentModel.js",
|
||||
"dev/Models/MessageModel.js",
|
||||
"dev/Models/FolderModel.js",
|
||||
"dev/Models/AccountModel.js",
|
||||
"dev/Models/IdentityModel.js",
|
||||
"dev/Models/FilterConditionModel.js",
|
||||
"dev/Models/FilterModel.js",
|
||||
"dev/Models/OpenPgpKeyModel.js",
|
||||
|
||||
"dev/ViewModels/PopupsFolderClearViewModel.js",
|
||||
"dev/ViewModels/PopupsFolderCreateViewModel.js",
|
||||
"dev/ViewModels/PopupsFolderSystemViewModel.js",
|
||||
"dev/ViewModels/PopupsComposeViewModel.js",
|
||||
"dev/ViewModels/PopupsContactsViewModel.js",
|
||||
"dev/ViewModels/PopupsAdvancedSearchViewModel.js",
|
||||
"dev/ViewModels/PopupsAddAccountViewModel.js",
|
||||
"dev/ViewModels/PopupsAddOpenPgpKeyViewModel.js",
|
||||
"dev/ViewModels/PopupsViewOpenPgpKeyViewModel.js",
|
||||
"dev/ViewModels/PopupsGenerateNewOpenPgpKeyViewModel.js",
|
||||
"dev/ViewModels/PopupsComposeOpenPgpViewModel.js",
|
||||
"dev/ViewModels/PopupsIdentityViewModel.js",
|
||||
"dev/ViewModels/PopupsLanguagesViewModel.js",
|
||||
"dev/ViewModels/PopupsTwoFactorTestViewModel.js",
|
||||
"dev/ViewModels/PopupsAskViewModel.js",
|
||||
"dev/ViewModels/PopupsKeyboardShortcutsHelpViewModel.js",
|
||||
|
||||
"dev/ViewModels/LoginViewModel.js",
|
||||
|
||||
"dev/ViewModels/AbstractSystemDropDownViewModel.js",
|
||||
"dev/ViewModels/MailBoxSystemDropDownViewModel.js",
|
||||
"dev/ViewModels/SettingsSystemDropDownViewModel.js",
|
||||
|
||||
"dev/ViewModels/MailBoxFolderListViewModel.js",
|
||||
"dev/ViewModels/MailBoxMessageListViewModel.js",
|
||||
"dev/ViewModels/MailBoxMessageViewViewModel.js",
|
||||
|
||||
"dev/ViewModels/SettingsMenuViewModel.js",
|
||||
"dev/ViewModels/SettingsPaneViewModel.js",
|
||||
|
||||
"dev/Settings/General.js",
|
||||
"dev/Settings/Contacts.js",
|
||||
"dev/Settings/Accounts.js",
|
||||
"dev/Settings/Identity.js",
|
||||
"dev/Settings/Identities.js",
|
||||
"dev/Settings/Filters.js",
|
||||
"dev/Settings/Security.js",
|
||||
"dev/Settings/Social.js",
|
||||
"dev/Settings/ChangePassword.js",
|
||||
"dev/Settings/Folders.js",
|
||||
"dev/Settings/Themes.js",
|
||||
"dev/Settings/OpenPGP.js",
|
||||
|
||||
"dev/Storages/AbstractData.js",
|
||||
"dev/Storages/WebMailData.js",
|
||||
|
||||
"dev/Storages/AbstractAjaxRemote.js",
|
||||
"dev/Storages/WebMailAjaxRemote.js",
|
||||
|
||||
"dev/Storages/AbstractCache.js",
|
||||
"dev/Storages/WebMailCache.js",
|
||||
|
||||
"dev/Screens/AbstractSettings.js",
|
||||
|
||||
"dev/Screens/Login.js",
|
||||
"dev/Screens/MailBox.js",
|
||||
"dev/Screens/Settings.js",
|
||||
|
||||
"dev/Boots/AbstractApp.js",
|
||||
"dev/Boots/RainLoopApp.js",
|
||||
|
||||
"dev/Common/_End.js",
|
||||
"dev/Common/_CoreEnd.js"
|
||||
],
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/js/app.js'
|
||||
},
|
||||
css: {
|
||||
nonull: true,
|
||||
src: [
|
||||
"vendors/jquery-ui/css/smoothness/jquery-ui-1.10.3.custom.css",
|
||||
"vendors/normalize/normalize.css",
|
||||
"vendors/fontastic/styles.css",
|
||||
"vendors/jquery-nanoscroller/nanoscroller.css",
|
||||
"vendors/jquery-magnific-popup/magnific-popup.css",
|
||||
"vendors/jquery-magnific-popup/magnific-popup-animations.css",
|
||||
"vendors/simple-pace/styles.css",
|
||||
"vendors/inputosaurus/inputosaurus.css",
|
||||
"vendors/flags/flags-fixed.css",
|
||||
"rainloop/v/<%= cfg.devVersion %>/static/css/less.css"
|
||||
],
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/css/app.css'
|
||||
}
|
||||
},
|
||||
|
||||
cssmin: {
|
||||
css: {
|
||||
src: 'rainloop/v/<%= cfg.devVersion %>/static/css/app.css',
|
||||
dest: 'rainloop/v/<%= cfg.devVersion %>/static/css/app.min.css'
|
||||
}
|
||||
},
|
||||
|
||||
compress: {
|
||||
build: {
|
||||
options: {
|
||||
archive: '<%= cfg.releasesPath %>/<%= cfg.releaseFolder %>/<%= cfg.releaseZipFile %>',
|
||||
mode: 'zip'
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '<%= cfg.releasesPath %>/<%= cfg.releaseFolder %>/src/',
|
||||
src: ['**/*']
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
md5: {
|
||||
build: {
|
||||
files: {
|
||||
'<%= cfg.releasesPath %>/<%= cfg.releaseFolder %>/':
|
||||
'<%= cfg.releasesPath %>/<%= cfg.releaseFolder %>/<%= cfg.releaseZipFile %>'
|
||||
},
|
||||
options: {
|
||||
keepExtension: true,
|
||||
keepBasename: true,
|
||||
after: function () {
|
||||
grunt.file['delete']([
|
||||
grunt.config('cfg.releasesPath'), grunt.config('cfg.releaseFolder'), grunt.config('cfg.releaseZipFile')
|
||||
].join("/"));
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
js: {
|
||||
options: {
|
||||
nospawn: true
|
||||
},
|
||||
files: ['dev/**/*.js', 'vendors/**/*.js'],
|
||||
tasks: ['concat:js_libs', 'concat:js_openpgp', 'concat:js_admin', 'concat:js_app']
|
||||
},
|
||||
styles: {
|
||||
options: {
|
||||
nospawn: true
|
||||
},
|
||||
files: ['dev/Styles/*.less'],
|
||||
tasks: ['less', 'concat:css']
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// dependencies
|
||||
for (var key in grunt.file.readJSON('package.json').devDependencies) {
|
||||
if (key.indexOf('grunt-') === 0) {
|
||||
grunt.loadNpmTasks(key);
|
||||
}
|
||||
}
|
||||
|
||||
grunt.registerTask('rainloop', 'RainLoop Webmail build task', function () {
|
||||
|
||||
var
|
||||
version = grunt.config('pkg.version'),
|
||||
release = parseInt(grunt.config('pkg.release'), 10),
|
||||
releasesPath = grunt.config('cfg.releasesPath'),
|
||||
devVersion = grunt.config('cfg.devVersion'),
|
||||
versionFull = version + '.' + release,
|
||||
dist = releasesPath + '/webmail/' + versionFull + '/src/'
|
||||
;
|
||||
|
||||
grunt.file.mkdir(dist);
|
||||
grunt.file.mkdir(dist + 'data');
|
||||
grunt.file.mkdir(dist + 'rainloop/v/' + versionFull);
|
||||
|
||||
require('wrench').copyDirSyncRecursive('rainloop/v/' + devVersion,
|
||||
dist + 'rainloop/v/' + versionFull, {'forceDelete': true});
|
||||
|
||||
grunt.file.write(dist + 'data/EMPTY', versionFull);
|
||||
|
||||
grunt.file.write(dist + 'index.php',
|
||||
grunt.file.read('index.php').replace('\'APP_VERSION\', \'0.0.0\'', '\'APP_VERSION\', \'' + versionFull + '\''));
|
||||
|
||||
grunt.file.copy(dist + 'index.php', dist + 'rainloop/v/' + versionFull + '/index.php.root');
|
||||
|
||||
grunt.file.delete(dist + 'rainloop/v/' + versionFull + '/static/css/less.css');
|
||||
|
||||
grunt.config.set('cfg.releaseFolder', 'webmail/' + versionFull);
|
||||
grunt.config.set('cfg.releaseSrcPath', dist);
|
||||
grunt.config.set('cfg.releaseZipFile', 'rainloop-' + versionFull + '.zip');
|
||||
});
|
||||
|
||||
grunt.registerTask('rainloop-owncloud', 'RainLoop ownCloud App build task', function () {
|
||||
|
||||
var
|
||||
content = '',
|
||||
version = grunt.config('pkg.ownCloudPackageVersion'),
|
||||
releasesPath = grunt.config('cfg.releasesPath'),
|
||||
versionFull = version,
|
||||
dist = releasesPath + '/owncloud/' + versionFull + '/src/'
|
||||
;
|
||||
|
||||
grunt.file.mkdir(dist);
|
||||
grunt.file.mkdir(dist + 'rainloop');
|
||||
|
||||
require('wrench').copyDirSyncRecursive('build/owncloud/rainloop-app',
|
||||
dist + 'rainloop', {'forceDelete': true});
|
||||
|
||||
content = grunt.file.read(dist + 'rainloop/appinfo/info.xml');
|
||||
|
||||
grunt.file.write(dist + 'rainloop/appinfo/info.xml',
|
||||
content.replace('<version>0.0.0</version>', '<version>' + versionFull + '</version>'));
|
||||
|
||||
grunt.file.write(dist + 'rainloop/appinfo/version', versionFull);
|
||||
|
||||
grunt.config.set('cfg.releaseFolder', 'owncloud/' + versionFull);
|
||||
grunt.config.set('cfg.releaseSrcPath', dist);
|
||||
grunt.config.set('cfg.releaseZipFile', 'rainloop-owncloud-app-' + versionFull + '.zip');
|
||||
});
|
||||
|
||||
grunt.registerTask('release-inc', 'release inc', function () {
|
||||
|
||||
grunt.file.write('package.json',
|
||||
grunt.file.read('package.json').replace(/"release":\s?"[\d]+",/, '"release": "' +
|
||||
(1 + parseInt(grunt.config('pkg.release'), 10)) + '",'));
|
||||
});
|
||||
|
||||
grunt.registerTask('rainloop-clean', 'RainLoop Webmail clean task', function () {
|
||||
var releaseSrcPath = grunt.config('cfg.releaseSrcPath');
|
||||
if ('' !== releaseSrcPath)
|
||||
{
|
||||
require('wrench').rmdirSyncRecursive(releaseSrcPath);
|
||||
}
|
||||
});
|
||||
|
||||
// uglify
|
||||
grunt.registerTask('rlmin', ['uglify:min_app', 'uglify:min_admin']);
|
||||
|
||||
// uglify (optional)
|
||||
grunt.registerTask('rl', ['uglify:rl']);
|
||||
grunt.registerTask('nano', ['uglify:nano']);
|
||||
grunt.registerTask('pace', ['uglify:pace']);
|
||||
grunt.registerTask('wakeup', ['uglify:wakeup']);
|
||||
grunt.registerTask('cookie', ['uglify:cookie']);
|
||||
grunt.registerTask('mousewheel', ['uglify:mousewheel']);
|
||||
grunt.registerTask('inputosaurus', ['uglify:inputosaurus']);
|
||||
grunt.registerTask('ifvisible', ['uglify:ifvisible']);
|
||||
// ---
|
||||
|
||||
grunt.registerTask('fast', ['less', 'concat']);
|
||||
grunt.registerTask('default', ['less', 'concat', 'cssmin', 'jshint', 'rlmin']);
|
||||
grunt.registerTask('build', ['default', 'rainloop', 'compress:build', 'md5:build', 'release-inc', 'rainloop-clean']);
|
||||
grunt.registerTask('owncloud', ['rainloop-owncloud', 'compress:build', 'md5:build', 'rainloop-clean']);
|
||||
|
||||
// aliases
|
||||
grunt.registerTask('u', ['uglify']);
|
||||
grunt.registerTask('h', ['jshint']);
|
||||
grunt.registerTask('b', ['build']);
|
||||
grunt.registerTask('f', ['fast']);
|
||||
grunt.registerTask('w', ['default', 'watch']);
|
||||
grunt.registerTask('o', ['owncloud']);
|
||||
grunt.registerTask('own', ['owncloud']);
|
||||
};
|
||||
|
|
@ -1 +1 @@
|
|||
1.3
|
||||
0.0
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
<?xml version="1.0"?>
|
||||
<info>
|
||||
<id>rainloop</id>
|
||||
<name>RainLoop</name>
|
||||
<description>RainLoop Webmail</description>
|
||||
<version>1.2</version>
|
||||
<licence>CC BY-NC-SA 3.0</licence>
|
||||
<author>RainLoop Team</author>
|
||||
<require>6.0</require>
|
||||
<?xml version="1.0"?>
|
||||
<info>
|
||||
<id>rainloop</id>
|
||||
<name>RainLoop</name>
|
||||
<description>RainLoop Webmail</description>
|
||||
<version>0.0</version>
|
||||
<licence>CC BY-NC-SA 3.0</licence>
|
||||
<author>RainLoop Team</author>
|
||||
<require>6.0</require>
|
||||
</info>
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
************************************************************************
|
||||
*
|
||||
* ownCloud - RainLoop mail plugin
|
||||
*
|
||||
* @author RainLoop Team
|
||||
* @copyright 2014 RainLoop Team
|
||||
*
|
||||
* https://github.com/RainLoop/rainloop-webmail/
|
||||
*
|
||||
************************************************************************
|
||||
|
||||
INSTALL:
|
||||
- Unpack the RainLoop Webmail application package in the apps directory of your OwnCloud instance
|
||||
|
||||
CONFIGURATION:
|
||||
|
||||
1) In the Apps > Enable 'RainLoop' plugin
|
||||
2) In the Settings > Personal > Type your mail server email(login) and password (for autologin)
|
||||
3) Enjoy!
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - RainLoop mail plugin
|
||||
*
|
||||
* @author RainLoop Team
|
||||
* @copyright 2014 RainLoop Team
|
||||
*
|
||||
* https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud
|
||||
*/
|
||||
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::checkAppEnabled('rainloop');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
$sEmail = '';
|
||||
$sLogin = '';
|
||||
if (isset($_POST['appname'], $_POST['rainloop-password'], $_POST['rainloop-email']) && 'rainloop' === $_POST['appname'])
|
||||
{
|
||||
$sUser = OCP\User::getUser();
|
||||
|
||||
$sPostEmail = $_POST['rainloop-email'];
|
||||
$sPostLogin = isset($_POST['rainloop-login']) ? $_POST['rainloop-login'] : '';
|
||||
|
||||
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-email', $sPostEmail);
|
||||
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-login', $sPostLogin);
|
||||
|
||||
$sPass = $_POST['rainloop-password'];
|
||||
if ('******' !== $sPass && '' !== $sPass)
|
||||
{
|
||||
include_once OC_App::getAppPath('rainloop').'/lib/RainLoopHelper.php';
|
||||
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-password',
|
||||
OC_RainLoop_Helper::encodePassword($sPass, md5($sPostEmail.$sPostLogin)));
|
||||
}
|
||||
|
||||
$sEmail = OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-email', '');
|
||||
$sLogin = OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-login', '');
|
||||
}
|
||||
else
|
||||
{
|
||||
OC_JSON::error(array('Message' => 'Invalid argument(s)', 'Email' => $sEmail, 'Login' => $sLogin));
|
||||
return false;
|
||||
}
|
||||
|
||||
OCP\JSON::success(array('Message' => 'Saved successfully', 'Email' => $sEmail, 'Login' => $sLogin));
|
||||
return true;
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - RainLoop mail plugin
|
||||
*
|
||||
* @author RainLoop Team
|
||||
* @copyright 2014 RainLoop Team
|
||||
*
|
||||
* https://github.com/RainLoop/owncloud
|
||||
*/
|
||||
|
||||
OCP\App::registerPersonal('rainloop', 'personal');
|
||||
|
||||
OCP\Util::addScript('rainloop', 'rainloop');
|
||||
|
||||
OCP\App::addNavigationEntry(array(
|
||||
'id' => 'rainloop_index',
|
||||
'order' => 20,
|
||||
'href' => OCP\Util::linkTo('rainloop', 'index.php'),
|
||||
'icon' => OCP\Util::imagePath('rainloop', 'mail.png'),
|
||||
'name' => 'RainLoop'
|
||||
));
|
||||
|
||||
if(OC_User::isAdminUser(OCP\User::getUser()))
|
||||
{
|
||||
OCP\App::addNavigationEntry(array(
|
||||
'id' => 'rainloop_index_admin',
|
||||
'order' => 21,
|
||||
'href' => OCP\Util::linkTo('rainloop', 'index-admin.php'),
|
||||
'icon' => OCP\Util::imagePath('rainloop', 'mail.png'),
|
||||
'name' => 'RainLoop (Admin)'
|
||||
));
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<info>
|
||||
<id>rainloop</id>
|
||||
<name>RainLoop</name>
|
||||
<description>RainLoop Webmail</description>
|
||||
<version>0.0.0</version>
|
||||
<licence>CC BY-NC-SA 3.0</licence>
|
||||
<author>RainLoop Team</author>
|
||||
<require>6.0</require>
|
||||
</info>
|
||||
|
|
@ -1 +0,0 @@
|
|||
0.0.0
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 832 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.5 KiB |
|
|
@ -1,22 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - RainLoop mail plugin
|
||||
*
|
||||
* @author RainLoop Team
|
||||
* @copyright 2014 RainLoop Team
|
||||
*
|
||||
* https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud
|
||||
*/
|
||||
|
||||
OCP\User::checkAdminUser();
|
||||
OCP\App::checkAppEnabled('rainloop');
|
||||
OCP\App::setActiveNavigationEntry('rainloop_index_admin');
|
||||
|
||||
$sUrl = OCP\Util::linkTo('apps/rainloop/app', 'index.php');
|
||||
$sResultUrl = $sUrl.'?admin';
|
||||
|
||||
$oTemplate = new OCP\Template('rainloop', 'iframe', 'user');
|
||||
$oTemplate->assign('rainloop-url', $sResultUrl);
|
||||
|
||||
$oTemplate->printpage();
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - RainLoop mail plugin
|
||||
*
|
||||
* @author RainLoop Team
|
||||
* @copyright 2014 RainLoop Team
|
||||
*
|
||||
* https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud
|
||||
*/
|
||||
|
||||
OCP\User::checkLoggedIn();
|
||||
OCP\App::checkAppEnabled('rainloop');
|
||||
OCP\App::setActiveNavigationEntry('rainloop_index');
|
||||
|
||||
$sUser = OCP\User::getUser();
|
||||
|
||||
$sEmail = OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-email', '');
|
||||
$sLogin = OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-login', '');
|
||||
$sPassword = OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-password', '');
|
||||
|
||||
$_ENV['RAINLOOP_INCLUDE_AS_API'] = true;
|
||||
include OC_App::getAppPath('rainloop').'/app/index.php';
|
||||
|
||||
include_once OC_App::getAppPath('rainloop').'/lib/RainLoopHelper.php';
|
||||
|
||||
$sPassword = OC_RainLoop_Helper::decodePassword($sPassword, md5($sEmail.$sLogin));
|
||||
$sSsoHash = \RainLoop\Api::GetUserSsoHash($sEmail, $sPassword, $sLogin);
|
||||
|
||||
$sUrl = OCP\Util::linkTo('apps/rainloop/app', 'index.php');
|
||||
$sResultUrl = empty($sSsoHash) ? $sUrl.'?sso' : $sUrl.'?sso&hash='.$sSsoHash;
|
||||
|
||||
$oTemplate = new OCP\Template('rainloop', 'iframe', 'user');
|
||||
$oTemplate->assign('rainloop-url', $sResultUrl);
|
||||
|
||||
$oTemplate->printpage();
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
|
||||
/**
|
||||
* ownCloud - RainLoop mail plugin
|
||||
*
|
||||
* @author RainLoop Team
|
||||
* @copyright 2014 RainLoop Team
|
||||
*
|
||||
* https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud
|
||||
*/
|
||||
|
||||
$(function() {
|
||||
RainLoopFormHelper('#mail-rainloop-personal-form', 'personal.php');
|
||||
});
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
|
||||
function RainLoopFormHelper(sID, sAjaxFile, fCallback)
|
||||
{
|
||||
try
|
||||
{
|
||||
var
|
||||
oForm = $(sID),
|
||||
oSubmit = $('#rainloop-save-button', oForm),
|
||||
sSubmitValue = oSubmit.val(),
|
||||
oDesc = oForm.find('.rainloop-result-desc')
|
||||
;
|
||||
|
||||
oSubmit.click(function (oEvent) {
|
||||
|
||||
var oDefAjax = null;
|
||||
|
||||
oEvent.preventDefault();
|
||||
|
||||
oForm
|
||||
.addClass('rainloop-ajax')
|
||||
.removeClass('rainloop-error')
|
||||
.removeClass('rainloop-success')
|
||||
;
|
||||
|
||||
oDesc.text('');
|
||||
oSubmit.val('...');
|
||||
|
||||
oDefAjax = $.ajax({
|
||||
'type': 'POST',
|
||||
'async': true,
|
||||
'url': OC.filePath('rainloop', 'ajax', sAjaxFile),
|
||||
'data': oForm.serialize(),
|
||||
'dataType': 'json',
|
||||
'global': true
|
||||
});
|
||||
|
||||
oDefAjax.always(function (oData) {
|
||||
|
||||
var bResult = false;
|
||||
|
||||
oForm.removeClass('rainloop-ajax');
|
||||
oSubmit.val(sSubmitValue);
|
||||
|
||||
if (oData)
|
||||
{
|
||||
bResult = 'success' === oData['status'];
|
||||
if (oData['Message'])
|
||||
{
|
||||
oDesc.text(oData['Message']);
|
||||
}
|
||||
}
|
||||
|
||||
if (bResult)
|
||||
{
|
||||
oForm.addClass('rainloop-success');
|
||||
}
|
||||
else
|
||||
{
|
||||
oForm.addClass('rainloop-error');
|
||||
if ('' === oDesc.text())
|
||||
{
|
||||
oDesc.text('Error');
|
||||
}
|
||||
}
|
||||
|
||||
if (fCallback)
|
||||
{
|
||||
fCallback(bResult, oData);
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
catch(e) {}
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
<?php
|
||||
|
||||
class OC_RainLoop_Helper
|
||||
{
|
||||
public static function encodePassword($sPassword, $sSalt)
|
||||
{
|
||||
if (function_exists('mcrypt_encrypt') && function_exists('mcrypt_create_iv') && function_exists('mcrypt_get_iv_size') &&
|
||||
defined('MCRYPT_RIJNDAEL_256') && defined('MCRYPT_MODE_ECB') && defined('MCRYPT_RAND'))
|
||||
{
|
||||
return @trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($sSalt), $sPassword,
|
||||
MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
|
||||
}
|
||||
|
||||
return @trim(base64_encode($sPassword));
|
||||
}
|
||||
|
||||
public static function decodePassword($sPassword, $sSalt)
|
||||
{
|
||||
if (function_exists('mcrypt_encrypt') && function_exists('mcrypt_create_iv') && function_exists('mcrypt_get_iv_size') &&
|
||||
defined('MCRYPT_RIJNDAEL_256') && defined('MCRYPT_MODE_ECB') && defined('MCRYPT_RAND'))
|
||||
{
|
||||
return @mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($sSalt), base64_decode(trim($sPassword)),
|
||||
MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND));
|
||||
}
|
||||
|
||||
return @base64_decode(trim($sPassword));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - RainLoop mail plugin
|
||||
*
|
||||
* @author RainLoop Team
|
||||
* @copyright 2014 RainLoop Team
|
||||
*
|
||||
* https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud
|
||||
*/
|
||||
|
||||
OCP\User::checkLoggedIn();
|
||||
OCP\App::checkAppEnabled('rainloop');
|
||||
|
||||
OCP\Util::addScript('rainloop', 'personal');
|
||||
|
||||
$sUser = OCP\User::getUser();
|
||||
|
||||
$oTemplate = new OCP\Template('rainloop', 'personal');
|
||||
|
||||
$sEmail = OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-email', '');
|
||||
|
||||
$oTemplate->assign('rainloop-email', $sEmail);
|
||||
$oTemplate->assign('rainloop-login', OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-login', ''));
|
||||
|
||||
$sPass = OCP\Config::getUserValue($sUser, 'rainloop', 'rainloop-password', '');
|
||||
$oTemplate->assign('rainloop-password', 0 === strlen($sPass) && 0 === strlen($sEmail) ? '' : '******');
|
||||
|
||||
return $oTemplate->fetchPage();
|
||||
|
|
@ -1 +0,0 @@
|
|||
<!-- empty -->
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
<div style="box-sizing: border-box; width: 100%; height: 100%; padding: 0px; margin: 0px; background-color: #383c43; position: relative; overflow: hidden;"
|
||||
><iframe style="border: none; width: 100%; height: 100%; position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px;" tabindex="-1" frameborder="0"
|
||||
src="<?php echo $_['rainloop-url']; ?>"></iframe></div>
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
<form id="mail-rainloop-personal-form" action="#" method="post">
|
||||
<input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>" id="requesttoken">
|
||||
<input type="hidden" name="appname" value="rainloop">
|
||||
|
||||
<fieldset class="personalblock">
|
||||
<h2><?php p($l->t('RainLoop Webmail (autologin)')); ?></h2>
|
||||
<p>
|
||||
<input type="text" id="rainloop-email" name="rainloop-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"
|
||||
value="<?php echo $_['rainloop-password']; ?>" placeholder="<?php p($l->t('Password')); ?>" />
|
||||
|
||||
<input type="button" id="rainloop-save-button" name="rainloop-save-button" value="<?php p($l->t('Save')); ?>" />
|
||||
<span class="rainloop-result-desc"></span>
|
||||
</p>
|
||||
</fieldset>
|
||||
</form>
|
||||
Loading…
Add table
Add a link
Reference in a new issue