Commit 4d28555e authored by Thomas Löffler's avatar Thomas Löffler
Browse files

Merge branch 'develop' into implement_composer

parents 59c38d95 cd2eb9cd
Pipeline #9204 passed with stages
in 5 minutes and 42 seconds
......@@ -4,12 +4,14 @@
/commands/*/*.example
/commands/*/README.txt
/commands/host/launch
/commands/web/xdebug
/commands/db/mysql
/homeadditions/*.example
/homeadditions/README.txt
/.gitignore
/import.yaml
/docker-compose.yaml
/.ddev-docker-compose-base.yaml
/.ddev-docker-compose-full.yaml
/db_snapshots
/sequelpro.spf
/import-db
......
APIVersion: v1.13.2
name: typo3.org
type: typo3
docroot: public
......@@ -10,7 +9,6 @@ xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
mariadb_version: "10.3"
nfs_mount_enabled: false
provider: default
hooks:
post-import-db:
......@@ -25,9 +23,9 @@ use_dns_when_possible: true
timezone: Europe/Berlin
# This config.yaml was created with ddev version v1.13.2
# webimage: drud/ddev-webserver:v1.13.1
# dbimage: drud/ddev-dbserver-mariadb-10.2:v1.13.0
# This config.yaml was created with ddev version v1.14.1
# webimage: drud/ddev-webserver:v1.14.1
# dbimage: drud/ddev-dbserver-mariadb-10.2:v1.14.1
# dbaimage: phpmyadmin/phpmyadmin:5
# However we do not recommend explicitly wiring these images into the
# config.yaml as they may break future versions of ddev.
......@@ -96,11 +94,11 @@ timezone: Europe/Berlin
# These values specify the destination directory for ddev ssh and the
# directory in which commands passed into ddev exec are run.
# omit_containers: ["dba", "ddev-ssh-agent"]
# would omit the dba (phpMyAdmin) and ddev-ssh-agent containers. Currently
# only those two containers can be omitted here.
# Note that these containers can also be omitted globally in the
# ~/.ddev/global_config.yaml or with the "ddev config global" command.
# omit_containers: ["db", dba", "ddev-ssh-agent"]
# Currently only these containers are supported. Some containers can also be
# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit
# the "db" container, several standard features of ddev that access the
# database container will be unusable.
# nfs_mount_enabled: false
# Great performance improvement but requires host configuration first.
......@@ -122,11 +120,13 @@ timezone: Europe/Berlin
# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic
# unless explicitly specified.
# phpmyadmin_port: "1000"
# The PHPMyAdmin port can be changed from the default 8036
# phpmyadmin_port: "8036"
# phpmyadmin_https_port: "8037"
# The PHPMyAdmin ports can be changed from the default 8036 and 8037
# mailhog_port: "1001"
# The MailHog port can be changed from the default 8025
# mailhog_port: "8025"
# mailhog_https_port: "8026"
# The MailHog ports can be changed from the default 8025 and 8026
# webimage_extra_packages: [php-yaml, php7.3-ldap]
# Extra Debian packages that are needed in the webimage can be added here
......@@ -155,6 +155,12 @@ timezone: Europe/Berlin
# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalSettings.php
# In this case the user must provide all such settings.
# no_project_mount: false
# (Experimental) If true, ddev will not mount the project into the web container;
# the user is responsible for mounting it manually or via a script.
# This is to enable experimentation with alternate file mounting strategies.
# For advanced users only!
# provider: default # Currently either "default" or "pantheon"
#
# Many ddev commands can be extended to run tasks before or after the
......
include:
- project: 't3o/t3olayout'
ref: develop-v10
ref: master
file: '/Configuration/GitLab/t3o-builds.yml'
variables:
GIT_STRATEGY: "none"
GIT_SSL_NO_VERIFY: "true"
STAGE_PORT: 22200
STAGE_HOST: "typo3.dev"
PRODUCTION_PORT: 22201
PRODUCTION_HOST: "typo3.org"
DUMP_USER: "t3o-stage"
STAGE_USER: "t3o-stage"
DUMP_EXCLUDE_TABLES_LIST: "be_groups,be_sessions,be_users,cf_cache_hash,cf_cache_hash_tags,cf_cache_imagesizes,cf_cache_imagesizes_tags,cf_cache_news_category,cf_cache_news_category_tags,cf_cache_pages,cf_cache_pages_tags,cf_cache_pagesection,cf_cache_pagesection_tags,cf_cache_rootline,cf_cache_rootline_tags,cf_extbase_datamapfactory_datamap,cf_extbase_datamapfactory_datamap_tags,cf_extbase_object,cf_extbase_object_tags,cf_extbase_reflection,cf_extbase_reflection_tags,cf_tx_solr,cf_tx_solr_configuration,cf_tx_solr_configuration_tags,cf_tx_solr_tags,fe_groups,fe_sessions,fe_users,sys_domain,sys_log,tx_solr_cache,tx_solr_cache_tags"
PHP_EXECUTABLE: "/opt/php/php72/bin/php"
ADDITIONAL_TABLE_EXCLUDES: "-e 'tx_certifications_*' -e 'tx_t3odonation_domain_model_donation' -e 'tx_t3omembership_domain_model_member' -e 'tx_randombanners_domain_model_banner'"
stages:
- maintenance
- test
- build
- layout
- deploy
- warmup
.deploy-template: &deploy_template
stage: deploy
......@@ -25,7 +32,7 @@ variables:
- echo "$SSH_PRIVATE_KEY_STAGE" | ssh-add -
- echo "$SSH_PRIVATE_KEY_PRODUCTION" | ssh-add -
- ssh-keyscan ${STAGE_HOST} >> /root/.ssh/known_hosts
- ssh-keyscan -p ${PRODUCTION_PORT} ${PRODUCTION_HOST} >> /root/.ssh/known_hosts
- ssh-keyscan ${PRODUCTION_HOST} >> /root/.ssh/known_hosts
- composer config cache-dir /cache/composer
- composer global require deployer/deployer:6.6.0 --update-with-dependencies
- composer global require deployer/recipes
......@@ -33,13 +40,33 @@ variables:
- /tmp/vendor/bin/dep --file=./.gitlab-ci/deployer/deploy.php deploy -vv ${CI_BUILD_REF_NAME}
dependencies:
- layout
except:
- assets
deploy-master:
<<: *deploy_template
environment:
name: master
url: https://${PRODUCTION_HOST}
only:
- master
deploy-develop:
<<: *deploy_template
environment:
name: develop
url: https://${STAGE_HOST}
only:
- develop
warmup:cache:
stage: warmup
image:
name: quentinsf/sitediff:alpine
entrypoint: ["/bin/sh", "-c"]
script:
- /tmp/vendor/bin/dep --file=./.gitlab-ci/deployer/deploy.php deploy -vv develop
- sitediff init https://${PRODUCTION_HOST}
dependencies:
- deploy-master
only:
- develop-v10
- master
......@@ -16,7 +16,8 @@ set('shared_dirs', $sharedDirectories);
$sharedFiles = [
'private/typo3conf/AdditionalConfiguration.php',
'.cachetool.yml',
'public/services/api-keys.php'
'public/services/api-keys.php',
'private/typo3conf/ext/t3olayout/Configuration/TypoScript/Deployment/Secret.typoscript'
];
set('shared_files', $sharedFiles);
......@@ -62,14 +63,15 @@ task('solr_host', function () {
});
task('typo3', function () {
if (get('stage') === 'production') {
set('php', '/opt/php/php72/bin/php');
}
run('cd {{release_path}} && {{php}} {{bin_folder}}typo3cms install:generatepackagestates');
run('cd {{release_path}} && {{php}} {{bin_folder}}typo3cms database:updateschema');
run('cd {{release_path}} && {{php}} {{bin_folder}}typo3cms install:extensionsetupifpossible');
});
task('typo3_cache', function() {
run('cd {{release_path}} && {{php}} {{bin_folder}}typo3cms cache:flush');
});
task('cache', function () {
run('cd {{release_path}} && {{php}} {{bin_folder}}cachetool opcache:reset');
});
......@@ -84,6 +86,7 @@ task('deploy', [
'typo3',
'deploy:symlink',
'solr_host',
'typo3_cache',
'cache',
'cleanup'
]);
master:
stage: master
hostname: typo3.org
port: 22201
user: tthreeorg
user: t3o-prod
writable_mode: chmod
forward_agent: true
deploy_path: ~/ci
......@@ -13,5 +12,5 @@ develop:
user: t3o-stage
writable_mode: chmod
forward_agent: true
deploy_path: ~/ci/
deploy_path: ~/ci
keep_releases: 2
This diff is collapsed.
......@@ -218,6 +218,7 @@ return [
'type' => 'input',
'size' => '30',
'eval' => 'datetime',
'renderType' => 'inputDateTime',
]
],
'crdate' => [
......
tx_sfeventmgt.templateLayouts {
1 = Latest view
2 = List view, no category selector
3 = List view, nothing more
}
plugin.tx_typo3roadmap_roadmap.persistence.storagePid = 228
[applicationContext == "Production"]
page {
5 = TEXT
5.value (
<script>
var _paq = _paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
_paq.push(['setVisitorCookieTimeout', '2592000']);
_paq.push(['setSessionCookieTimeout', '0']);
_paq.push(['setDoNotTrack', true]);
(function () {
var u = "//piwik.typo3.org/";
_paq.push(['setTrackerUrl', u + 'piwik.php']);
_paq.push(['setSiteId', '2']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript';
g.async = true;
g.defer = true;
g.src = u + 'piwik.js';
s.parentNode.insertBefore(g, s);
})();
</script>
<noscript><img src="//piwik.typo3.org/piwik.php?idsite=2&rec=1" style="border:0;" alt=""/></noscript>
)
}
[global]
......@@ -2,75 +2,93 @@
<f:layout name="Default" />
<f:section name="main">
<f:if condition="{settings.templateLayout} == 1">
<f:then>
<ul class="list-unstyled event-list listing__group">
<f:for each="{events}" as="event">
<li class="m-3 m-md-4 mx-lg-5 mt-lg-5">
<f:link.action action="detail" arguments="{event : event}" pageUid="{settings.detailPid}" class="media listing__group-item p-sm-2 card-date">
<div class="d-flex mr-sm-4">
<time class="listing__group-item_time" datetime="{event.startdate -> f:format.date(format:'Y-m-d H:i')}">
<span class="listing__group-item_time-day mt-sm-2">{event.startdate -> f:format.date(format:'d')}</span>
<span class="listing__group-item_time-month">{event.startdate -> f:format.date(format:'M')}</span>
<span class="listing__group-item_time-year">{event.startdate -> f:format.date(format:'Y')}</span>
</time>
</div>
<div class="media-body listing__group-item_body">
<h5 class="mb-0 mt-sm-1 mb-sm-3">
<strong>{event.title}</strong>
</h5>
<p class="listing__group-item_body-text">
{event.location.title}<br>{event.location.city}<br>{event.location.country}<i class="fa fa-chevron-right ml-2" aria-hidden="true"></i>
</p>
</div>
</f:link.action>
</li>
</f:for>
</ul>
<f:link.action class="btn btn-primary btn-block py-lg-3 mb-0" pageUid="433" action="list" controller="Event" arguments="{overwriteDemand:{category:settings.category}}">Show more</f:link.action>
</f:then>
<f:else>
<div class="container">
<div class="row">
<div class="{f:if(condition:'{categories -> f:count()} > 1',then:'col-md-8',else:'col-md-12')}">
<div id="accordion" role="tablist" aria-multiselectable="true">
<f:widget.paginate objects="{events}" as="paginatedEvents" configuration="{itemsPerPage: 10, insertAbove: 0, insertBelow: 1, maximumNumberOfLinks: 10, addQueryStringMethod: 'GET'}">
<f:for each="{paginatedEvents}" as="event">
<f:render partial="Event/ListItem" arguments="{_all}" />
</f:for>
</f:widget.paginate>
</div>
</div>
<f:if condition="{categories -> f:count()} > 1">
<div class="col-md-4">
<f:render section="Filter" arguments="{_all}" />
</div>
</f:if>
<div class="col-md-12">
<f:link.action action="list" controller="Event">
<f:translate key="event.allEvents" />
</f:link.action>
</div>
</div>
</div>
</f:else>
</f:if>
<f:render section="layout{settings.templateLayout}" arguments="{_all}" />
</f:section>
<f:section name="Filter">
<f:if condition="{settings.templateLayout} == '2'">
<f:else>
<form class="event-filter">
<f:form.select class="custom-select" name="event-filter-neu" additionalAttributes="{onchange: 'location = this.value;'}">
<option value="{f:uri.action(action: 'list', controller: 'Event', arguments: '{overwriteDemand:{category: category}}')}"><f:translate key="tx_t3org_layout.events.all_category" extensionName="t3org_layout"/></option>
<f:for each="{categories}" as="category">
<option value="{f:uri.action(action: 'list', controller: 'Event', arguments: '{overwriteDemand:{category: category}}')}" {f:if(condition: '{overwriteDemand.category} == {category.uid}', then: 'class="active" selected="selected"')}>
{category.title}
</option>
</f:for>
</f:form.select>
</form>
</f:else>
</f:if>
<f:if condition="{settings.templateLayout} == '2'">
<f:else>
<form class="event-filter">
<f:form.select class="custom-select" name="event-filter-neu" additionalAttributes="{onchange: 'location = this.value;'}">
<option value="{f:uri.action(action: 'list', controller: 'Event', arguments: '{overwriteDemand:{category: category}}')}">
<f:translate key="tx_t3org_layout.events.all_category" extensionName="t3org_layout" />
</option>
<f:for each="{categories}" as="category">
<option value="{f:uri.action(action: 'list', controller: 'Event', arguments: '{overwriteDemand:{category: category}}')}" {f:if(condition:'{overwriteDemand.category} == {category.uid}', then: 'class="active" selected="selected"')}>
{category.title}
</option>
</f:for>
</f:form.select>
</form>
</f:else>
</f:if>
</f:section>
<f:section name="layout1">
<ul class="list-unstyled event-list listing__group">
<f:for each="{events}" as="event">
<li class="m-3 m-md-4 mx-lg-5 mt-lg-5">
<f:link.action action="detail" arguments="{event : event}" pageUid="{settings.detailPid}" class="media listing__group-item p-sm-2 card-date">
<div class="d-flex mr-sm-4">
<time class="listing__group-item_time" datetime="{event.startdate -> f:format.date(format:'Y-m-d H:i')}">
<span class="listing__group-item_time-day mt-sm-2">{event.startdate -> f:format.date(format:'d')}</span>
<span class="listing__group-item_time-month">{event.startdate -> f:format.date(format:'M')}</span>
<span class="listing__group-item_time-year">{event.startdate -> f:format.date(format:'Y')}</span>
</time>
</div>
<div class="media-body listing__group-item_body">
<h5 class="mb-0 mt-sm-1 mb-sm-3">
<strong>{event.title}</strong>
</h5>
<p class="listing__group-item_body-text">
{event.location.title}<br>{event.location.city}<br>{event.location.country}<i class="fa fa-chevron-right ml-2" aria-hidden="true"></i>
</p>
</div>
</f:link.action>
</li>
</f:for>
</ul>
<f:link.action class="btn btn-primary btn-block py-lg-3 mb-0" pageUid="433" action="list" controller="Event" arguments="{overwriteDemand:{category:settings.category}}">Show more</f:link.action>
</f:section>
<f:section name="layout2">
<div class="container">
<div class="row">
<div class="{f:if(condition:'{categories -> f:count()} > 1',then:'col-md-8',else:'col-md-12')}">
<div id="accordion" role="tablist" aria-multiselectable="true">
<f:widget.paginate objects="{events}" as="paginatedEvents" configuration="{itemsPerPage: 10, insertAbove: 0, insertBelow: 1, maximumNumberOfLinks: 10, addQueryStringMethod: 'GET'}">
<f:for each="{paginatedEvents}" as="event">
<f:render partial="Event/ListItem" arguments="{_all}" />
</f:for>
</f:widget.paginate>
</div>
</div>
<f:if condition="{categories -> f:count()} > 1">
<div class="col-md-4">
<f:render section="Filter" arguments="{_all}" />
</div>
</f:if>
<div class="col-md-12">
<f:link.action action="list" controller="Event">
<f:translate key="event.allEvents" />
</f:link.action>
</div>
</div>
</div>
</f:section>
<f:section name="layout3">
<div class="container">
<div class="row">
<div class="col-md-12">
<h2>{contentObjectData.header}</h2>
<div id="accordion" role="tablist" aria-multiselectable="true">
<f:for each="{events}" as="event">
<f:render partial="Event/ListItem" arguments="{_all}" />
</f:for>
</div>
</div>
</div>
</div>
</f:section>
</html>
......@@ -9,8 +9,8 @@
<div class="col-12 mt-3">
<div class="card listing__group-item card-date">
<div class="card-horizontal" style="display: flex;">
<div class="d-flex mr-sm-4">
<time class="listing__group-item_time" datetime="{document.startdate_intS -> f:format.date(format:'Y-m-d H:i')}">
<div class="mr-sm-4 d-none d-sm-flex">
<time class="listing__group-item_time">
<span class="listing__group-item_time-day mt-sm-2">{document.startdate_intS -> f:format.date(format:'d')}</span>
<span class="listing__group-item_time-month">{document.startdate_intS -> f:format.date(format:'M')}</span>
<span class="listing__group-item_time-year">{document.startdate_intS -> f:format.date(format:'Y')}</span>
......@@ -23,6 +23,9 @@
</a>
</h4>
<p class="card-text">{document.content -> f:format.crop(maxCharacters:'200') -> f:format.stripTags()}</p>
<time datetime="{document.startdate_intS -> f:format.date(format:'Y-m-d H:i T')}">
<small>Begin: {document.startdate_intS -> f:format.date(format:'l, F d Y H:i T')}</small>
</time>
</div>
</div>
<f:if condition="{document.location_stringS}">
......
......@@ -49,4 +49,6 @@ pageNewsICalendar {
useStdWrap = domain
}
}
}
\ No newline at end of file
}
@import 'EXT:t3org_layout/Configuration/TypoScript/Production.typoscript'
......@@ -16,8 +16,11 @@ $GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] = 1;
$GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'] = '$P$CZqeoYBTHC0kXKny4tpTvBSzzV5wVY0'; /* joh316 */
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['filefill']['storages'][1] = [
'domain' => [
'https://typo3.org/',
[
'identifier' => 'domain',
'configuration' => 'https://typo3.org/',
],
[
'identifier' => 'placeholder',
],
'placeholder' => true,
];
......@@ -86,6 +86,12 @@ return [
'storageUidImporter' => '1',
'tagPid' => '1',
],
'randombanners' => [
'developmentEmail' => 'dev@typo3.org.ddev.site',
'senderEmail' => 'no-reply@typo3.org',
'senderEmailName' => 'typo3.org Banner',
'templatePathAndFilename' => 'EXT:randombanners/Resources/Private/Templates/Scheduler/Email.html',
],
'rx_shariff' => [
'allowedDomains' => 'SERVER_NAME',
'facebook_app_id' => '',
......@@ -148,7 +154,7 @@ return [
],
'devIPmask' => '*',
'displayErrors' => 1,
'encryptionKey' => '52fd0fa7b7337befc0840fd8ad8fd8868fc9d98f60ea9b6e737ce732448e80eb35d2662bc15d04eb523171ec727c1dee',
'encryptionKey' => 'this.key.is.changed.on.remote.servers',
'exceptionalErrors' => 12290,
'sitename' => 'TYPO3.org',
'systemMaintainers' => [
......
......@@ -4,30 +4,11 @@ error_reporting(E_ALL & ~E_NOTICE);
require('api-keys.php');
define(
'PATH_THISSCRIPT',
str_replace(
'//',
'/',
str_replace(
'\\',
'/',
(PHP_SAPI === 'fpm-fcgi' || PHP_SAPI === 'cgi' || PHP_SAPI === 'isapi' || PHP_SAPI === 'cgi-fcgi') &&
(!empty($_SERVER['ORIG_PATH_TRANSLATED']) ? $_SERVER['ORIG_PATH_TRANSLATED'] : $_SERVER['PATH_TRANSLATED']) ?
(!empty($_SERVER['ORIG_PATH_TRANSLATED']) ? $_SERVER['ORIG_PATH_TRANSLATED'] : $_SERVER['PATH_TRANSLATED']) :
(!empty($_SERVER['ORIG_SCRIPT_FILENAME']) ? $_SERVER['ORIG_SCRIPT_FILENAME'] : $_SERVER['SCRIPT_FILENAME'])
)
)
);
define('PATH_SITE', dirname(PATH_THISSCRIPT) . '/');
// db connection
require(PATH_SITE . '../../private/typo3conf/AdditionalConfiguration.php');
define('TYPO3_DB_NAME', $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['dbname']);
define('TYPO3_DB_HOST', $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['host']);
define('TYPO3_DB_USERNAME', $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['user']);
define('TYPO3_DB_PASSWORD', $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['password']);
define('TYPO3_DB_NAME', getenv('DB_NAME'));
define('TYPO3_DB_HOST', getenv('DB_HOST'));
define('TYPO3_DB_USERNAME', getenv('DB_USERNAME'));
define('TYPO3_DB_PASSWORD', getenv('DB_PASSWORD'));
// no user serviceable parts below...
if (empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && empty($_SERVER['HTTPS'])) {
......@@ -35,12 +16,12 @@ if (empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && empty($_SERVER['HTTPS'])) {
header('HTTP/1.0 403 Forbidden');
die('Not using HTTPS');
}
if (isset($apiKeys[$_SERVER['HTTP_X_FORWARDED_FOR']]) && $apiKeys[$_SERVER['HTTP_X_FORWARDED_FOR']] === $_GET['apiKey']) {
if (isset($apiKeys[$_SERVER['REMOTE_ADDR']]) && $apiKeys[$_SERVER['REMOTE_ADDR']] === $_GET['apiKey']) {
echo printAssociationMembers();
} else {
syslog(
LOG_NOTICE,
't3a-members.php: API key for remote address ' . $_SERVER['HTTP_X_FORWARDED_FOR'] . ' not found or invalid.'
't3a-members.php: API key for remote address ' . $_SERVER['REMOTE_ADDR'] . ' not found or invalid.'
);
header('HTTP/1.0 403 Forbidden');
die('Invalid token');
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment