├── .gitignore ├── Dockerfile ├── README.md ├── install.php └── install_files ├── css ├── animations.css ├── controls.css ├── layout.css └── vendor.css ├── images ├── clouds.png ├── grass.png ├── leaves.png ├── logo.png ├── october.png ├── skyline.png ├── sprite.png ├── stars.png └── tree.png ├── js ├── app.js ├── check.js ├── complete.js ├── config.js ├── lang.js ├── progress.js ├── project.js └── vendor.js ├── lang ├── de.php ├── en.php ├── fi.php ├── fr.php ├── hu.php ├── nl.php ├── pt-br.php ├── ru.php └── zh-cn.php ├── partials ├── check.htm ├── check │ └── fail.htm ├── complete.htm ├── config.htm ├── config │ ├── config.htm │ ├── fail.htm │ ├── sql.htm │ └── sqlite.htm ├── footer.htm ├── header.htm ├── lang.htm ├── progress.htm ├── progress │ └── fail.htm ├── project.htm ├── project │ ├── fail.htm │ ├── plugin.htm │ ├── project.htm │ └── theme.htm └── title.htm └── php ├── Installer.php ├── InstallerException.php ├── InstallerHandlers.php ├── InstallerSetup.php └── boot.php /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.log -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # October CMS installer 3 | # 4 | # Create image with: 5 | # docker build -t myoctober:latest . 6 | # 7 | # Open installer with: 8 | # http://localhost:port/install.php 9 | # 10 | FROM php:8.2-apache 11 | LABEL maintainer="October CMS (@octobercms)" 12 | 13 | # Installs dependencies 14 | RUN apt-get update && apt-get install -y --no-install-recommends \ 15 | unzip \ 16 | wget \ 17 | libfreetype6-dev \ 18 | libjpeg62-turbo-dev \ 19 | libpng-dev \ 20 | libyaml-dev \ 21 | libwebp-dev \ 22 | libzip4 \ 23 | libzip-dev \ 24 | zlib1g-dev \ 25 | libicu-dev \ 26 | libpq-dev \ 27 | libsqlite3-dev \ 28 | g++ \ 29 | git \ 30 | cron \ 31 | vim \ 32 | nano \ 33 | ssh-client \ 34 | && docker-php-ext-install opcache \ 35 | && docker-php-ext-configure intl \ 36 | && docker-php-ext-install intl \ 37 | && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ 38 | && docker-php-ext-install -j$(nproc) gd \ 39 | && docker-php-ext-install zip \ 40 | && docker-php-ext-install exif \ 41 | && docker-php-ext-install mysqli \ 42 | && docker-php-ext-install pdo_pgsql \ 43 | && docker-php-ext-install pdo_mysql \ 44 | && rm -rf /var/lib/apt/lists/* 45 | 46 | # Sets recommended PHP.ini settings (https://secure.php.net/manual/en/opcache.installation.php) 47 | RUN { \ 48 | echo 'opcache.memory_consumption=128'; \ 49 | echo 'opcache.interned_strings_buffer=8'; \ 50 | echo 'opcache.max_accelerated_files=4000'; \ 51 | echo 'opcache.revalidate_freq=2'; \ 52 | echo 'opcache.fast_shutdown=1'; \ 53 | echo 'opcache.enable_cli=1'; \ 54 | echo 'upload_max_filesize=128M'; \ 55 | echo 'post_max_size=128M'; \ 56 | echo 'expose_php=off'; \ 57 | } > /usr/local/etc/php/conf.d/php-recommended.ini 58 | 59 | RUN pecl install apcu \ 60 | && pecl install yaml-2.2.2 \ 61 | && docker-php-ext-enable apcu yaml 62 | 63 | # Enables apache rewrite w/ security 64 | RUN a2enmod rewrite expires && \ 65 | sed -i 's/ServerTokens OS/ServerTokens ProductOnly/g' \ 66 | /etc/apache2/conf-available/security.conf 67 | 68 | # Install composer 69 | RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 70 | 71 | # Create html directory 72 | RUN mkdir -p /var/www/html && chown -R www-data:www-data /var/www/html 73 | 74 | # Sets user to www-data 75 | USER www-data 76 | 77 | # Adds installer 78 | WORKDIR /var/www/html 79 | 80 | # Download the zip file 81 | RUN wget -O installer.zip https://github.com/octobercms/install/archive/refs/heads/master.zip 82 | 83 | # Unzip the downloaded file 84 | RUN unzip installer.zip -d /var/www/html && \ 85 | mv /var/www/html/install-master/* /var/www/html/ && \ 86 | rm -r /var/www/html/install-master && \ 87 | rm installer.zip 88 | 89 | # Returns to root user 90 | USER root 91 | 92 | # Expose the default port 93 | EXPOSE 80/tcp 94 | 95 | # Provides container inside image for data persistence 96 | VOLUME ["/var/www/html"] 97 | 98 | CMD ["apache2-foreground"] 99 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Installation Wizard for October CMS 2 | 3 | The wizard installation is the recommended way to install October for non-technical users. It is simpler than the command-line installation and doesn't require any special skills. 4 | 5 | 1. Prepare a directory on your server that is empty. It can be a sub-directory, domain root or a sub-domain. 6 | 1. [Download the installer archive file](https://github.com/octobercms/install/archive/master.zip). 7 | 1. Unpack the installer archive to the prepared directory. 8 | 1. Grant writing permissions on the installation directory and all its subdirectories and files. 9 | 1. Navigate to the install.php script in your web browser. 10 | 1. Follow the installation instructions. 11 | 12 | ### Minimum System Requirements 13 | 14 | October CMS has a few system requirements: 15 | 16 | * PHP version 8.0 or higher 17 | * PDO PHP Extension 18 | * cURL PHP Extension 19 | * OpenSSL PHP Extension 20 | * Mbstring PHP Extension 21 | * ZipArchive PHP Extension 22 | * GD PHP Extension 23 | * SimpleXML PHP Extension 24 | * 128MB or more allocated memory 25 | 26 | ### OS Dependencies 27 | 28 | Some OS distributions may require you to manually install some of the required PHP extensions. 29 | 30 | When using Ubuntu, the following command can be run to install all required extensions: 31 | 32 | 33 | ```bash 34 | sudo apt-get update && 35 | sudo apt-get install php php-ctype php-curl php-xml php-fileinfo php-gd php-json php-mbstring php-mysql php-sqlite3 php-zip 36 | ``` 37 | 38 | ## Installation with Command Line (Composer) 39 | 40 | To install the platform using the command line, initialize a project using the `create-project` command in the terminal. The following command creates a new project in a directory called **myoctober**: 41 | 42 | ```bash 43 | composer create-project october/october myoctober 44 | ``` 45 | 46 | For further information, visit the [documentation for installation instructions](https://docs.octobercms.com/3.x/setup/installation.html). 47 | -------------------------------------------------------------------------------- /install.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | October CMS Installation 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 |
26 |
27 | 28 | 29 |
30 |
31 |
32 | 33 |
34 | 35 | 36 |
37 | 38 |
39 |
40 |
41 | 42 |
43 | 44 |
45 | 46 |
47 | 48 | 49 | 52 | 53 | 54 | 55 | 56 | 79 | 80 | 81 | 84 | 85 | 86 | 87 | 101 | 102 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /install_files/css/animations.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Animations 3 | */ 4 | 5 | .js .animated-content { 6 | opacity: 0; 7 | } 8 | 9 | .no-js .animated-content, 10 | .no-csstransitions .animated-content { 11 | opacity: 1; 12 | } 13 | 14 | .lt-ie9 .animated-content { 15 | opacity: 1; 16 | animation: none !important; 17 | transform: none !important; 18 | } 19 | 20 | /* Breathing button */ 21 | 22 | .btn.btn-primary { 23 | -webkit-animation: popUp 2s infinite; 24 | -moz-animation: popUp 2s infinite; 25 | animation: popUp 2s infinite; 26 | } 27 | 28 | .btn.btn-primary:hover { 29 | -webkit-animation-play-state: paused; 30 | -moz-animation-play-state: paused; 31 | animation-play-state: paused; 32 | } 33 | 34 | .btn.btn-primary[disabled], 35 | .btn.btn-primary.disabled, 36 | .btn.btn-primary:active { 37 | -webkit-animation: none; 38 | -moz-animation: none; 39 | animation: none; 40 | } 41 | 42 | /* Fade In */ 43 | 44 | .fade_in.animate { 45 | -webkit-animation: fadeIn 0.65s ease forwards; 46 | -moz-animation: fadeIn 0.65s ease forwards; 47 | animation: fadeIn 0.65s ease forwards; 48 | } 49 | 50 | @-webkit-keyframes fadeIn { 51 | to { opacity: 1; } 52 | } 53 | 54 | @-moz-keyframes fadeIn { 55 | to { opacity: 1; } 56 | } 57 | 58 | @keyframes fadeIn { 59 | to { opacity: 1; } 60 | } 61 | 62 | /* Move Left */ 63 | 64 | .move_left.animate { 65 | -webkit-transform: translateX(-200px); 66 | -moz-transform: translateX(-200px); 67 | transform: translateX(-200px); 68 | -webkit-animation: moveLeft 0.65s ease forwards; 69 | -moz-animation: moveLeft 0.65s ease forwards; 70 | animation: moveLeft 0.65s ease forwards; 71 | } 72 | 73 | @-webkit-keyframes moveLeft { 74 | to { -webkit-transform: translateX(0); opacity: 1; } 75 | } 76 | 77 | @-moz-keyframes moveLeft { 78 | to { -moz-transform: translateX(0); opacity: 1; } 79 | } 80 | 81 | @keyframes moveLeft { 82 | to { transform: translateX(0); opacity: 1; } 83 | } 84 | 85 | /* Move Right */ 86 | 87 | .move_right.animate { 88 | -webkit-transform: translateX(200px); 89 | -moz-transform: translateX(200px); 90 | transform: translateX(200px); 91 | -webkit-animation: moveLeft 0.65s ease forwards; 92 | -moz-animation: moveLeft 0.65s ease forwards; 93 | animation: moveLeft 0.65s ease forwards; 94 | } 95 | 96 | @-webkit-keyframes moveRight { 97 | to { -webkit-transform: translateX(0); opacity: 1; } 98 | } 99 | 100 | @-moz-keyframes moveRight { 101 | to { -moz-transform: translateX(0); opacity: 1; } 102 | } 103 | 104 | @keyframes moveRight { 105 | to { transform: translateX(0); opacity: 1; } 106 | } 107 | 108 | 109 | /* Move Up */ 110 | 111 | .move_up.animate { 112 | -webkit-transform: translateY(200px); 113 | -moz-transform: translateY(200px); 114 | transform: translateY(200px); 115 | -webkit-animation: moveUp 0.65s ease forwards; 116 | -moz-animation: moveUp 0.65s ease forwards; 117 | animation: moveUp 0.65s ease forwards; 118 | } 119 | 120 | @-webkit-keyframes moveUp { 121 | to { -webkit-transform: translateY(0); opacity: 1; } 122 | } 123 | 124 | @-moz-keyframes moveUp { 125 | to { -moz-transform: translateY(0); opacity: 1; } 126 | } 127 | 128 | @keyframes moveUp { 129 | to { transform: translateY(0); opacity: 1; } 130 | } 131 | 132 | /* Scale Up */ 133 | 134 | .scale_up.animate { 135 | -webkit-transform: scale(0.6); 136 | -moz-transform: scale(0.6); 137 | transform: scale(0.6); 138 | -webkit-animation: scaleUp 0.65s ease-in-out forwards; 139 | -moz-animation: scaleUp 0.65s ease-in-out forwards; 140 | animation: scaleUp 0.65s ease-in-out forwards; 141 | } 142 | 143 | @-webkit-keyframes scaleUp { 144 | to { -webkit-transform: scale(1); opacity: 1; } 145 | } 146 | 147 | @-moz-keyframes scaleUp { 148 | to { -moz-transform: scale(1); opacity: 1; } 149 | } 150 | 151 | @keyframes scaleUp { 152 | to { transform: scale(1); opacity: 1; } 153 | } 154 | 155 | /* Little Bounce */ 156 | 157 | .little_bounce.animate { 158 | -webkit-transform: scale(0.4); 159 | -moz-transform: scale(0.4); 160 | transform: scale(0.4); 161 | -webkit-animation: popUp .8s ease-in forwards; 162 | -moz-animation: popUp .8s ease-in forwards; 163 | animation: popUp .8s ease-in forwards; 164 | } 165 | 166 | @-webkit-keyframes popUp { 167 | 70% { -webkit-transform: scale(1.1); opacity: .8; -webkit-animation-timing-function: ease-out; } 168 | 100% { -webkit-transform: scale(1); opacity: 1; } 169 | } 170 | 171 | @-moz-keyframes popUp { 172 | 70% { -moz-transform: scale(1.1); opacity: .8; -moz-animation-timing-function: ease-out; } 173 | 100% { -moz-transform: scale(1); opacity: 1; } 174 | } 175 | 176 | @keyframes popUp { 177 | 70% { transform: scale(1.1); opacity: .8; animation-timing-function: ease-out; } 178 | 100% { transform: scale(1); opacity: 1; } 179 | } 180 | 181 | /* Spin */ 182 | 183 | @-moz-keyframes spin { 184 | 0% { -moz-transform: rotate(0deg); } 185 | 100% { -moz-transform: rotate(359deg); } 186 | } 187 | 188 | @-webkit-keyframes spin { 189 | 0% { -webkit-transform: rotate(0deg); } 190 | 100% { -webkit-transform: rotate(359deg); } 191 | } 192 | 193 | @keyframes spin { 194 | 0% { transform: rotate(0deg); } 195 | 100% { transform: rotate(359deg); } 196 | } 197 | 198 | /* Infinite Loader */ 199 | 200 | .infinite_loader.animate { 201 | -webkit-animation: infiniteLoader 90s ease-in forwards; 202 | -moz-animation: infiniteLoader 90s ease-in forwards; 203 | animation: infiniteLoader 90s ease-in forwards; 204 | } 205 | 206 | @-moz-keyframes infiniteLoader { 207 | 0% { width: 0%; } 208 | 10% { width: 42%; } 209 | 20% { width: 63%; } 210 | 30% { width: 78.75%; } 211 | 40% { width: 88.59375%; } 212 | 50% { width: 94.130859375%; } 213 | 60% { width: 97.07244873046875%; } 214 | 70% { width: 98.58920574188232%; } 215 | 80% { width: 99.35943391174078%; } 216 | 90% { width: 99.74755670045852%; } 217 | 100% { width: 99.9423761471391%; } 218 | } 219 | @-webkit-keyframes infiniteLoader { 220 | 0% { width: 0%; } 221 | 10% { width: 42%; } 222 | 20% { width: 63%; } 223 | 30% { width: 78.75%; } 224 | 40% { width: 88.59375%; } 225 | 50% { width: 94.130859375%; } 226 | 60% { width: 97.07244873046875%; } 227 | 70% { width: 98.58920574188232%; } 228 | 80% { width: 99.35943391174078%; } 229 | 90% { width: 99.74755670045852%; } 230 | 100% { width: 99.9423761471391%; } 231 | } 232 | @keyframes infiniteLoader { 233 | 0% { width: 0%; } 234 | 10% { width: 42%; } 235 | 20% { width: 63%; } 236 | 30% { width: 78.75%; } 237 | 40% { width: 88.59375%; } 238 | 50% { width: 94.130859375%; } 239 | 60% { width: 97.07244873046875%; } 240 | 70% { width: 98.58920574188232%; } 241 | 80% { width: 99.35943391174078%; } 242 | 90% { width: 99.74755670045852%; } 243 | 100% { width: 99.9423761471391%; } 244 | } -------------------------------------------------------------------------------- /install_files/css/controls.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * October Controls 3 | */ 4 | 5 | .progress-bar-container { 6 | opacity: 0; 7 | -webkit-transition: opacity 0.4s linear; 8 | -moz-transition: opacity 0.4s linear; 9 | transition: opacity 0.4s linear; 10 | } 11 | .progress-bar-container .progress { 12 | margin-top: 15px; 13 | margin-bottom: 25px; 14 | background: white; 15 | -webkit-box-shadow: none; 16 | -moz-box-shadow: none; 17 | box-shadow: none; 18 | } 19 | .progress-bar-container.loading { 20 | -webkit-transition: none; 21 | -moz-transition: none; 22 | transition: none; 23 | opacity: 1; 24 | } 25 | .progress-bar-container.loaded { 26 | opacity: 0; 27 | -webkit-transition-delay: 0.3s; 28 | -moz-transition-delay: 0.3s; 29 | transition-delay: 0.3s; 30 | } 31 | .progress-bar { 32 | -webkit-transition: none; 33 | -moz-transition: none; 34 | transition: none; 35 | width: 0; 36 | } 37 | .progress-bar-container.loaded .progress-bar { 38 | -webkit-transition: width 0.3s linear; 39 | -moz-transition: width 0.3s linear; 40 | transition: width 0.3s linear; 41 | width: 100% !important; 42 | } 43 | 44 | .progress-bar-container.failed .progress-bar { 45 | width: 100% !important; 46 | } 47 | .progress-bar-container .progress-message { 48 | font-size: 17px; 49 | position: relative; 50 | padding-left: 42px; 51 | line-height: 32px; 52 | } 53 | .progress-bar-container .progress-message:before { 54 | content: ""; 55 | background: transparent url('../images/sprite.png') no-repeat; 56 | background-size: 32px auto; 57 | display: block; 58 | width: 32px; 59 | height: 32px; 60 | position: absolute; 61 | left: 0; 62 | top: 0; 63 | -moz-animation: spin 1s infinite linear; 64 | -webkit-animation: spin 1s infinite linear; 65 | animation: spin 1s infinite linear; 66 | background-position: 0 -32px; 67 | } 68 | 69 | .progress-bar-container.failed .progress-message:before { 70 | -moz-animation: none; 71 | -webkit-animation: none; 72 | animation: none; 73 | background-position: 0 -64px; 74 | } 75 | 76 | .callout { 77 | margin-bottom: 20px; 78 | padding: 20px; 79 | color: #f0f0f0; 80 | border-radius: 3px; 81 | font-weight: 400; 82 | } 83 | .callout p { 84 | font-size: 14px; 85 | } 86 | .callout a { 87 | color: #fff; 88 | } 89 | .callout a.btn { 90 | color: #333; 91 | border-width: 0!important; 92 | } 93 | .callout a.btn:hover { 94 | color: #000; 95 | } 96 | .callout small { 97 | font-size: 12px; 98 | } 99 | .callout h4 { 100 | margin-top: 0; 101 | font-size: 20px; 102 | margin-bottom: 18px; 103 | font-weight: 400; 104 | color: #fff; 105 | } 106 | .callout p:last-child { 107 | margin-bottom: 0; 108 | } 109 | .callout-danger { 110 | background-color: #cc3300; 111 | } 112 | .callout-danger h4 a { 113 | text-decoration: underline; 114 | } 115 | .callout-warning { 116 | background-color: #f0ad4e; 117 | } 118 | .callout-info { 119 | background-color: #5e6ca8; 120 | } 121 | .callout-success { 122 | background-color: #8da85e; 123 | } 124 | 125 | .system-check { 126 | padding-bottom: 20px; 127 | overflow: hidden; 128 | margin: 0 -10px; 129 | } 130 | .system-check li { 131 | padding: 10px; 132 | padding-left: 52px; 133 | margin-bottom: 10px; 134 | min-height: 32px; 135 | background: #FFF; 136 | position: relative; 137 | font-size: 14px; 138 | float: left; 139 | width: calc(50% - 20px); 140 | margin-left: 10px; 141 | margin-right: 10px; 142 | } 143 | .system-check li:before { 144 | content: ""; 145 | background: transparent url('../images/sprite.png') no-repeat; 146 | background-size: 32px auto; 147 | display: block; 148 | width: 32px; 149 | height: 32px; 150 | position: absolute; 151 | left: 7px; 152 | top: 5px; 153 | } 154 | .system-check li.pass:before { 155 | background-position: 0 0; 156 | } 157 | .system-check li.fail:before { 158 | background-position: 0 -64px; 159 | } 160 | .system-check li.load:before { 161 | background-position: 0 -32px; 162 | -moz-animation: spin 1s infinite linear; 163 | -webkit-animation: spin 1s infinite linear; 164 | animation: spin 1s infinite linear; 165 | } 166 | 167 | .theme-item { 168 | background: #fff; 169 | padding: 20px; 170 | margin-top: 20px; 171 | min-height: 385px; 172 | } 173 | .theme-item-header small { 174 | color: rgba(0,0,0,.5); 175 | position: relative; 176 | top: -1px; 177 | } 178 | .theme-item .theme-item-thumb { 179 | text-align: center; 180 | padding: 10px 0 20px 0; 181 | } 182 | .theme-item .theme-item-description { 183 | overflow-y: auto; 184 | height: 75px; 185 | } 186 | .theme-item ul.list-inline { 187 | margin-top: 20px; 188 | } 189 | .theme-item .theme-item-confirm { 190 | margin-top: 20px; 191 | font-weight: bold; 192 | } 193 | .theme-item .theme-item-confirm span, 194 | .theme-item .theme-item-confirm a.btn { 195 | margin-right: 5px; 196 | } 197 | 198 | .scroll-panel { 199 | padding: 20px; 200 | overflow: auto; 201 | max-height: 250px; 202 | background: #fff; 203 | font-size: 14px; 204 | border-radius: 3px; 205 | } 206 | .scroll-panel p:last-child { 207 | margin-bottom: 0; 208 | } 209 | 210 | .app-eula .eula-title { 211 | text-align: center; 212 | padding: 10px 0; 213 | } 214 | .app-eula .scroll-panel { 215 | height: 450px; 216 | max-height: 450px; 217 | line-height: 2; 218 | overflow-anchor: none; 219 | } 220 | .app-eula article * { 221 | font-size: 12px; 222 | } 223 | .app-eula article h1 { 224 | font-size: 15px; 225 | font-weight: bold; 226 | } 227 | .app-eula article h2 { 228 | font-size: 14px; 229 | font-weight: bold; 230 | } 231 | .app-eula article h3 { 232 | font-size: 13px; 233 | font-weight: bold; 234 | } 235 | 236 | .suggested-products-container .scroll-panel { 237 | padding: 0 15px; 238 | max-height: 250px; 239 | } 240 | 241 | .advanced-options { 242 | overflow: hidden; 243 | max-height: 0; 244 | } 245 | .advanced-options.visible { 246 | max-height: 2000px; 247 | -webkit-transition: all 1s ease-in-out; 248 | transition: all 1s ease-in-out; 249 | } 250 | 251 | .project-details { 252 | margin: 30px 0; 253 | } 254 | 255 | .product-list-header small { 256 | position: relative; 257 | top: -2px; 258 | } 259 | .product-list-empty { 260 | padding: 5px 0; 261 | font-size: 16px; 262 | color: #999; 263 | } 264 | .product-list { 265 | margin: 0; 266 | padding: 0; 267 | overflow: hidden; /* clearfix */ 268 | } 269 | .product-list li button, 270 | .product-list li .image, 271 | .product-list li .details { 272 | -webkit-transition: opacity .2s linear; 273 | -moz-transition: opacity .2s linear; 274 | transition: opacity .2s linear; 275 | } 276 | .product-list li button { 277 | position: absolute; 278 | top: 0; 279 | right: 0; 280 | width: 20px; 281 | height: 20px; 282 | opacity: 0; 283 | outline: none; 284 | } 285 | .product-list li:hover button { 286 | opacity: .3; 287 | } 288 | .product-list li:hover button:hover { 289 | opacity: .8; 290 | } 291 | 292 | .plugin-list { 293 | 294 | } 295 | .plugin-list li { 296 | list-style: none; 297 | position: relative; 298 | border-bottom: 1px solid #E6E9E9; 299 | margin-bottom: 10px; 300 | padding-bottom: 10px; 301 | overflow: hidden; 302 | } 303 | .plugin-list li:last-child { 304 | border-bottom: none; 305 | } 306 | .plugin-list li .image { 307 | float: left; 308 | margin-right: 15px; 309 | margin-left: 5px; 310 | } 311 | .plugin-list li .image img { 312 | width: 50px; 313 | height: 50px; 314 | } 315 | .plugin-list li .details p { 316 | padding: 0; 317 | margin: 3px 0 0 0; 318 | color: #808C8D; 319 | } 320 | .plugin-list li h4 { 321 | padding: 5px 0 0; 322 | margin: 0; 323 | color: #C03F31; 324 | font-weight: 400; 325 | } 326 | 327 | .theme-list li { 328 | float: left; 329 | padding: 0; 330 | margin: 0 10px 10px 0; 331 | list-style: none; 332 | border: 1px solid #E6E9E9; 333 | background: #fff; 334 | position: relative; 335 | border-radius: 3px; 336 | } 337 | .theme-list li:hover { 338 | border-color: transparent; 339 | } 340 | .theme-list li { 341 | -webkit-transition: border .2s linear; 342 | -moz-transition: border .2s linear; 343 | transition: border .2s linear; 344 | } 345 | .theme-list li .image { 346 | padding: 5px; 347 | } 348 | .theme-list li .image img { 349 | width: 210px; 350 | height: 140px; 351 | } 352 | .theme-list li:hover .image { 353 | opacity: 0; 354 | } 355 | .theme-list li .details { 356 | position: absolute; 357 | bottom: 0; 358 | left: 0; 359 | opacity: 0; 360 | padding: 10px; 361 | overflow: hidden; 362 | } 363 | .theme-list li:hover .details { 364 | opacity: 1; 365 | } 366 | .theme-list li h4 { 367 | padding: 15px 0 0; 368 | margin: 0; 369 | } 370 | .theme-list li p { 371 | padding: 0; 372 | margin: 0; 373 | color: #999; 374 | text-transform: uppercase; 375 | font-size: 12px; 376 | } 377 | 378 | /* Language List */ 379 | 380 | .language-list { 381 | display: flex; 382 | justify-content: center; 383 | align-items: baseline; 384 | flex-wrap: wrap; 385 | } 386 | 387 | .language-list a { 388 | flex: 0 33.3%; 389 | display: block; 390 | margin-bottom: 10px; 391 | text-decoration: none; 392 | padding: 5px 10px; 393 | } 394 | 395 | .language-list a:hover { 396 | box-shadow: inset 0 0 3px rgba(0,0,0,.6); 397 | } 398 | 399 | .language-list a > span { 400 | display: block; 401 | } 402 | 403 | .language-list a > small { 404 | color: #666; 405 | } 406 | -------------------------------------------------------------------------------- /install_files/css/layout.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * October Layout 3 | */ 4 | 5 | html, 6 | body { 7 | height: 100%; 8 | /* The html and body elements cannot have any padding or margin. */ 9 | -webkit-font-smoothing: antialiased !important; 10 | } 11 | 12 | body { 13 | color: #33495E; 14 | font-weight: 200; 15 | font-size: 14px; 16 | } 17 | h1, h2, h3, h4, h5, h6 { 18 | font-weight: 200; 19 | } 20 | h3 { 21 | font-size: 36px; 22 | } 23 | .section-header { 24 | text-transform: uppercase; 25 | font-weight: 400; 26 | } 27 | .text-success { 28 | color: #8da85e; 29 | } 30 | 31 | a { 32 | color: #0181b9; 33 | } 34 | .text-overflow { 35 | overflow: hidden; 36 | text-overflow: ellipsis; 37 | white-space: nowrap; 38 | } 39 | label { 40 | font-weight: 400; 41 | } 42 | .form-control { 43 | -webkit-transition: none; 44 | transition: none; 45 | -webkit-box-shadow: none; 46 | box-shadow: none; 47 | border: 1px solid #e0e0e0; 48 | border-radius: 3px; 49 | font-family: sans-serif; 50 | transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 51 | } 52 | .form-control:focus { 53 | -webkit-box-shadow: none; 54 | box-shadow: none; 55 | border: 1px solid #72809d; 56 | } 57 | .form-control-prefix { 58 | display: flex; 59 | align-items: center; 60 | } 61 | .form-control-prefix .prefix { 62 | border: 1px solid #cfd7e1; 63 | padding: 6px 13px; 64 | 65 | background: #f9f9f9; 66 | border-radius: 4px; 67 | } 68 | .form-control-prefix .prefix + .form-control { 69 | box-shadow: -2px 0 2px -2px rgba(0,0,0,.2); 70 | margin-left: -5px; 71 | 72 | } 73 | .form-control-prefix.is-url-prefix .prefix { 74 | text-align: right; 75 | word-break: break-all; 76 | } 77 | .form-control-prefix.is-url-prefix .form-control { 78 | width: auto; 79 | } 80 | .radio-group { 81 | padding-top: 7px; 82 | } 83 | .radio-group > span > label { 84 | padding-right: 15px; 85 | } 86 | input.project-id-input { 87 | font-family: monospace; 88 | } 89 | 90 | #wrap { 91 | min-height: 100%; 92 | height: auto; 93 | margin: 0 auto -100px; 94 | padding: 0 0 100px; 95 | background: #ecf0f1; 96 | position: relative; 97 | overflow: hidden; 98 | } 99 | 100 | #wrap:before { 101 | content: ' '; 102 | background: #ecf0f1 url('../images/skyline.png') repeat-x left bottom; 103 | position: absolute; 104 | bottom: -225px; 105 | width: 100%; 106 | height: 399px; 107 | display: block; 108 | } 109 | 110 | /* Preload leaves */ 111 | #wrap:after { 112 | content: url('../images/leaves.png'); 113 | position: absolute; 114 | opacity: 0; 115 | } 116 | 117 | header { 118 | padding: 40px 0 0; 119 | top: 0; 120 | background: #162430 url('../images/stars.png'); 121 | width: 100%; 122 | z-index: 2; 123 | } 124 | 125 | header h1 { 126 | margin: 0 0 30px 0; 127 | display: block; 128 | height: 47px; 129 | width: 283px; 130 | background: transparent url('../images/logo.png') no-repeat left -90px; 131 | line-height: 0; 132 | text-indent: -9999px; 133 | overflow: hidden; 134 | } 135 | header .progress-bar-container { 136 | margin-top: 10px; 137 | } 138 | header h5 { 139 | text-transform: uppercase; 140 | color: #95a5a6; 141 | padding: 24px 0 15px 20px; 142 | margin: 17px 0 0 0; 143 | font-weight: 400; 144 | } 145 | 146 | section.title { 147 | position: relative; 148 | } 149 | 150 | section.title:before { 151 | content: ' '; 152 | display: block; 153 | position: absolute; 154 | width: 100%; 155 | height: 63px; 156 | left: 0; 157 | bottom: 0; 158 | background: url('../images/clouds.png') repeat-x left top; 159 | } 160 | 161 | section.title .steps { 162 | position: relative; 163 | top: -50px; 164 | } 165 | 166 | section.title .steps p { 167 | height: 50px; 168 | width: 50px; 169 | margin: 0 auto; 170 | display: block; 171 | line-height: 50px; 172 | 173 | text-align: center; 174 | text-transform: uppercase; 175 | position: relative; 176 | color: rgba(255,255,255,.9); 177 | border: 1px solid rgba(255,255,255,.6); 178 | border-radius: 99999px; 179 | font-size: 22px; 180 | opacity: .4; 181 | font-weight: 200; 182 | } 183 | section.title .steps .pass p { 184 | opacity: 1; 185 | background: #d35400; 186 | border-color: #d35400; 187 | } 188 | section.title .steps .pass.last p { 189 | opacity: .4; 190 | } 191 | section.title .steps .pass.last.animate.fade_in p { 192 | -webkit-animation: fadeIn 0.65s ease forwards; 193 | -moz-animation: fadeIn 0.65s ease forwards; 194 | animation: fadeIn 0.65s ease forwards; 195 | } 196 | section.title .steps.animate.move_up .pass.last p { 197 | -webkit-animation-delay: 0.65s; 198 | -moz-animation-delay: 0.65s; 199 | animation-delay: 0.65s; 200 | } 201 | section.title { 202 | padding: 10px 0 30px 0; 203 | } 204 | section.title h2 { 205 | margin: 0; 206 | color: #ECF0F1; 207 | font-size: 32px; 208 | line-height: 55px; 209 | font-weight: 400; 210 | } 211 | 212 | section.body { 213 | z-index: 3; 214 | overflow: hidden; 215 | position: relative; 216 | } 217 | 218 | section.body .container { 219 | padding-top: 40px; 220 | padding-bottom: 50px; 221 | } 222 | 223 | section.body p.lead { 224 | margin-top: 20px; 225 | } 226 | section.body p.lead.with-tick:before { 227 | content: ""; 228 | background: transparent url('../images/sprite.png') no-repeat; 229 | background-size: 32px auto; 230 | display: block; 231 | width: 32px; 232 | height: 32px; 233 | float: left; 234 | margin-right: 5px; 235 | margin-top: -1px; 236 | } 237 | 238 | .cloud-content { 239 | background: rgba(255,255,255,.5); 240 | position: relative; 241 | border-radius: 3px; 242 | padding: 20px 30px; 243 | } 244 | .cloud-content .cp-button { 245 | position: absolute; 246 | top: 60px; 247 | right: 30px 248 | } 249 | 250 | .side-nav { 251 | position: relative; 252 | z-index: 20; 253 | } 254 | .side-nav h3 { 255 | text-transform: uppercase; 256 | color: #C03F31; 257 | font-size: 14px; 258 | font-weight: 400; 259 | margin-bottom: 10px; 260 | } 261 | .side-nav ul li a { 262 | margin-left: -12px; 263 | padding: 4px 12px; 264 | border-radius: 3px; 265 | font-size: 16px; 266 | } 267 | .side-nav ul li.active a { 268 | background: #0181b9; 269 | color: #ffffff; 270 | } 271 | 272 | .page-nav { 273 | margin-bottom: 0; 274 | margin-top: 20px; 275 | float: right; 276 | } 277 | .page-nav a.btn { 278 | padding: 10px 15px; 279 | border: none; 280 | background-color: #D2D9DD; 281 | color: #576061; 282 | position: relative; 283 | } 284 | .page-nav a.btn:hover { 285 | background-color: #0799dc; 286 | color: #ffffff; 287 | } 288 | .page-nav a.btn:before { 289 | position: absolute; 290 | top: 13px; 291 | font-weight: bold; 292 | font-style: normal; 293 | font-family: Verdana; 294 | text-decoration: inherit; 295 | content: "<"; 296 | font-size: 10px; 297 | opacity: .5; 298 | } 299 | .page-nav a.btn.prev { 300 | padding-left: 30px; 301 | } 302 | .page-nav a.btn.prev:before { 303 | left: 15px; 304 | } 305 | .page-nav a.btn.next { 306 | padding-right: 30px; 307 | } 308 | .page-nav a.btn.next:before { 309 | right: 15px; 310 | content: ">"; 311 | } 312 | 313 | footer { 314 | background: transparent url('../images/grass.png') repeat-x left bottom; 315 | height: 100px; 316 | z-index: 10; 317 | position: relative; 318 | } 319 | 320 | footer .container { 321 | position: relative; 322 | height: 100px; 323 | } 324 | footer .container:after { 325 | content: ' '; 326 | display: block; 327 | position: absolute; 328 | left: 0; 329 | bottom: 0; 330 | width: 207px; 331 | height: 127px; 332 | background: transparent url('../images/tree.png') repeat-x left bottom; 333 | z-index: 7; 334 | } 335 | 336 | footer ul.menu { 337 | margin-top: 50px; 338 | margin-left: 250px; 339 | padding-left: 0; 340 | } 341 | 342 | footer ul.menu li { 343 | margin-right: 15px; 344 | } 345 | footer a { 346 | color: #7e8c8d; 347 | font-weight: 200; 348 | } 349 | footer a:hover { 350 | text-decoration: none; 351 | } 352 | footer .form-control-panel { 353 | float: right; 354 | } 355 | footer .form-control-panel.loading:before { 356 | content: ""; 357 | background: transparent url('../images/sprite.png') no-repeat; 358 | background-size: 42px auto; 359 | display: block; 360 | width: 42px; 361 | height: 42px; 362 | margin-top: 2px; 363 | margin-right: 10px; 364 | float: left; 365 | background-position: 0 -42px; 366 | -moz-animation: spin 1s infinite linear; 367 | -webkit-animation: spin 1s infinite linear; 368 | animation: spin 1s infinite linear; 369 | } 370 | p { 371 | font-size: 14px; 372 | } 373 | 374 | .loading-section:before { 375 | content: ""; 376 | background: transparent url('../images/sprite.png') no-repeat; 377 | background-size: 42px auto; 378 | display: block; 379 | width: 42px; 380 | height: 42px; 381 | margin-top: 2px; 382 | margin-right: 10px; 383 | float: left; 384 | background-position: 0 -42px; 385 | -moz-animation: spin 1s infinite linear; 386 | -webkit-animation: spin 1s infinite linear; 387 | animation: spin 1s infinite linear; 388 | } 389 | .loading-section p { 390 | line-height: 42px; 391 | margin-left: 72px; 392 | } 393 | -------------------------------------------------------------------------------- /install_files/images/clouds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/clouds.png -------------------------------------------------------------------------------- /install_files/images/grass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/grass.png -------------------------------------------------------------------------------- /install_files/images/leaves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/leaves.png -------------------------------------------------------------------------------- /install_files/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/logo.png -------------------------------------------------------------------------------- /install_files/images/october.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/october.png -------------------------------------------------------------------------------- /install_files/images/skyline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/skyline.png -------------------------------------------------------------------------------- /install_files/images/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/sprite.png -------------------------------------------------------------------------------- /install_files/images/stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/stars.png -------------------------------------------------------------------------------- /install_files/images/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octobercms/install/9f941c45bfa89e486a937130e66b5c7b5f528a76/install_files/images/tree.png -------------------------------------------------------------------------------- /install_files/js/app.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * October Logic 3 | */ 4 | 5 | $(document).ready(function(){ 6 | Installer.Pages.langPicker.isRendered = true; 7 | Installer.showPage(Installer.ActivePage, true); 8 | }); 9 | 10 | var Installer = { 11 | ActivePage: 'langPicker', 12 | PageLocked: false, 13 | Pages: { 14 | langPicker: { isStep0: true, body: 'lang' }, 15 | systemCheck: { isStep1: true, body: 'check' }, 16 | configForm: { isStep2: true, body: 'config' }, 17 | projectForm: { isStep3: true, body: 'project' }, 18 | installProgress: { isStep4: true, body: 'progress' }, 19 | installComplete: { isStep5: true, body: 'complete' } 20 | }, 21 | Locale: 'en', 22 | ActiveSection: null, 23 | Sections: {}, 24 | Events: {}, 25 | Data: { 26 | meta: null, // Meta information from the server 27 | config: null, // Configuration from the user 28 | project: null // Project for the installation 29 | }, 30 | DataSet: { 31 | includedPlugins: [], // Plugins to install 32 | includedThemes: [] // Themes to install 33 | } 34 | } 35 | 36 | Installer.Events.retry = function() { 37 | var pageEvent = Installer.Pages[Installer.ActivePage].retry 38 | pageEvent && pageEvent() 39 | } 40 | 41 | Installer.Events.next = function() { 42 | var nextButton = $('#nextButton') 43 | if (nextButton.hasClass('disabled')) { 44 | return; 45 | } 46 | 47 | var pageEvent = Installer.Pages[Installer.ActivePage].next; 48 | pageEvent && pageEvent(); 49 | } 50 | 51 | Installer.showPage = function(pageId, noPush) { 52 | $('html, body').scrollTop(0); 53 | var page = Installer.Pages[pageId], 54 | oldPage = (pageId != Installer.ActivePage) ? Installer.Pages[Installer.ActivePage] : null; 55 | 56 | // Page events 57 | oldPage && oldPage.beforeUnload && oldPage.beforeUnload(); 58 | Installer.ActivePage = pageId; 59 | page.beforeShow && page.beforeShow(); 60 | 61 | $('#containerHeader').renderPartial('header', page); 62 | $('#containerTitle').renderPartial('title', page).find('.steps > .last.pass:first').addClass('animate fade_in'); 63 | $('#containerFooter').renderPartial('footer', page); 64 | 65 | // Check if the content container exists already, if not, create it 66 | var pageContainer = $('#containerBody').find('.pageContainer-' + pageId); 67 | if (!pageContainer.length) { 68 | pageContainer = $('
').addClass('pageContainer-' + pageId); 69 | pageContainer.renderPartial(page.body, page); 70 | $('#containerBody').append(pageContainer); 71 | page.init && page.init(); 72 | } 73 | else { 74 | page.reinit && page.reinit(); 75 | } 76 | 77 | pageContainer.show().siblings().hide(); 78 | Installer.renderLangMessages(pageContainer); 79 | 80 | // New page, add it to the history 81 | if (history.pushState && !noPush) { 82 | window.history.pushState({ page: pageId }, '', window.location.pathname); 83 | page.isRendered = true; 84 | } 85 | } 86 | 87 | Installer.setLoadingBar = function(state, message) { 88 | var progressBarContainer = $('#progressBar'), 89 | progressBar = $('#progressBar .progress-bar:first'), 90 | progressBarMessage = $('#progressBarMessage'); 91 | 92 | if (message) { 93 | progressBarMessage.text(message); 94 | } 95 | 96 | progressBar.removeClass('progress-bar-danger'); 97 | progressBarContainer.removeClass('failed'); 98 | 99 | if (state == 'failed') { 100 | progressBar.addClass('progress-bar-danger').removeClass('animate infinite_loader'); 101 | progressBarContainer.addClass('failed'); 102 | } 103 | else if (state) { 104 | progressBarContainer.addClass('loading').removeClass('loaded'); 105 | progressBar.addClass('animate infinite_loader'); 106 | } 107 | else { 108 | progressBarContainer.addClass('loaded').removeClass('loading'); 109 | progressBar.removeClass('animate infinite_loader'); 110 | } 111 | } 112 | 113 | Installer.renderLangMessages = function(container) { 114 | // Render language string 115 | $('[data-lang]', container).each(function() { 116 | var langKey = $(this).attr('data-lang') ? $(this).attr('data-lang') : $(this).text(); 117 | $(this).text(Installer.getLang(langKey)); 118 | $(this).attr('data-lang', langKey); 119 | }); 120 | } 121 | 122 | Installer.getLang = function(langKey) { 123 | var activeLocale = installerLang[Installer.Locale] ? Installer.Locale : 'en'; 124 | 125 | // Access dot notation 126 | var langValue = langKey.split('.').reduce(function(a, b) { 127 | return a[b] ? a[b] : ''; 128 | }, installerLang[activeLocale]); 129 | 130 | if (!langValue) { 131 | langValue = langKey.split('.').reduce(function(a, b) { 132 | return a[b] ? a[b] : ''; 133 | }, installerLang['en']); 134 | } 135 | 136 | if (!langValue) { 137 | return langKey; 138 | } 139 | 140 | return langValue; 141 | } 142 | 143 | $.fn.extend({ 144 | renderPartial: function(name, data, options) { 145 | var container = $(this), 146 | template = $('[data-partial="' + name + '"]'), 147 | contents = Mustache.to_html(template.html(), data); 148 | 149 | options = $.extend(true, { 150 | append: false 151 | }, options); 152 | 153 | if (options.append) { 154 | container.append(contents); 155 | } 156 | else { 157 | container.html(contents); 158 | } 159 | 160 | Installer.renderLangMessages(container); 161 | 162 | return this; 163 | }, 164 | 165 | sendRequest: function(handler, data, options) { 166 | var form = $(this), 167 | postData = form.serializeObject(), 168 | controlPanel = $('#formControlPanel'), 169 | nextButton = $('#nextButton'); 170 | 171 | options = $.extend(true, { 172 | loadingIndicator: true 173 | }, options); 174 | 175 | if (options.loadingIndicator) { 176 | nextButton.attr('disabled', true); 177 | controlPanel.addClass('loading'); 178 | } 179 | 180 | if (!data) { 181 | data = { handler: handler }; 182 | } 183 | else { 184 | data.handler = handler; 185 | } 186 | 187 | if (data) { 188 | $.extend(postData, data); 189 | } 190 | 191 | var postObj = $.post(window.location.pathname, postData) 192 | postObj.always(function(){ 193 | if (options.loadingIndicator) { 194 | nextButton.attr('disabled', false) 195 | controlPanel.removeClass('loading') 196 | } 197 | }) 198 | return postObj 199 | }, 200 | 201 | serializeObject: function() { 202 | var o = {}; 203 | var a = this.serializeArray(); 204 | $.each(a, function() { 205 | if (o[this.name] !== undefined) { 206 | if (!o[this.name].push) { 207 | o[this.name] = [o[this.name]]; 208 | } 209 | o[this.name].push(this.value || ''); 210 | } else { 211 | o[this.name] = this.value || ''; 212 | } 213 | }); 214 | return o; 215 | } 216 | }) 217 | 218 | $.extend({ 219 | sendRequest: function(handler, data, options) { 220 | return $('
').sendRequest(handler, data, options); 221 | } 222 | }) 223 | 224 | window.onpopstate = function(event) { 225 | // If progress page has rendered, disable navigation 226 | if (Installer.PageLocked) { 227 | // Do nothing 228 | } 229 | // Navigate back/foward through a known push state 230 | else if (event.state) { 231 | // Only allow navigation to previously rendered pages 232 | var noPop = (!Installer.Pages[event.state.page].isRendered || Installer.ActivePage == event.state.page) 233 | if (!noPop) { 234 | Installer.showPage(event.state.page, true); 235 | } 236 | } 237 | // Otherwise show the first page, if not already on it 238 | else if (Installer.ActivePage != 'langPicker') { 239 | Installer.showPage('langPicker', true); 240 | } 241 | } 242 | -------------------------------------------------------------------------------- /install_files/js/check.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * System Check Page (Step 1) 3 | */ 4 | Installer.Pages.systemCheck.title = 'webinstaller.system_check'; 5 | Installer.Pages.systemCheck.nextButton = 'webinstaller.agree_continue'; 6 | 7 | Installer.Pages.systemCheck.requirements = [ 8 | { code: 'phpVersion', label: 'webinstaller.require_php_version' }, 9 | { code: 'phpExtensions', label: 'webinstaller.require_php_extensions', subreason: 'webinstaller.require_php_extensions_subreason' }, 10 | { code: 'liveConnection', label: 'webinstaller.require_test_connection', reason: 'webinstaller.require_test_connection_reason' }, 11 | { code: 'writePermission', label: 'webinstaller.require_write_permissions', reason: 'webinstaller.require_write_permissions_reason' }, 12 | ]; 13 | 14 | Installer.Pages.systemCheck.reinit = function() { 15 | Installer.Pages.systemCheck.retry(); 16 | } 17 | 18 | Installer.Pages.systemCheck.init = function() { 19 | var checkList = $('#systemCheckList'), 20 | appEula = $('#appEula').hide(), 21 | systemCheckFailed = $('#systemCheckFailed').hide(), 22 | nextButton = $('#nextButton').addClass('disabled'), 23 | eventChain = [], 24 | failCodes = [], 25 | failReasons = [], 26 | success = true; 27 | 28 | // Lock navigation 29 | Installer.PageLocked = true; 30 | 31 | // Loops each requirement, posts it back and processes the result 32 | // as part of a waterfall 33 | $.each(this.requirements, function(index, requirement){ 34 | eventChain.push(function(){ 35 | var deferred = $.Deferred(); 36 | 37 | var requireLabel = Installer.getLang(requirement.label); 38 | if (requirement.code === 'phpVersion') { 39 | requireLabel = requireLabel.replace('%s', installerPhpVersion); 40 | } 41 | 42 | var item = $('
  • ').addClass('animated-content move_right').text(requireLabel); 43 | item.addClass('load animate fade_in'); 44 | checkList.append(item); 45 | 46 | $.sendRequest('onCheckRequirement', { code: requirement.code }, { loadingIndicator: false }) 47 | .done(function(data) { 48 | setTimeout(function() { 49 | if (data.result) { 50 | item.removeClass('load').addClass('pass'); 51 | deferred.resolve(); 52 | } 53 | else { 54 | // Fail the item but continue the waterfall. 55 | success = false; 56 | failCodes.push(requirement.code); 57 | if (data.subChecks && requirement.subreason) { 58 | failReasons.push(Installer.getLang(requirement.subreason).replace('%s', data.subChecks.join(', '))); 59 | } 60 | if (requirement.reason) { 61 | failReasons.push(Installer.getLang(requirement.reason)); 62 | } 63 | item.removeClass('load').addClass('fail'); 64 | deferred.resolve(); 65 | } 66 | }, 500) 67 | }).fail(function(data) { 68 | setTimeout(function() { 69 | success = false; 70 | failCodes.push(requirement.code); 71 | if (requirement.reason) { 72 | failReasons.push(requirement.reason); 73 | } 74 | if (data.responseText) { 75 | console.log('Failure reason: ' + data.responseText); 76 | } 77 | item.removeClass('load').addClass('fail'); 78 | deferred.resolve(); 79 | }, 500); 80 | }) 81 | 82 | return deferred; 83 | }) 84 | }) 85 | 86 | /* 87 | * Handle the waterfall result 88 | */ 89 | $.waterfall.apply(this, eventChain).done(function() { 90 | if (!success) { 91 | // Specific reasons are not currently being used. 92 | systemCheckFailed.show().addClass('animate fade_in'); 93 | systemCheckFailed.renderPartial('check/fail', { code: failCodes.join(', '), reason: failReasons.join(', ') }); 94 | } 95 | else { 96 | // Success 97 | appEula.show().addClass('animate fade_in'); 98 | nextButton.removeClass('disabled'); 99 | } 100 | }).always(function() { 101 | Installer.PageLocked = false; 102 | }); 103 | } 104 | 105 | Installer.Pages.systemCheck.next = function() { 106 | Installer.showPage('configForm'); 107 | } 108 | 109 | Installer.Pages.systemCheck.retry = function() { 110 | var self = Installer.Pages.systemCheck; 111 | $('#systemCheckList').html(''); 112 | self.init(); 113 | } 114 | -------------------------------------------------------------------------------- /install_files/js/complete.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Install Progress (Step 5) 3 | */ 4 | Installer.Pages.installComplete.title = 'Congratulations!' 5 | 6 | Installer.Pages.installComplete.beforeUnload = function() { 7 | // Hide the leaves 8 | $(document).octoberLeaves('stop'); 9 | } 10 | 11 | Installer.Pages.installComplete.beforeShow = function() { 12 | var backendUri = Installer.Data.config.backend_uri, 13 | baseUrl = installerBaseUrl; 14 | 15 | if (baseUrl.charAt(baseUrl.length - 1) == '/') { 16 | baseUrl = baseUrl.substr(0, baseUrl.length - 1); 17 | } 18 | 19 | Installer.Pages.installComplete.baseUrl = installerBaseUrl; 20 | Installer.Pages.installComplete.backendUrl = baseUrl + backendUri; 21 | } 22 | 23 | Installer.Pages.installComplete.init = function() { 24 | // Purrty leaves 25 | $(document).octoberLeaves({ numberOfLeaves: 10, cycleSpeed: 40 }); 26 | $(document).octoberLeaves('start'); 27 | } 28 | -------------------------------------------------------------------------------- /install_files/js/config.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Configuration Form (Step 2) 3 | */ 4 | Installer.Pages.configForm.title = 'installer.app_config_section'; 5 | Installer.Pages.configForm.nextButton = 'webinstaller.continue'; 6 | Installer.Pages.configForm.activeCategory = null; 7 | 8 | Installer.Pages.configForm.init = function() { 9 | $('#configForm').addClass('animate fade_in'); 10 | $('#configForm .section-content:first').renderPartial('config/config'); 11 | $('#configFormFailed').hide(); 12 | $('#configFormDatabase').renderPartial('config/sql'); 13 | } 14 | 15 | Installer.Pages.configForm.next = function() { 16 | var configFormFailed = $('#configFormFailed').hide().removeClass('animate fade_in'); 17 | Installer.Data.config = $('#configFormElement').serializeObject(); 18 | 19 | $('#configFormElement').sendRequest('onValidateConfig') 20 | .fail(function(data){ 21 | configFormFailed.show().addClass('animate fade_in'); 22 | configFormFailed.renderPartial('config/fail', { reason: data.responseText }); 23 | 24 | // Scroll browser to the bottom of the error 25 | var scrollTo = configFormFailed.offset().top - $(window).height() + configFormFailed.height() + 10; 26 | $('body, html').animate({ scrollTop: scrollTo }); 27 | }) 28 | .done(function(){ 29 | Installer.showPage('projectForm'); 30 | }); 31 | } 32 | 33 | Installer.Pages.configForm.toggleDatabase = function(el) { 34 | var selectedValue = $(el).val(), 35 | configFormDatabase = $('#configFormDatabase'), 36 | databasePartial = 'config/' + selectedValue; 37 | 38 | if (selectedValue === 'mysql' || selectedValue === 'pgsql' || selectedValue === 'sqlsrv') { 39 | databasePartial = 'config/sql'; 40 | } 41 | 42 | configFormDatabase.renderPartial(databasePartial); 43 | } 44 | -------------------------------------------------------------------------------- /install_files/js/lang.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lang Picker Page (Step 0) 3 | */ 4 | Installer.Pages.langPicker.title = 'Select Language'; 5 | Installer.Pages.langPicker.nextButton = null; 6 | 7 | Installer.Pages.langPicker.selectLanguage = function(lang) { 8 | Installer.Locale = lang; 9 | Installer.Pages.langPicker.next(); 10 | } 11 | 12 | Installer.Pages.langPicker.next = function() { 13 | Installer.showPage('systemCheck'); 14 | } 15 | -------------------------------------------------------------------------------- /install_files/js/progress.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Install Progress (Step 4) 3 | */ 4 | Installer.Pages.installProgress.title = 'Installation progress...' 5 | Installer.Pages.installProgress.steps = [ 6 | { code: 'getMetaData', label: 'Requesting package information' }, 7 | { code: 'downloadCore', label: 'Downloading application files' }, 8 | { code: 'extractCore', label: 'Unpacking application files' }, 9 | { code: 'setupConfig', label: 'Building configuration files' }, 10 | { code: 'setupProject', label: 'Setting website project' }, 11 | { code: 'composerUpdate', label: 'Updating package manager' }, 12 | { code: 'composerInstall', label: 'Installing application files' }, 13 | { code: 'migrateDatabase', label: 'Migrating database' }, 14 | { code: 'cleanInstall', label: 'Clean installation files' } 15 | ] 16 | 17 | Installer.Pages.installProgress.activeStep = null; 18 | 19 | Installer.Pages.installProgress.init = function() { 20 | var self = Installer.Pages.installProgress, 21 | eventChain = []; 22 | 23 | // Process each step 24 | $.each(self.steps, function(index, step){ 25 | eventChain = self.spoolStep(step, eventChain); 26 | }); 27 | 28 | // Lock navigation, forever 29 | Installer.PageLocked = true; 30 | 31 | self.run(eventChain); 32 | } 33 | 34 | Installer.Pages.installProgress.retry = function() { 35 | var self = Installer.Pages.installProgress, 36 | eventChain = [], 37 | skipStep = true; 38 | 39 | // Process each step 40 | $.each(self.steps, function(index, step){ 41 | if (step == self.activeStep) { 42 | skipStep = false; 43 | } 44 | 45 | if (skipStep) { 46 | return true; // Continue 47 | } 48 | 49 | eventChain = self.spoolStep(step, eventChain); 50 | }) 51 | 52 | self.run(eventChain); 53 | } 54 | 55 | Installer.Pages.installProgress.run = function(eventChain) { 56 | var installProgressFailed = $('#installProgressFailed').hide(); 57 | 58 | $.waterfall.apply(this, eventChain) 59 | .done(function() { 60 | Installer.showPage('installComplete'); 61 | }) 62 | .fail(function(reason){ 63 | Installer.setLoadingBar('failed'); 64 | installProgressFailed.show().addClass('animate fade_in'); 65 | installProgressFailed.renderPartial('progress/fail', { reason: reason }); 66 | }); 67 | } 68 | 69 | Installer.Pages.installProgress.spoolStep = function(step, eventChain) { 70 | var self = Installer.Pages.installProgress, 71 | result; 72 | 73 | // Set the active step 74 | eventChain.push(function(){ 75 | self.activeStep = step; 76 | return $.Deferred().resolve(); 77 | }); 78 | 79 | // Step mutator exists 80 | if (self.execStep[step.code]) { 81 | result = self.execStep[step.code](step); 82 | if (!$.isArray(result)) { 83 | result = [result]; 84 | } 85 | eventChain = $.merge(eventChain, result); 86 | } 87 | // Fall back on default logic 88 | else { 89 | eventChain.push(function(){ 90 | return self.execDefaultStep(step); 91 | }); 92 | } 93 | 94 | return eventChain; 95 | } 96 | 97 | Installer.Pages.installProgress.execDefaultStep = function(step, options) { 98 | var deferred = $.Deferred(), 99 | options = options || {}, 100 | postData = { step: step.code, meta: Installer.Data.meta }; 101 | 102 | if (options.extraData) { 103 | $.extend(true, postData, options.extraData); 104 | } 105 | 106 | Installer.setLoadingBar(true, step.label); 107 | 108 | $.sendRequest('onInstallStep', postData, { loadingIndicator: false }) 109 | .fail(function(data){ 110 | if (data.status == 504) { 111 | Installer.Pages.installProgress.timeoutRejection(deferred); 112 | } 113 | else { 114 | deferred.reject(data.responseText); 115 | } 116 | }) 117 | .done(function(data){ 118 | options.onSuccess && options.onSuccess(data); 119 | Installer.setLoadingBar(false); 120 | setTimeout(function() { deferred.resolve() }, 300); 121 | }); 122 | 123 | return deferred; 124 | } 125 | 126 | Installer.Pages.installProgress.timeoutRejection = function(deferred) { 127 | var webserverHints = ''; 128 | [ 129 | ['Apache', 'https://httpd.apache.org/docs/2.4/mod/core.html#timeout'], 130 | ['Nginx', 'http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout'] 131 | ] 132 | .forEach(function(webserver, index) { 133 | webserverHints += (index !== 0 ? ', ' : '') + '' + webserver[0] +''; 134 | }); 135 | 136 | deferred.reject( 137 | Installer.getLang('installer.operation_timeout_comment') + 138 | '

    ' + 139 | Installer.getLang('installer.operation_timeout_hint').replace(':name', webserverHints) 140 | ); 141 | } 142 | 143 | Installer.Pages.installProgress.execIterationStep = function(step, handlerCode, collection) { 144 | var eventChain = []; 145 | 146 | // Item must contain a code property 147 | $.each(collection, function(index, item){ 148 | var data = { name: item.code }; 149 | if (Installer.Data.project && Installer.Data.project.code) { 150 | data.project_id = Installer.Data.project.code; 151 | } 152 | 153 | eventChain.push(function(){ 154 | return Installer.Pages.installProgress.execDefaultStep({ 155 | code: handlerCode, 156 | label: step.label + item.code 157 | }, { extraData: data }); 158 | }); 159 | }); 160 | 161 | return eventChain; 162 | } 163 | 164 | /* 165 | * Specific logic to execute for each step 166 | * 167 | * These must return an anonymous function, or an array of anonymous functions, 168 | * that each return a deferred object 169 | */ 170 | 171 | Installer.Pages.installProgress.execStep = {}; 172 | 173 | Installer.Pages.installProgress.execStep.getMetaData = function(step) { 174 | return function() { 175 | var data = { 176 | plugins: Installer.DataSet.includedPlugins, 177 | themes: Installer.DataSet.includedThemes 178 | }; 179 | 180 | if (Installer.Data.project && Installer.Data.project.code) { 181 | data.project_id = Installer.Data.project.code; 182 | } 183 | 184 | return Installer.Pages.installProgress.execDefaultStep(step, { 185 | extraData: data, 186 | onSuccess: function(data) { 187 | // Save the result for later usage 188 | Installer.Data.meta = data.result; 189 | } 190 | }) 191 | } 192 | } 193 | 194 | Installer.Pages.installProgress.execStep.setupConfig = function(step) { 195 | return function() { 196 | var data = $.extend(true, {}, Installer.Data.config, { locale: Installer.Locale }); 197 | return Installer.Pages.installProgress.execDefaultStep(step, { extraData: data }); 198 | } 199 | } 200 | 201 | Installer.Pages.installProgress.execStep.migrateDatabase = function(step) { 202 | return function() { 203 | var data = $.extend(true, {}, Installer.Data.config, { is_clean_install: !Installer.Data.project }); 204 | return Installer.Pages.installProgress.execDefaultStep(step, { extraData: data }); 205 | } 206 | } 207 | 208 | Installer.Pages.installProgress.execStep.setupProject = function(step) { 209 | return function() { 210 | var data = $.extend(true, {}, Installer.Data.project, { disableLog: true }); 211 | return Installer.Pages.installProgress.execDefaultStep(step, { extraData: data }); 212 | } 213 | } 214 | 215 | Installer.Pages.installProgress.execStep.composerInstall = function(step) { 216 | return function() { 217 | var data = $.extend(true, {}, Installer.Data.meta.core, { is_clean_install: !Installer.Data.project }); 218 | return Installer.Pages.installProgress.execDefaultStep(step, { extraData: data }); 219 | } 220 | } 221 | 222 | Installer.Pages.installProgress.execStep.cleanInstall = function(step) { 223 | return function() { 224 | return Installer.Pages.installProgress.execDefaultStep(step, { extraData: Installer.Data.meta.core }); 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /install_files/js/project.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Packages & Install (Step 3) 3 | */ 4 | 5 | Installer.Pages.projectForm.title = 'webinstaller.license_details'; 6 | Installer.Pages.projectForm.nextButton = 'webinstaller.install_button'; 7 | 8 | Installer.Pages.projectForm.init = function() { 9 | var projectForm = $('#projectForm').addClass('animate fade_in'); 10 | 11 | Installer.Pages.projectForm.refreshSections(); 12 | 13 | $('#nextButton').addClass('disabled'); 14 | 15 | Installer.Pages.projectForm.bindAll(); 16 | } 17 | 18 | Installer.Pages.projectForm.next = function() { 19 | Installer.showPage('installProgress'); 20 | } 21 | 22 | Installer.Pages.projectForm.startClean = function() { 23 | Installer.showPage('installProgress'); 24 | } 25 | 26 | Installer.Pages.projectForm.bindAll = function() { 27 | Installer.Pages.projectForm.bindIncludeManager('#pluginList'); 28 | Installer.Pages.projectForm.bindIncludeManager('#themeList'); 29 | } 30 | 31 | Installer.Pages.projectForm.detachProject = function(el) { 32 | Installer.Data.project = null; 33 | Installer.DataSet.includedPlugins = []; 34 | Installer.DataSet.includedThemes = []; 35 | Installer.Pages.projectForm.refreshSections(); 36 | Installer.Pages.projectForm.bindAll(); 37 | 38 | $('#nextButton').addClass('disabled'); 39 | } 40 | 41 | Installer.Pages.projectForm.attachProject = function(el) { 42 | var 43 | $el = $(el), 44 | $input = $el.find('.project-id-input:first'), 45 | code = $input.val(), 46 | projectFormFailed = $('#projectFormFailed').hide().removeClass('animate fade_in'); 47 | 48 | $.sendRequest('onProjectDetails', { project_id: code }) 49 | .done(function(result){ 50 | Installer.Data.project = result; 51 | Installer.Data.project.code = code; 52 | Installer.DataSet.includedPlugins = result.plugins ? result.plugins : []; 53 | Installer.DataSet.includedThemes = result.themes ? result.themes : []; 54 | Installer.Pages.projectForm.refreshSections({ 55 | projectId: code, 56 | projectName: result.name, 57 | projectOwner: result.owner, 58 | projectDescription: result.description 59 | }); 60 | 61 | Installer.Pages.projectForm.bindAll(); 62 | $('#nextButton').removeClass('disabled'); 63 | }) 64 | .fail(function(data){ 65 | projectFormFailed.show().addClass('animate fade_in'); 66 | projectFormFailed.renderPartial('project/fail', { reason: data.responseText }); 67 | $('#nextButton').addClass('disabled'); 68 | }) 69 | } 70 | 71 | Installer.Pages.projectForm.bindIncludeManager = function(el) { 72 | var 73 | $el = $(el), 74 | $list = $el.find('.product-list:first'), 75 | $empty = $el.find('.product-list-empty:first'), 76 | $counter = $el.find('.product-counter:first'), 77 | partial = $el.data('view'), 78 | dataSetId = $el.data('set'), 79 | includedProducts = Installer.DataSet[dataSetId]; 80 | 81 | if (!$el.length) { 82 | return; 83 | } 84 | 85 | if (includedProducts.length == 0) { 86 | $empty.show(); 87 | } 88 | else { 89 | $.each(includedProducts, function(index, product){ 90 | $list.renderPartial( 91 | partial, 92 | $.extend(true, {}, product, { projectId: Installer.Data.project.code }), 93 | { append: true } 94 | ) 95 | }); 96 | $empty.hide(); 97 | } 98 | 99 | $counter.text(includedProducts.length); 100 | } 101 | 102 | Installer.Pages.projectForm.refreshSections = function(vars) { 103 | $('#projectForm').find('.section-content:first').renderPartial('project/project', vars); 104 | } 105 | -------------------------------------------------------------------------------- /install_files/lang/de.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Konfiguration der Applikation', 4 | 'license_section' => 'Lizenzierung', 5 | 'dependencies_section' => 'Installiere Abhängigkeiten', 6 | 'demo_section' => 'Beispielinhalte', 7 | 'locale_select_label' => 'Sprache wählen', 8 | 'locale_select_error' => 'Sprachauswahl ":code" ist ungültig', 9 | 'app_url_label' => 'Applikations-URL', 10 | 'backend_uri_label' => 'Backend-URL', 11 | 'backend_uri_comment' => 'Eine selbst gewählte Backend-URL trägt zur erhöhten Sicherheit deiner Applikation bei.', 12 | 'license_key_label' => 'Lizenzschlüssel', 13 | 'license_key_comment' => 'Gib einen gültigen Lizenzschlüssel ein um fortzufahren', 14 | 'license_thanks_comment' => 'Vielen Dank, dass du ein October CMS Kunde bist!', 15 | 'license_expired_comment' => 'Die Lizenz ist unbedzahlt oder abgelaufen. Besuche octobercms.com um eine neue Lizenz zu erwerben.', 16 | 'too_many_failures_label' => 'Zu viele Fehlversuche', 17 | 'non_interactive_label' => 'Nicht-interaktiver Modus erkannt', 18 | 'non_interactive_comment' => 'Wird dieser Fehler umgehend angezeigt, nutze die nicht-interaktiven Befehle.', 19 | 'install_failed_label' => 'Installation fehlgeschlagen', 20 | 'install_failed_comment' => 'Bitte führe die Befehle manuell aus.', 21 | 'database_engine_label' => 'Datenbank-Typ', 22 | 'database_host_label' => 'Datenbank-Host', 23 | 'database_host_comment' => 'Hostname für die Datenbankverbindung.', 24 | 'database_port_label' => 'Datenbank-Port', 25 | 'database_port_comment' => '(Optional) Ein Port für die Verbindung.', 26 | 'database_name_label' => 'Datenbank-Name', 27 | 'database_name_comment' => 'Gib den Namen der zu verwendenden Datenbank ein.', 28 | 'database_login_label' => 'Datenbank-Login', 29 | 'database_login_comment' => 'Benutzer, der mindestens über "create database" Berechtigungen verfügt.', 30 | 'database_pass_label' => 'Datenbank-Passwort', 31 | 'database_pass_comment' => 'Passwort des angegebenen Benutzers.', 32 | 'database_path_label' => 'Datenbank-Pfad', 33 | 'database_path_comment' => 'Für die Speicherung im Dateisystem, gib einen relativen Pfad zum Root-Verzeichnis der Applikation an.', 34 | 'migrate_database_comment' => 'Bitte migriere die Datenbank mit folgenden Befehlen', 35 | 'visit_backend_comment' => 'Öffne anschliessend das Admin-Backend über diese URL', 36 | 'open_configurator_comment' => 'Öffne diesen Link in einem Browser', 37 | 'install_demo_label' => 'Beispielinhalte installieren? (Empfohlen)', 38 | ], 39 | 'webinstaller' => [ 40 | 'license_agreement' => 'Lizenzbestimmungen', 41 | 'system_check' => 'Überprüfung des Systems', 42 | 'agree_continue' => 'Akzeptieren und weiter', 43 | 'continue' => 'Weiter', 44 | 'require_php_version' => 'PHP Version %s oder höher wird benötigt', 45 | 'require_php_extensions' => 'Benötigte PHP-Erweiterungen', 46 | 'require_php_extensions_subreason' => 'Die [%s] PHP-Erweiterungen werden benötigt.', 47 | 'require_test_connection' => 'Teste Verbindung zum Installationsserver', 48 | 'require_test_connection_reason' => 'Sicherstellen, dass Verbindungen nach gateway.octobercms.com möglich sind.', 49 | 'require_write_permissions' => 'Berechtigungen um Dateien und Ordner zu erstellen', 50 | 'require_write_permissions_reason' => 'Der Installer konnte nicht ins Installationsverzeichnis schreiben.', 51 | 'config_backend_uri_header' => 'Gib eine eigene URL für den Administrationsbereich an', 52 | 'config_database_header' => 'Eine leere Datenbank wird für diese Installation benötigt', 53 | 'project_license' => 'Projekt-Lizenz', 54 | 'license_details' => 'Lizenzdetails', 55 | 'install_button' => 'Installation starten!', 56 | 'explain_license' => 'October CMS ist nicht kostenlos. Jede Website, die mit October CMS erstellt wird, benötigt eine kostenpflichtige Lizenz.', 57 | 'explain_license_instructions' => 'Du kannst eine Lizenz auf der October CMS Website erwerben, in dem du ein neues Projekt erstellst.', 58 | 'explain_license_finish' => 'Klicke anschliessend auf die Start-Aktion unten um fortzufahren.', 59 | 'howto_find_project_id' => 'Lizenzschlüssel finden', 60 | 'install_without_license' => 'Ohne Linzenz fortfahren', 61 | 'install_without_license_confirm' => 'Diese Funktion dient dazu, zu überprüfen, ob dein Server October CMS betreiben kann. Fortfahren?', 62 | 'project_check_button' => 'Überprüfen', 63 | 'project_remove_button' => 'Entfernen', 64 | 'project_key_check_failed' => 'Lizenzprüfung', 65 | 'project_name' => 'Name', 66 | 'project_owner' => 'Inhaber', 67 | 'project_description' => 'Beschreibung', 68 | 'project_included_plugins' => 'Enthaltene Plugins', 69 | 'project_included_plugins_none' => 'Das Projekt enthält keine Plugins.', 70 | 'project_included_themes' => 'Enthaltene Themes', 71 | 'project_included_themes_none' => 'Das Projekt enthält keine Themes.', 72 | ], 73 | ]; 74 | -------------------------------------------------------------------------------- /install_files/lang/en.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Application Configuration', 4 | 'license_section' => 'License Key', 5 | 'dependencies_section' => 'Installing Dependencies', 6 | 'demo_section' => 'Demo Content', 7 | 'locale_select_label' => 'Select Language', 8 | 'locale_select_error' => 'Language code :code is invalid, please try again', 9 | 'app_url_label' => 'Application URL', 10 | 'backend_uri_label' => 'Backend URI', 11 | 'backend_uri_comment' => 'To secure your application, use a custom address for accessing the admin panel.', 12 | 'license_key_label' => 'License Key', 13 | 'license_key_comment' => 'Enter a valid License Key to proceed.', 14 | 'license_thanks_comment' => 'Thanks for being a customer of October CMS!', 15 | 'license_expired_comment' => 'License is unpaid or has expired. Please visit octobercms.com to obtain a license.', 16 | 'too_many_failures_label' => 'Too many failed attempts', 17 | 'non_interactive_label' => 'Non Interactive Mode Detected', 18 | 'non_interactive_comment' => 'If you see this error immediately, use these non-interactive commands instead.', 19 | 'install_failed_label' => 'Installation Failed', 20 | 'install_failed_comment' => 'Please try running these commands manually.', 21 | 'database_engine_label' => 'Database Engine', 22 | 'database_host_label' => 'Database Host', 23 | 'database_host_comment' => 'Hostname for the database connection.', 24 | 'database_port_label' => 'Database Port', 25 | 'database_port_comment' => '(Optional) A port for the connection.', 26 | 'database_name_label' => 'Database Name', 27 | 'database_name_comment' => 'Specify the name of the database to use.', 28 | 'database_login_label' => 'Database Login', 29 | 'database_login_comment' => 'User with create database privileges.', 30 | 'database_pass_label' => 'Database Password', 31 | 'database_pass_comment' => 'Password for the specified user.', 32 | 'database_path_label' => 'Database Path', 33 | 'database_path_comment' => 'For file-based storage, enter a path relative to the application root directory.', 34 | 'migrate_database_comment' => 'Please migrate the database with the following command', 35 | 'visit_backend_comment' => 'Then, open the administration area at this URL', 36 | 'open_configurator_comment' => 'Open this application in your browser', 37 | 'install_demo_label' => 'Install the demonstration theme and content? (Recommended)', 38 | 'operation_timeout_comment' => 'The operation timed out. Please increase the server\'s timeout and try again.', 39 | 'operation_timeout_hint' => 'See the relevant documentation for :name.', 40 | ], 41 | 'webinstaller' => [ 42 | 'license_agreement' => 'License Agreement', 43 | 'system_check' => 'System Check', 44 | 'agree_continue' => 'Agree & Continue', 45 | 'continue' => 'Continue', 46 | 'require_php_version' => 'PHP version %s or greater required', 47 | 'require_php_extensions' => 'Required PHP Extensions', 48 | 'require_php_extensions_subreason' => 'The PHP settings or extensions are required: [%s].', 49 | 'require_test_connection' => 'Test connection to the installation server', 50 | 'require_test_connection_reason' => 'Check that your server can make outgoing connections to gateway.octobercms.com.', 51 | 'require_write_permissions' => 'Permission to write to directories and files', 52 | 'require_write_permissions_reason' => 'The installer was unable to write to the installation directories and files.', 53 | 'config_backend_uri_header' => 'Provide a custom URL for the Administration Area', 54 | 'config_database_header' => 'Please prepare an empty database for this installation', 55 | 'project_license' => 'Project License', 56 | 'license_details' => 'License Details', 57 | 'install_button' => 'Install!', 58 | 'explain_license' => 'October CMS is not free software. A license with a small fee is required for each website you build with October CMS.', 59 | 'explain_license_instructions' => 'You may purchase a license at the October CMS website by creating a new project.', 60 | 'explain_license_finish' => 'When finished, click the Install button below to continue.', 61 | 'howto_find_project_id' => 'How to find your License Key', 62 | 'install_without_license' => 'Install without a License', 63 | 'install_without_license_confirm' => 'This is used to test if your server can run an October CMS installation. Continue?', 64 | 'project_check_button' => 'Check', 65 | 'project_remove_button' => 'Remove', 66 | 'project_key_check_failed' => 'Check the supplied License Key', 67 | 'project_name' => 'Name', 68 | 'project_owner' => 'Owner', 69 | 'project_description' => 'Description', 70 | 'project_included_plugins' => 'Included Plugins', 71 | 'project_included_plugins_none' => 'There are no plugins included with this project.', 72 | 'project_included_themes' => 'Included Themes', 73 | 'project_included_themes_none' => 'There are no themes included with this project.', 74 | ], 75 | 'locale' => [ 76 | 'ar' => 'العربية', 77 | 'be' => 'Беларуская', 78 | 'bg' => 'Български', 79 | 'ca' => 'Català', 80 | 'cs' => 'Čeština', 81 | 'da' => 'Dansk', 82 | 'de' => 'Deutsch', 83 | 'el' => 'Ελληνικά', 84 | 'en' => 'English (United States)', 85 | 'en-au' => 'English (Australia)', 86 | 'en-ca' => 'English (Canada)', 87 | 'en-gb' => 'English (United Kingdom)', 88 | 'et' => 'Eesti', 89 | 'es' => 'Español', 90 | 'es-ar' => 'Español (Argentina)', 91 | 'fa' => 'فارسی', 92 | 'fi' => 'Suomi', 93 | 'fr' => 'Français', 94 | 'fr-ca' => 'Français (Canada)', 95 | 'hu' => 'Magyar', 96 | 'id' => 'Bahasa Indonesia', 97 | 'it' => 'Italiano', 98 | 'ja' => '日本語', 99 | 'kr' => '한국어', 100 | 'lt' => 'Lietuvių', 101 | 'lv' => 'Latviešu', 102 | 'nb-no' => 'Norsk (Bokmål)', 103 | 'nl' => 'Nederlands', 104 | 'pl' => 'Polski', 105 | 'pt-br' => 'Português (Brasil)', 106 | 'pt-pt' => 'Português (Portugal)', 107 | 'ro' => 'Română', 108 | 'ru' => 'Русский', 109 | 'sk' => 'Slovenský', 110 | 'sl' => 'Slovenščina', 111 | 'sv' => 'Svenska', 112 | 'th' => 'ไทย', 113 | 'tr' => 'Türkçe', 114 | 'uk' => 'Українська мова', 115 | 'vn' => 'Tiếng việt', 116 | 'zh-cn' => '简体中文', 117 | 'zh-tw' => '繁體中文', 118 | ], 119 | ]; 120 | -------------------------------------------------------------------------------- /install_files/lang/fi.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Sovelluksen konfigurointi', 4 | 'license_section' => 'Lisenssiavain', 5 | 'dependencies_section' => 'Asennetaan riippuvuudet', 6 | 'locale_select_label' => 'Valitse kieli', 7 | 'locale_select_error' => 'Kielikoodi :code on virheellinen, yritä uudelleen', 8 | 'app_url_label' => 'Sovelluksen URL-osoite', 9 | 'backend_uri_label' => 'Ylläpidon URI', 10 | 'backend_uri_comment' => 'Tee sovelluksesta turvallisempi ja käytä omaa osoitetta ylläpitopaneliin.', 11 | 'license_key_label' => 'Lisenssiavain', 12 | 'license_key_comment' => 'Anna voimassa oleva lisenssiavain jatkaaksesi.', 13 | 'license_thanks_comment' => 'Kiitos, että olet valinnut OctoberCMS:n!', 14 | 'license_expired_comment' => 'Lisenssi ei ole voimassa. Ole hyvä ja hanki lisenssi osoitteesta octobercms.com.', 15 | 'too_many_failures_label' => 'Liian monta väärää yritystä', 16 | 'non_interactive_label' => 'Ei-interaktiivinen moodi valittu', 17 | 'non_interactive_comment' => 'Jos saat tämän virheen heti, käytä näitä ei-interaktiivisia käskyjä.', 18 | 'install_failed_label' => 'Installation Failed', 19 | 'install_failed_comment' => 'Please try running these commands manually.', 20 | 'database_engine_label' => 'Database Engine', 21 | 'database_host_label' => 'Database Host', 22 | 'database_host_comment' => 'Hostname for the database connection.', 23 | 'database_port_label' => 'Database Port', 24 | 'database_port_comment' => '(Optional) A port for the connection.', 25 | 'database_name_label' => 'Database Name', 26 | 'database_name_comment' => 'Specify the name of the database to use.', 27 | 'database_login_label' => 'Database Login', 28 | 'database_login_comment' => 'User with create database privileges.', 29 | 'database_pass_label' => 'Database Password', 30 | 'database_pass_comment' => 'Password for the specified user.', 31 | 'database_path_label' => 'Database Path', 32 | 'database_path_comment' => 'For file-based storage, enter a path relative to the application root directory.', 33 | 'migrate_database_comment' => 'Please migrate the database with the following command', 34 | 'visit_backend_comment' => 'Then, open the administration area at this URL', 35 | 'open_configurator_comment' => 'Open this application in your browser', 36 | ], 37 | ]; 38 | -------------------------------------------------------------------------------- /install_files/lang/fr.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Configuration de l\'application', 4 | 'license_section' => 'Clé de licence', 5 | 'dependencies_section' => 'Installation des dépendances', 6 | 'locale_select_label' => 'Choisir la langue', 7 | 'locale_select_error' => 'Le code de langue :code n\'est pas valide, veuillez réessayer', 8 | 'app_url_label' => 'URL de l\'application', 9 | 'backend_uri_label' => 'URI du backend', 10 | 'backend_uri_comment' => 'Pour sécuriser votre application, utilisez une adresse personnalisée pour accéder au panneau d\'administration.', 11 | 'license_key_label' => 'Clé de licence', 12 | 'license_key_comment' => 'Entrez une clé de licence valide pour continuer.', 13 | 'license_thanks_comment' => 'Merci d\'être client d\'Octobre CMS!', 14 | 'license_expired_comment' => 'La licence n\'est pas payée ou a expiré. Veuillez visiter octobercms.com pour obtenir une licence.', 15 | 'too_many_failures_label' => 'Trop de tentatives échouées', 16 | 'non_interactive_label' => 'Mode non interactif détecté', 17 | 'non_interactive_comment' => 'Si vous voyez cette erreur immédiatement, utilisez plutôt ces commandes non interactives.', 18 | 'install_failed_label' => 'L\'installation a échoué', 19 | 'install_failed_comment' => 'Veuillez essayer d\'exécuter ces commandes manuellement.', 20 | 'database_engine_label' => 'Moteur de base de données', 21 | 'database_host_label' => 'Hôte de la base de données', 22 | 'database_host_comment' => 'Nom d\'hôte de la connexion à la base de données.', 23 | 'database_port_label' => 'Port de base de données', 24 | 'database_port_comment' => '(Optionnel) Un port pour la connexion.', 25 | 'database_name_label' => 'Nom de la base de données', 26 | 'database_name_comment' => 'Spécifiez le nom de la base de données à utiliser.', 27 | 'database_login_label' => 'Connexion à la base de données', 28 | 'database_login_comment' => 'Utilisateur avec des privilèges de création de base de données.', 29 | 'database_pass_label' => 'Mot de passe de la base de données', 30 | 'database_pass_comment' => 'Mot de passe de l\'utilisateur spécifié.', 31 | 'database_path_label' => 'Chemin de la base de données', 32 | 'database_path_comment' => 'Pour le stockage basé sur des fichiers, entrez un chemin relatif au répertoire racine de l\'application.', 33 | 'migrate_database_comment' => 'Veuillez migrer la base de données avec la commande suivante', 34 | 'visit_backend_comment' => 'Ensuite, ouvrez la zone d\'administration à cette URL', 35 | 'open_configurator_comment' => 'Ouvrez cette application dans votre navigateur', 36 | ], 37 | 'webinstaller' => [ 38 | 'license_agreement' => 'Accord de licence', 39 | 'system_check' => 'Verification du système', 40 | 'agree_continue' => 'Accepter et continuer', 41 | 'continue' => 'Continuer', 42 | 'require_php_version' => 'Version PHP %s ou supérieure requise', 43 | 'require_php_extensions' => 'Extensions PHP requises', 44 | 'require_php_extensions_subreason' => 'Les extensions PHP [%s] sont requises.', 45 | 'require_test_connection' => 'Tester la connexion au serveur d\'installation', 46 | 'require_test_connection_reason' => 'Vérifiez que votre serveur peut établir des connexions sortantes vers gateway.octobercms.com.', 47 | 'require_write_permissions' => 'Autorisation d\'écrire dans les répertoires et les fichiers', 48 | 'require_write_permissions_reason' => 'Le programme d\'installation n\'a pas pu écrire dans les répertoires et les fichiers d\'installation.', 49 | 'config_backend_uri_header' => 'Fournir une URL personnalisée pour la zone d\'administration', 50 | 'config_database_header' => 'Veuillez préparer une base de données vide pour cette installation', 51 | 'project_license' => 'Licence de projet', 52 | 'license_details' => 'Détails de la licence', 53 | 'install_button' => 'Installer!', 54 | 'explain_license' => 'Octobre CMS n\'est pas un logiciel libre. Une licence avec une somme modique est requise pour chaque site Web que vous créez avec October CMS.', 55 | 'explain_license_instructions' => 'Vous pouvez acheter une licence sur le site Web du Octobre CMS en créant un nouveau projet.', 56 | 'explain_license_finish' => 'Lorsque vous avez terminé, cliquez sur le bouton Installer ci-dessous pour continuer.', 57 | 'howto_find_project_id' => 'Comment trouver votre clé de licence', 58 | 'install_without_license' => 'Installer sans licence', 59 | 'install_without_license_confirm' => 'Ceci est utilisé pour tester si votre serveur peut exécuter une installation Octobre CMS. Continuer?', 60 | 'project_check_button' => 'Vérifier', 61 | 'project_remove_button' => 'Retirer', 62 | 'project_key_check_failed' => 'Vérifiez la clé de licence fournie', 63 | 'project_name' => 'Nom', 64 | 'project_owner' => 'Propriétaire', 65 | 'project_description' => 'La description', 66 | 'project_included_plugins' => 'Plugins inclus', 67 | 'project_included_plugins_none' => 'Il n\'y a pas de plugins inclus avec ce projet.', 68 | 'project_included_themes' => 'Thèmes inclus', 69 | 'project_included_themes_none' => 'Il n\'y a pas de thèmes inclus avec ce projet.', 70 | ], 71 | ]; 72 | -------------------------------------------------------------------------------- /install_files/lang/hu.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Weboldal konfigurálása', 4 | 'license_section' => 'Licenc kulcs', 5 | 'dependencies_section' => 'Függőségek telepítése', 6 | 'locale_select_label' => 'Válasszon nyelvet', 7 | 'locale_select_error' => 'A(z) :code nyelvi kód helytelen, kérjük módosítsa azt.', 8 | 'app_url_label' => 'Honlap webcíme', 9 | 'backend_uri_label' => 'Admin felület címe', 10 | 'backend_uri_comment' => 'A weboldal védelme érdekében használjon egyéni címet az adminisztrációs panel eléréséhez.', 11 | 'license_key_label' => 'Licenc kulcs', 12 | 'license_key_comment' => 'A folytatáshoz adjon meg egy érvényes licenc kulcsot.', 13 | 'license_thanks_comment' => 'Köszönjük, hogy az October CMS rendszert választotta!', 14 | 'license_expired_comment' => 'A licenc kifizetetlen vagy lejárt. Kérjük, látogasson el az octobercms.com webhelyre, hogy licencet szerezzen.', 15 | 'too_many_failures_label' => 'Túl sok sikertelen próbálkozás', 16 | 'non_interactive_label' => 'Nem interaktív mód észlelve', 17 | 'non_interactive_comment' => 'Ha ezt a hibát látja, használja ezeket a parancsokat.', 18 | 'install_failed_label' => 'Sikertelen telepítés', 19 | 'install_failed_comment' => 'Próbálja meg manuálisan futtatni ezeket a parancsokat.', 20 | 'database_engine_label' => 'Adatbázis motor', 21 | 'database_host_label' => 'Adatbázis hoszt', 22 | 'database_host_comment' => 'Az adatbázis kapcsolat gépneve.', 23 | 'database_port_label' => 'Adatbázis port', 24 | 'database_port_comment' => '(Opcionális) Csatlakozáshoz szükséges port.', 25 | 'database_name_label' => 'Adatbázis neve', 26 | 'database_name_comment' => 'Adja meg a használni kívánt adatbázis nevét', 27 | 'database_login_label' => 'Adatbázis belépés', 28 | 'database_login_comment' => 'Felhasználó adatbázis jogosultságokkal.', 29 | 'database_pass_label' => 'Adatbázis jelszó', 30 | 'database_pass_comment' => 'Jelszó a megadott felhasználó számára.', 31 | 'database_path_label' => 'Adatbázis útvonal', 32 | 'database_path_comment' => 'A fájl alapú tároláshoz adjon meg egy elérési utat az weboldal gyökérkönyvtárához képest.', 33 | 'migrate_database_comment' => 'Kérjük, migrálja az adatbázist a következő paranccsal', 34 | 'visit_backend_comment' => 'Ezután nyissa meg az adminisztrációs felületet ezen a webcímen', 35 | 'open_configurator_comment' => 'Nyissa meg a weboldalt a böngészőjében', 36 | ], 37 | ]; 38 | -------------------------------------------------------------------------------- /install_files/lang/nl.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Applicatie configuratie', 4 | 'license_section' => 'Licentiecode', 5 | 'dependencies_section' => 'Installeren van vereiste pakketten', 6 | 'locale_select_label' => 'Selecteer taal', 7 | 'locale_select_error' => 'Taalcode :code is ongeldig, probeer het opnieuw', 8 | 'app_url_label' => 'Applicatie URL', 9 | 'backend_uri_label' => 'Back-end URI', 10 | 'backend_uri_comment' => 'Voor een betere beveiliging van de applicatie is het aanbevolen om een afwijkende back-end URI te kiezen.', 11 | 'license_key_label' => 'Licentiecode', 12 | 'license_key_comment' => 'Voer een geldige licentiecode in om verder te gaan.', 13 | 'license_thanks_comment' => 'Bedankt dat je hebt gekozen voor October CMS!', 14 | 'license_expired_comment' => 'De licentie is niet betaald of is verlopen. Bezoek octobercms.com om een licentiecode te verkrijgen.', 15 | 'too_many_failures_label' => 'Teveel mislukte pogingen', 16 | 'non_interactive_label' => 'Niet-interactieve modus gedetecteerd', 17 | 'non_interactive_comment' => 'Zie je deze fout meteen? Gebruik dan deze niet-interactieve commando\'s.', 18 | 'install_failed_label' => 'Installatie mislukt', 19 | 'install_failed_comment' => 'Pobeer deze commando\'s handmatig uit te voeren.', 20 | 'database_engine_label' => 'Database engine', 21 | 'database_host_label' => 'Database hostnaam', 22 | 'database_host_comment' => 'Hostnaam voor de database connectie.', 23 | 'database_port_label' => 'Database poort', 24 | 'database_port_comment' => '(Optioneel) De poort voor de database connectie.', 25 | 'database_name_label' => 'Databasenaam', 26 | 'database_name_comment' => 'Voer de naam in van de database die gebruikt moet worden.', 27 | 'database_login_label' => 'Database gebruiker', 28 | 'database_login_comment' => 'De gebruiker die voldoende privileges heeft om database tabellen aan te maken.', 29 | 'database_pass_label' => 'Database wachtwoord', 30 | 'database_pass_comment' => 'Wachtwoord van de opgegeven database gebruiker.', 31 | 'database_path_label' => 'Database pad', 32 | 'database_path_comment' => 'Voor bestandsgebaseerde opslag geef je het bestandspad op relatief aan de root-directory van de applicatie.', 33 | 'migrate_database_comment' => 'Migreer de database met het volgende commando', 34 | 'visit_backend_comment' => 'En open vervolgens het beheergedeelte op deze URL', 35 | 'open_configurator_comment' => 'Open deze applicatie in je browser', 36 | ], 37 | ]; 38 | -------------------------------------------------------------------------------- /install_files/lang/pt-br.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Configuração da aplicaçao', 4 | 'license_section' => 'Chave de licença', 5 | 'dependencies_section' => 'Instalando dependências', 6 | 'demo_section' => 'Conteúdo de demonstração', 7 | 'locale_select_label' => 'Selecionar idioma', 8 | 'locale_select_error' => 'Código do idioma :code é inválido, tente novamente', 9 | 'app_url_label' => 'URL da aplicação', 10 | 'backend_uri_label' => 'URI do painel', 11 | 'backend_uri_comment' => 'Para proteger sua aplicaçao, use um endereço personalizado para acessar o painel de administração.', 12 | 'license_key_label' => 'Chave de licença', 13 | 'license_key_comment' => 'Digite uma chave de licença válida para continuar.', 14 | 'license_thanks_comment' => 'Obrigado por ser cliente do October CMS!', 15 | 'license_expired_comment' => 'A licença não foi paga ou expirou. Visite octobercms.com para obter uma licença.', 16 | 'too_many_failures_label' => 'Muitas tentativas falhadas', 17 | 'non_interactive_label' => 'Modo não interativo detectado', 18 | 'non_interactive_comment' => 'Se você vir este erro imediatamente, use estes comandos não interativos.', 19 | 'install_failed_label' => 'Falha na instalação', 20 | 'install_failed_comment' => 'Por favor, tente executar estes comandos manualmente.', 21 | 'database_engine_label' => 'Motor de Banco de Dados', 22 | 'database_host_label' => 'Host do banco de dados', 23 | 'database_host_comment' => 'Nome do host para a conexão do banco de dados.', 24 | 'database_port_label' => 'Porta do banco de dados', 25 | 'database_port_comment' => '(Opcional) Uma porta para a conexão.', 26 | 'database_name_label' => 'Nome do banco de dados', 27 | 'database_name_comment' => 'Especifique o nome do banco de dados a ser usado.', 28 | 'database_login_label' => 'Login do banco de dados', 29 | 'database_login_comment' => 'Usuário com privilégios de criação de banco de dados.', 30 | 'database_pass_label' => 'Senha do banco de dados', 31 | 'database_pass_comment' => 'Senha para o usuário especificado.', 32 | 'database_path_label' => 'Caminho do banco de dados', 33 | 'database_path_comment' => 'Para armazenamento baseado em arquivo, insira um caminho relativo ao diretório raiz do aplicativo.', 34 | 'migrate_database_comment' => 'Por favor, migre o banco de dados com o seguinte comando', 35 | 'visit_backend_comment' => 'Então, abra a área de administração nesta URL', 36 | 'open_configurator_comment' => 'Abra a aplicação em seu navegador', 37 | 'install_demo_label' => 'Instalar o tema de demonstração e conteúdo? (Recomendado)', 38 | ], 39 | ]; 40 | -------------------------------------------------------------------------------- /install_files/lang/ru.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => 'Конфигурация приложения', 4 | 'license_section' => 'Лицензионный ключ', 5 | 'dependencies_section' => 'Установка зависимостей', 6 | 'demo_section' => 'Демо контент', 7 | 'locale_select_label' => 'Выберите язык', 8 | 'locale_select_error' => 'Код языка :code ошибочен, попробуйте еще раз', 9 | 'app_url_label' => 'URL приложения', 10 | 'backend_uri_label' => 'URI панели управления', 11 | 'backend_uri_comment' => 'Чтобы защитить свое приложение, введите иной адрес для доступа к панели администратора.', 12 | 'license_key_label' => 'Лицензионный ключ', 13 | 'license_key_comment' => 'Введите лицензионный ключ чтобы продолжить.', 14 | 'license_thanks_comment' => 'Спасибо за то что пользуетесь October CMS!', 15 | 'license_expired_comment' => 'Лицензия не оплачена или истекла. Посетите octobercms.com чтобы получить лицензию.', 16 | 'too_many_failures_label' => 'Слишком много неудачных попыток', 17 | 'non_interactive_label' => 'Обнаружен не интерактивный режим', 18 | 'non_interactive_comment' => 'Если вы видите эту ошибку, используйте вместо нее эти не интерактивные команды.', 19 | 'install_failed_label' => 'Установка не удалась', 20 | 'install_failed_comment' => 'Пожалуйста попробуйте ввести эти команды вручную.', 21 | 'database_engine_label' => 'Движок базы данных', 22 | 'database_host_label' => 'Хост базы данных', 23 | 'database_host_comment' => 'Хост для подключения к БД.', 24 | 'database_port_label' => 'Порт базы данных', 25 | 'database_port_comment' => '(Опционально) Порт для подключения к БД.', 26 | 'database_name_label' => 'Имя базы данных', 27 | 'database_name_comment' => 'Укажите имя используемой базы данных.', 28 | 'database_login_label' => 'Логин от пользователя базы данных', 29 | 'database_login_comment' => 'Пользователь с возможностью создания таблиц', 30 | 'database_pass_label' => 'Пароль от пользователя базы данных', 31 | 'database_pass_comment' => 'Пароль для указанного пользователя', 32 | 'database_path_label' => 'Путь к базе данных', 33 | 'database_path_comment' => 'Введите путь относительно корневого каталога приложения.', 34 | 'migrate_database_comment' => 'Пожалуйста, мигрируйте базу данных с помощью следующей команды', 35 | 'visit_backend_comment' => 'Затем, откройте панель управления по следующему URL', 36 | 'open_configurator_comment' => 'Откройте приложение в браузере', 37 | 'install_demo_label' => 'Установить демо шаблон и контент? (Рекомендуется)', 38 | ], 39 | ]; 40 | -------------------------------------------------------------------------------- /install_files/lang/zh-cn.php: -------------------------------------------------------------------------------- 1 | [ 3 | 'app_config_section' => '应用程序配置', 4 | 'license_section' => '许可证密钥', 5 | 'dependencies_section' => '安装依赖', 6 | 'locale_select_label' => '选择语言', 7 | 'locale_select_error' => '语言代码:代码无效,请重试', 8 | 'app_url_label' => '应用程序 URL', 9 | 'backend_uri_label' => '后端 URI', 10 | 'backend_uri_comment' => '为了保护您的应用程序,请使用自定义地址来访问管理面板。', 11 | 'license_key_label' => '许可证密钥', 12 | 'license_key_comment' => '输入有效的许可证密钥以继续。', 13 | 'license_thanks_comment' => '感谢您成为October客户!', 14 | 'license_expired_comment' => '许可证未支付或已过期。请访问 october.com 获取许可证。', 15 | 'too_many_failures_label' => '失败的尝试太多', 16 | 'non_interactive_label' => '检测到非交互模式', 17 | 'non_interactive_comment' => '如果您立即看到此错误,请改用这些非交互式命令。', 18 | 'install_failed_label' => '安装失败', 19 | 'install_failed_comment' => '请尝试手动运行这些命令。', 20 | 'database_engine_label' => '数据库引擎', 21 | 'database_host_label' => '数据库主机', 22 | 'database_host_comment' => '数据库连接的主机名。', 23 | 'database_port_label' => '数据库端口', 24 | 'database_port_comment' => '(可选)连接端口。', 25 | 'database_name_label' => '数据库名称', 26 | 'database_name_comment' => '指定要使用的数据库名称。', 27 | 'database_login_label' => '数据库登录', 28 | 'database_login_comment' => '具有创建数据库权限的用户。', 29 | 'database_pass_label' => '数据库密码', 30 | 'database_pass_comment' => '指定用户的密码。', 31 | 'database_path_label' => '数据库路径', 32 | 'database_path_comment' => '对于基于文件的存储,输入相对于应用程序根目录的路径。', 33 | 'migrate_database_comment' => '请使用以下命令迁移数据库', 34 | 'visit_backend_comment' => '然后,在这个 URL 打开管理区域', 35 | 'open_configurator_comment' => '在浏览器中打开这个应用程序', 36 | ], 37 | ]; 38 | -------------------------------------------------------------------------------- /install_files/partials/check.htm: -------------------------------------------------------------------------------- 1 | 2 |
      3 | 4 | 5 |
      6 | 7 | 8 |
      9 |

      License Agreement

      10 |
      11 |
      12 |

      This End User License Agreement (“EULA”) constitutes a binding agreement between you (the “Licensee”, “you” or “your”) and Responsiv Pty Ltd - ACN 159 492 823 (the “Company”, “we”, “us” or “our”) with respect to your use of the October CMS software (“Licensed Software” or “October CMS Software”). The Company and the Licensee are each individually referred to as “Party” and collectively as “Parties”.

      13 |

      Please carefully read the terms and conditions of this EULA before installing and using the Licensed Software. By using the Licensed Software, you represent that you have read this EULA, and you agree to be bound by all the terms and conditions of this EULA, including any other agreements and policies referenced in this EULA. If you do not agree with any provisions of this EULA, please do not install the October CMS Software.

      14 |

      The Company reserves the right to modify or discontinue the October CMS Software or any portion thereof, temporarily or permanently, with or without notice to you. The Company will not be under any obligation to support or update the Licensed Software, except as described in this EULA.

      15 |

      YOU AGREE THAT THE COMPANY SHALL NOT BE LIABLE TO YOU OR ANY THIRD PARTY IN THE EVENT THAT WE EXERCISE OUR RIGHT TO MODIFY OR DISCONTINUE THE LICENSED SOFTWARE OR ANY PORTION THEREOF.

      16 |

      Summary

      17 |

      This section outlines some of the key provisions covered in this EULA. Please note that this summary is provided for your convenience only, and it does not relieve you of your obligation to read the full EULA before installing/using the October CMS Software.

      18 |

      By proceeding to use the October CMS Software, you understand and agree that:

      19 |
        20 |
      • 21 |

        You must be at least 18 years of age to enter into this EULA;

        22 |
      • 23 |
      • 24 |

        You will only use the October CMS Software in compliance with applicable laws;

        25 |
      • 26 |
      • 27 |

        October CMS Software licenses are only issued for Projects created through the website. To acquire/renew your Project licence, you need to sign in to your October CMS Account, and select/create the Project for which you wish to acquire/renew the licence;

        28 |
      • 29 |
      • 30 |

        You will be responsible for paying the full License Fee prior to installing the October CMS Software;

        31 |
      • 32 |
      • 33 |

        All License Fee Payments are non-refundable;

        34 |
      • 35 |
      • 36 |

        Upon full payment of the License Fee, you will receive a License Key that allows you to install the Licensed Software to create a single production or non-production website and ancillary installations needed to support that single production or non-production website;

        37 |
      • 38 |
      • 39 |

        Each new/renewed Project licence comes with one year of Updates. You may continue to use your expired Project license in perpetuity, but if you wish to continue receiving all the Updates, you will be required to keep your Project licence active by renewing it every year;

        40 |
      • 41 |
      • 42 |

        Subject to the payment of full License Fee and compliance with this EULA, the Company and its third party licensors grant you a limited, non-exclusive, non-transferable, non-assignable, perpetual and worldwide license to install and/or use the October CMS Software;

        43 |
      • 44 |
      • 45 |

        The Company and its licensors retain all rights, title and interest in the October CMS Software, Documentation and other similar proprietary materials made available to you;

        46 |
      • 47 |
      • 48 |

        You will not sublicense, resell, distribute, or transfer the Licensed Software to any third party without the Company’s prior written consent;

        49 |
      • 50 |
      • 51 |

        You will not remove, obscure or otherwise modify any copyright notices from the October CMS Software files or this EULA;

        52 |
      • 53 |
      • 54 |

        You will not modify, disassemble, or reverse engineer any part of the October CMS Software;

        55 |
      • 56 |
      • 57 |

        You will take all required steps to prevent unauthorised installation/use of the October CMS Software and prevent any breach of this EULA;

        58 |
      • 59 |
      • 60 |

        The Company may terminate this EULA if you are in breach of any provision of this EULA or if we discontinue the October CMS Software;

        61 |
      • 62 |
      • 63 |

        SUBJECT TO YOUR STATUTORY RIGHTS, THE COMPANY PROVIDES THE OCTOBER CMS SOFTWARE TO YOU “AS IS” AND “WITH ALL FAULTS”. THE COMPANY DOES NOT OFFER ANY WARRANTIES, WHETHER EXPRESS OR IMPLIED. IN NO EVENT WILL THE COMPANY’S AGGREGATE LIABILITY TO YOU FOR ANY CLAIMS CONNECTED WITH THIS EULA OR THE OCTOBER CMS SOFTWARE EXCEED THE AMOUNT ACTUALLY PAID BY YOU TO THE COMPANY FOR THE OCTOBER CMS SOFTWARE IN THE TWELVE MONTHS PRECEDING THE DATE WHEN THE CLAIM FIRST AROSE;

        64 |
      • 65 |
      • 66 |

        This EULA shall be governed by and construed in accordance with the laws of the state of New South Wales, Australia, without giving effect to any principles of conflict of laws.

        67 |
      • 68 |
      69 |

      Table of Contents

      70 |
        71 |
      • 1. Definitions
      • 72 |
      • 2. Authorisation
      • 73 |
      • 3. License Grant
      • 74 |
      • 4. License Purchase and Renewal
      • 75 |
      • 5. License Fees, Payments and Refunds
      • 76 |
      • 6. Ownership
      • 77 |
      • 7. Use and Restrictions
      • 78 |
      • 8. Technical Support
      • 79 |
      • 9. Termination
      • 80 |
      • 10. Statutory Consumer Rights
      • 81 |
      • 11. Disclaimer of Warranties
      • 82 |
      • 12. Limitation of Liability
      • 83 |
      • 13. Waiver
      • 84 |
      • 14. Indemnification
      • 85 |
      • 15. Compliance with the Laws
      • 86 |
      • 16. Data Protection
      • 87 |
      • 17. Delivery
      • 88 |
      • 18. General
      • 89 |
      90 |

      91 |

      1. Definitions

      92 |

      The following words shall have the meaning given hereunder whenever they appear in this EULA:

      93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 |
      TermDefinition
      Accountrefers to a user account registered on the Website by an individual or entity.
      Active Termmeans the period commencing from the date of License purchase/renewal until the License expiry date as specified on the Project page in your Account.
      Documentationmeans the current version of the documentation relating to the October CMS Software available at https://docs.octobercms.com or otherwise made available by the Company in electronic format. Documentation includes but is not limited to installation instructions, user guides and help documents regarding the use of the October CMS Software.
      License Feemeans the fee payable by the Licensee for the use of the October CMS Software in accordance with the provisions of this EULA and any other applicable agreements referenced in this EULA.
      License Keymeans a unique string of characters provided by the Company that enables users to install the October CMS Software for a specific Project.
      Modificationsmeans any changes to the original code or files of the October CMS Software by the Licensee or any third party. For the avoidance of any doubt, the term “Modifications” does not include any Updates furnished by the Company.
      October CMS Softwarerefers to the collection of proprietary code and graphics in various file formats provided by the Company to the Licensee.
      Projectmeans a collection of extensions and themes to be used in a single production website.
      Updatesmeans all new releases of the October CMS Software, including but not limited to new features and fixes which are provided by the Company to a Licensee during the Active Term of the License.
      The Websiterefers to the Company website located at www.octobercms.com.
      143 |

      144 |

      2. Authorisation

      145 |

      You must be at least 18 years of age and have the legal capacity to enter into this EULA. If you are accepting this EULA on behalf of a corporation, organisation, or other legal entity (‘corporate entity’), you warrant that you have the authority to enter into this EULA on behalf of such corporate entity and to bind the former to this EULA.

      146 |

      147 |

      3. License Grant

      148 |

      Subject to your compliance with all the terms and conditions of this EULA and the payment of the full License Fee, the Company and its third party licensors grant you a limited, non-exclusive, non-transferable, non-assignable, perpetual and worldwide license to install and/or use the October CMS Software.

      149 |

      You shall be solely responsible for ensuring that all your authorised employees, contractors or other users of the Licensed Software comply with all the terms and conditions of this EULA, and any failure to comply with this EULA will be deemed as a breach of this EULA by you.

      150 |

      The Company and its third party licensors may make changes to the Licensed Software, which are provided to you through Updates. You will only receive all such Updates during the Active Term of your license. You will not have any right to receive Updates after the expiration of your license. Please note that if you terminate your Account, you will not be able to access your Projects and renew your license/receive any future Updates.

      151 |

      UNLESS EXPRESSLY PROVIDED IN THIS EULA, YOU MAY NOT COPY OR MODIFY THE OCTOBER CMS SOFTWARE.

      152 |

      153 |

      4. License Purchase and Renewal

      154 |

      October CMS Software licenses are only issued for Projects created through the Website. To acquire a new Project licence or to renew an existing Project licence, you must sign in to your October CMS Account and select/create the Project for which you wish to acquire/renew the licence.

      155 |

      Upon full payment of the License Fee, you will receive a License Key that allows you to install the Licensed Software to create a single production or non-production website and ancillary installations needed to support that single production or non-production website.

      156 |

      Each new/renewed Project licence comes with one year of Updates starting from the date on which you pay the License Fee. You are not under any legal obligation to renew your Project licence, and you can continue to use your expired Project license for your website in perpetuity. Please note that expired Project licenses do not receive any Updates. If you wish to continue receiving all the Updates, you will be required to keep your Project licence active by renewing it every year.

      157 |

      By installing and using the October CMS Software, you assume full responsibility for your selection of the Licensed Software, its installation, and the results obtained from the use of the October CMS Software.

      158 |

      159 |

      5. License Fees, Payments and Refunds

      160 |

      The current License Fee for the October CMS Software is published on the Website, and the amount is specified in United States Dollars (USD). The License fee as specified on the Website does not include any taxes which shall be payable by the Licensee in addition to the License Fee.

      161 |

      The License fee becomes due and payable in full at the time the Licensee purchases a new Project license or renews an existing Project license.

      162 |

      All Project licenses are issued/renewed subject to the payment of the License Fee by the Licensee as outlined in Section 7 of our Website Terms of Use and incorporated into this EULA by reference. The Company reserves the right to refuse issuance of a new Project license or renewal of an existing license until the Company receives the full payment.

      163 |

      To the extent permitted by law, all License Fee payments are non-refundable.

      164 |

      165 |

      6. Ownership

      166 |

      Nothing in this EULA constitutes the sale of October CMS Software to you. The Company and its licensors retain all rights, title and interest in the October CMS Software, Documentation and other similar proprietary materials made available to you (collectively “Proprietary Material”). All Proprietary Material is protected by copyright and other intellectual property laws of Australia and international conventions. You acknowledge that the October CMS Software may contain some open source software that is not owned by the Company and which shall be governed by its own license terms.

      167 |

      Except where authorised by the Company in writing, any use of the October CMS trademark, trade name, or logo is strictly prohibited. The Company reserves all rights that are not expressly granted in and to the Proprietary Material.

      168 |

      169 |

      7. Use and Restrictions

      170 |

      You hereby agree that:

      171 |
        172 |
      1. 173 |

        A License Key may only be used to create a single production or non-production website as provided in Section 4 (License Purchase and Renewal) of this EULA. If you wish to create another website, you will need to create a new Project and acquire a new License for that Project;

        174 |
      2. 175 |
      3. 176 |

        Unless expressly provided otherwise in this EULA or other applicable agreements referenced herein, you will not sublicense, resell, distribute, or transfer the Licensed Software to any third party without the Company’s prior written consent;

        177 |
      4. 178 |
      5. 179 |

        You will not remove, obscure or otherwise modify any copyright notices from the October CMS Software files or this EULA;

        180 |
      6. 181 |
      7. 182 |

        You will not modify, disassemble, or reverse engineer any part of the October CMS Software;

        183 |
      8. 184 |
      9. 185 |

        You will take all required steps to prevent unauthorised installation/use of the October CMS Software and prevent any breach of this EULA;

        186 |
      10. 187 |
      11. 188 |

        You do not receive any rights, interests or titles in the “October CMS” trademark, trade name or service mark (“Marks”), and you will not use any of these Marks without our express consent.

        189 |
      12. 190 |
      191 |

      192 |

      8. Technical Support

      193 |

      The Company does not offer any technical support except as described in our Premium Support Policy. The Company reserves the right to deny any and all technical support for any Modifications of the October CMS Software or in the event of any breach of this EULA.

      194 |

      195 |

      9. Termination

      196 |

      This EULA shall remain effective until terminated by either Party as described below.

      197 |

      9.1 Termination by Licensee

      198 |

      You may terminate this EULA by uninstalling the October CMS Software and deleting all files and your Account. Please note that once you delete your Account, you will not be able to reactivate it to restore your Projects and access your License Key.

      199 |

      9.2 Termination by the Company

      200 |

      The Company may terminate this EULA if you are in breach of any provision of this EULA or if we discontinue the October CMS Software.

      201 |

      9.3 Survival

      202 |

      Section 11 (Disclaimer of Warranties), Section 12 (Limitation of Liability), Section 13 (Waiver), Section 14 (Indemnification) and other sections of this EULA that by their nature are intended to survive the termination of this EULA shall survive.

      203 |

      Unless expressly specified otherwise in this EULA, any termination of this EULA either by you or the Company does not create any obligation on the Company to issue a full or partial refund of the License Fee paid by you.

      204 |

      205 |

      10. Statutory Consumer Rights

      206 |

      10.1 CONSUMERS IN AUSTRALIA

      207 |

      If you acquire the October CMS Software license as a “consumer”, nothing in this EULA will exclude, limit or modify any rights and guarantees conferred on you by legislation, including the Australian Consumer Law (ACL) in the Competition and Consumer Act 2010 (Cth) (‘Statutory Rights’). If the Company is in breach of any such Statutory Rights, then the Company’s liability shall be limited (at the Company’s option) to:

      208 |

      10.1.1 In case of products supplied to you, to resupplying, replacing or paying the cost of resupplying or replacing the product in respect of which the breach occurred;

      209 |

      10.1.2 In case of services supplied to you, to resupply the service or to pay the cost of resupplying the service in respect of which the breach occurred.

      210 |

      Unless expressly specified otherwise in this EULA, you agree that the Company’s liability for the October CMS Software is governed solely by this EULA and the Australian Consumer Law.

      211 |

      10.1 CONSUMERS OUTSIDE OF AUSTRALIA

      212 |

      If you are deemed a “consumer” by statutory law in your country of residence, you may enjoy some legal rights under your local law which prohibit the exclusions, modification or limitations of certain liabilities from applying to you, and where such prohibition exists in your country of residence, any such limitations or exclusions will only apply to you to the extent it is permitted by your local law.

      213 |

      You agree that apart from the application of your statutory consumer rights, the Company’s liability for the October CMS Software is governed solely by this EULA.

      214 |

      215 |

      11. Disclaimer of Warranties

      216 |

      SUBJECT TO YOUR STATUTORY RIGHTS AS PROVIDED IN SECTION 10 ABOVE, THE COMPANY PROVIDES THE OCTOBER CMS SOFTWARE TO YOU “AS IS” AND “WITH ALL FAULTS”.

      217 |

      EXCLUDING ANY EXPRESS WARRANTIES OFFERED IN THIS EULA, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE COMPANY, ITS EMPLOYEES, DIRECTORS, CONTRACTORS, AFFILIATES (“THE COMPANY AND ITS OFFICERS”) DISCLAIM ANY EXPRESS OR IMPLIED WARRANTIES WITH RESPECT TO THE OCTOBER CMS SOFTWARE, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, RELIABILITY, COURSE OF PERFORMANCE OR USAGE IN TRADE. THE COMPANY DOES NOT WARRANT THAT THE OCTOBER CMS SOFTWARE: WILL MEET YOUR REQUIREMENTS; WILL BE UNINTERRUPTED, ERROR-FREE, OR SECURE; OR THAT THE COMPANY WILL BE ABLE TO RECTIFY ANY ERRORS, BUGS, SECURITY VULNERABILITIES. NO OBLIGATION, WARRANTIES OR LIABILITY SHALL ARISE OUT OF ANY TECHNICAL SUPPORT SERVICES PROVIDED BY THE COMPANY AND ITS OFFICERS IN CONNECTION WITH THE OCTOBER CMS SOFTWARE. NO VERBAL OR WRITTEN COMMUNICATION RECEIVED FROM THE COMPANY AND ITS OFFICERS, WHETHER MARKETING, PROMOTIONAL OR TECHNICAL SUPPORT, SHALL CREATE ANY WARRANTIES THAT ARE NOT EXPRESSLY PROVIDED IN THIS EULA.

      218 |

      ALTHOUGH THE COMPANY PERIODICALLY RELEASES UPDATES FOR THE OCTOBER CMS SOFTWARE THAT MAY INCLUDE FIXES FOR KNOWN VULNERABILITIES, YOU ACKNOWLEDGE AND AGREE THAT THERE MAY BE VULNERABILITIES THAT THE COMPANY HAS NOT YET IDENTIFIED AND THEREFORE CANNOT ADDRESS. YOU ACKNOWLEDGE AND AGREE THAT YOU ARE SOLELY RESPONSIBLE FOR TAKING ALL THE PRECAUTIONS AND SAFEGUARDS NECESSARY TO PROTECT YOUR WEBSITE AND DATA FROM ANY EXTERNAL ATTACKS, INCLUDING BUT NOT LIMITED TO KEEPING YOUR OCTOBER CMS SOFTWARE INSTALLATION CURRENT AND UP TO DATE.

      219 |

      SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU.

      220 |

      221 |

      12. Limitation of Liability

      222 |

      IN NO EVENT SHALL THE COMPANY BE LIABLE TO YOU OR ANY THIRD-PARTY FOR ANY LOSS OF REVENUE, LOSS OF PROFITS (ACTUAL OR ANTICIPATED), LOSS OF SAVINGS (ACTUAL OR ANTICIPATED), LOSS OF OPPORTUNITY, LOSS OF REPUTATION, LOSS OF GOODWILL OR FOR ANY INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES RESULTING FROM THE INSTALLATION, USE OR INABILITY TO USE THE OCTOBER CMS SOFTWARE, WHETHER ARISING FROM ANY BREACH OF CONTRACT, NEGLIGENCE OR ANY OTHER THEORY OF LIABILITY, EVEN IF THE COMPANY WAS PREVIOUSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE LICENSEE SHALL BE SOLELY RESPONSIBLE FOR DETERMINING THE SUITABILITY OF THE LICENSED SOFTWARE AND ALL RISKS ASSOCIATED WITH ITS USE.

      223 |

      IN NO EVENT WILL THE COMPANY’S AGGREGATE LIABILITY TO YOU FOR ANY CLAIMS CONNECTED WITH THIS EULA OR THE OCTOBER CMS SOFTWARE, INCLUDING THOSE ARISING FROM ANY BREACH OF CONTRACT OR NEGLIGENCE, EXCEED THE AMOUNT ACTUALLY PAID BY YOU TO THE COMPANY FOR THE OCTOBER CMS SOFTWARE IN THE TWELVE MONTHS PRECEDING THE DATE WHEN THE CLAIM FIRST AROSE.

      224 |

      NOTWITHSTANDING ANYTHING TO THE FOREGOING, NOTHING IN THIS PROVISION SHALL LIMIT EITHER PARTY’S LIABILITY FOR ANY FRAUD OR LIABILITY THAT CANNOT BE LIMITED BY LAW.

      225 |

      226 |

      13. Waiver

      227 |

      YOU HEREBY RELEASE THE COMPANY AND ITS OFFICERS FROM ALL UNKNOWN RISKS ARISING OUT OF OR ASSOCIATED WITH THE USE OF THE OCTOBER CMS SOFTWARE. IF YOU ARE A RESIDENT IN THE STATE OF CALIFORNIA, U.S.A., YOU EXPRESSLY WAIVE CALIFORNIA CIVIL CODE SECTION 1542, OR OTHER SIMILAR LAW APPLICABLE TO YOU, WHICH STATES: “A GENERAL RELEASE DOES NOT EXTEND TO CLAIMS WHICH THE CREDITOR DOES NOT KNOW OR SUSPECT TO EXIST IN HIS OR HER FAVOR AT THE TIME OF EXECUTING THE RELEASE, WHICH IF KNOWN BY HIM OR HER MUST HAVE MATERIALLY AFFECTED HIS OR HER SETTLEMENT WITH THE DEBTOR OR RELEASED PARTY. ”

      228 |

      YOU ACKNOWLEDGE AND AGREE THAT THE LIMITATION OF LIABILITY AND THE WAIVER SET FORTH ABOVE REFLECT A REASONABLE AND FAIR ALLOCATION OF RISK BETWEEN YOU AND THE COMPANY AND THAT THESE PROVISIONS FORM AN ESSENTIAL BASIS OF THE BARGAIN BETWEEN YOU AND THE COMPANY. THE COMPANY WOULD NOT BE ABLE TO PROVIDE THE OCTOBER CMS SOFTWARE TO YOU ON AN ECONOMICALLY REASONABLE BASIS WITHOUT THESE LIMITATIONS.

      229 |

      230 |

      14. Indemnification

      231 |

      14.1 The Company will defend or settle any claims against you that allege that the October CMS Software as supplied to you for installation and use in accordance with this EULA and Documentation infringes the intellectual property rights of a third party provided that:

      232 |

      14.1.1 You immediately notify the Company of any such claim that relates to this indemnity;

      233 |

      14.1.2 The Company has the sole right to control the defence or settlement of such claim; and

      234 |

      14.1.3 You provide the Company with all reasonable assistance in relation to the defence.

      235 |

      14.2 For any claims of infringement of intellectual property mentioned in Section 14.1, the Company reserves the right to:

      236 |

      14.2.1 Modify or replace the Licensed Software to make it non-infringing provided such modification or replacement does not substantively change the functionality of the Licensed Software; or

      237 |

      14.2.2 Acquire at its own expense the right for you to continue the use of the Licensed Software; or

      238 |

      14.2.3 Terminate the Project license and direct you to cease the use of the Licensed Software. In such cases, the Company will provide you with a full refund of the License Fees paid by you for the Licensed Software in the preceding 12 months. Please note that where the Company directs you to cease the use of the October CMS Software due to a third party claim of infringement, you are under a legal obligation to immediately cease such use.

      239 |

      Unless otherwise provided by law, this Section 14 sets out your exclusive remedies for any infringement of intellectual property claims made by a third party against you and nothing in this EULA will create any obligations on the Company to offer greater indemnity. The Company does not have any obligation to defend or indemnify any other third party.

      240 |

      14.3 The Company shall not have any obligation to indemnify you if:

      241 |

      14.3.1 The infringement arises out of any Modification of the October CMS Software;

      242 |

      14.3.2 The infringement arises from any combination, operation, or use of the Licensed Software with any other third party software;

      243 |

      14.3.3 The infringement arises from the use of the Licensed Software in breach of this EULA;

      244 |

      14.3.4 The infringement arises from the use of the Licensed Software after the Company has informed you to cease the use of the Licensed Software due to possible claims.

      245 |

      14.4 You will indemnify the Company against any third party claims, damages, losses and costs, including reasonable attorney fees arising from:

      246 |

      14.4.1 Your actions or omissions (actual or alleged), including without limitation, claims that your actions or omission infringe any third party’s intellectual property rights; or

      247 |

      14.4.2 Your violation of any applicable laws; or

      248 |

      14.4.3 Your breach of this EULA.

      249 |

      250 |

      15. Compliance with the Laws

      251 |

      You will only install/use the October CMS Software and fulfil all your obligations under this EULA in compliance with all applicable laws. You hereby confirm that neither you nor the corporate entity that you represent is subject or target of any government Sanctions, and your use of the October CMS Software would not result in violation of any Sanctions by the Company.

      252 |

      You further confirm that the Licensed Software will not be used by any individual or entity engaged in any of the following activities: (i) Terrorist activities; (ii) design, development or production of any weapons of mass destruction; or (iii) any other illegal activity.

      253 |

      254 |

      16. Data Protection

      255 |

      The Company only collects minimal personal data from the Licensee, as described in our Privacy Policy. The Company does not process any data on behalf of the Licensee, and the Licensee shall be solely responsible for compliance with applicable data protection laws for any data it controls or processes.

      256 |

      257 |

      17. Delivery

      258 |

      The Company will deliver the October CMS Software and this EULA to you by electronic download.

      259 |

      260 |

      18. General

      261 |

      18.1 Amendments

      262 |

      The Company reserves the right to amend the terms and conditions of this EULA at any time and without giving any prior notice to you. You acknowledge that you are responsible for periodically reviewing this EULA to familiarise yourself with any changes. Your continued use of the October CMS Software after any changes to the EULA shall constitute your consent to such change. You can access the latest version of the EULA by visiting https://octobercms.com/eula

      263 |

      18.2 Assignment

      264 |

      You may not assign any rights and obligations under this EULA, in whole or in part, without an authorised Company representative's written consent. Any attempt to assign any rights and obligations without the Company's consent shall be void. The Company reserves the right to assign any of its rights and obligations under this EULA to a third party without requiring your consent.

      265 |

      18.3 Notices

      266 |

      You hereby consent to receive all notices and communication from the Company electronically.

      267 |

      All notices to the Company under this EULA shall be sent to:

      268 |

      PO Box 47
      269 | Queanbeyan NSW 2620
      270 | Australia

      271 |

      For any other questions relating to this EULA, please contact us at https://octobercms.com/contact

      272 |

      18.4 Governing Law and Jurisdiction

      273 |

      This EULA shall be governed by and construed in accordance with the laws of the state of New South Wales, Australia, without giving effect to any principles of conflict of laws. The parties hereby agree to submit to the non-exclusive jurisdiction of the courts of New South Wales to decide any matter arising out of these Terms. Both Parties hereby agree that the United Nations Convention on Contracts for the International Sale of Goods will not apply to this EULA.

      274 |

      18.5 Force Majeure

      275 |

      Neither Party will be liable to the other for any failure or delay in the performance of its obligations to the extent that such failure or delay is caused by any unforeseen events which are beyond the reasonable control of the obligated Party such as an act of God, strike, war, terrorism, epidemic, internet or telecommunication outage or other similar events, and the obligated Party is not able to avoid or remove the force measure by taking reasonable measures.

      276 |
      277 |
      278 |
      279 | -------------------------------------------------------------------------------- /install_files/partials/check/fail.htm: -------------------------------------------------------------------------------- 1 |
      2 |

      System Check Failed

      3 |

      4 | {{#reason}}{{reason}}{{/reason}} 5 | {{^reason}}Your system does not meet the minimum requirements for the installation.{{/reason}} 6 | Please see the documentation for more information. 7 |

      8 |

      Retry System Check

      9 | Reason code: {{code}} 10 |
      11 | -------------------------------------------------------------------------------- /install_files/partials/complete.htm: -------------------------------------------------------------------------------- 1 |
      2 | 3 |

      Installation has been successfully completed

      4 | 5 | 6 |
      7 |
      8 |

      Website Address

      9 |

      Your website is located at this URL:

      10 |

      {{baseUrl}}

      11 |
      12 | 13 |
      14 |

      Administration Panel

      15 |

      Use the following link to access the admin panel:

      16 |

      {{backendUrl}}

      17 |
      18 |
      19 | 20 |
      21 | 22 | 23 |
      24 |

      Post-install Configuration

      25 |

      26 | Now that we're done, there a few things you may want to address for the smooth operation of your site. Please review the 27 | installation help guide 28 | for further instructions. 29 |

      30 |
      31 |
      32 | -------------------------------------------------------------------------------- /install_files/partials/config.htm: -------------------------------------------------------------------------------- 1 | 2 |
      3 | 4 | 5 |
      6 | 7 |
      8 |
      9 | 10 | 11 |
      12 | 13 | 14 |
      15 | -------------------------------------------------------------------------------- /install_files/partials/config/config.htm: -------------------------------------------------------------------------------- 1 |

      webinstaller.config_backend_uri_header

      2 | 3 |
      4 | 5 |
      6 |
      7 | getBaseUrl() ?> 8 | 13 |
      14 | installer.backend_uri_comment 15 |
      16 |
      17 | 18 |

      webinstaller.config_database_header

      19 | 20 |
      21 | 22 |
      23 |
      24 | 25 | 33 | 34 | 35 | 36 | 43 | 44 | 45 | 46 | 53 | 54 | 55 | 56 | 63 | 64 | 65 |
      66 |
      67 |
      68 | 69 |
      70 | -------------------------------------------------------------------------------- /install_files/partials/config/fail.htm: -------------------------------------------------------------------------------- 1 |
      2 |

      {{reason}}

      3 |

      There is a problem with the specified configuration.

      4 |
      5 | -------------------------------------------------------------------------------- /install_files/partials/config/sql.htm: -------------------------------------------------------------------------------- 1 |
      2 | 3 |
      4 | 10 | installer.database_host_comment 11 |
      12 |
      13 | 14 |
      15 | 16 |
      17 | 23 | installer.database_port_comment 24 |
      25 |
      26 | 27 |
      28 | 29 |
      30 | 36 | installer.database_name_comment 37 |
      38 |
      39 | 40 |
      41 | 42 |
      43 | 49 | installer.database_login_comment 50 |
      51 |
      52 | 53 |
      54 | 55 |
      56 | 63 | installer.database_pass_comment 64 |
      65 |
      66 | 67 | -------------------------------------------------------------------------------- /install_files/partials/config/sqlite.htm: -------------------------------------------------------------------------------- 1 |
      2 | 3 |
      4 | 10 | installer.database_path_comment 11 |
      12 |
      13 | -------------------------------------------------------------------------------- /install_files/partials/footer.htm: -------------------------------------------------------------------------------- 1 |
      2 |
      3 | 4 | 5 |
      6 | {{#nextButton}} 7 | {{nextButton}} 8 | {{/nextButton}} 9 |
      10 | 11 |
      12 |
      -------------------------------------------------------------------------------- /install_files/partials/header.htm: -------------------------------------------------------------------------------- 1 |
      2 |
      3 | 4 | 5 |

      October

      6 | 7 |
      8 |
      -------------------------------------------------------------------------------- /install_files/partials/lang.htm: -------------------------------------------------------------------------------- 1 | 2 |
      3 |
      4 |
      5 | getAvailableLocales() as $key => $info): ?> 6 | 10 | 11 | 12 | 13 | 14 |
      15 |
      16 |
      17 | -------------------------------------------------------------------------------- /install_files/partials/progress.htm: -------------------------------------------------------------------------------- 1 | 2 |
      3 |
      4 |
      5 |
      6 |

      7 |
      8 | 9 | 10 |
      -------------------------------------------------------------------------------- /install_files/partials/progress/fail.htm: -------------------------------------------------------------------------------- 1 |
      2 | {{#reason}} 3 |

      {{{reason}}}

      4 | {{/reason}} 5 | {{^reason}} 6 |

      Progress failed

      7 | {{/reason}} 8 |

      9 | Something went wrong during the installation. 10 | Please check the log file (install_files/install.log) or see 11 | the documentation 12 | for more information. 13 |

      14 |

      Try again

      15 |
      16 | -------------------------------------------------------------------------------- /install_files/partials/project.htm: -------------------------------------------------------------------------------- 1 | 2 |
      3 | 4 |
      5 |
      6 | 7 |
      8 | 9 |
      10 |
      11 | 12 |
      13 | 28 |
      29 | 30 |
      31 | -------------------------------------------------------------------------------- /install_files/partials/project/fail.htm: -------------------------------------------------------------------------------- 1 |
      2 |

      webinstaller.project_key_check_failed

      3 |

      {{reason}}

      4 |
      5 | -------------------------------------------------------------------------------- /install_files/partials/project/plugin.htm: -------------------------------------------------------------------------------- 1 |
    • 2 |
      3 | 4 |
      5 |
      6 |

      {{name}}

      7 |

      {{description}}

      8 |
      9 |
    • 10 | -------------------------------------------------------------------------------- /install_files/partials/project/project.htm: -------------------------------------------------------------------------------- 1 | {{^projectId}} 2 |

      installer.license_key_comment

      3 | {{/projectId}} 4 | {{#projectId}} 5 |

      installer.license_thanks_comment

      6 | {{/projectId}} 7 | 8 |
      9 |
      10 | 11 | 12 | {{^projectId}} 13 | 14 |
      15 | 21 | 22 | 23 | 24 |
      25 | 26 | {{/projectId}} 27 | {{#projectId}} 28 | 29 |
      30 | 36 | 37 | 42 | 43 |
      44 | 45 | {{/projectId}} 46 | 47 |
      48 |
      49 | 50 | 51 |
      52 | 53 | {{^projectId}} 54 | 55 | 59 | 60 | {{/projectId}} 61 | {{#projectId}} 62 | 63 |
      64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |
      webinstaller.project_name{{ projectName }}
      webinstaller.project_owner{{ projectOwner }}
      webinstaller.project_description{{ projectDescription }}
      78 |
      79 | 80 |
      81 | 82 | 83 |
      84 |

      webinstaller.project_included_plugins (0)

      85 |
      86 |

      webinstaller.project_included_plugins_none

      87 |
      88 |
        89 |
        90 | 91 |
        92 | 93 |
        94 | 95 | 96 |
        97 |

        webinstaller.project_included_themes (0)

        98 |
        99 |

        webinstaller.project_included_themes_none

        100 |
        101 |
          102 |
          103 | 104 |
          105 | 106 | {{/projectId}} 107 | -------------------------------------------------------------------------------- /install_files/partials/project/theme.htm: -------------------------------------------------------------------------------- 1 |
        • 2 |
          3 | 4 |
          5 |
          6 |

          {{name}}

          7 |

          {{description}}

          8 |
          9 |
        • 10 | -------------------------------------------------------------------------------- /install_files/partials/title.htm: -------------------------------------------------------------------------------- 1 |
          2 |
          3 | 4 | 5 |

          {{title}}

          6 | 7 |
          8 |
          9 | 10 | {{#isStep0}} 11 |
          12 |

          1

          13 |

          2

          14 |

          3

          15 |
          16 | {{/isStep0}} 17 | 18 | {{#isStep1}} 19 |
          20 |

          1

          21 |

          2

          22 |

          3

          23 |
          24 | {{/isStep1}} 25 | 26 | {{#isStep2}} 27 |
          28 |

          1

          29 |

          2

          30 |

          3

          31 |
          32 | {{/isStep2}} 33 | 34 | {{#isStep3}} 35 |
          36 |

          1

          37 |

          2

          38 |

          3

          39 |
          40 | {{/isStep3}} 41 | 42 |
          43 |
          -------------------------------------------------------------------------------- /install_files/php/Installer.php: -------------------------------------------------------------------------------- 1 | baseDirectory = PATH_INSTALL; 33 | $this->tempDirectory = PATH_INSTALL . '/install_files/temp'; 34 | $this->configDirectory = $this->baseDirectory . '/config'; 35 | $this->logFile = PATH_INSTALL . '/install_files/install.log'; 36 | $this->logPost(); 37 | 38 | if (!is_null($handler = $this->post('handler'))) { 39 | if (!strlen($handler)) { 40 | exit; 41 | } 42 | 43 | try { 44 | if (!preg_match('/^on[A-Z]{1}[\w+]*$/', $handler)) 45 | throw new Exception(sprintf('Invalid handler: %s', $this->e($handler))); 46 | 47 | if (method_exists($this, $handler) && ($result = $this->$handler()) !== null) { 48 | $this->log('Execute handler [%s]', $handler); 49 | $this->log($result); 50 | header('Content-Type: application/json'); 51 | die(json_encode($result)); 52 | } 53 | } 54 | catch (Exception $ex) { 55 | header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); 56 | $this->log('Handler error (%s): %s', $handler, $ex->getMessage()); 57 | $this->log(array('Trace log:', '%s'), $ex->getTraceAsString()); 58 | die($this->e($ex->getMessage())); 59 | } 60 | 61 | exit; 62 | } 63 | } 64 | 65 | /** 66 | * getUpdateWantVersion 67 | */ 68 | public function getUpdateWantVersion() 69 | { 70 | return WANT_OCTOBER_VERSION; 71 | } 72 | 73 | /** 74 | * getLang 75 | */ 76 | public function getLang($key, $vars = []) 77 | { 78 | return str_replace('system::lang.', '', $key); 79 | } 80 | 81 | // 82 | // Installation Steps 83 | // 84 | 85 | /** 86 | * buildConfigFile 87 | */ 88 | protected function buildConfigFile() 89 | { 90 | if (!$this->checkEnvWritable()) { 91 | throw new Exception('Cannot write to .env file!'); 92 | } 93 | 94 | $dbType = $this->post('db_type'); 95 | $dbName = $this->post('db_name'); 96 | $dbPort = $this->post('db_port'); 97 | 98 | if (empty($dbPort)) { 99 | if ($dbType === 'mysql') { 100 | $dbPort = 3306; 101 | } 102 | elseif ($dbType === 'mysql') { 103 | $dbPort = 5432; 104 | } 105 | elseif ($dbType === 'sqlsrv') { 106 | $dbPort = 1433; 107 | } 108 | } 109 | 110 | if ($dbType === 'sqlite') { 111 | $this->setEnvVars([ 112 | 'APP_KEY' => $this->getRandomKey(), 113 | 'APP_LOCALE' => $this->post('locale', 'xx'), 114 | 'BACKEND_URI' => $this->post('backend_uri', '/admin'), 115 | 'APP_URL' => $this->getBaseUrl(), 116 | 'DB_CONNECTION' => $dbType, 117 | 'DB_DATABASE' => $dbName, 118 | ]); 119 | } 120 | else { 121 | $this->setEnvVars([ 122 | 'APP_KEY' => $this->getRandomKey(), 123 | 'APP_LOCALE' => $this->post('locale', 'xx'), 124 | 'BACKEND_URI' => $this->post('backend_uri', '/admin'), 125 | 'APP_URL' => $this->getBaseUrl(), 126 | 'DB_CONNECTION' => $dbType, 127 | 'DB_HOST' => $this->post('db_host'), 128 | 'DB_PORT' => $dbPort, 129 | 'DB_DATABASE' => $dbName, 130 | 'DB_USERNAME' => $this->post('db_user'), 131 | 'DB_PASSWORD' => $this->post('db_pass'), 132 | ]); 133 | } 134 | } 135 | 136 | /** 137 | * flushOpCache 138 | */ 139 | protected function flushOpCache() 140 | { 141 | $opcache_enabled = ini_get('opcache.enable'); 142 | $opcache_path = trim(ini_get('opcache.restrict_api')); 143 | 144 | if (!empty($opcache_path) && !starts_with(__FILE__, $opcache_path)) { 145 | $opcache_enabled = false; 146 | } 147 | 148 | if (function_exists('opcache_reset') && $opcache_enabled) { 149 | opcache_reset(); 150 | } 151 | if (function_exists('apc_clear_cache')) { 152 | apc_clear_cache(); 153 | } 154 | } 155 | 156 | /** 157 | * setProjectDetails 158 | */ 159 | public function setProjectDetails() 160 | { 161 | if (!$projectId = $this->post('project_id')) { 162 | return; 163 | } 164 | 165 | // Configure Composer 166 | $this->setComposerAuth($this->post('email'), $projectId); 167 | 168 | // Configure Demo Content 169 | $this->setDemoContent(true); 170 | } 171 | 172 | /** 173 | * migrateDatabase 174 | */ 175 | protected function migrateDatabase() 176 | { 177 | if ($this->isCleanInstall()) { 178 | $this->log('Skipping migration for a clean install...'); 179 | return; 180 | } 181 | 182 | $updater = call_user_func('System\Classes\UpdateManager::instance'); 183 | $updater->update(); 184 | $updater->setBuildNumberManually(); 185 | } 186 | 187 | /** 188 | * runComposerUpdate composer only 189 | */ 190 | public function runComposerUpdate() 191 | { 192 | try { 193 | $this->log('Updating package manager...'); 194 | $composer = call_user_func('October\Rain\Composer\Manager::instance'); 195 | $composer->setOutputBuffer(); 196 | $composer->update(['composer/composer']); 197 | } 198 | catch (Exception $ex) { 199 | $this->log($composer->getOutputBuffer()); 200 | } 201 | } 202 | 203 | /** 204 | * composerInstall licensed packages 205 | */ 206 | public function runComposerInstall() 207 | { 208 | if ($this->isCleanInstall()) { 209 | $this->log('Running a clean install...'); 210 | return $this->runComposerCleanInstall(); 211 | } 212 | 213 | try { 214 | $composer = call_user_func('October\Rain\Composer\Manager::instance'); 215 | $composer->setOutputBuffer(); 216 | $composer->require([ 217 | 'october/rain' => $this->getUpdateWantVersion(), 218 | 'october/all' => $this->getUpdateWantVersion() 219 | ]); 220 | } 221 | catch (Exception $ex) { 222 | $this->log($composer->getOutputBuffer()); 223 | throw $ex; 224 | } 225 | } 226 | 227 | /** 228 | * runComposerCleanInstall without a license 229 | */ 230 | public function runComposerCleanInstall() 231 | { 232 | try { 233 | $composer = call_user_func('October\Rain\Composer\Manager::instance'); 234 | $composer->setOutputBuffer(); 235 | $composer->update(); 236 | } 237 | catch (Exception $ex) { 238 | $this->log($composer->getOutputBuffer()); 239 | throw $ex; 240 | } 241 | } 242 | 243 | /** 244 | * isCleanInstall 245 | */ 246 | protected function isCleanInstall() 247 | { 248 | return $this->post('is_clean_install') === 'true'; 249 | } 250 | 251 | // 252 | // File Management 253 | // 254 | 255 | /** 256 | * moveHtaccess 257 | */ 258 | protected function moveHtaccess($old = null, $new = null) 259 | { 260 | $oldFile = $this->baseDirectory . '/.htaccess'; 261 | if ($old) { 262 | $oldFile .= '.' . $old; 263 | } 264 | 265 | $newFile = $this->baseDirectory . '/.htaccess'; 266 | if ($new) { 267 | $newFile .= '.' . $new; 268 | } 269 | 270 | if (file_exists($oldFile)) { 271 | rename($oldFile, $newFile); 272 | } 273 | } 274 | 275 | /** 276 | * unzipFile 277 | */ 278 | protected function unzipFile($fileCode, $directory = null) 279 | { 280 | $source = $this->getFilePath($fileCode); 281 | $destination = $this->baseDirectory; 282 | 283 | $this->log('Extracting file (%s): %s', $fileCode, basename($source)); 284 | 285 | if ($directory) 286 | $destination .= '/' . $directory; 287 | 288 | if (!file_exists($destination)) 289 | mkdir($destination, 0777, true); 290 | 291 | $zip = new ZipArchive; 292 | if ($zip->open($source) === true) { 293 | $zip->extractTo($destination); 294 | $zip->close(); 295 | return true; 296 | } 297 | 298 | return false; 299 | } 300 | 301 | /** 302 | * getFilePath 303 | */ 304 | protected function getFilePath($fileCode) 305 | { 306 | $name = md5($fileCode) . '.arc'; 307 | return $this->tempDirectory . '/' . $name; 308 | } 309 | 310 | // 311 | // Logging 312 | // 313 | 314 | public function cleanLog() 315 | { 316 | $message = array( 317 | ".=====================================================================.", 318 | " ", 319 | " .d8888b. .o8888b. db .d8888b. d8888b. d88888b d8888b. .d888b. ", 320 | " .8P Y8. d8P Y8 88 .8P Y8. 88 `8D 88' 88 `8D .8P , Y8. ", 321 | " 88 88 8P .ooo88 88 88 88oooY' 88oooo 88oobY' 88 | 88 ", 322 | " 88 88 8b `~~~88 88 88 88~~~b. 88~~~~ 88`8b 88 |/ 88 ", 323 | " `8b d8' Y8b d8 88 `8b d8' 88 8D 88. 88 `88. `8b | d8' ", 324 | " `Y8888P' `Y8888P' YP `Y8888P' Y8888P' Y88888P 88 YD `Y888P' ", 325 | " ", 326 | "`========================== INSTALLATION LOG ========================='", 327 | "", 328 | ); 329 | 330 | file_put_contents($this->logFile, implode(PHP_EOL, $message) . PHP_EOL); 331 | } 332 | 333 | /** 334 | * logPost 335 | */ 336 | public function logPost() 337 | { 338 | if (!isset($_POST) || !count($_POST)) { 339 | return; 340 | } 341 | 342 | $postData = $_POST; 343 | 344 | if (array_key_exists('disableLog', $postData)) { 345 | $postData = ['disableLog' => true]; 346 | } 347 | 348 | // Sensitive data fields 349 | $postData = $this->cleanLogArray($postData); 350 | 351 | file_put_contents($this->logFile, '.============================ POST REQUEST ==========================.' . PHP_EOL, FILE_APPEND); 352 | $this->log('Postback payload: %s', print_r($postData, true)); 353 | } 354 | 355 | /** 356 | * log 357 | */ 358 | public function log() 359 | { 360 | $args = func_get_args(); 361 | $message = array_shift($args); 362 | 363 | if (is_array($message)) { 364 | $message = print_r($this->cleanLogArray($message), true); 365 | } 366 | 367 | $message = "[" . date("Y/m/d h:i:s", time()) . "] " . vsprintf($message, $args) . PHP_EOL; 368 | file_put_contents($this->logFile, $message, FILE_APPEND); 369 | } 370 | 371 | /** 372 | * cleanLogArray 373 | */ 374 | protected function cleanLogArray($data) 375 | { 376 | if (isset($data['admin_email'])) { 377 | $data['admin_email'] = '*******@*****.com'; 378 | } 379 | 380 | $fieldsToErase = array( 381 | 'encryption_code', 382 | 'admin_password', 383 | 'admin_confirm_password', 384 | 'db_pass', 385 | 'project_id', 386 | ); 387 | 388 | foreach ($fieldsToErase as $field) { 389 | if (isset($data[$field])) $data[$field] = '*******'; 390 | } 391 | 392 | return $data; 393 | } 394 | 395 | // 396 | // Helpers 397 | // 398 | 399 | /** 400 | * bootFramework 401 | */ 402 | protected function bootFramework() 403 | { 404 | $autoloadFile = $this->baseDirectory . '/bootstrap/autoload.php'; 405 | if (!file_exists($autoloadFile)) { 406 | throw new Exception('Unable to find autoloader: ~/bootstrap/autoload.php'); 407 | } 408 | 409 | require $autoloadFile; 410 | 411 | $appFile = $this->baseDirectory . '/bootstrap/app.php'; 412 | if (!file_exists($appFile)) { 413 | throw new Exception('Unable to find app loader: ~/bootstrap/app.php'); 414 | } 415 | 416 | try { 417 | $app = require_once $appFile; 418 | $kernel = $app->make('Illuminate\Contracts\Console\Kernel'); 419 | $kernel->bootstrap(); 420 | } 421 | catch (Throwable $ex) { 422 | throw new Exception('PHP Error: ' . $ex->getMessage()); 423 | } 424 | } 425 | 426 | /** 427 | * requestServerData 428 | */ 429 | protected function requestServerData($uri = null, $params = array()) 430 | { 431 | $result = null; 432 | $error = null; 433 | try { 434 | $curl = $this->prepareServerRequest($uri, $params); 435 | $result = curl_exec($curl); 436 | 437 | $this->log('Server request: %s', $uri); 438 | 439 | $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 440 | if ($httpCode == 500) { 441 | $error = $result; 442 | $result = ''; 443 | } 444 | 445 | $this->log('Request information: %s', print_r(curl_getinfo($curl), true)); 446 | 447 | curl_close($curl); 448 | } 449 | catch (Exception $ex) { 450 | $this->log('Failed to get server data (ignored): ' . $ex->getMessage()); 451 | } 452 | 453 | if ($error !== null) 454 | throw new Exception('Server responded with error: ' . $error); 455 | 456 | if (!$result || !strlen($result)) 457 | throw new Exception('Server responded had no response.'); 458 | 459 | try { 460 | $_result = @json_decode($result, true); 461 | } 462 | catch (Exception $ex) {} 463 | 464 | if (!is_array($_result)) { 465 | $this->log('Server response: '. $result); 466 | throw new Exception('Server returned an invalid response.'); 467 | } 468 | 469 | return $_result; 470 | } 471 | 472 | /** 473 | * requestServerFile 474 | */ 475 | protected function requestServerFile($fileCode, $expectedHash, $uri = null, $params = array()) 476 | { 477 | $error = null; 478 | try { 479 | if (!is_dir($this->tempDirectory)) { 480 | $tempDirectory = mkdir($this->tempDirectory, 0777, true); // @todo Use config 481 | if ($tempDirectory === false) { 482 | $this->log('Failed to get create temporary directory: %s', $this->tempDirectory); 483 | throw new Exception('Failed to get create temporary directory in ' . $this->tempDirectory . '. Please ensure this directory is writable.'); 484 | } 485 | } 486 | 487 | $filePath = $this->getFilePath($fileCode); 488 | $stream = fopen($filePath, 'w'); 489 | 490 | $curl = $this->prepareServerRequest($uri, $params); 491 | curl_setopt($curl, CURLOPT_FILE, $stream); 492 | curl_exec($curl); 493 | 494 | $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 495 | if ($httpCode == 500) { 496 | $error = file_get_contents($filePath); 497 | } 498 | 499 | curl_close($curl); 500 | fclose($stream); 501 | } 502 | catch (Exception $ex) { 503 | $this->log('Failed to get server delivery: ' . $ex->getMessage()); 504 | throw new Exception('Server failed to deliver the package'); 505 | } 506 | 507 | if ($error !== null) { 508 | throw new Exception('Server responded with error: ' . $error); 509 | } 510 | 511 | $this->log('Saving to file (%s): %s', $fileCode, $filePath); 512 | 513 | return true; 514 | } 515 | 516 | /** 517 | * prepareServerRequest 518 | */ 519 | protected function prepareServerRequest($uri, $params = array()) 520 | { 521 | $params['protocol_version'] = '1.2'; 522 | $params['client'] = 'october'; 523 | $params['server'] = base64_encode(json_encode([ 524 | 'php' => PHP_VERSION, 525 | 'url' => $this->getBaseUrl() 526 | ])); 527 | 528 | $curl = curl_init(); 529 | curl_setopt($curl, CURLOPT_URL, OCTOBER_GATEWAY.'/'.$uri); 530 | curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 531 | curl_setopt($curl, CURLOPT_TIMEOUT, 3600); 532 | // curl_setopt($curl, CURLOPT_FOLLOWLOCATION , true); 533 | curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 534 | curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 535 | curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params, '', '&')); 536 | 537 | if (defined('OCTOBER_GATEWAY_AUTH')) { 538 | curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 539 | curl_setopt($curl, CURLOPT_USERPWD, OCTOBER_GATEWAY_AUTH); 540 | } 541 | 542 | return $curl; 543 | } 544 | 545 | /** 546 | * post 547 | */ 548 | protected function post($var, $default = null) 549 | { 550 | if (array_key_exists($var, $_REQUEST)) { 551 | $result = $_REQUEST[$var]; 552 | 553 | if (is_string($result)) { 554 | $result = trim($result); 555 | } 556 | 557 | return $result; 558 | } 559 | 560 | return $default; 561 | } 562 | 563 | /** 564 | * getHashFromMeta 565 | */ 566 | protected function getHashFromMeta($targetCode, $packageType = 'plugin') 567 | { 568 | $meta = $this->post('meta'); 569 | $packageType .= 's'; 570 | 571 | if ($targetCode == 'core') { 572 | return (isset($meta['core']['hash'])) ? $meta['core']['hash'] : null; 573 | } 574 | 575 | if (!isset($meta[$packageType])) { 576 | return null; 577 | } 578 | 579 | $collection = $meta[$packageType]; 580 | if (!is_array($collection)) { 581 | return null; 582 | } 583 | 584 | foreach ($collection as $code => $hash) { 585 | if ($code == $targetCode) { 586 | return $hash; 587 | } 588 | } 589 | 590 | return null; 591 | } 592 | 593 | /** 594 | * getBaseUrl 595 | */ 596 | public function getBaseUrl() 597 | { 598 | if (isset($_SERVER['HTTP_HOST'])) { 599 | $baseUrl = !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http'; 600 | $baseUrl .= '://'. $_SERVER['HTTP_HOST']; 601 | $baseUrl .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']); 602 | } 603 | else { 604 | $baseUrl = 'http://localhost'; 605 | } 606 | 607 | return rtrim($baseUrl, '/'); 608 | } 609 | 610 | /** 611 | * cleanUp 612 | */ 613 | public function cleanUp() 614 | { 615 | $path = $this->tempDirectory; 616 | if (!file_exists($path)) { 617 | return; 618 | } 619 | 620 | $d = dir($path); 621 | while (($entry = $d->read()) !== false) { 622 | $filePath = $path.'/'.$entry; 623 | 624 | if ($entry == '.' || $entry == '..' || $entry == '.htaccess' || is_dir($filePath)) { 625 | continue; 626 | } 627 | 628 | $this->log('Cleaning up file: %s', $entry); 629 | @unlink($filePath); 630 | } 631 | 632 | $d->close(); 633 | 634 | // Remove installer files 635 | $this->recursiveRemove('install_files'); 636 | @unlink('Dockerfile'); 637 | @unlink('install-master.zip'); 638 | @unlink('install.php'); 639 | } 640 | 641 | /** 642 | * e for escape 643 | */ 644 | public function e($value) 645 | { 646 | return htmlentities($value, ENT_QUOTES, 'UTF-8', false); 647 | } 648 | 649 | /** 650 | * validateSqliteFile 651 | */ 652 | protected function validateSqliteFile($filename) 653 | { 654 | if (file_exists($filename)) 655 | return; 656 | 657 | $directory = dirname($filename); 658 | if (!is_dir($directory)) 659 | mkdir($directory, 0777, true); 660 | 661 | new PDO('sqlite:'.$filename); 662 | } 663 | 664 | /** 665 | * recursiveRemove 666 | */ 667 | protected function recursiveRemove($dir) 668 | { 669 | $structure = glob(rtrim($dir, '/') . '/*'); 670 | 671 | if (is_array($structure)) { 672 | foreach ($structure as $file) { 673 | if (is_dir($file)) { 674 | $this->recursiveRemove($file); 675 | } 676 | elseif (is_file($file)) { 677 | @unlink($file); 678 | } 679 | } 680 | } 681 | 682 | @rmdir($dir); 683 | } 684 | } 685 | -------------------------------------------------------------------------------- /install_files/php/InstallerException.php: -------------------------------------------------------------------------------- 1 | field = $field; 11 | } 12 | } -------------------------------------------------------------------------------- /install_files/php/InstallerHandlers.php: -------------------------------------------------------------------------------- 1 | post('code'); 14 | $this->log('System check: %s', $checkCode); 15 | 16 | if ($checkCode === 'phpExtensions') { 17 | $subChecks = array_keys(array_filter([ 18 | 'extension:mbstring' => extension_loaded('mbstring'), 19 | 'extension:fileinfo' => extension_loaded('fileinfo'), 20 | 'extension:openssl' => extension_loaded('openssl'), 21 | 'extension:gd' => extension_loaded('gd'), 22 | 'extension:filter' => extension_loaded('filter'), 23 | 'extension:hash' => extension_loaded('hash'), 24 | 'extension:pdo' => defined('PDO::ATTR_DRIVER_NAME'), 25 | 'extension:zip' => class_exists('ZipArchive'), 26 | 'extension:json' => function_exists('json_decode'), 27 | 'extension:curl' => function_exists('curl_init') && defined('CURLOPT_FOLLOWLOCATION'), 28 | 'memory_limit:128M' => !$this->checkMemoryLimit(128), 29 | ], function($v) { return !$v; })); 30 | $result = count($subChecks) === 0; 31 | $this->log('Requirement %s %s %s', $checkCode, print_r($subChecks, true), ($result ? '+OK' : '=FAIL')); 32 | return ['result' => $result, 'subChecks' => $subChecks]; 33 | } 34 | 35 | $result = false; 36 | switch ($checkCode) { 37 | case 'phpVersion': 38 | $result = version_compare(trim(strtolower(PHP_VERSION)), REQUIRED_PHP_VERSION, '>='); 39 | break; 40 | case 'liveConnection': 41 | $result = ($this->requestServerData('ping') !== null); 42 | break; 43 | case 'writePermission': 44 | $result = is_writable(PATH_INSTALL) && is_writable($this->logFile); 45 | break; 46 | } 47 | 48 | $this->log('Requirement %s %s', $checkCode, ($result ? '+OK' : '=FAIL')); 49 | return ['result' => $result]; 50 | } 51 | 52 | /** 53 | * onValidateDatabase 54 | */ 55 | protected function onValidateConfig() 56 | { 57 | if ($this->post('db_type') !== 'sqlite' && !strlen($this->post('db_host'))) { 58 | throw new InstallerException('Please specify a database host', 'db_host'); 59 | } 60 | 61 | if (!strlen($this->post('db_name'))) { 62 | throw new InstallerException('Please specify the database name', 'db_name'); 63 | } 64 | 65 | // Check the database credentials 66 | $db = $this->checkDatabase( 67 | $type = $this->post('db_type'), 68 | $this->post('db_host'), 69 | $this->post('db_port'), 70 | $name = $this->post('db_name'), 71 | $this->post('db_user'), 72 | $this->post('db_pass'), 73 | ); 74 | 75 | // Check the database is empty 76 | $expectedTablesAndViewsCount = 0; 77 | if ($type == 'sqlite') { 78 | $fetch = $db->query("select name from sqlite_master where type='table'", PDO::FETCH_NUM); 79 | } 80 | elseif ($type == 'pgsql') { 81 | $fetch = $db->query("select table_name from information_schema.tables where table_schema = 'public'", PDO::FETCH_NUM); 82 | } 83 | elseif ($type === 'sqlsrv') { 84 | $fetch = $db->query("select [table_name] from information_schema.tables", PDO::FETCH_NUM); 85 | $expectedTablesAndViewsCount = 1; 86 | } 87 | else { 88 | $fetch = $db->query('show tables', PDO::FETCH_NUM); 89 | } 90 | 91 | $tables = 0; 92 | while ($fetch->fetch()) { 93 | $tables++; 94 | } 95 | 96 | if ($tables > $expectedTablesAndViewsCount) { 97 | throw new Exception(sprintf('Database "%s" is not empty. Please empty the database or specify another database.', $this->e($name))); 98 | } 99 | } 100 | 101 | /** 102 | * onProjectDetails 103 | */ 104 | protected function onProjectDetails() 105 | { 106 | // Validate input with gateway 107 | try { 108 | $result = $this->requestServerData('project/detail', ['id' => $this->post('project_id')]); 109 | } 110 | catch (Exception $ex) { 111 | throw new Exception("The supplied license key could not be found. Please visit octobercms.com to obtain a license."); 112 | } 113 | 114 | // Check project status 115 | $isActive = $result['is_active'] ?? false; 116 | if (!$isActive) { 117 | throw new Exception("License is unpaid or has expired. Please visit octobercms.com to obtain a license."); 118 | } 119 | 120 | return $result; 121 | } 122 | 123 | /** 124 | * onInstallStep 125 | */ 126 | protected function onInstallStep() 127 | { 128 | $installStep = $this->post('step'); 129 | $this->log('Install step: %s', $installStep); 130 | $result = false; 131 | 132 | switch ($installStep) { 133 | case 'getMetaData': 134 | $params = []; 135 | 136 | if ($project = $this->post('project_id', false)) { 137 | $params['project'] = $project; 138 | } 139 | 140 | $result = $this->requestServerData('install/detail', $params); 141 | break; 142 | 143 | case 'downloadCore': 144 | $hash = $this->getHashFromMeta('core'); 145 | $this->requestServerFile('core', $hash, 'install/download'); 146 | break; 147 | 148 | case 'extractCore': 149 | $this->moveHtaccess(null, 'installer'); 150 | 151 | $result = $this->unzipFile('core'); 152 | if (!$result) { 153 | throw new Exception('Unable to open application archive file'); 154 | } 155 | 156 | if ( 157 | !file_exists(PATH_INSTALL . '/index.php') || 158 | !is_dir(PATH_INSTALL . '/modules') || 159 | !is_dir(PATH_INSTALL . '/vendor') 160 | ) { 161 | throw new Exception('Could not extract application files'); 162 | } 163 | 164 | $this->moveHtaccess(null, 'october'); 165 | $this->moveHtaccess('installer', null); 166 | break; 167 | 168 | case 'setupConfig': 169 | $this->bootFramework(); 170 | $this->buildConfigFile(); 171 | $this->flushOpCache(); 172 | $this->refreshEnvVars(); 173 | break; 174 | 175 | case 'setupProject': 176 | $this->bootFramework(); 177 | $this->setProjectDetails(); 178 | break; 179 | 180 | case 'composerUpdate': 181 | $this->bootFramework(); 182 | $this->runComposerUpdate(); 183 | break; 184 | 185 | case 'composerInstall': 186 | $this->bootFramework(); 187 | $this->runComposerInstall(); 188 | break; 189 | 190 | case 'migrateDatabase': 191 | $this->bootFramework(); 192 | $this->migrateDatabase(); 193 | break; 194 | 195 | case 'cleanInstall': 196 | $this->moveHtaccess(null, 'installer'); 197 | $this->moveHtaccess('october', null); 198 | $this->cleanUp(); 199 | break; 200 | } 201 | 202 | // Skip cleanInstall step to prevent writing to nonexisting folder 203 | if ($installStep !== 'cleanInstall') { 204 | $this->log('Step %s +OK', $installStep); 205 | } 206 | 207 | return ['result' => $result]; 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /install_files/php/InstallerSetup.php: -------------------------------------------------------------------------------- 1 | addAuthCredentials( 33 | $this->getComposerUrl(false), 34 | $email, 35 | $projectKey 36 | ); 37 | 38 | // Store project details 39 | $this->injectJsonToFile(storage_path('cms/project.json'), [ 40 | 'project' => $projectKey 41 | ]); 42 | 43 | // Add gateway as a composer repo 44 | $composer->addOctoberRepository($this->getComposerUrl()); 45 | } 46 | 47 | /** 48 | * setDemoContent instructs the system to install demo content or not 49 | */ 50 | protected function setDemoContent($confirm = true) 51 | { 52 | if ($confirm) { 53 | $this->injectJsonToFile(storage_path('cms/autoexec.json'), [ 54 | 'theme:seed demo --root' 55 | ]); 56 | } 57 | else { 58 | $this->injectJsonToFile(storage_path('cms/autoexec.json'), [ 59 | 'october:fresh --force' 60 | ]); 61 | } 62 | } 63 | 64 | /** 65 | * processWantString ensures a valid want version is supplied 66 | */ 67 | protected function processWantString($version) 68 | { 69 | $parts = explode('.', $version); 70 | 71 | if (count($parts) > 1) { 72 | $parts[2] = '*'; 73 | } 74 | 75 | $parts = array_slice($parts, 0, 3); 76 | 77 | return implode('.', $parts); 78 | } 79 | 80 | /** 81 | * addModulesToGitignore 82 | */ 83 | protected function addModulesToGitignore($gitignore) 84 | { 85 | $toIgnore = '/modules'; 86 | $contents = file_get_contents($gitignore); 87 | 88 | if (strpos($contents, $toIgnore) === false) { 89 | file_put_contents($gitignore, 90 | trim(file_get_contents($gitignore), PHP_EOL) . PHP_EOL . 91 | $toIgnore . PHP_EOL 92 | ); 93 | } 94 | } 95 | 96 | /** 97 | * setEnvVars sets multiple environment variables 98 | */ 99 | protected function setEnvVars(array $vars) 100 | { 101 | foreach ($vars as $key => $val) { 102 | $this->setEnvVar($key, $val); 103 | } 104 | } 105 | 106 | /** 107 | * setEnvVar writes an environment variable to disk 108 | */ 109 | protected function setEnvVar($key, $value) 110 | { 111 | $path = base_path('.env'); 112 | $old = $this->getEnvVar($key); 113 | $value = $this->encodeEnvVar($value); 114 | 115 | if (is_bool(env($key))) { 116 | $old = env($key) ? 'true' : 'false'; 117 | } 118 | 119 | if (file_exists($path)) { 120 | file_put_contents($path, str_replace( 121 | [$key.'='.$old, $key.'='.'"'.$old.'"'], 122 | [$key.'='.$value, $key.'='.$value], 123 | file_get_contents($path) 124 | )); 125 | } 126 | 127 | $this->userConfig[$key] = $value; 128 | } 129 | 130 | /** 131 | * encodeEnvVar for compatibility with certain characters 132 | */ 133 | protected function encodeEnvVar($value) 134 | { 135 | if (!is_string($value)) { 136 | return $value; 137 | } 138 | 139 | // Escape quotes 140 | if (strpos($value, '"') !== false) { 141 | $value = str_replace('"', '\"', $value); 142 | } 143 | 144 | // Quote values with comment, space, quotes 145 | $triggerChars = ['#', ' ', '"', "'"]; 146 | foreach ($triggerChars as $char) { 147 | if (strpos($value, $char) !== false) { 148 | $value = '"'.$value.'"'; 149 | break; 150 | } 151 | } 152 | 153 | return $value; 154 | } 155 | 156 | /** 157 | * getEnvVar specifically from installer specified values. This is needed since 158 | * the writing to the environment file may not update the values from env() 159 | */ 160 | protected function getEnvVar(string $key, $default = null) 161 | { 162 | return $this->userConfig[$key] ?? env($key, $default); 163 | } 164 | 165 | /** 166 | * checkDatabase validates the supplied database configuration 167 | */ 168 | protected function checkDatabase($type, $host, $port, $name, $user, $pass) 169 | { 170 | if ($type != 'sqlite' && !strlen($host)) { 171 | throw new Exception('Please specify a database host'); 172 | } 173 | 174 | if (!strlen($name)) { 175 | throw new Exception('Please specify the database name'); 176 | } 177 | 178 | // Check connection 179 | switch ($type) { 180 | case 'mysql': 181 | $dsn = 'mysql:host='.$host.';dbname='.$name; 182 | if ($port) $dsn .= ";port=".$port; 183 | break; 184 | 185 | case 'pgsql': 186 | $_host = ($host) ? 'host='.$host.';' : ''; 187 | $dsn = 'pgsql:'.$_host.'dbname='.$name; 188 | if ($port) $dsn .= ";port=".$port; 189 | break; 190 | 191 | case 'sqlite': 192 | $dsn = 'sqlite:'.$name; 193 | $this->checkSqliteFile($name); 194 | break; 195 | 196 | case 'sqlsrv': 197 | $availableDrivers = PDO::getAvailableDrivers(); 198 | $portStr = $port ? ','.$port : ''; 199 | if (in_array('dblib', $availableDrivers)) { 200 | $dsn = 'dblib:host='.$host.$portStr.';dbname='.$name; 201 | } 202 | else { 203 | $dsn = 'sqlsrv:Server='.$host.$portStr.';Database='.$name; 204 | } 205 | break; 206 | } 207 | try { 208 | return new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 209 | } 210 | catch (PDOException $ex) { 211 | throw new Exception('Connection failed: ' . $ex->getMessage()); 212 | } 213 | } 214 | 215 | /** 216 | * validateSqliteFile will establish the SQLite engine 217 | */ 218 | protected function checkSqliteFile($filename) 219 | { 220 | if (file_exists($filename)) { 221 | return; 222 | } 223 | 224 | $directory = dirname($filename); 225 | if (!is_dir($directory)) { 226 | mkdir($directory, 0777, true); 227 | } 228 | 229 | new PDO('sqlite:'.$filename); 230 | } 231 | 232 | /** 233 | * injectJsonToFile merges a JSON array in to an existing JSON file. 234 | * Merging is useful for preserving array values. 235 | */ 236 | protected function injectJsonToFile(string $filename, array $jsonArr, bool $merge = false): void 237 | { 238 | $contentsArr = file_exists($filename) 239 | ? json_decode(file_get_contents($filename), true) 240 | : []; 241 | 242 | $newArr = $merge 243 | ? array_merge_recursive($contentsArr, $jsonArr) 244 | : $this->mergeRecursive($contentsArr, $jsonArr); 245 | 246 | $content = json_encode($newArr, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT); 247 | 248 | file_put_contents($filename, $content); 249 | } 250 | 251 | /** 252 | * mergeRecursive substitues the native PHP array_merge_recursive to be 253 | * more config friendly. Scalar values are replaced instead of being 254 | * merged in to their own new array. 255 | */ 256 | protected function mergeRecursive(array $array1, $array2) 257 | { 258 | if ($array2 && is_array($array2)) { 259 | foreach ($array2 as $key => $val2) { 260 | if ( 261 | is_array($val2) && 262 | (($val1 = isset($array1[$key]) ? $array1[$key] : null) !== null) && 263 | is_array($val1) 264 | ) { 265 | $array1[$key] = $this->mergeRecursive($val1, $val2); 266 | } 267 | else { 268 | $array1[$key] = $val2; 269 | } 270 | } 271 | } 272 | 273 | return $array1; 274 | } 275 | 276 | /** 277 | * getAvailableLocales returns available system locales 278 | */ 279 | public function getAvailableLocales() 280 | { 281 | return [ 282 | 'ar' => [$this->getLang('system::lang.locale.ar'), 'Arabic'], 283 | 'be' => [$this->getLang('system::lang.locale.be'), 'Belarusian'], 284 | 'bg' => [$this->getLang('system::lang.locale.bg'), 'Bulgarian'], 285 | 'ca' => [$this->getLang('system::lang.locale.ca'), 'Catalan'], 286 | 'cs' => [$this->getLang('system::lang.locale.cs'), 'Czech'], 287 | 'da' => [$this->getLang('system::lang.locale.da'), 'Danish'], 288 | 'de' => [$this->getLang('system::lang.locale.de'), 'German'], 289 | 'el' => [$this->getLang('system::lang.locale.el'), 'Greek'], 290 | 'en' => [$this->getLang('system::lang.locale.en'), 'English'], 291 | 'en-au' => [$this->getLang('system::lang.locale.en-au'), 'English'], 292 | 'en-ca' => [$this->getLang('system::lang.locale.en-ca'), 'English'], 293 | 'en-gb' => [$this->getLang('system::lang.locale.en-gb'), 'English'], 294 | 'es' => [$this->getLang('system::lang.locale.es'), 'Spanish'], 295 | 'es-ar' => [$this->getLang('system::lang.locale.es-ar'), 'Spanish'], 296 | 'et' => [$this->getLang('system::lang.locale.et'), 'Estonian'], 297 | 'fa' => [$this->getLang('system::lang.locale.fa'), 'Persian'], 298 | 'fi' => [$this->getLang('system::lang.locale.fi'), 'Finnish'], 299 | 'fr' => [$this->getLang('system::lang.locale.fr'), 'French'], 300 | 'fr-ca' => [$this->getLang('system::lang.locale.fr-ca'), 'French'], 301 | 'hu' => [$this->getLang('system::lang.locale.hu'), 'Hungarian'], 302 | 'id' => [$this->getLang('system::lang.locale.id'), 'Indonesian'], 303 | 'it' => [$this->getLang('system::lang.locale.it'), 'Italian'], 304 | 'ja' => [$this->getLang('system::lang.locale.ja'), 'Japanese'], 305 | 'kr' => [$this->getLang('system::lang.locale.kr'), 'Korean'], 306 | 'lt' => [$this->getLang('system::lang.locale.lt'), 'Lithuanian'], 307 | 'lv' => [$this->getLang('system::lang.locale.lv'), 'Latvian'], 308 | 'nb-no' => [$this->getLang('system::lang.locale.nb-no'), 'Norwegian'], 309 | 'nl' => [$this->getLang('system::lang.locale.nl'), 'Dutch'], 310 | 'pl' => [$this->getLang('system::lang.locale.pl'), 'Polish'], 311 | 'pt-br' => [$this->getLang('system::lang.locale.pt-br'), 'Portuguese'], 312 | 'pt-pt' => [$this->getLang('system::lang.locale.pt-pt'), 'Portuguese'], 313 | 'ro' => [$this->getLang('system::lang.locale.ro'), 'Romanian'], 314 | 'ru' => [$this->getLang('system::lang.locale.ru'), 'Russian'], 315 | 'sk' => [$this->getLang('system::lang.locale.sk'), 'Slovak'], 316 | 'sl' => [$this->getLang('system::lang.locale.sl'), 'Slovene'], 317 | 'sv' => [$this->getLang('system::lang.locale.sv'), 'Swedish'], 318 | 'th' => [$this->getLang('system::lang.locale.th'), 'Thai'], 319 | 'tr' => [$this->getLang('system::lang.locale.tr'), 'Turkish'], 320 | 'uk' => [$this->getLang('system::lang.locale.uk'), 'Ukrainian'], 321 | 'vn' => [$this->getLang('system::lang.locale.vn'), 'Vietnamese'], 322 | 'zh-cn' => [$this->getLang('system::lang.locale.zh-cn'), 'Chinese'], 323 | 'zh-tw' => [$this->getLang('system::lang.locale.zh-tw'), 'Chinese'], 324 | ]; 325 | } 326 | 327 | /** 328 | * checkMemoryLimit checks if there is enough memory 329 | */ 330 | protected function checkMemoryLimit(int $requiredMb) 331 | { 332 | $getRamInBytes = function() { 333 | $size = ini_get('memory_limit'); 334 | 335 | if (!$size) { 336 | return 0; 337 | } 338 | 339 | $size = strtolower($size); 340 | 341 | $max = ltrim($size, '+'); 342 | if (str_starts_with($max, '0x')) { 343 | $max = intval($max, 16); 344 | } 345 | elseif (str_starts_with($max, '0')) { 346 | $max = intval($max, 8); 347 | } 348 | else { 349 | $max = (int) $max; 350 | } 351 | 352 | // No breaks 353 | switch (substr($size, -1)) { 354 | case 't': $max *= 1024; 355 | case 'g': $max *= 1024; 356 | case 'm': $max *= 1024; 357 | case 'k': $max *= 1024; 358 | } 359 | 360 | return $max; 361 | }; 362 | 363 | return $getRamInBytes() < ($requiredMb * 1024 * 1024); 364 | } 365 | 366 | // 367 | // Framework Booted 368 | // 369 | 370 | /** 371 | * getRandomKey generates a random application key 372 | */ 373 | protected function getRandomKey(): string 374 | { 375 | return Str::random($this->getKeyLength(Config::get('app.cipher'))); 376 | } 377 | 378 | /** 379 | * getKeyLength returns the supported length of a key for a cipher 380 | */ 381 | protected function getKeyLength(string $cipher): int 382 | { 383 | return $cipher === 'AES-128-CBC' ? 16 : 32; 384 | } 385 | 386 | /** 387 | * checkEnvWritable checks to see if the app can write to the .env file 388 | */ 389 | protected function checkEnvWritable() 390 | { 391 | $path = base_path('.env'); 392 | $gitignore = base_path('.gitignore'); 393 | 394 | // Copy environment variables and reload 395 | if (!file_exists($path)) { 396 | copy(base_path('.env.example'), $path); 397 | $this->refreshEnvVars(); 398 | } 399 | 400 | // Add modules to .gitignore 401 | if (file_exists($gitignore) && is_writable($gitignore)) { 402 | $this->addModulesToGitignore($gitignore); 403 | } 404 | 405 | return is_writable($path); 406 | } 407 | 408 | /** 409 | * getComposerUrl returns the endpoint for composer 410 | */ 411 | protected function getComposerUrl(bool $withProtocol = true): string 412 | { 413 | return UpdateManager::instance()->getComposerUrl($withProtocol); 414 | } 415 | 416 | /** 417 | * refreshEnvVars will reload defined environment variables 418 | */ 419 | protected function refreshEnvVars() 420 | { 421 | DotEnv::create(Env::getRepository(), App::environmentPath(), App::environmentFile())->load(); 422 | } 423 | } 424 | -------------------------------------------------------------------------------- /install_files/php/boot.php: -------------------------------------------------------------------------------- 1 | log('Fatal error: %s on line %s in file %s', $errorMsg, $error['line'], $error['file']); 73 | } 74 | exit; 75 | } 76 | } 77 | 78 | /* 79 | * Bootstrap the installer 80 | */ 81 | require_once 'InstallerException.php'; 82 | require_once 'InstallerHandlers.php'; 83 | require_once 'InstallerSetup.php'; 84 | require_once 'Installer.php'; 85 | 86 | try { 87 | $installer = new Installer(); 88 | $installer->cleanLog(); 89 | $installer->log('Host: %s', php_uname()); 90 | $installer->log('PHP version: %s', PHP_VERSION); 91 | $installer->log('Server software: %s', isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : 'Unknown'); 92 | $installer->log('Operating system: %s', PHP_OS); 93 | $installer->log('Memory limit: %s', ini_get('memory_limit')); 94 | $installer->log('Max execution time: %s', ini_get('max_execution_time')); 95 | } 96 | catch (Exception $ex) { 97 | $fatalError = $ex->getMessage(); 98 | } 99 | --------------------------------------------------------------------------------