Initial commit: CloudOps infrastructure platform

This commit is contained in:
root
2026-04-09 19:58:57 +02:00
commit 1166a52f26
7762 changed files with 839452 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,16 @@
#!/usr/bin/env php
<?php
use Mautic\CoreBundle\Console\Output\ConsoleDatetimeOutput;
use Symfony\Component\Console\Input\ArgvInput;
require_once __DIR__.'/../vendor/autoload.php';
$input = new ArgvInput();
$output = (false !== $input->getParameterOption(['--no-interaction', '-n'])) ? new ConsoleDatetimeOutput() : null;
$reflection = new \ReflectionClass(AppKernel::class);
$project_dir = dirname($reflection->getFileName(), 2);
$application = include $project_dir.'/app/console-application.php';
$application->run($input, $output);

View File

@@ -0,0 +1,146 @@
.*
!.github
!.gitignore
!.htaccess
!.gitkeep
!.ddev
!.php-cs-fixer.php
!.github/ci-files/.my.cnf
.ddev/mautic-preference
/.ddev/docker-compose.host-docker-internal.yaml
!/.ddev/.env.*.dist
/.ddev/docker-compose.phpmyadmin_norouter.yaml
!.gitpod.Dockerfile
!.gitpod.yml
!.ddev/commands/web/dd
.php_cs.cache
/.env.local
/.env.local.php
/.env.*.local
/composer.phar
/coverage.xml
/app/bootstrap*
/app/console
/app/tests.bootstrap*
/app/phpunit.xml
/var/bootstrap*
/app/bundles/CoreBundle/Assets/css/app/less/**/*.css
/app/bundles/CoreBundle/Assets/pictograms/
/app/bundles/CoreBundle/Assets/css/libraries/**/*.css
!/app/bundles/CoreBundle/Assets/css/libraries/builder.css
!/app/bundles/CoreBundle/Assets/css/*.css
/app/cache/*
!/app/cache/.gitkeep
/var/cache/*
!/var/cache/.gitkeep
/var/phpstan-cache/*
/app/logs/*
!/app/logs/.gitkeep
/var/logs/*
!/var/logs/.gitkeep
/app/spool/*
!/app/spool/.gitkeep
/var/spool/*
!/var/spool/.gitkeep
/var/tmp/*
!/var/tmp/.gitkeep
/app/config/local*.php
/app/config/config_local.php
/app/config/paths_local.php
/app/config/parameters_defaults.php
/config/*
!/config/.gitkeep
/vendor/*
!/vendor/.htaccess
/bin/*
!/bin/.htaccess
!/bin/console
/assets/ckeditor/build/*
/bundles
/node_modules
/build/coverage
/build/packaging
/build/packages/*
!/build/packages/.placeholder
/mockup
/upgrade
/upgrade_errors.txt
/media/libraries/ckeditor/*
/media/bundles/*
/media/dashboards/*
!/media/dashboards/*.json
/media/files/*
!/media/files/.htaccess
/media/assets/*
/media/images/*
!/media/images/flags
!/media/images/mejs
!/media/images/apple-touch-icon.png
!/media/images/avatar.png
!/media/images/placeholder*
!/media/images/favicon.ico
!/media/images/mautic_logo*
!/media/images/.htaccess
/media/css/app.css
/media/css/libraries.css
/media/css/mediaelementplayer.min.css
/media/css/modal.min.css
/media/js/app.js
/media/js/libraries.js
/media/js/mautic-form.js
/media/js/froogaloop.min.js
/media/js/jquery.min.js
/plugins/*
!/plugins/GrapesJsBuilderBundle
!/plugins/MauticClearbitBundle
!/plugins/MauticCloudStorageBundle
!/plugins/MauticCrmBundle
!/plugins/MauticDynamicsBundle
!/plugins/MauticEmailMarketingBundle
!/plugins/MauticFocusBundle
!/plugins/MauticFullContactBundle
!/plugins/MauticGmailBundle
!/plugins/MauticOutlookBundle
!/plugins/MauticSocialBundle
!/plugins/MauticZapierBundle
!/plugins/MauticTagManagerBundle
!/plugins/index.html
!/plugins/.gitkeep
tests/**/*.sql
/themes/*
!/themes/aurora
!/themes/blank
!/themes/cards
!/themes/confirmme
!/themes/fresh-center
!/themes/fresh-fixed
!/themes/fresh-left
!/themes/fresh-wide
!/themes/goldstar
!/themes/neopolitan
!/themes/oxygen
!/themes/skyline
!/themes/sparse
!/themes/sunday
!/themes/vibrant
!/themes/blank.png
!/themes/blank-big.png
/translations

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,149 @@
# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
#DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
# Set Authorization header for OAuth2 for when php is running under fcgi
RewriteCond %{HTTP:Authorization} .+
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Determine the RewriteBase automatically and set it as environment variable.
# If you are using Apache aliases to do mass virtual hosting or installed the
# project in a subdirectory, the base path will be prepended to allow proper
# resolution of the app.php file and to redirect to the correct URI. It will
# work in environments without path prefix as well, providing a safe, one-size
# fits all solution. But as you do not need it in this case, you can comment
# the following 2 lines to eliminate the overhead.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
# Redirect to URI without front controller to prevent duplicate content
# (with and without `/app.php`). Only do this redirect on the initial
# rewrite by Apache and not on subsequent cycles. Otherwise we would get an
# endless redirect loop (request -> rewrite to front controller ->
# redirect -> request -> ...).
# So in case you get a "too many redirects" error or you always get redirected
# to the start page because your Apache does not expose the REDIRECT_STATUS
# environment variable, you have 2 choices:
# - disable this feature by commenting the following 2 lines or
# - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
# following RewriteCond (best solution)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]
# Rewrite all other queries to the front controller.
RewriteRule .? %{ENV:BASE}/index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
# When mod_rewrite is not available, we instruct a temporary redirect of
# the start page to the front controller explicitly so that the website
# and the generated links can still be used.
RedirectMatch 302 ^(?!/(index\.php|app|addons|plugins|media|upgrade))(/(.*))$ /index.php$2
# RedirectTemp cannot be used instead
</IfModule>
</IfModule>
<IfModule mod_php5.c>
# @link https://github.com/mautic/mautic/issues/1504
php_value always_populate_raw_post_data -1
</IfModule>
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
# Do not enable compression for file types that could contain secrets
#AddOutputFilterByType DEFLATE text/html
#AddOutputFilterByType DEFLATE text/plain
#AddOutputFilterByType DEFLATE text/xml
#AddOutputFilterByType DEFLATE application/xhtml+xml
#AddOutputFilterByType DEFLATE application/xml
#AddOutputFilterByType DEFLATE application/json
<IfModule mod_setenvif.c>
<IfModule mod_header.c>
# Remove browser bugs (only needed for really old browsers)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
</IfModule>
</IfModule>
</IfModule>
</IfModule>
# Apache 2.4+
<IfModule authz_core_module>
# Deny access via HTTP requests to all .env files.
<FilesMatch "^\.env.*$">
Require all denied
</FilesMatch>
# Deny access via HTTP requests to all PHP files.
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# Deny access via HTTP requests to composer files.
<FilesMatch "^(composer\.json|composer\.lock)$">
Require all denied
</FilesMatch>
# Except those allowed below.
<If "%{REQUEST_URI} =~ m#^/(index|upgrade/upgrade)\.php#">
Require all granted
</If>
</IfModule>
# Fallback for Apache < 2.4
<IfModule !authz_core_module>
# Deny access via HTTP requests to all .env files.
<FilesMatch "^\.env.*$">
Order deny,allow
Deny from all
</FilesMatch>
# Deny access via HTTP requests to all PHP files.
<FilesMatch "\.php$">
Order deny,allow
Deny from all
</FilesMatch>
# Deny access via HTTP requests to composer files
<FilesMatch "^(composer\.json|composer\.lock)$">
Order deny,allow
Deny from all
</FilesMatch>
# Except those allowed below.
<If "%{REQUEST_URI} =~ m#^/(index|upgrade/upgrade)\.php#">
Order allow,deny
Allow from all
</If>
</IfModule>

View File

@@ -0,0 +1,16 @@
<IfModule mod_php4.c>
php_flag engine Off
</IfModule>
<IfModule mod_php5.c>
php_flag engine Off
</IfModule>
<IfModule mod_php6.c>
php_flag engine Off
</IfModule>
<IfModule mod_cgi.c>
Options -ExecCGI
</IfModule>
RemoveHandler .cgi .pl .py .pyc .pyo .phtml .php .php3 .php4 .php5 .php6 .pcgi .pcgi3 .pcgi4 .pcgi5 .pchi6 .inc
RemoveType .cgi .pl .py .pyc .pyo .phtml .php .php3 .php4 .php5 .php6 .pcgi .pcgi3 .pcgi4 .pcgi5 .pchi6 .inc
SetHandler None
SetHandler default-handler

View File

@@ -0,0 +1,21 @@
<?php
define('MAUTIC_ROOT_DIR', __DIR__);
define('ELFINDER_IMG_PARENT_URL', 'media/bundles/fmelfinder');
// Fix for hosts that do not have date.timezone set, it will be reset based on users settings
date_default_timezone_set('UTC');
require 'app/config/bootstrap.php';
use Mautic\CoreBundle\ErrorHandler\ErrorHandler;
use Mautic\Middleware\MiddlewareBuilder;
use Symfony\Component\HttpFoundation\Request;
ErrorHandler::register($_SERVER['APP_ENV']);
$kernel = (new MiddlewareBuilder(new AppKernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG'])))->resolve();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,72 @@
{
"name": "mautic",
"version": "0.0.0",
"description": "Mautic Open Source Distribution",
"devDependencies": {
"grunt": "^1.6.1",
"grunt-contrib-less": "^3.0.0",
"grunt-contrib-watch": "^1.1.0",
"patch-package": "^8.0.1",
"webpack-cli": "^5.1.4"
},
"dependencies": {
"@carbon/pictograms": "^12.50.0",
"@ckeditor/ckeditor5-adapter-ckfinder": "^43.1.1",
"@ckeditor/ckeditor5-alignment": "^43.1.1",
"@ckeditor/ckeditor5-autoformat": "^43.1.1",
"@ckeditor/ckeditor5-autosave": "^43.1.1",
"@ckeditor/ckeditor5-basic-styles": "^43.1.1",
"@ckeditor/ckeditor5-block-quote": "^43.1.1",
"@ckeditor/ckeditor5-build-classic": "^43.1.1",
"@ckeditor/ckeditor5-ckfinder": "^43.1.1",
"@ckeditor/ckeditor5-core": "^43.1.1",
"@ckeditor/ckeditor5-dev-translations": "^43.0.0",
"@ckeditor/ckeditor5-dev-utils": "^43.0.0",
"@ckeditor/ckeditor5-editor-classic": "^43.1.1",
"@ckeditor/ckeditor5-essentials": "^43.1.1",
"@ckeditor/ckeditor5-font": "^43.1.1",
"@ckeditor/ckeditor5-heading": "^43.1.1",
"@ckeditor/ckeditor5-html-support": "^43.1.1",
"@ckeditor/ckeditor5-image": "^43.1.1",
"@ckeditor/ckeditor5-indent": "^43.1.1",
"@ckeditor/ckeditor5-link": "^43.1.1",
"@ckeditor/ckeditor5-list": "^43.1.1",
"@ckeditor/ckeditor5-media-embed": "^43.1.1",
"@ckeditor/ckeditor5-mention": "^43.1.1",
"@ckeditor/ckeditor5-paragraph": "^43.1.1",
"@ckeditor/ckeditor5-remove-format": "^43.1.1",
"@ckeditor/ckeditor5-source-editing": "^43.1.1",
"@ckeditor/ckeditor5-table": "^43.1.1",
"@ckeditor/ckeditor5-theme-lark": "^43.1.1",
"@ckeditor/ckeditor5-ui": "^43.1.1",
"@ckeditor/ckeditor5-utils": "^43.1.1",
"@ckeditor/ckeditor5-word-count": "^43.1.1",
"@claviska/jquery-minicolors": "^2.3.6",
"at.js": "^1.5.4",
"bootstrap": "^3.4.1",
"chart.js": "^2.9.4",
"chosen-js": "^1.8.7",
"dropzone": "^4.3.0",
"jquery": "^3.7.0",
"jquery-datetimepicker": "^2.5.21",
"jquery-form": "^4.3.0",
"jquery-ui": "~1.13.2",
"jquery-ui-touch-punch": "^0.2.3",
"jquery.caret": "^0.3.1",
"jquery.cookie": "^1.4.1",
"jquery.quicksearch": "^2.4.0",
"js-cookie": "^2.2.1",
"jsplumb": "^2.15.6",
"jvectormap-next": "^3.1.1",
"moment": "^2.29.4",
"mousetrap": "^1.6.5",
"multiselect": "^0.9.12",
"shufflejs": "^5.4.1",
"typeahead.js": "^0.11.1",
"vimeo-froogaloop2": "^0.1.1"
},
"scripts": {
"build": "webpack --mode production --config webpack.config.js",
"postinstall": "npm run build"
}
}

View File

@@ -0,0 +1,38 @@
diff --git a/node_modules/at.js/dist/js/jquery.atwho.js b/node_modules/at.js/dist/js/jquery.atwho.js
index 09ca40c..dfed389 100644
--- a/node_modules/at.js/dist/js/jquery.atwho.js
+++ b/node_modules/at.js/dist/js/jquery.atwho.js
@@ -835,13 +835,13 @@ EditableController = (function(superClass) {
}
suffix = (suffix = this.getOpt('suffix')) === "" ? suffix : suffix || "\u00A0";
data = $li.data('item-data');
- this.query.el.removeClass('atwho-query').addClass('atwho-inserted').html(content).attr('data-atwho-at-query', "" + data['atwho-at'] + this.query.text).attr('contenteditable', "false");
+ this.query.el.removeClass('atwho-query').addClass('atwho-inserted').html(content).attr('data-atwho-at-query', "" + data['atwho-at'] + this.query.text);
if (range = this._getRange()) {
if (this.query.el.length) {
range.setEndAfter(this.query.el[0]);
}
range.collapse(false);
- range.insertNode(suffixNode = this.app.document.createTextNode("" + suffix));
+ range.insertNode(suffixNode = this.app.document.createTextNode("\u200D" + suffix));
this._setRange('after', suffixNode, range);
}
if (!this.$inputor.is(':focus')) {
diff --git a/node_modules/at.js/src/editableController.coffee b/node_modules/at.js/src/editableController.coffee
index d6fcaeb..5f76987 100644
--- a/node_modules/at.js/src/editableController.coffee
+++ b/node_modules/at.js/src/editableController.coffee
@@ -163,12 +163,11 @@ class EditableController extends Controller
.addClass 'atwho-inserted'
.html content
.attr 'data-atwho-at-query', "" + data['atwho-at'] + @query.text
- .attr 'contenteditable', "false"
if range = @_getRange()
if @query.el.length
range.setEndAfter @query.el[0]
range.collapse false
- range.insertNode suffixNode = @app.document.createTextNode "" + suffix
+ range.insertNode suffixNode = @app.document.createTextNode "\u200D" + suffix
@_setRange 'after', suffixNode, range
@$inputor.focus() unless @$inputor.is ':focus'
@$inputor.change()

View File

@@ -0,0 +1,76 @@
diff --git a/node_modules/chosen-js/chosen.jquery.js b/node_modules/chosen-js/chosen.jquery.js
index dbc3a25..3a1e473 100644
--- a/node_modules/chosen-js/chosen.jquery.js
+++ b/node_modules/chosen-js/chosen.jquery.js
@@ -382,15 +382,38 @@
}
}
this.result_clear_highlight();
- if (results < 1 && query.length) {
+
+ // Mautic hack to allow adding new options - start
+
+ var resultsCount = this.results_data.length,
+ selectedCount = 0;
+
+ for (_i = 0, _len = this.results_data.length; _i < _len; _i++) {
+ if (!this.results_data[_i].group && this.results_data[_i].selected) {
+ selectedCount++;
+ }
+ }
+
+ if ((results < 1 || (resultsCount > 0 && resultsCount === selectedCount && $(this.form_field).data('allow-add'))) && query.length) {
this.update_results_content("");
return this.no_results(query);
} else {
this.update_results_content(this.results_option_build());
- if (!(options != null ? options.skip_highlight : void 0)) {
- return this.winnow_results_set_highlight();
- }
+ return this.winnow_results_set_highlight();
}
+
+ // Mautic hack to allow adding new options - end
+
+ // Original:
+ // if (results < 1 && query.length) {
+ // this.update_results_content("");
+ // return this.no_results(query);
+ // } else {
+ // this.update_results_content(this.results_option_build());
+ // if (!(options != null ? options.skip_highlight : void 0)) {
+ // return this.winnow_results_set_highlight();
+ // }
+ // }
};
AbstractChosen.prototype.get_search_regex = function(escaped_search_string) {
@@ -456,6 +479,23 @@
case 13:
if (this.results_showing) {
evt.preventDefault();
+
+ // Mautic hack to allow adding new entries if applicable - start
+ if (!$(this.form_field).data('allow-add') || !this.is_multiple || this.result_highlight) {
+ return this.result_select(evt);
+ }
+
+ var newTag = $(evt.target).val();
+
+ if ($(this.form_field).find('option').filter(function(){ return $(this).text() === newTag}).length === 0) {
+ $(this.form_field).append($('<option></option>').text(newTag));
+ $(this.form_field).trigger('chosen:updated');
+ this.result_highlight = this.search_results.find('li.active-result').last();
+
+ return this.result_select(evt);
+ }
+ // Mautic hack to allow adding new entries if applicable - end
+
}
break;
case 27:
@@ -1345,3 +1385,4 @@
})(AbstractChosen);
}).call(this);
+

View File

@@ -0,0 +1,10 @@
User-agent: *
Disallow: /addons/
Disallow: /plugins/
Disallow: /app/
Disallow: /media/dashboards/
Disallow: /media/files/
Disallow: /media/js/mautic-form-src.js
Disallow: /themes/
Disallow: /translations/
Disallow: /vendor/

View File

@@ -0,0 +1,24 @@
/*
* The base configuration used by all other configuration.
*
* Be careful when updating this file. It may affect building docs, preparing DLLs, executing tests, or impacts the release process.
*/
{
"compilerOptions": {
"lib": [
"DOM",
"DOM.Iterable"
],
"noImplicitAny": true,
"noImplicitOverride": true,
"strict": true,
"module": "es6",
"target": "es2019",
"sourceMap": true,
"allowJs": true,
"moduleResolution": "node",
"skipLibCheck": true
},
"include": [
]
}

