<select />
</component>
<component name="ChangeListManager">
- <list default="true" id="5d2ecd5e-a05a-4f96-a195-fa6372618165" name="Default Changelist" comment="wait #5189 @0.25">
- <change afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/Operations/Tools/GitReposCreate.php" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/Operations/Tools/TextToSpeech.php" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/.idea/deployment.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/deployment.xml" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/.idea/php.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/php.xml" afterDir="false" />
+ <list default="true" id="5d2ecd5e-a05a-4f96-a195-fa6372618165" name="Default Changelist" comment="wait #5264 @2">
+ <change afterPath="$PROJECT_DIR$/app/Models/CubedesignersEmails.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/app/Http/Controllers/Admin/ToolsController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/ToolsController.php" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/composer.json" beforeDir="false" afterPath="$PROJECT_DIR$/composer.json" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/composer.lock" beforeDir="false" afterPath="$PROJECT_DIR$/composer.lock" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/resources/views/tools/pdf2svg.blade.php" beforeDir="false" />
- <change beforePath="$PROJECT_DIR$/resources/views/tools/sidebar.blade.php" beforeDir="false" afterPath="$PROJECT_DIR$/resources/views/tools/sidebar.blade.php" afterDir="false" />
+ <change beforePath="$PROJECT_DIR$/resources/views/vendor/backpack/base/inc/sidebar_content.blade.php" beforeDir="false" afterPath="$PROJECT_DIR$/resources/views/vendor/backpack/base/inc/sidebar_content.blade.php" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
- <component name="PropertiesComponent">{
- "keyToString": {
- "WebServerToolWindowFactoryState": "true",
- "nodejs_package_manager_path": "npm",
- "ruby.rails.projectView.checked": "true",
- "vue.rearranger.settings.migration": "true"
+ <component name="PropertiesComponent"><![CDATA[{
+ "keyToString": {
+ "WebServerToolWindowFactoryState": "true",
+ "WebServerToolWindowPanel.toolwindow.highlight.mappings": "true",
+ "WebServerToolWindowPanel.toolwindow.highlight.symlinks": "true",
+ "WebServerToolWindowPanel.toolwindow.show.date": "false",
+ "WebServerToolWindowPanel.toolwindow.show.permissions": "false",
+ "WebServerToolWindowPanel.toolwindow.show.size": "false",
+ "nodejs_package_manager_path": "npm",
+ "ruby.rails.projectView.checked": "true",
+ "vue.rearranger.settings.migration": "true"
}
-}</component>
+}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\Works\FluidbookToolbox\app\Fields" />
<workItem from="1650370001187" duration="1140000" />
<workItem from="1650543593675" duration="5191000" />
<workItem from="1650692345830" duration="3144000" />
- <workItem from="1651220888006" duration="594000" />
- </task>
- <task id="LOCAL-00220" summary="wait #5049 @0.25">
- <created>1642764868216</created>
- <option name="number" value="00220" />
- <option name="presentableId" value="LOCAL-00220" />
- <option name="project" value="LOCAL" />
- <updated>1642764868216</updated>
+ <workItem from="1651220888006" duration="13022000" />
</task>
<task id="LOCAL-00221" summary="wip #5045 @0.5">
<created>1642786391085</created>
<option name="project" value="LOCAL" />
<updated>1650371758882</updated>
</task>
- <option name="localTasksCounter" value="269" />
+ <task id="LOCAL-00269" summary="wait #5264 @2">
+ <created>1651222636749</created>
+ <option name="number" value="00269" />
+ <option name="presentableId" value="LOCAL-00269" />
+ <option name="project" value="LOCAL" />
+ <updated>1651222636750</updated>
+ </task>
+ <option name="localTasksCounter" value="270" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
<option name="CHECK_NEW_TODO" value="false" />
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
- <MESSAGE value="wait #5045 @0.5" />
<MESSAGE value="wip #5041 @3" />
<MESSAGE value="wip #5041" />
<MESSAGE value="wip #5041 @0.5" />
<MESSAGE value="wait #5210 @1" />
<MESSAGE value="wait #5188 @0.25" />
<MESSAGE value="wait #5189 @0.25" />
- <option name="LAST_COMMIT_MESSAGE" value="wait #5189 @0.25" />
+ <MESSAGE value="wait #5264 @2" />
+ <option name="LAST_COMMIT_MESSAGE" value="wait #5264 @2" />
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
--- /dev/null
+<?php
+
+namespace App\Models;
+
+use Cubist\Backpack\Magic\Fields\Table;
+use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
+use Cubist\Util\Crypt;
+use Cubist\Util\Files\Files;
+use Cubist\Util\Str;
+
+class CubedesignersEmails extends CubistMagicAbstractModel
+{
+ protected $table = 'cubedesigners_emails';
+
+ protected $_options = ['name' => 'cubemails',
+ 'singular' => 'paramètre',
+ 'plural' => 'paramètres',
+ 'oneinstance' => true];
+
+
+ public function setFields()
+ {
+ parent::setFields();
+
+ $this->addField('domains', Table::class, __('Domaines'), ['entity_singular' => __('un domaine'), 'columns' => ['domaine' => __('Domaine')], 'translatable' => false,]);
+ $this->addField('mailboxes', Table::class, __('Boîtes mail'), ['entity_singular' => __('une boîte mail'), 'columns' => ['mailbox' => __('E-mail'), 'password' => __('Mot de passe')], 'translatable' => false, 'hint' => __('Laisser le mot de passe vide pour utiliser celui du compte "Toolbox"')]);
+ $this->addField('aliases', Table::class, __('Redirections'), ['entity_singular' => __('une redirection'), 'columns' => ['from' => __('Alias'), 'dest' => __('Destinations')], 'translatable' => false,]);
+ }
+
+ public function preSave()
+ {
+
+ $maindomain = 'cubedesigners.com';
+
+ $mailboxes = json_decode($this->mailboxes, true);
+ $accounts = [];
+ foreach ($mailboxes as $k => $m) {
+ if (!isset($m['password'])) {
+ $m['password'] = '';
+ }
+ $email = $m['mailbox'] . '@' . $maindomain;
+ $password = $m['password'] = trim($m['password']);
+ if ($m['password'] === '') {
+ $user = User::where('email', $email)->first();
+ if (null === $user) {
+ $m['password'] = Str::random(12);
+ } else {
+ $password = '{BLF-CRYPT}' . $user->password;
+ }
+ }
+ if ($m['password'] !== '' && !preg_match('/^\{([A-Z0-9-]+)\}\$\d/', $m['password'])) {
+ $p = $m['password'];
+ $cmd = "export PATH=\$PATH:/usr/bin;echo $(doveadm pw -s SHA512-CRYPT -u $email -p $p 2>/dev/null)";
+ $password = $m['password'] = trim(`$cmd`);
+ if (!$password) {
+ dd($cmd, $m['password']);
+ }
+ }
+ $accounts[$m['mailbox']] = $password;
+ $mailboxes[$k] = $m;
+ }
+ $this->mailboxes = json_encode($mailboxes);
+
+ $accountFile = [];
+ foreach ($accounts as $account => $password) {
+ $accountFile[] = $account . '@' . $maindomain . '|' . $password;
+ }
+ Files::mkdir(storage_path('emailconfig'));
+ file_put_contents(storage_path('emailconfig/postfix-accounts.cf'), implode("\n", $accountFile));
+ //
+ $domains = json_decode($this->domains, true);
+ $aliases = json_decode($this->aliases, true);
+ $aliasesFile = [];
+
+ foreach ($domains as $d) {
+ $domain = $d['domaine'];
+ if ($domain !== 'cubedesigners.com') {
+ foreach ($accounts as $account => $password) {
+ $aliasesFile[] = $account . '@' . $domain . ' ' . $account . '@' . $maindomain;
+ }
+ }
+ foreach ($aliases as $a) {
+ $dests = explode(',', $a['dest']);
+ foreach ($dests as $dest) {
+ $aliasesFile[] = $a['from'] . '@' . $domain . ' ' . trim($dest);
+ }
+ }
+ }
+
+ file_put_contents(storage_path('emailconfig/postfix-virtual.cf'), implode("\n", $aliasesFile));
+ }
+}
@include('tools.sidebar')
@canany(['users:read','company:read','managerolesandpersmissions'])
<li class='nav-item nav-dropdown open'><a class='nav-link nav-dropdown-toggle' href='#'><i
- class='nav-icon la la-group'></i>Clients</a>
+ class='nav-icon la la-group'></i>{{__('Clients')}}</a>
<ul class='nav-dropdown-items'>
@can('company:read')
<li class='nav-item'><a class='nav-link' href='{{ backpack_url('company') }}'><i
</li>
@endcan
+@canany(['extranet:manage_team','extranet:manage_emails'])
+ <li class='nav-item nav-dropdown'><a class='nav-link nav-dropdown-toggle' href='#'><i
+ class='nav-icon la la-mug-hot'></i>{{__('Équipe')}}</a>
+ <ul class='nav-dropdown-items'>
+ @can('extranet:manage_emails')
+ <li class="nav-item"><a class="nav-link"
+ href='{{ backpack_url('cubemails') }}'><i
+ class='la la-mail-bulk'></i>
+ <span>{{__('Emails')}}</span></a>
+ </li>
+ @endcan
+ </ul>
+ </li>
+@endcan
+
@canany(['maintenance','toolbox-translate:admin'])
<li class='nav-item nav-dropdown'><a class='nav-link nav-dropdown-toggle' href='#'><i
class='nav-icon la la-cogs'></i>{{__('Administration')}}</a>