View File

@@ -0,0 +1,69 @@
/**
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
'use strict';
/* eslint-env node */
const path = require( 'path' );
const glob = require("glob")
const fs = require( 'fs' );
const { loaders } = require( '@ckeditor/ckeditor5-dev-utils' );
const { CKEditorTranslationsPlugin } = require( '@ckeditor/ckeditor5-dev-translations' );
// Find the webroot path if it is not the same folder as the current dir.
// This is the case for Composer based installations following the best practices.
let webroot = '';
if (!fs.existsSync('app/release_metadata.json')) {
let files = glob.sync("**/app/release_metadata.json");
webroot = path.dirname(path.dirname(files[0])) + '/';
}
module.exports = {
devtool: 'source-map',
performance: { hints: false },
cache: {
type: 'filesystem',
cacheDirectory: path.resolve(__dirname, 'var/cache/js/webpack'),
},
entry: path.resolve( __dirname, webroot + 'app/assets/libraries/ckeditor/src', 'ckeditor.ts' ),
output: {
// The name under which the editor will be exported.
library: 'ClassicEditor',
path: path.resolve( __dirname, webroot + 'media/libraries/ckeditor' ),
filename: 'ckeditor.js',
libraryTarget: 'umd',
libraryExport: 'default'
},
plugins: [
new CKEditorTranslationsPlugin( {
language: 'en',
additionalLanguages: 'all'
} )
],
module: {
rules: [
loaders.getIconsLoader( { matchExtensionOnly: true } ),
loaders.getStylesLoader( {
themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ),
minify: true
} ),
loaders.getTypeScriptLoader()
]
},
resolve: {
extensions: [ '.ts', '.js', '.json' ]
},
optimization: {
removeAvailableModules: false,
removeEmptyChunks: false,
splitChunks: false,
}
};