Docs
This commit is contained in:
385
data/web/add.php
Normal file
385
data/web/add.php
Normal file
@@ -0,0 +1,385 @@
|
||||
<?php
|
||||
require_once("inc/prerequisites.inc.php");
|
||||
$AuthUsers = array("admin", "domainadmin", "user");
|
||||
if (!isset($_SESSION['mailcow_cc_role']) OR !in_array($_SESSION['mailcow_cc_role'], $AuthUsers)) {
|
||||
header('Location: /');
|
||||
exit();
|
||||
}
|
||||
require_once("inc/header.inc.php");
|
||||
?>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['add']['title'];?></h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<?php
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
if (isset($_GET['domain']) && $_SESSION['mailcow_cc_role'] == "admin") {
|
||||
?>
|
||||
<h4><?=$lang['add']['domain'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="domain"><?=$lang['add']['domain'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" autocorrect="off" autocapitalize="none" class="form-control" name="domain" id="domain">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="description"><?=$lang['add']['description'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="description" id="description">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="aliases"><?=$lang['add']['max_aliases'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="aliases" id="aliases" value="400">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="mailboxes"><?=$lang['add']['max_mailboxes'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="mailboxes" id="mailboxes" value="10">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="maxquota"><?=$lang['add']['mailbox_quota_m'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="maxquota" id="maxquota" value="3072">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="quota"><?=$lang['add']['domain_quota_m'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="quota" id="quota" value="10240">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2"><?=$lang['add']['backup_mx_options'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="backupmx"> <?=$lang['add']['relay_domain'];?></label>
|
||||
<br />
|
||||
<label><input type="checkbox" name="relay_all_recipients"> <?=$lang['add']['relay_all'];?></label>
|
||||
<p><?=$lang['add']['relay_all_info'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" checked> <?=$lang['add']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_add_domain" class="btn btn-success"><?=$lang['add']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
<p><span class="glyphicon glyphicon-exclamation-sign text-danger"></span> <?=$lang['add']['restart_sogo_hint'];?></p>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
elseif (isset($_GET['alias'])) {
|
||||
?>
|
||||
<h4><?=$lang['add']['alias'];?></h4>
|
||||
<p><?=$lang['add']['alias_spf_fail'];?></p>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="address"><?=$lang['add']['alias_address'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<textarea autocorrect="off" autocapitalize="none" class="form-control" rows="5" name="address" id="address"></textarea>
|
||||
<p><?=$lang['add']['alias_address_info'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="goto"><?=$lang['add']['target_address'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<textarea autocorrect="off" autocapitalize="none" class="form-control" rows="5" id="goto" name="goto"></textarea>
|
||||
<p><?=$lang['add']['target_address_info'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" checked> <?=$lang['add']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_add_alias" class="btn btn-success "><?=$lang['add']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
elseif (isset($_GET['aliasdomain'])) {
|
||||
?>
|
||||
<h4><?=$lang['add']['alias_domain'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="alias_domain"><?=$lang['add']['alias_domain'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<textarea autocorrect="off" autocapitalize="none" class="form-control" rows="5" name="alias_domain" id="alias_domain"></textarea>
|
||||
<p><?=$lang['add']['alias_domain_info'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="target_domain"><?=$lang['add']['target_domain'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<select name="target_domain" id="target_domain" title="<?=$lang['add']['select'];?>" required>
|
||||
<?php
|
||||
foreach (mailbox_get_domains() as $domain) {
|
||||
echo "<option>".htmlspecialchars($domain)."</option>";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" checked> <?=$lang['add']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_add_alias_domain" class="btn btn-success "><?=$lang['add']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
elseif (isset($_GET['mailbox'])) {
|
||||
?>
|
||||
<h4><?=$lang['add']['mailbox'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="local_part"><?=$lang['add']['mailbox_username'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" pattern="[A-Za-z0-9\.!#$%&'*+/=?^_`{|}~-]+" autocorrect="off" autocapitalize="none" class="form-control" name="local_part" id="local_part" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="domain"><?=$lang['add']['domain'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select id="addSelectDomain" name="domain" id="domain" title="<?=$lang['add']['select'];?>" required>
|
||||
<?php
|
||||
foreach (mailbox_get_domains() as $domain) {
|
||||
echo "<option>".htmlspecialchars($domain)."</option>";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="name"><?=$lang['add']['full_name'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="name" id="name">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="addInputQuota"><?=$lang['add']['quota_mb'];?>
|
||||
<br /><span id="quotaBadge" class="badge">max. - MiB</span>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="quota" min="1" max="" id="addInputQuota" disabled value="<?=$lang['add']['select_domain'];?>" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password"><?=$lang['add']['password'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password" id="password" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password2"><?=$lang['add']['password_repeat'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password2" id="password2" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" checked> <?=$lang['add']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_add_mailbox" class="btn btn-success "><?=$lang['add']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
elseif (isset($_GET['resource'])) {
|
||||
?>
|
||||
<h4><?=$lang['add']['resource'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="description"><?=$lang['add']['description'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="description" id="description" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="domain"><?=$lang['add']['domain'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="domain" id="domain" title="<?=$lang['add']['select'];?>" required>
|
||||
<?php
|
||||
foreach (mailbox_get_domains() as $domain) {
|
||||
echo "<option>".htmlspecialchars($domain)."</option>";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="domain"><?=$lang['add']['kind'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="kind" id="kind" title="<?=$lang['add']['select'];?>" required>
|
||||
<option value="location">Location</option>
|
||||
<option value="group">Group</option>
|
||||
<option value="thing">Thing</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" checked> <?=$lang['add']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="multiple_bookings" checked> <?=$lang['add']['multiple_bookings'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_add_resource" class="btn btn-success "><?=$lang['add']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "user")) {
|
||||
if (isset($_GET['syncjob'])) {
|
||||
?>
|
||||
<h4><?=$lang['add']['syncjob'];?></h4>
|
||||
<p><?=$lang['add']['syncjob_hint'];?></p>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="host1"><?=$lang['add']['hostname'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="host1" id="host1" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="port1">Port</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="port1" id="port1" min="1" max="65535" value="143" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="user1"><?=$lang['add']['username'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="user1" id="user1" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password1"><?=$lang['add']['password'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="password1" id="password1" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="enc1"><?=$lang['add']['enc_method'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<select name="enc1" id="enc1" title="<?=$lang['add']['select'];?>" required>
|
||||
<option selected>TLS</option>
|
||||
<option>SSL</option>
|
||||
<option>PLAIN</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="mins_interval"><?=$lang['add']['mins_interval'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="mins_interval" min="10" max="3600" value="20" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="subfolder2"><?=$lang['edit']['subfolder2'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="subfolder2" id="subfolder2" value="External">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="maxage"><?=$lang['edit']['maxage'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="maxage" id="maxage" min="0" max="32000" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="exclude"><?=$lang['add']['exclude'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="exclude" id="exclude" value="(?i)spam|(?i)junk">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="delete2duplicates" checked> <?=$lang['add']['delete2duplicates'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" checked> <?=$lang['add']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="add_syncjob" value="1" class="btn btn-success "><?=$lang['add']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-danger" role="alert"><?=$lang['danger']['access_denied'];?></div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="<?=$_SESSION['return_to'];?>">← <?=$lang['add']['previous'];?></a>
|
||||
</div> <!-- /container -->
|
||||
<script src="js/add.js"></script>
|
||||
<?php
|
||||
require_once("inc/footer.inc.php");
|
||||
?>
|
311
data/web/admin.php
Normal file
311
data/web/admin.php
Normal file
@@ -0,0 +1,311 @@
|
||||
<?php
|
||||
require_once("inc/prerequisites.inc.php");
|
||||
|
||||
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin") {
|
||||
require_once("inc/header.inc.php");
|
||||
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||
$tfa_data = get_tfa();
|
||||
?>
|
||||
<div class="container">
|
||||
<h4><span class="glyphicon glyphicon-user" aria-hidden="true"></span> <?=$lang['admin']['access'];?></h4>
|
||||
|
||||
<div class="panel-group" id="accordion_access">
|
||||
<div class="panel panel-danger">
|
||||
<div class="panel-heading"><?=$lang['admin']['admin_details'];?></div>
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal" autocapitalize="none" autocorrect="off" role="form" method="post">
|
||||
<?php $admindetails = get_admin_details(); ?>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="admin_user"><?=$lang['admin']['admin'];?>:</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" class="form-control" name="admin_user" id="admin_user" value="<?=htmlspecialchars($admindetails['username']);?>" required>
|
||||
↳ <kbd>a-z A-Z - _ .</kbd>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="admin_pass"><?=$lang['admin']['password'];?>:</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="password" class="form-control" name="admin_pass" id="admin_pass" placeholder="<?=$lang['admin']['unchanged_if_empty'];?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="admin_pass2"><?=$lang['admin']['password_repeat'];?>:</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="password" class="form-control" name="admin_pass2" id="admin_pass2">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<button type="submit" name="edit_admin_account" class="btn btn-default"><?=$lang['admin']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-3 col-xs-5 text-right"><?=$lang['tfa']['tfa'];?>:</div>
|
||||
<div class="col-sm-9 col-xs-7">
|
||||
<p id="tfa_pretty"><?=$tfa_data['pretty'];?></p>
|
||||
<div id="tfa_additional">
|
||||
<?php if($tfa_data['additional']):
|
||||
foreach ($tfa_data['additional'] as $key_info): ?>
|
||||
<form style="display:inline;" method="post">
|
||||
<input type="hidden" name="unset_tfa_key" value="<?=$key_info['id'];?>" />
|
||||
<div style="padding:4px;margin:4px" class="label label-<?=($_SESSION['tfa_id'] == $key_info['id']) ? 'success' : 'default'; ?>">
|
||||
<?=$key_info['key_id'];?>
|
||||
<a href="#" style="font-weight:bold;color:white" onClick="$(this).closest('form').submit()">[<?=strtolower($lang['admin']['remove']);?>]</a>
|
||||
</div>
|
||||
</form>
|
||||
<?php endforeach;
|
||||
endif;?>
|
||||
</div>
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-3 col-xs-5 text-right"><?=$lang['tfa']['set_tfa'];?>:</div>
|
||||
<div class="col-sm-9 col-xs-7">
|
||||
<select data-width="auto" id="selectTFA" class="selectpicker" title="<?=$lang['tfa']['select'];?>">
|
||||
<option value="yubi_otp"><?=$lang['tfa']['yubi_otp'];?></option>
|
||||
<option value="u2f"><?=$lang['tfa']['u2f'];?></option>
|
||||
<option value="none"><?=$lang['tfa']['none'];?></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel-default">
|
||||
<div style="cursor:pointer;" class="panel-heading" data-toggle="collapse" data-parent="#accordion_access" data-target="#collapseDomAdmins">
|
||||
<span class="accordion-toggle"><?=$lang['admin']['domain_admins'];?></span>
|
||||
</div>
|
||||
<div id="collapseDomAdmins" class="panel-collapse collapse">
|
||||
<div class="panel-body">
|
||||
<form method="post">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped sortable-theme-bootstrap" data-sortable id="domainadminstable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sort-table" style="min-width: 100px;"><?=$lang['admin']['username'];?></th>
|
||||
<th class="sort-table" style="min-width: 166px;"><?=$lang['admin']['admin_domains'];?></th>
|
||||
<th class="sort-table" style="min-width: 76px;"><?=$lang['admin']['active'];?></th>
|
||||
<th class="sort-table" style="min-width: 76px;"><?=$lang['tfa']['tfa'];?></th>
|
||||
<th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['admin']['action'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach (get_domain_admins() as $domain_admin) {
|
||||
$da_data = get_domain_admin_details($domain_admin);
|
||||
if (!empty($da_data)):
|
||||
?>
|
||||
<tr id="data">
|
||||
<td><?=htmlspecialchars(strtolower($domain_admin));?></td>
|
||||
<td>
|
||||
<?php
|
||||
foreach ($da_data['selected_domains'] as $domain) {
|
||||
echo htmlspecialchars($domain).'<br />';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td><?=$da_data['active'];?></td>
|
||||
<td><?=empty($da_data['tfa_active_int']) ? "✘" : "✔";?></td>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="edit.php?domainadmin=<?=$domain_admin;?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['admin']['edit'];?></a>
|
||||
<a href="delete.php?domainadmin=<?=$domain_admin;?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['admin']['remove'];?></a>
|
||||
</div>
|
||||
</td>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<?php
|
||||
else:
|
||||
?>
|
||||
<tr id="no-data"><td colspan="4" style="text-align: center; font-style: italic;"><?=$lang['admin']['no_record'];?></td></tr>
|
||||
<?php
|
||||
endif;
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</form>
|
||||
<small>
|
||||
<legend><?=$lang['admin']['add_domain_admin'];?></legend>
|
||||
<form class="form-horizontal" role="form" method="post">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="username"><?=$lang['admin']['username'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="username" id="username" required>
|
||||
↳ <kbd>a-z A-Z - _ .</kbd>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="name"><?=$lang['admin']['admin_domains'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select title="<?=$lang['admin']['search_domain_da'];?>" style="width:100%" name="domain[]" size="5" multiple>
|
||||
<?php
|
||||
foreach (mailbox_get_domains() as $domain) {
|
||||
echo "<option>".htmlspecialchars($domain)."</option>";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password"><?=$lang['admin']['password'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password" id="password" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password2"><?=$lang['admin']['password_repeat'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password2" id="password2" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" checked> <?=$lang['admin']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="add_domain_admin" class="btn btn-default"><?=$lang['admin']['add'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> <?=$lang['admin']['configuration'];?></h4>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading"><?=$lang['admin']['dkim_keys'];?></div>
|
||||
<div id="collapseDKIM" class="panel-collapse">
|
||||
<div class="panel-body">
|
||||
<p style="margin-bottom:40px"><?=$lang['admin']['dkim_key_hint'];?></p>
|
||||
<?php
|
||||
foreach(mailbox_get_domains() as $domain) {
|
||||
if (!empty($dkim = dkim_get_key_details($domain))) {
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<p>Domain: <strong><?=htmlspecialchars($domain);?></strong><br />
|
||||
<span class="label label-success"><?=$lang['admin']['dkim_key_valid'];?></span>
|
||||
<span class="label label-info"><?=$dkim['length'];?> bit</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-xs-8">
|
||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<form class="form-inline" method="post">
|
||||
<input type="hidden" name="domain" value="<?=$domain;?>">
|
||||
<input type="hidden" name="dkim_delete_key" value="1">
|
||||
<a href="#" onclick="$(this).closest('form').submit()" data-toggle="tooltip" data-placement="top" title="<?=$lang['user']['delete_now'];?>"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<p>Domain: <strong><?=htmlspecialchars($domain);?></strong><br /><span class="label label-danger"><?=$lang['admin']['dkim_key_missing'];?></span></p>
|
||||
</div>
|
||||
<div class="col-xs-8"><pre>-</pre></div>
|
||||
<div class="col-xs-1"> </div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
foreach(mailbox_get_alias_domains($domain) as $alias_domain) {
|
||||
if (!empty($dkim = dkim_get_key_details($alias_domain))) {
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-xs-offset-1 col-xs-2">
|
||||
<p><small>↳ Alias-Domain: <strong><?=htmlspecialchars($alias_domain);?></strong><br /></small>
|
||||
<span class="label label-success"><?=$lang['admin']['dkim_key_valid'];?></span>
|
||||
<span class="label label-info"><?=$dkim['length'];?> bit</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-xs-8">
|
||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<form class="form-inline" method="post">
|
||||
<input type="hidden" name="domain" value="<?=$alias_domain;?>">
|
||||
<input type="hidden" name="dkim_delete_key" value="1">
|
||||
<a href="#" onclick="$(this).closest('form').submit()" data-toggle="tooltip" data-placement="top" title="<?=$lang['user']['delete_now'];?>"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-xs-2 col-xs-offset-1">
|
||||
<p><small>↳ Alias-Domain: <strong><?=htmlspecialchars($alias_domain);?></strong><br /></small><span class="label label-danger"><?=$lang['admin']['dkim_key_missing'];?></span></p>
|
||||
</div>
|
||||
<div class="col-xs-8"><pre>-</pre></div>
|
||||
<div class="col-xs-1"> </div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach(dkim_get_blind_keys() as $blind) {
|
||||
if (!empty($dkim = dkim_get_key_details($blind))) {
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<p>Domain: <strong><?=htmlspecialchars($blind);?></strong><br /><span class="label label-warning"><?=$lang['admin']['dkim_key_unused'];?></span></p>
|
||||
</div>
|
||||
<div class="col-xs-8">
|
||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<form class="form-inline" method="post">
|
||||
<input type="hidden" name="domain" value="<?=$blind;?>">
|
||||
<input type="hidden" name="dkim_delete_key" value="1">
|
||||
<a href="#" onclick="$(this).closest('form').submit()" data-toggle="tooltip" data-placement="top" title="<?=$lang['user']['delete_now'];?>"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
<legend style="margin-top:40px"><?=$lang['admin']['dkim_add_key'];?></legend>
|
||||
<form class="form-inline" role="form" method="post">
|
||||
<div class="form-group">
|
||||
<label for="domain">Domain</label>
|
||||
<input class="form-control" id="domain" name="domain" placeholder="example.org" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<select data-width="200px" class="form-control" id="key_size" name="key_size" title="<?=$lang['admin']['dkim_key_length'];?>" required>
|
||||
<option data-subtext="bits">1024</option>
|
||||
<option data-subtext="bits">2048</option>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" name="dkim_add_key" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> <?=$lang['admin']['add'];?></button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- /container -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js" integrity="sha384-YWP9O4NjmcGo4oEJFXvvYSEzuHIvey+LbXkBNJ1Kd0yfugEZN9NCQNpRYBVC1RvA" crossorigin="anonymous"></script>
|
||||
<script src="js/sorttable.js"></script>
|
||||
<script src="js/admin.js"></script>
|
||||
<?php
|
||||
require_once("inc/footer.inc.php");
|
||||
} else {
|
||||
header('Location: /');
|
||||
exit();
|
||||
}
|
||||
?>
|
69
data/web/autoconfig.php
Normal file
69
data/web/autoconfig.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
require_once "inc/vars.inc.php";
|
||||
if (empty($mailcow_hostname)) { exit(); }
|
||||
header("Content-Type: application/xml");
|
||||
?>
|
||||
<?='<?xml version="1.0"?>';?>
|
||||
<clientConfig version="1.1">
|
||||
<emailProvider id="<?=$mailcow_hostname;?>">
|
||||
|
||||
<displayName>A mailcow mail server</displayName>
|
||||
<displayShortName>mail server</displayShortName>
|
||||
|
||||
<incomingServer type="imap">
|
||||
<hostname><?=$mailcow_hostname;?></hostname>
|
||||
<port>993</port>
|
||||
<socketType>SSL</socketType>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
<authentication>password-cleartext</authentication>
|
||||
</incomingServer>
|
||||
<incomingServer type="imap">
|
||||
<hostname><?=$mailcow_hostname;?></hostname>
|
||||
<port>143</port>
|
||||
<socketType>STARTTLS</socketType>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
<authentication>password-cleartext</authentication>
|
||||
</incomingServer>
|
||||
|
||||
<incomingServer type="pop3">
|
||||
<hostname><?=$mailcow_hostname;?></hostname>
|
||||
<port>995</port>
|
||||
<socketType>SSL</socketType>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
<authentication>password-cleartext</authentication>
|
||||
</incomingServer>
|
||||
<incomingServer type="pop3">
|
||||
<hostname><?=$mailcow_hostname;?></hostname>
|
||||
<port>110</port>
|
||||
<socketType>STARTTLS</socketType>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
<authentication>password-cleartext</authentication>
|
||||
</incomingServer>
|
||||
|
||||
<outgoingServer type="smtp">
|
||||
<hostname><?=$mailcow_hostname;?></hostname>
|
||||
<port>465</port>
|
||||
<socketType>SSL</socketType>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
<authentication>password-cleartext</authentication>
|
||||
</outgoingServer>
|
||||
|
||||
<outgoingServer type="smtp">
|
||||
<hostname><?=$mailcow_hostname;?></hostname>
|
||||
<port>587</port>
|
||||
<socketType>STARTTLS</socketType>
|
||||
<username>%EMAILADDRESS%</username>
|
||||
<authentication>password-cleartext</authentication>
|
||||
</outgoingServer>
|
||||
|
||||
<enable visiturl="https://<?=$mailcow_hostname;?>/admin.php">
|
||||
<instruction>If you didn't change the password given to you by the administrator or if you didn't change it in a long time, please consider doing that now.</instruction>
|
||||
<instruction lang="de">Sollten Sie das Ihnen durch den Administrator vergebene Passwort noch nicht geändert haben, empfehlen wir dies nun zu tun. Auch ein altes Passwort sollte aus Sicherheitsgründen geändert werden.</instruction>
|
||||
</enable>
|
||||
|
||||
</emailProvider>
|
||||
|
||||
<webMail>
|
||||
<loginPage url="https://<?=$mailcow_hostname;?>/SOGo/" />
|
||||
</webMail>
|
||||
</clientConfig>
|
142
data/web/autodiscover.php
Normal file
142
data/web/autodiscover.php
Normal file
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
require_once 'inc/vars.inc.php';
|
||||
require_once 'inc/functions.inc.php';
|
||||
|
||||
ini_set('error_reporting', '0');
|
||||
$config = array(
|
||||
'useEASforOutlook' => 'yes',
|
||||
'autodiscoverType' => 'activesync',
|
||||
'imap' => array(
|
||||
'server' => $mailcow_hostname,
|
||||
'port' => '993',
|
||||
'ssl' => 'on',
|
||||
),
|
||||
'smtp' => array(
|
||||
'server' => $mailcow_hostname,
|
||||
'port' => '465',
|
||||
'ssl' => 'on'
|
||||
),
|
||||
'activesync' => array(
|
||||
'url' => 'https://'.$mailcow_hostname.'/Microsoft-Server-ActiveSync'
|
||||
)
|
||||
);
|
||||
|
||||
if(file_exists('inc/vars.local.inc.php')) {
|
||||
include_once 'inc/vars.local.inc.php';
|
||||
}
|
||||
|
||||
/* ---------- DO NOT MODIFY ANYTHING BEYOND THIS LINE. IGNORE AT YOUR OWN RISK. ---------- */
|
||||
|
||||
if ($config['useEASforOutlook'] == 'no') {
|
||||
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Outlook')) {
|
||||
$config['autodiscoverType'] = 'imap';
|
||||
}
|
||||
}
|
||||
|
||||
$dsn = "$database_type:host=$database_host;dbname=$database_name";
|
||||
$opt = [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
];
|
||||
$pdo = new PDO($dsn, $database_user, $database_pass, $opt);
|
||||
$login_user = strtolower(trim($_SERVER['PHP_AUTH_USER']));
|
||||
$as = check_login($login_user, $_SERVER['PHP_AUTH_PW']);
|
||||
|
||||
if (!isset($_SERVER['PHP_AUTH_USER']) OR $as !== "user") {
|
||||
header('WWW-Authenticate: Basic realm=""');
|
||||
header('HTTP/1.0 401 Unauthorized');
|
||||
exit;
|
||||
} else {
|
||||
if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
|
||||
if ($as === "user") {
|
||||
header("Content-Type: application/xml");
|
||||
echo '<?xml version="1.0" encoding="utf-8" ?><Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">';
|
||||
|
||||
$data = trim(file_get_contents("php://input"));
|
||||
if(!$data) {
|
||||
list($usec, $sec) = explode(' ', microtime());
|
||||
echo '<Response>';
|
||||
echo '<Error Time="' . date('H:i:s', $sec) . substr($usec, 0, strlen($usec) - 2) . '" Id="2477272013">';
|
||||
echo '<ErrorCode>600</ErrorCode><Message>Invalid Request</Message><DebugData /></Error>';
|
||||
echo '</Response>';
|
||||
echo '</Autodiscover>';
|
||||
exit(0);
|
||||
}
|
||||
$discover = new SimpleXMLElement($data);
|
||||
$email = $discover->Request->EMailAddress;
|
||||
|
||||
if ($config['autodiscoverType'] == 'imap') {
|
||||
?>
|
||||
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
|
||||
<Account>
|
||||
<AccountType>email</AccountType>
|
||||
<Action>settings</Action>
|
||||
<Protocol>
|
||||
<Type>IMAP</Type>
|
||||
<Server><?php echo $config['imap']['server']; ?></Server>
|
||||
<Port><?php echo $config['imap']['port']; ?></Port>
|
||||
<DomainRequired>off</DomainRequired>
|
||||
<LoginName><?php echo $email; ?></LoginName>
|
||||
<SPA>off</SPA>
|
||||
<SSL><?php echo $config['imap']['ssl']; ?></SSL>
|
||||
<AuthRequired>on</AuthRequired>
|
||||
</Protocol>
|
||||
<Protocol>
|
||||
<Type>SMTP</Type>
|
||||
<Server><?php echo $config['smtp']['server']; ?></Server>
|
||||
<Port><?php echo $config['smtp']['port']; ?></Port>
|
||||
<DomainRequired>off</DomainRequired>
|
||||
<LoginName><?php echo $email; ?></LoginName>
|
||||
<SPA>off</SPA>
|
||||
<SSL><?php echo $config['smtp']['ssl']; ?></SSL>
|
||||
<AuthRequired>on</AuthRequired>
|
||||
<UsePOPAuth>on</UsePOPAuth>
|
||||
<SMTPLast>off</SMTPLast>
|
||||
</Protocol>
|
||||
</Account>
|
||||
</Response>
|
||||
<?php
|
||||
}
|
||||
else if ($config['autodiscoverType'] == 'activesync') {
|
||||
$username = trim($email);
|
||||
try {
|
||||
$stmt = $pdo->prepare("SELECT `name` FROM `mailbox` WHERE `username`= :username");
|
||||
$stmt->execute(array(':username' => $username));
|
||||
$MailboxData = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
}
|
||||
catch(PDOException $e) {
|
||||
die("Failed to determine name from SQL");
|
||||
}
|
||||
if (!empty($MailboxData['name'])) {
|
||||
$displayname = utf8_encode($MailboxData['name']);
|
||||
}
|
||||
else {
|
||||
$displayname = $email;
|
||||
}
|
||||
?>
|
||||
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006">
|
||||
<Culture>en:en</Culture>
|
||||
<User>
|
||||
<DisplayName><?php echo $displayname; ?></DisplayName>
|
||||
<EMailAddress><?php echo $email; ?></EMailAddress>
|
||||
</User>
|
||||
<Action>
|
||||
<Settings>
|
||||
<Server>
|
||||
<Type>MobileSync</Type>
|
||||
<Url><?php echo $config['activesync']['url']; ?></Url>
|
||||
<Name><?php echo $config['activesync']['url']; ?></Name>
|
||||
</Server>
|
||||
</Settings>
|
||||
</Action>
|
||||
</Response>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</Autodiscover>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
40
data/web/call_sogo_ctrl.php
Normal file
40
data/web/call_sogo_ctrl.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
session_start();
|
||||
$AuthUsers = array("admin");
|
||||
if (!isset($_SESSION['mailcow_cc_role']) OR !in_array($_SESSION['mailcow_cc_role'], $AuthUsers)) {
|
||||
echo "Not allowed." . PHP_EOL;
|
||||
exit();
|
||||
}
|
||||
if ($_GET['ACTION'] == "start") {
|
||||
$request = xmlrpc_encode_request("supervisor.startProcessGroup", 'sogo-group', array('encoding'=>'utf-8'));
|
||||
$context = stream_context_create(array('http' => array(
|
||||
'method' => "POST",
|
||||
'header' => "Content-Length: " . strlen($request),
|
||||
'content' => $request
|
||||
)));
|
||||
$file = @file_get_contents("http://sogo:9191/RPC2", false, $context) or die("Cannot connect to $remote_server:$listener_port");
|
||||
$response = xmlrpc_decode($file);
|
||||
if (isset($response['faultString'])) {
|
||||
echo '<b><span class="pull-right text-warning">' . $response['faultString'] . '</span></b>';
|
||||
}
|
||||
else {
|
||||
echo '<b><span class="pull-right text-success">OK</span></b>';
|
||||
}
|
||||
}
|
||||
elseif ($_GET['ACTION'] == "stop") {
|
||||
$request = xmlrpc_encode_request("supervisor.stopProcessGroup", 'sogo-group', array('encoding'=>'utf-8'));
|
||||
$context = stream_context_create(array('http' => array(
|
||||
'method' => "POST",
|
||||
'header' => "Content-Length: " . strlen($request),
|
||||
'content' => $request
|
||||
)));
|
||||
$file = @file_get_contents("http://sogo:9191/RPC2", false, $context) or die("Cannot connect to $remote_server:$listener_port");
|
||||
$response = xmlrpc_decode($file);
|
||||
if (isset($response['faultString'])) {
|
||||
echo '<b><span class="pull-right text-warning">' . $response['faultString'] . '</span></b>';
|
||||
}
|
||||
else {
|
||||
echo '<b><span class="pull-right text-success">OK</span></b>';
|
||||
}
|
||||
}
|
||||
?>
|
6
data/web/css/bootstrap-select.min.css
vendored
Normal file
6
data/web/css/bootstrap-select.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
41
data/web/css/bootstrap-slider.min.css
vendored
Normal file
41
data/web/css/bootstrap-slider.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
10
data/web/css/bootstrap-switch.min.css
vendored
Normal file
10
data/web/css/bootstrap-switch.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
19
data/web/css/mailbox.css
Normal file
19
data/web/css/mailbox.css
Normal file
@@ -0,0 +1,19 @@
|
||||
.panel-heading div {
|
||||
margin-top: -18px;
|
||||
font-size: 15px;
|
||||
}
|
||||
.panel-heading div span {
|
||||
margin-left:5px;
|
||||
}
|
||||
.panel-body {
|
||||
display: none;
|
||||
}
|
||||
.clickable {
|
||||
cursor: pointer;
|
||||
}
|
||||
.progress {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.table>thead>tr>th {
|
||||
vertical-align: top !important;
|
||||
}
|
46
data/web/css/mailcow.css
Normal file
46
data/web/css/mailcow.css
Normal file
@@ -0,0 +1,46 @@
|
||||
#maxmsgsize { min-width: 80px; }
|
||||
#slider1 .slider-selection {
|
||||
background: #FFD700;
|
||||
}
|
||||
#slider1 .slider-track-high {
|
||||
background: #FF4500;
|
||||
}
|
||||
#slider1 .slider-track-low {
|
||||
background: #66CD00;
|
||||
}
|
||||
.striped:nth-child(odd) {
|
||||
background-color: #fff;
|
||||
}
|
||||
.striped:nth-child(even) {
|
||||
background-color: #fafafa;
|
||||
border:1px solid white;
|
||||
}
|
||||
.btn {
|
||||
text-transform: none;
|
||||
}
|
||||
.glyphicon-spin {
|
||||
font-size:12px;
|
||||
-webkit-animation: spin 2000ms infinite linear;
|
||||
animation: spin 2000ms infinite linear;
|
||||
}
|
||||
@-webkit-keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
@keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;}
|
79
data/web/css/tables.css
Normal file
79
data/web/css/tables.css
Normal file
@@ -0,0 +1,79 @@
|
||||
ul[id*="sortable"] { word-wrap: break-word; list-style-type: none; float: left; padding: 0 15px 0 0; width: 48%; cursor:move}
|
||||
ul[id$="sortable-active"] li {cursor:move; }
|
||||
ul[id$="sortable-inactive"] li {cursor:move }
|
||||
.list-heading { cursor:default !important}
|
||||
.ui-state-disabled { cursor:no-drop; color:#ccc; }
|
||||
.ui-state-highlight {background: #F5F5F5 !important; height: 41px !important; cursor:move }
|
||||
table[data-sortable] {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
table[data-sortable] th {
|
||||
vertical-align: bottom;
|
||||
font-weight: bold;
|
||||
}
|
||||
table[data-sortable] th, table[data-sortable] td {
|
||||
text-align: left;
|
||||
padding: 10px;
|
||||
}
|
||||
table[data-sortable] th:not([data-sortable="false"]) {
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
-o-user-select: none;
|
||||
user-select: none;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
-webkit-touch-callout: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
table[data-sortable] th:after {
|
||||
content: "";
|
||||
visibility: hidden;
|
||||
display: inline-block;
|
||||
vertical-align: inherit;
|
||||
height: 0;
|
||||
width: 0;
|
||||
border-width: 5px;
|
||||
border-style: solid;
|
||||
border-color: transparent;
|
||||
margin-right: 1px;
|
||||
margin-left: 10px;
|
||||
float: right;
|
||||
}
|
||||
table[data-sortable] th[data-sortable="false"]:after {
|
||||
display: none;
|
||||
}
|
||||
table[data-sortable] th[data-sorted="true"]:after {
|
||||
visibility: visible;
|
||||
}
|
||||
table[data-sortable] th[data-sorted-direction="descending"]:after {
|
||||
border-top-color: inherit;
|
||||
margin-top: 8px;
|
||||
}
|
||||
table[data-sortable] th[data-sorted-direction="ascending"]:after {
|
||||
border-bottom-color: inherit;
|
||||
margin-top: 3px;
|
||||
}
|
||||
table[data-sortable].sortable-theme-bootstrap thead th {
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
}
|
||||
table[data-sortable].sortable-theme-bootstrap th[data-sorted="true"] {
|
||||
color: #3a87ad;
|
||||
background: #d9edf7;
|
||||
border-bottom-color: #bce8f1;
|
||||
}
|
||||
table[data-sortable].sortable-theme-bootstrap th[data-sorted="true"][data-sorted-direction="descending"]:after {
|
||||
border-top-color: #3a87ad;
|
||||
}
|
||||
table[data-sortable].sortable-theme-bootstrap th[data-sorted="true"][data-sorted-direction="ascending"]:after {
|
||||
border-bottom-color: #3a87ad;
|
||||
}
|
||||
table[data-sortable].sortable-theme-bootstrap.sortable-theme-bootstrap-striped tbody > tr:nth-child(odd) > td {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
#data td, #no-data td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
.sort-table:hover {
|
||||
border-bottom-color: #00B7DC !important;
|
||||
}
|
212
data/web/delete.php
Normal file
212
data/web/delete.php
Normal file
@@ -0,0 +1,212 @@
|
||||
<?php
|
||||
require_once("inc/prerequisites.inc.php");
|
||||
$AuthUsers = array("admin", "domainadmin", "user");
|
||||
if (!isset($_SESSION['mailcow_cc_role']) OR !in_array($_SESSION['mailcow_cc_role'], $AuthUsers)) {
|
||||
header('Location: /');
|
||||
exit();
|
||||
}
|
||||
require_once("inc/header.inc.php");
|
||||
?>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['delete']['title'];?></h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<?php
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
// DELETE DOMAIN
|
||||
if (isset($_GET["domain"]) &&
|
||||
is_valid_domain_name($_GET["domain"]) &&
|
||||
!empty($_GET["domain"]) &&
|
||||
$_SESSION['mailcow_cc_role'] == "admin") {
|
||||
$domain = $_GET["domain"];
|
||||
?>
|
||||
<div class="alert alert-warning" role="alert"><?=sprintf($lang['delete']['remove_domain_warning'], htmlspecialchars($_GET["domain"]));?></div>
|
||||
<p><?=$lang['delete']['remove_domain_details'];?></p>
|
||||
<form class="form-horizontal" role="form" method="post" action="/mailbox.php">
|
||||
<input type="hidden" name="domain" value="<?php echo htmlspecialchars($domain) ?>">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-1 col-sm-10">
|
||||
<button type="submit" name="mailbox_delete_domain" class="btn btn-default btn-sm"><?=$lang['delete']['remove_button'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
// DELETE ALIAS
|
||||
elseif (isset($_GET["alias"]) &&
|
||||
(filter_var($_GET["alias"], FILTER_VALIDATE_EMAIL) || is_valid_domain_name(substr(strrchr($_GET["alias"], "@"), 1))) &&
|
||||
!empty($_GET["alias"])) {
|
||||
$domain = substr(strrchr($_GET["alias"], "@"), 1);
|
||||
if (hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
|
||||
?>
|
||||
<div class="alert alert-warning" role="alert"><?=sprintf($lang['delete']['remove_alias_warning'], htmlspecialchars($_GET["alias"]));?></div>
|
||||
<p><?=$lang['delete']['remove_alias_details'];?></p>
|
||||
<form class="form-horizontal" role="form" method="post" action="/mailbox.php">
|
||||
<input type="hidden" name="address" value="<?php echo htmlspecialchars($_GET["alias"]) ?>">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-1 col-sm-10">
|
||||
<button type="submit" name="mailbox_delete_alias" class="btn btn-default btn-sm"><?=$lang['delete']['remove_button'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
// DELETE ALIAS DOMAIN
|
||||
elseif (
|
||||
isset($_GET["aliasdomain"]) &&
|
||||
is_valid_domain_name($_GET["aliasdomain"]) &&
|
||||
!empty($_GET["aliasdomain"])) {
|
||||
$alias_domain = $_GET["aliasdomain"];
|
||||
$result = mailbox_get_alias_domain_details($alias_domain);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<div class="alert alert-warning" role="alert"><?=sprintf($lang['delete']['remove_domainalias_warning'], htmlspecialchars($_GET["aliasdomain"]));?></div>
|
||||
<form class="form-horizontal" role="form" method="post" action="/mailbox.php">
|
||||
<input type="hidden" name="alias_domain" value="<?php echo htmlspecialchars($alias_domain) ?>">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-1 col-sm-10">
|
||||
<button type="submit" name="mailbox_delete_alias_domain" class="btn btn-default btn-sm"><?=$lang['delete']['remove_button'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
// DELETE DOMAIN ADMIN
|
||||
elseif (isset($_GET["domainadmin"]) &&
|
||||
ctype_alnum(str_replace(array('_', '.', '-'), '', $_GET["domainadmin"])) &&
|
||||
!empty($_GET["domainadmin"]) &&
|
||||
$_SESSION['mailcow_cc_role'] == "admin") {
|
||||
$domain_admin = $_GET["domainadmin"];
|
||||
?>
|
||||
<div class="alert alert-warning" role="alert"><?=sprintf($lang['delete']['remove_domainadmin_warning'], htmlspecialchars($_GET["domainadmin"]));?></div>
|
||||
<form class="form-horizontal" role="form" method="post" action="/admin.php">
|
||||
<input type="hidden" name="username" value="<?=htmlspecialchars($domain_admin);?>">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-1 col-sm-10">
|
||||
<button type="submit" name="delete_domain_admin" class="btn btn-default btn-sm"><?=$lang['delete']['remove_button'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
// DELETE MAILBOX
|
||||
elseif (isset($_GET["mailbox"]) &&
|
||||
filter_var($_GET["mailbox"], FILTER_VALIDATE_EMAIL) &&
|
||||
!empty($_GET["mailbox"])) {
|
||||
$mailbox = $_GET["mailbox"];
|
||||
if (hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $mailbox)) {
|
||||
?>
|
||||
<div class="alert alert-warning" role="alert"><?=sprintf($lang['delete']['remove_mailbox_warning'], htmlspecialchars($mailbox));?></div>
|
||||
<p><?=$lang['delete']['remove_mailbox_details'];?></p>
|
||||
<form class="form-horizontal" role="form" method="post" action="/mailbox.php">
|
||||
<input type="hidden" name="username" value="<?=htmlspecialchars($mailbox);?>">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-1 col-sm-10">
|
||||
<button type="submit" name="mailbox_delete_mailbox" class="btn btn-default btn-sm"><?=$lang['delete']['remove_button'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
// DELETE RESOURCE
|
||||
elseif (isset($_GET["resource"]) &&
|
||||
filter_var($_GET["resource"], FILTER_VALIDATE_EMAIL) &&
|
||||
!empty($_GET["resource"])) {
|
||||
$resource = $_GET["resource"];
|
||||
if (hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $resource)) {
|
||||
?>
|
||||
<div class="alert alert-warning" role="alert"><?=sprintf($lang['delete']['remove_resource_warning'], htmlspecialchars($resource));?></div>
|
||||
<p><?=$lang['delete']['remove_resource_details'];?></p>
|
||||
<form class="form-horizontal" role="form" method="post" action="/mailbox.php">
|
||||
<input type="hidden" name="name" value="<?=htmlspecialchars($resource);?>">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-1 col-sm-10">
|
||||
<button type="submit" name="mailbox_delete_resource" class="btn btn-default btn-sm"><?=$lang['delete']['remove_button'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "user")) {
|
||||
// DELETE SYNCJOB
|
||||
if (isset($_GET["syncjob"]) &&
|
||||
is_numeric($_GET["syncjob"]) &&
|
||||
filter_var($_SESSION['mailcow_cc_username'], FILTER_VALIDATE_EMAIL)) {
|
||||
$id = $_GET["syncjob"];
|
||||
$result = get_syncjob_details($id);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<div class="alert alert-warning" role="alert"><?=sprintf($lang['delete']['remove_syncjob_warning'], htmlspecialchars($result['user2']));?></div>
|
||||
<p><?=$lang['delete']['remove_syncjob_details'];?></p>
|
||||
<form class="form-horizontal" role="form" method="post" action="/user.php">
|
||||
<input type="hidden" name="username" value="<?=htmlspecialchars($mailbox);?>">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-1 col-sm-10">
|
||||
<input type="hidden" name="id" value="<?=$_GET["syncjob"];?>">
|
||||
<button type="submit" name="delete_syncjob" value="1" class="btn btn-default btn-sm"><?=$lang['delete']['remove_button'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-danger" role="alert"><?=$lang['danger']['access_denied'];?></div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="<?=$_SESSION['return_to'];?>">← <?=$lang['delete']['previous'];?></a>
|
||||
</div> <!-- /container -->
|
||||
<?php
|
||||
require_once("inc/footer.inc.php");
|
||||
?>
|
664
data/web/edit.php
Normal file
664
data/web/edit.php
Normal file
@@ -0,0 +1,664 @@
|
||||
<?php
|
||||
require_once("inc/prerequisites.inc.php");
|
||||
$AuthUsers = array("admin", "domainadmin", "user");
|
||||
if (!isset($_SESSION['mailcow_cc_role']) OR !in_array($_SESSION['mailcow_cc_role'], $AuthUsers)) {
|
||||
header('Location: /');
|
||||
exit();
|
||||
}
|
||||
require_once("inc/header.inc.php");
|
||||
?>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['edit']['title'];?></h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<?php
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
if (isset($_GET["alias"]) &&
|
||||
!empty($_GET["alias"])) {
|
||||
$alias = $_GET["alias"];
|
||||
$result = mailbox_get_alias_details($alias);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<h4><?=$lang['edit']['alias'];?></h4>
|
||||
<br />
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<input type="hidden" name="address" value="<?=htmlspecialchars($alias);?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="goto"><?=$lang['edit']['target_address'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="goto" name="goto"><?=htmlspecialchars($result['goto']) ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" <?php if (isset($result['active_int']) && $result['active_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_edit_alias" class="btn btn-success btn-sm"><?=$lang['edit']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_GET['domainadmin']) &&
|
||||
ctype_alnum(str_replace(array('_', '.', '-'), '', $_GET["domainadmin"])) &&
|
||||
!empty($_GET["domainadmin"]) &&
|
||||
$_GET["domainadmin"] != 'admin' &&
|
||||
$_SESSION['mailcow_cc_role'] == "admin") {
|
||||
$domain_admin = $_GET["domainadmin"];
|
||||
$result = get_domain_admin_details($domain_admin);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<h4><?=$lang['edit']['domain_admin'];?></h4>
|
||||
<br />
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<input type="hidden" name="username_now" value="<?=htmlspecialchars($domain_admin);?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="username"><?=$lang['edit']['username'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input class="form-control" type="text" name="username" value="<?=htmlspecialchars($domain_admin);?>" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="domain"><?=$lang['edit']['domains'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<select id="domain" name="domain[]" multiple>
|
||||
<?php
|
||||
foreach ($result['selected_domains'] as $domain):
|
||||
?>
|
||||
<option selected><?=htmlspecialchars($domain);?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
foreach ($result['unselected_domains'] as $domain):
|
||||
?>
|
||||
<option><?=htmlspecialchars($domain);?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password" id="password" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password2" id="password2">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" <?php if (isset($result['active_int']) && $result['active_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="disable_tfa"> <?=$lang['tfa']['disable_tfa'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="edit_domain_admin" class="btn btn-success btn-sm"><?=$lang['edit']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_GET['domain']) &&
|
||||
is_valid_domain_name($_GET["domain"]) &&
|
||||
!empty($_GET["domain"])) {
|
||||
$domain = $_GET["domain"];
|
||||
$result = mailbox_get_domain_details($domain);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<h4><?=$lang['edit']['domain'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<input type="hidden" name="domain" value="<?=htmlspecialchars($domain);?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="description"><?=$lang['edit']['description'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="description" id="description" value="<?=htmlspecialchars($result['description']);?>">
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin") {
|
||||
?>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="aliases"><?=$lang['edit']['max_aliases'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="aliases" id="aliases" value="<?=intval($result['max_num_aliases_for_domain']);?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="mailboxes"><?=$lang['edit']['max_mailboxes'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="mailboxes" id="mailboxes" value="<?=intval($result['max_num_mboxes_for_domain']);?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="maxquota"><?=$lang['edit']['max_quota'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="maxquota" id="maxquota" value="<?=intval($result['max_new_mailbox_quota'] / 1048576);?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="quota"><?=$lang['edit']['domain_quota'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="quota" id="quota" value="<?=intval($result['max_quota_for_domain'] / 1048576);?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2"><?=$lang['edit']['backup_mx_options'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="backupmx" <?=(isset($result['backupmx_int']) && $result['backupmx_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['relay_domain'];?></label>
|
||||
<br />
|
||||
<label><input type="checkbox" name="relay_all_recipients" <?=(isset($result['relay_all_recipients_int']) && $result['relay_all_recipients_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['relay_all'];?></label>
|
||||
<p><?=$lang['edit']['relay_all_info'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" <?=(isset($result['active_int']) && $result['active_int']=="1") ? "checked" : null;?> <?=($_SESSION['mailcow_cc_role'] == "admin") ? null : "disabled";?>> <?=$lang['edit']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_edit_domain" class="btn btn-success btn-sm"><?=$lang['edit']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
if (!empty($dkim = dkim_get_key_details($domain))) {
|
||||
?>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-xs-2">
|
||||
<p>Domain: <strong><?=htmlspecialchars($result['domain_name']);?></strong> (dkim._domainkey)</p>
|
||||
</div>
|
||||
<div class="col-xs-10">
|
||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h4><span class="glyphicon glyphicon-thumbs-up" aria-hidden="true"></span> <?=$lang['user']['spamfilter_wl'];?></h4>
|
||||
<p><?=$lang['user']['spamfilter_wl_desc'];?></p>
|
||||
<div class="row">
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_rule'];?></b></div>
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_action'];?></b></div>
|
||||
</div>
|
||||
<?php
|
||||
$get_policy_list = get_policy_list($domain);
|
||||
if (empty($get_policy_list['whitelist'])):
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-sm-12"><i><?=$lang['user']['spamfilter_table_empty'];?></i></div>
|
||||
</div>
|
||||
<?php
|
||||
else:
|
||||
foreach($get_policy_list['whitelist'] as $wl):
|
||||
?>
|
||||
<div class="row striped">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6"><code><?=$wl['value'];?></code></div>
|
||||
<div class="col-xs-6">
|
||||
<?php
|
||||
if ($wl['object'] == $domain):
|
||||
?>
|
||||
<input type="hidden" name="delete_prefid" value="<?=$wl['prefid'];?>">
|
||||
<input type="hidden" name="delete_policy_list_item">
|
||||
<input type="hidden" name="domain" value="<?=$domain;?>">
|
||||
<a href="#" onclick="$(this).closest('form').submit()" data-toggle="tooltip" data-placement="left" title="<?=$lang['user']['delete_now'];?>"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
<?php
|
||||
else:
|
||||
?>
|
||||
<span style="cursor:not-allowed"><?=$lang['user']['spamfilter_table_domain_policy'];?></span>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
endforeach;
|
||||
endif;
|
||||
?>
|
||||
<hr style="margin:5px 0px 7px 0px">
|
||||
<div class="row">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6">
|
||||
<input type="text" class="form-control input-sm" name="object_from" id="object_from" placeholder="*@example.org" required>
|
||||
<input type="hidden" name="object_list" value="wl">
|
||||
<input type="hidden" name="domain" value="<?=$domain;?>">
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
<button type="submit" name="add_policy_list_item" class="btn btn-xs btn-default"><?=$lang['user']['spamfilter_table_add'];?></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<h4><span class="glyphicon glyphicon-thumbs-down" aria-hidden="true"></span> <?=$lang['user']['spamfilter_bl'];?></h4>
|
||||
<p><?=$lang['user']['spamfilter_bl_desc'];?></p>
|
||||
<div class="row">
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_rule'];?></b></div>
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_action'];?></b></div>
|
||||
</div>
|
||||
<?php
|
||||
if (empty($get_policy_list['blacklist'])):
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-sm-12"><i><?=$lang['user']['spamfilter_table_empty'];?></i></div>
|
||||
</div>
|
||||
<?php
|
||||
else:
|
||||
foreach($get_policy_list['blacklist'] as $bl):
|
||||
?>
|
||||
<div class="row striped">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6"><code><?=$bl['value'];?></code></div>
|
||||
<div class="col-xs-6">
|
||||
<input type="hidden" name="delete_prefid" value="<?=$bl['prefid'];?>">
|
||||
<?php
|
||||
if ($bl['object'] == $domain):
|
||||
?>
|
||||
<input type="hidden" name="delete_policy_list_item">
|
||||
<input type="hidden" name="domain" value="<?=$domain;?>">
|
||||
<a href="#" onclick="$(this).closest('form').submit()" data-toggle="tooltip" data-placement="left" title="<?=$lang['user']['delete_now'];?>"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
<?php
|
||||
else:
|
||||
?>
|
||||
<span style="cursor:not-allowed"><?=$lang['user']['spamfilter_table_domain_policy'];?></span>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
endforeach;
|
||||
endif;
|
||||
?>
|
||||
<hr style="margin:5px 0px 7px 0px">
|
||||
<div class="row">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6">
|
||||
<input type="text" class="form-control input-sm" name="object_from" id="object_from" placeholder="*@example.org" required>
|
||||
<input type="hidden" name="object_list" value="bl">
|
||||
<input type="hidden" name="domain" value="<?=$domain;?>">
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
<button type="submit" name="add_policy_list_item" class="btn btn-xs btn-default"><?=$lang['user']['spamfilter_table_add'];?></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_GET['aliasdomain']) &&
|
||||
is_valid_domain_name($_GET["aliasdomain"]) &&
|
||||
!empty($_GET["aliasdomain"])) {
|
||||
$alias_domain = $_GET["aliasdomain"];
|
||||
$result = mailbox_get_alias_domain_details($alias_domain);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<h4><?=$lang['edit']['edit_alias_domain'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<input type="hidden" name="alias_domain_now" value="<?=htmlspecialchars($alias_domain);?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="alias_domain"><?=$lang['edit']['alias_domain'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="alias_domain" id="alias_domain" value="<?=htmlspecialchars($result['alias_domain']);?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" <?=(isset($result['active_int']) && $result['active_int']=="1") ? "checked" : null ?>> <?=$lang['edit']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_edit_alias_domain" class="btn btn-success btn-sm"><?=$lang['edit']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
if (!empty($dkim = dkim_get_key_details($alias_domain))) {
|
||||
?>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-xs-2">
|
||||
<p>Domain: <strong><?=htmlspecialchars($result['alias_domain']);?></strong> (dkim._domainkey)</p>
|
||||
</div>
|
||||
<div class="col-xs-10">
|
||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_GET['mailbox']) && filter_var($_GET["mailbox"], FILTER_VALIDATE_EMAIL) && !empty($_GET["mailbox"])) {
|
||||
$mailbox = $_GET["mailbox"];
|
||||
$result = mailbox_get_mailbox_details($mailbox);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<h4><?=$lang['edit']['mailbox'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<input type="hidden" name="username" value="<?=htmlspecialchars($result['username']);?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="name"><?=$lang['edit']['full_name'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="name" id="name" value="<?=htmlspecialchars($result['name'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="quota"><?=$lang['edit']['quota_mb'];?>:
|
||||
<br /><span id="quotaBadge" class="badge">max. <?=intval($result['max_new_quota'] / 1048576)?> MiB</span>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" name="quota" id="quota" id="destroyable" style="width:100%" min="1" max="<?=intval($result['max_new_quota'] / 1048576);?>" value="<?=intval($result['quota']) / 1048576;?>" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="sender_acl"><?=$lang['edit']['sender_acl'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select data-width="50%" style="width:100%" id="sender_acl" name="sender_acl[]" size="10" multiple>
|
||||
<?php
|
||||
$sender_acl_handles = mailbox_get_sender_acl_handles($mailbox);
|
||||
|
||||
foreach ($sender_acl_handles['sender_acl_domains']['ro'] as $domain):
|
||||
?>
|
||||
<option data-subtext="Admin" value="<?=htmlspecialchars($domain);?>" disabled selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
|
||||
foreach ($sender_acl_handles['sender_acl_addresses']['ro'] as $domain):
|
||||
?>
|
||||
<option data-subtext="Admin" disabled selected><?=htmlspecialchars($alias);?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
|
||||
foreach ($sender_acl_handles['fixed_sender_aliases'] as $alias):
|
||||
?>
|
||||
<option data-subtext="Alias" disabled selected><?=htmlspecialchars($alias);?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
|
||||
foreach ($sender_acl_handles['sender_acl_domains']['rw'] as $domain):
|
||||
?>
|
||||
<option value="<?=htmlspecialchars($domain);?>" selected><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
|
||||
foreach ($sender_acl_handles['sender_acl_domains']['selectable'] as $domain):
|
||||
?>
|
||||
<option value="<?=htmlspecialchars($domain);?>"><?=htmlspecialchars(sprintf($lang['edit']['dont_check_sender_acl'], $domain));?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
|
||||
foreach ($sender_acl_handles['sender_acl_addresses']['rw'] as $address):
|
||||
?>
|
||||
<option selected><?=htmlspecialchars($address);?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
|
||||
foreach ($sender_acl_handles['sender_acl_addresses']['selectable'] as $address):
|
||||
?>
|
||||
<option><?=htmlspecialchars($address);?></option>
|
||||
<?php
|
||||
endforeach;
|
||||
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password"><?=$lang['edit']['password'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password" id="password" placeholder="<?=$lang['edit']['unchanged_if_empty'];?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password2"><?=$lang['edit']['password_repeat'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password2" id="password2">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_edit_mailbox" class="btn btn-success btn-sm"><?=$lang['edit']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_GET['resource']) && filter_var($_GET["resource"], FILTER_VALIDATE_EMAIL) && !empty($_GET["resource"])) {
|
||||
$resource = $_GET["resource"];
|
||||
$result = mailbox_get_resource_details($resource);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<h4><?=$lang['edit']['resource'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<input type="hidden" name="name" value="<?=htmlspecialchars($result['name']);?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="description"><?=$lang['add']['description'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="description" id="description" value="<?=htmlspecialchars($result['description'], ENT_QUOTES, 'UTF-8');?>" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="domain"><?=$lang['edit']['kind'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="kind" id="kind" title="<?=$lang['edit']['select'];?>" required>
|
||||
<option value="location" <?=($result['kind'] == "location") ? "selected" : null;?>>Location</option>
|
||||
<option value="group" <?=($result['kind'] == "group") ? "selected" : null;?>>Group</option>
|
||||
<option value="thing" <?=($result['kind'] == "thing") ? "selected" : null;?>>Thing</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" <?=($result['active_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="multiple_bookings" <?=($result['multiple_bookings_int']=="1") ? "checked" : null;?>> <?=$lang['edit']['multiple_bookings'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="mailbox_edit_resource" class="btn btn-success btn-sm"><?=$lang['edit']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
elseif (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "user")) {
|
||||
if (isset($_GET['syncjob']) &&
|
||||
is_numeric($_GET['syncjob'])) {
|
||||
$id = $_GET["syncjob"];
|
||||
$result = get_syncjob_details($id);
|
||||
if (!empty($result)) {
|
||||
?>
|
||||
<h4><?=$lang['edit']['syncjob'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post" action="<?=($FORM_ACTION == "previous") ? $_SESSION['return_to'] : null;?>">
|
||||
<input type="hidden" name="id" value="<?=htmlspecialchars($result['id']);?>">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="host1"><?=$lang['edit']['hostname'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="host1" id="host1" value="<?=htmlspecialchars($result['host1'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="port1">Port</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="port1" id="port1" min="1" max="65535" value="<?=htmlspecialchars($result['port1'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="user1"><?=$lang['edit']['username'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="user1" id="user1" value="<?=htmlspecialchars($result['user1'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="password1"><?=$lang['edit']['password'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="password1" id="password1" value="<?=htmlspecialchars($result['password1'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="enc1"><?=$lang['edit']['encryption'];?>:</label>
|
||||
<div class="col-sm-10">
|
||||
<select id="enc1" name="enc1">
|
||||
<option <?=($result['enc1'] == "TLS") ? "selected" : null;?>>TLS</option>
|
||||
<option <?=($result['enc1'] == "SSL") ? "selected" : null;?>>SSL</option>
|
||||
<option <?=($result['enc1'] == "PLAIN") ? "selected" : null;?>>PLAIN</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="mins_interval"><?=$lang['edit']['mins_interval'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="mins_interval" min="10" max="3600" value="<?=htmlspecialchars($result['mins_interval'], ENT_QUOTES, 'UTF-8');?>" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="subfolder2"><?=$lang['edit']['subfolder2'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="subfolder2" id="subfolder2" value="<?=htmlspecialchars($result['subfolder2'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="maxage"><?=$lang['edit']['maxage'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="maxage" id="maxage" value="<?=htmlspecialchars($result['maxage'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="exclude"><?=$lang['edit']['exclude'];?></label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="exclude" id="exclude" value="<?=htmlspecialchars($result['exclude'], ENT_QUOTES, 'UTF-8');?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label><input type="checkbox" name="active" <?=($result['active']=="1") ? "checked" : "";?>> <?=$lang['edit']['active'];?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" name="edit_syncjob" value="1" class="btn btn-success btn-sm"><?=$lang['edit']['save'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<div class="alert alert-danger" role="alert"><?=$lang['danger']['access_denied'];?></div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="<?=$_SESSION['return_to'];?>">← <?=$lang['edit']['previous'];?></a>
|
||||
</div> <!-- /container -->
|
||||
<?php
|
||||
require_once("inc/footer.inc.php");
|
||||
?>
|
BIN
data/web/favicon.png
Normal file
BIN
data/web/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.7 KiB |
197
data/web/img/cow_mailcow.svg
Normal file
197
data/web/img/cow_mailcow.svg
Normal file
@@ -0,0 +1,197 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="Layer_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="446.22601"
|
||||
height="396.02499"
|
||||
viewBox="0 0 446.226 396.02499"
|
||||
enable-background="new 0 0 1600 1200"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="cow_mailcow.svg"><metadata
|
||||
id="metadata144"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs142" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1097"
|
||||
inkscape:window-height="1138"
|
||||
id="namedview140"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.1125147"
|
||||
inkscape:cx="261.00704"
|
||||
inkscape:cy="233.97883"
|
||||
inkscape:window-x="814"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="Layer_1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" /><g
|
||||
id="g3"
|
||||
transform="translate(-576.88698,-401.988)"><g
|
||||
id="g5"><g
|
||||
id="g7"><g
|
||||
id="email"><path
|
||||
d="m 890.306,557.81 29.26,11.373 0,172.027 c 0,9.753 -7.895,17.649 -17.638,17.649 l -235.998,0 c -9.743,0 -17.638,-7.896 -17.638,-17.649 l 0,-172.026 29.259,-8.937"
|
||||
id="path10"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#5a3620" /><path
|
||||
d="M 758.871,656.221 649.49,747.45 c 2.507,6.648 8.901,11.409 16.44,11.409 l 235.998,0 c 7.536,0 13.933,-4.761 16.444,-11.409 l -107.402,-91.229 -52.099,0 z"
|
||||
id="path12"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#fee70f;fill-opacity:0.89499998" /><g
|
||||
id="g14"><path
|
||||
d="m 810.391,656.686 107.981,90.764 c -0.331,0.881 -0.744,1.726 -1.205,2.536 l 0.028,0.035 c 1.501,-2.596 2.371,-5.594 2.371,-8.81 l 0,-172.004 -109.175,87.479 z"
|
||||
id="path16"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f9e82d;fill-opacity:1" /><path
|
||||
d="m 649.49,747.45 108.864,-90.764 -110.061,-87.479 0,172.003 c 0,3.216 0.876,6.214 2.367,8.81 l 0.039,-0.035 c -0.466,-0.809 -0.877,-1.654 -1.209,-2.535 z"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f9e82d;fill-opacity:1" /></g></g><path
|
||||
d="m 961.81,681.214 c 0,0 -15.232,16.783 -42.244,14.73 l 0,28.14 c 13.328,-5.185 47.061,-20.036 56.854,-40.809 l -14.61,-2.061 z"
|
||||
id="path20"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#b58765" /><path
|
||||
d="m 984.594,658.413 c 3.59,-9.156 7.701,-11 9.346,-11.346 -49.276,4.542 -32.99,38.693 -32.99,38.693 0,0 6.229,14.728 26.532,13.892 27.063,0.461 35.631,-50.166 35.631,-50.166 -6.654,11.655 -26.404,9.876 -38.519,8.927 z"
|
||||
id="path22"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#fef3df" /><ellipse
|
||||
cx="787.75098"
|
||||
cy="788.54498"
|
||||
rx="210.864"
|
||||
ry="9.4680004"
|
||||
id="ellipse24"
|
||||
style="fill:#f1f2f2" /><path
|
||||
d="m 783.931,446.247 c -66.396,0 -120.223,53.827 -120.223,120.223 0,66.396 53.827,120.221 120.223,120.221 66.397,0 120.222,-53.825 120.222,-120.221 0,-66.395 -53.825,-120.223 -120.222,-120.223 z m -11.96,215.702 c -53.009,0 -95.982,-43.855 -95.982,-97.953 0,-54.098 42.973,-97.952 95.982,-97.952 53.007,0 95.98,43.855 95.98,97.952 -10e-4,54.098 -42.973,97.953 -95.98,97.953 z"
|
||||
id="path26"
|
||||
inkscape:connector-curvature="0"
|
||||
style="opacity:0.1;fill:#3d5263" /><g
|
||||
id="g28"><g
|
||||
id="g30"><polyline
|
||||
points="691.144,492.5 673.257,540.276 686.55,605.582 712.496,631.852 "
|
||||
id="polyline32"
|
||||
style="fill:#3d5263" /><g
|
||||
id="g34"><g
|
||||
id="g36"><polyline
|
||||
points="658.248,450.81 673.501,487.076 693.836,496.903 724.04,458.731 "
|
||||
id="polyline38"
|
||||
style="fill:#fef3df" /><g
|
||||
id="g40"><path
|
||||
d="m 710.634,473.205 c 0,0 -22.482,-25.556 -49.793,-18.975 0,0 4.667,34.118 46.349,44.019 l 2.61,8.533 c 0,0 -65.612,-9.689 -59.339,-67.593 0,0 49.008,-19.884 72.598,15.106"
|
||||
id="path42"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#b58765" /><polyline
|
||||
points="909.697,450.81 894.447,487.076 874.114,496.903 843.907,458.731 "
|
||||
id="polyline44"
|
||||
style="fill:#fef3df" /><path
|
||||
d="m 857.314,473.205 c 0,0 22.48,-25.556 49.79,-18.975 0,0 -4.664,34.118 -46.347,44.019 l -2.613,8.533 c 0,0 65.611,-9.689 59.339,-67.593 0,0 -49.006,-19.884 -72.6,15.106"
|
||||
id="path46"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#b58765" /></g></g><path
|
||||
d="m 726.619,647.067 55.945,0 16.40428,-204.81407 c -55.814,0 -112.41728,30.01707 -112.41728,77.85207 0,1.454 0.085,2.787 0.121,4.175 0.127,3.934 0.448,7.585 0.856,11.135 1.689,14.816 5.451,27.177 8.461,43.383 1.452,7.831 5.002,23.374 5.002,23.374 0.056,0.408 0.165,0.804 0.224,1.211 2.535,16.546 11.832,32.027 25.404,43.684 z"
|
||||
id="path48"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#b58765"
|
||||
sodipodi:nodetypes="cccscccccc" /><path
|
||||
d="m 781.992,433.489 0,213.577 55.944,0 c 13.572,-11.657 22.867,-27.138 25.406,-43.684 0.058,-0.407 0.163,-0.803 0.221,-1.211 0,0 3.549,-15.543 5.002,-23.374 3.011,-16.206 6.774,-28.567 8.464,-43.381 0.405,-3.552 0.724,-7.203 0.846,-11.137 0.042,-1.388 0.126,-2.721 0.126,-4.175 0,-47.834 -40.191,-86.615 -96.009,-86.615 z"
|
||||
id="path50"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#b58765" /><g
|
||||
id="g52"><g
|
||||
id="g54"><path
|
||||
d="m 860.944,613.502 c 0,28.321 -35.091,51.289 -78.383,51.289 -43.299,0 -78.388,-22.968 -78.388,-51.289 0,-28.325 35.089,-51.289 78.388,-51.289 43.292,0 78.383,22.964 78.383,51.289 z"
|
||||
id="path56"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#fef3df" /></g></g><g
|
||||
id="g58"><g
|
||||
id="g60"><g
|
||||
id="g62"><path
|
||||
d="m 747.044,605.582 c 0,6.215 -5.04,11.256 -11.261,11.256 -6.21,0 -11.253,-5.041 -11.253,-11.256 0,-6.223 5.043,-11.257 11.253,-11.257 6.22,0 11.261,5.034 11.261,11.257 z"
|
||||
id="path64"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#5a3620" /></g></g><g
|
||||
id="g66"><g
|
||||
id="g68"><path
|
||||
d="m 840.856,605.582 c 0,6.215 -5.037,11.256 -11.257,11.256 -6.218,0 -11.259,-5.041 -11.259,-11.256 0,-6.223 5.041,-11.257 11.259,-11.257 6.22,0 11.257,5.034 11.257,11.257 z"
|
||||
id="path70"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#5a3620" /></g></g></g><g
|
||||
id="g72"><path
|
||||
d="m 875.228,525.835 c 0.354,-3.113 0.634,-6.311 0.743,-9.754 0.035,-1.218 0.109,-2.384 0.109,-3.661 0,-40.785 -33.369,-74.043 -80.237,-75.775 l -7.335,0.005 c -0.003,0 -0.003,0 -0.006,0 -0.007,0.018 -28.632,88.422 76.583,140.268 0.946,-4.317 2.078,-9.585 2.73,-13.088 2.64,-14.196 5.934,-25.021 7.413,-37.995 z"
|
||||
id="path74"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#87654a" /></g><g
|
||||
id="g76"><g
|
||||
id="g78"><g
|
||||
id="g80"><g
|
||||
id="g82"><path
|
||||
d="m 843.907,519.681 c 0,6.964 -5.65,12.611 -12.618,12.611 -6.963,0 -12.614,-5.646 -12.614,-12.611 0,-6.97 5.651,-12.614 12.614,-12.614 6.968,0 12.618,5.644 12.618,12.614 z"
|
||||
id="path84"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#5a3620" /></g></g></g><g
|
||||
id="g86"><g
|
||||
id="g88"><g
|
||||
id="g90"><path
|
||||
d="m 752.028,519.681 c 0,6.964 -5.649,12.611 -12.612,12.611 -6.969,0 -12.612,-5.646 -12.612,-12.611 0,-6.97 5.642,-12.614 12.612,-12.614 6.964,0 12.612,5.644 12.612,12.614 z"
|
||||
id="path92"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#5a3620" /></g></g></g><g
|
||||
id="g94"><g
|
||||
id="g96"><path
|
||||
d="m 748.75,515.894 c 0,2.558 -2.071,4.629 -4.63,4.629 -2.558,0 -4.633,-2.072 -4.633,-4.629 0,-2.552 2.076,-4.626 4.633,-4.626 2.559,0 4.63,2.073 4.63,4.626 z"
|
||||
id="path98"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff" /></g></g><g
|
||||
id="g100"><g
|
||||
id="g102"><path
|
||||
d="m 839.771,515.894 c 0,2.558 -2.073,4.629 -4.629,4.629 -2.558,0 -4.631,-2.072 -4.631,-4.629 0,-2.552 2.072,-4.626 4.631,-4.626 2.555,0 4.629,2.073 4.629,4.626 z"
|
||||
id="path104"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff" /></g></g></g></g><path
|
||||
d="m 734.557,443.625 c 0,0 -18.236,-25.199 0,-41.637 0,0 13.125,32.012 40.242,31.502"
|
||||
id="path106"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#fef3df" /><path
|
||||
d="m 834.496,443.625 c 0,0 18.236,-25.199 0,-41.637 0,0 -13.126,32.012 -40.242,31.502"
|
||||
id="path108"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#fef3df" /><path
|
||||
d="m 786.264,431.965 c -66.396,0 -120.223,53.827 -120.223,120.223 0,66.396 53.827,120.221 120.223,120.221 66.397,0 120.222,-53.825 120.222,-120.221 10e-4,-66.395 -53.825,-120.223 -120.222,-120.223 z m -11.96,215.702 c -53.009,0 -95.982,-43.855 -95.982,-97.953 0,-54.098 42.973,-97.952 95.982,-97.952 53.007,0 95.979,43.855 95.979,97.952 0,54.098 -42.972,97.953 -95.979,97.953 z"
|
||||
id="path110"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f1f2f2" /></g><g
|
||||
id="g112"><path
|
||||
d="m 781.737,436.751 c 66.396,0 120.221,53.827 120.221,120.223 0,30.718 -11.526,58.74 -30.482,79.991 21.636,-21.74 35.01,-51.708 35.01,-84.803 0,-66.395 -53.825,-120.222 -120.222,-120.222 -35.678,0 -67.721,15.549 -89.739,40.233 21.772,-21.879 51.91,-35.422 85.212,-35.422 z"
|
||||
id="path114"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff" /></g></g><path
|
||||
d="m 919.566,695.944 c 0,0 7.562,0.712 13.317,-0.502 l 13.013,16.12 c 0,0 -17.639,9.525 -26.33,12.523 l 0,-28.141 z"
|
||||
id="path116"
|
||||
inkscape:connector-curvature="0"
|
||||
style="opacity:0.1;fill:#3d5263" /></g><path
|
||||
d="m 648.292,659.614 0,81.645 c 0,9.72 7.88,17.6 17.6,17.6 l 236.073,0 c 9.72,0 17.6,-7.88 17.6,-17.6 l 0,-24.902 c 10e-4,0 -175.814,35.524 -271.273,-56.743 z"
|
||||
id="path124"
|
||||
inkscape:connector-curvature="0"
|
||||
style="opacity:0.1;fill:#3d5263" /></g><g
|
||||
id="g126" /></g></svg>
|
After Width: | Height: | Size: 12 KiB |
BIN
data/web/img/yubi.ico
Normal file
BIN
data/web/img/yubi.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
225
data/web/inc/footer.inc.php
Normal file
225
data/web/inc/footer.inc.php
Normal file
@@ -0,0 +1,225 @@
|
||||
<?php
|
||||
include("inc/tfa_modals.php");
|
||||
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin"):
|
||||
?>
|
||||
<div id="RestartSOGo" class="modal fade" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||
<h4 class="modal-title"><?=$lang['footer']['restart_sogo'];?></h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p><?=$lang['footer']['restart_sogo_info'];?></p>
|
||||
<hr />
|
||||
<button class="btn btn-md btn-primary" id="triggerRestartSogo"><?=$lang['footer']['restart_now'];?></button>
|
||||
<br /><br />
|
||||
<div id="statusTriggerRestartSogo"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
<div style="margin-bottom:100px"></div>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></script>
|
||||
<script src="/js/bootstrap-switch.min.js"></script>
|
||||
<script src="/js/bootstrap-slider.min.js"></script>
|
||||
<script src="/js/bootstrap-select.min.js"></script>
|
||||
<script src="/js/u2f-api.js"></script>
|
||||
<script>
|
||||
// Select language and reopen active URL without POST
|
||||
function setLang(sel) {
|
||||
$.post( "<?=$_SERVER['REQUEST_URI'];?>", {lang: sel} );
|
||||
window.location.href = window.location.pathname + window.location.search;
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// Confirm TFA modal
|
||||
<?php if (isset($_SESSION['pending_tfa_method'])):?>
|
||||
$('#ConfirmTFAModal').modal({
|
||||
backdrop: 'static',
|
||||
keyboard: false
|
||||
});
|
||||
$('#ConfirmTFAModal').on('shown.bs.modal', function(){
|
||||
$(this).find('#token').focus();
|
||||
// If U2F
|
||||
if(document.getElementById("u2f_auth_data") !== null) {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
cache: false,
|
||||
dataType: 'script',
|
||||
url: "json_api.php",
|
||||
data: {
|
||||
'action':'get_u2f_auth_challenge',
|
||||
'object':'<?=(isset($_SESSION['pending_mailcow_cc_username'])) ? $_SESSION['pending_mailcow_cc_username'] : null;?>',
|
||||
},
|
||||
success: function(data){
|
||||
data;
|
||||
}
|
||||
});
|
||||
setTimeout(function() {
|
||||
console.log("sign: ", req);
|
||||
u2f.sign(req, function(data) {
|
||||
var form = document.getElementById('u2f_auth_form');
|
||||
var auth = document.getElementById('u2f_auth_data');
|
||||
console.log("Authenticate callback", data);
|
||||
auth.value = JSON.stringify(data);
|
||||
form.submit();
|
||||
});
|
||||
}, 1000);
|
||||
}
|
||||
});
|
||||
<?php endif; ?>
|
||||
|
||||
// Set TFA modals
|
||||
|
||||
$('#selectTFA').change(function () {
|
||||
if ($(this).val() == "yubi_otp") {
|
||||
$('#YubiOTPModal').modal('show');
|
||||
$("option:selected").prop("selected", false);
|
||||
}
|
||||
if ($(this).val() == "u2f") {
|
||||
$('#U2FModal').modal('show');
|
||||
$("option:selected").prop("selected", false);
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
cache: false,
|
||||
dataType: 'script',
|
||||
url: "json_api.php",
|
||||
data: {
|
||||
'action':'get_u2f_reg_challenge',
|
||||
'object':'<?=(isset($_SESSION['mailcow_cc_username'])) ? $_SESSION['mailcow_cc_username'] : null;?>',
|
||||
},
|
||||
success: function(data){
|
||||
data;
|
||||
}
|
||||
});
|
||||
setTimeout(function() {
|
||||
console.log("Register: ", req);
|
||||
u2f.register([req], sigs, function(data) {
|
||||
var form = document.getElementById('u2f_reg_form');
|
||||
var reg = document.getElementById('u2f_register_data');
|
||||
console.log("Register callback", data);
|
||||
if (data.errorCode && data.errorCode != 0) {
|
||||
var u2f_return_code = document.getElementById('u2f_return_code');
|
||||
u2f_return_code.style.display = u2f_return_code.style.display === 'none' ? '' : null;
|
||||
if (data.errorCode == "4") { data.errorCode = "4 - The presented device is not eligible for this request. For a registration request this may mean that the token is already registered, and for a sign request it may mean that the token does not know the presented key handle"; }
|
||||
u2f_return_code.innerHTML = 'Error code: ' + data.errorCode;
|
||||
return;
|
||||
}
|
||||
reg.value = JSON.stringify(data);
|
||||
form.submit();
|
||||
});
|
||||
}, 1000);
|
||||
}
|
||||
if ($(this).val() == "none") {
|
||||
$('#DisableTFAModal').modal('show');
|
||||
$("option:selected").prop("selected", false);
|
||||
}
|
||||
});
|
||||
|
||||
// Activate tooltips
|
||||
$(function () {
|
||||
$('[data-toggle="tooltip"]').tooltip()
|
||||
})
|
||||
// Hide alerts after n seconds
|
||||
$("#alert-fade").fadeTo(7000, 500).slideUp(500, function(){
|
||||
$("#alert-fade").alert('close');
|
||||
});
|
||||
|
||||
// Remember last navigation pill
|
||||
(function () {
|
||||
'use strict';
|
||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
||||
var id = $(this).parents('[role="tablist"]').attr('id');
|
||||
var key = 'lastTag';
|
||||
if (id) {
|
||||
key += ':' + id;
|
||||
}
|
||||
localStorage.setItem(key, $(e.target).attr('href'));
|
||||
});
|
||||
$('[role="tablist"]').each(function (idx, elem) {
|
||||
var id = $(elem).attr('id');
|
||||
var key = 'lastTag';
|
||||
if (id) {
|
||||
key += ':' + id;
|
||||
}
|
||||
var lastTab = localStorage.getItem(key);
|
||||
if (lastTab) {
|
||||
$('[href="' + lastTab + '"]').tab('show');
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
// Disable submit after submitting form
|
||||
$('form').submit(function() {
|
||||
if ($('form button[type="submit"]').data('submitted') == '1') {
|
||||
return false;
|
||||
} else {
|
||||
$(this).find('button[type="submit"]').first().text('<?=$lang['footer']['loading'];?>');
|
||||
$('form button[type="submit"]').attr('data-submitted', '1');
|
||||
function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); };
|
||||
$(document).on("keydown", disableF5);
|
||||
}
|
||||
});
|
||||
|
||||
// IE fix to hide scrollbars when table body is empty
|
||||
$('tbody').filter(function (index) {
|
||||
return $(this).children().length < 1;
|
||||
}).remove();
|
||||
|
||||
// Init Bootstrap Selectpicker
|
||||
$('select').selectpicker();
|
||||
|
||||
// Trigger SOGo restart
|
||||
$('#triggerRestartSogo').click(function(){
|
||||
$(this).prop("disabled",true);
|
||||
$(this).html('<span class="glyphicon glyphicon-refresh glyphicon-spin"></span> ');
|
||||
$('#statusTriggerRestartSogo').text('Stopping SOGo workers, this may take a while... ');
|
||||
$.ajax({
|
||||
method: 'get',
|
||||
url: 'call_sogo_ctrl.php',
|
||||
data: {
|
||||
'ajax': true,
|
||||
'ACTION': 'stop'
|
||||
},
|
||||
success: function(data) {
|
||||
$('#statusTriggerRestartSogo').append(data);
|
||||
$('#statusTriggerRestartSogo').append('<br />Starting SOGo... ');
|
||||
$.ajax({
|
||||
method: 'get',
|
||||
url: 'call_sogo_ctrl.php',
|
||||
data: {
|
||||
'ajax': true,
|
||||
'ACTION': 'start'
|
||||
},
|
||||
success: function(data) {
|
||||
$('#statusTriggerRestartSogo').append(data);
|
||||
$('#triggerRestartSogo').html('<span class="glyphicon glyphicon-ok"></span> ');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
if (isset($_SESSION['return'])):
|
||||
?>
|
||||
<div class="container">
|
||||
<div style="position:fixed;bottom:8px;right:25px;min-width:300px;max-width:350px;z-index:2000">
|
||||
<div <?=($_SESSION['return']['type'] == 'danger') ? null : 'id="alert-fade"'?> class="alert alert-<?=$_SESSION['return']['type'];?>" role="alert">
|
||||
<a href="#" class="close" data-dismiss="alert"> ×</a>
|
||||
<?=htmlspecialchars($_SESSION['return']['msg']);?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
unset($_SESSION['return']);
|
||||
endif;
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
<?php $stmt = null; $pdo = null; ?>
|
4922
data/web/inc/functions.inc.php
Normal file
4922
data/web/inc/functions.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
104
data/web/inc/header.inc.php
Normal file
104
data/web/inc/header.inc.php
Normal file
@@ -0,0 +1,104 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?= $_SESSION['mailcow_locale'] ?>">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>mailcow UI</title>
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js" integrity="sha384-XxcvoeNF5V0ZfksTnV+bejnCsJjOOIzN6UVwF85WBsAnU3zeYh5bloN+L4WLgeNE" crossorigin="anonymous"></script>
|
||||
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.6/<?=strtolower(trim($DEFAULT_THEME));?>/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="/css/bootstrap-select.min.css">
|
||||
<link rel="stylesheet" href="/css/bootstrap-slider.min.css">
|
||||
<link rel="stylesheet" href="/css/bootstrap-switch.min.css">
|
||||
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700&subset=latin,latin-ext">
|
||||
<link rel="stylesheet" href="/inc/languages.min.css">
|
||||
<link rel="stylesheet" href="/css/mailcow.css">
|
||||
<link rel="stylesheet" href="/css/tables.css">
|
||||
<?=(preg_match("/mailbox.php/i", $_SERVER['REQUEST_URI'])) ? '<link rel="stylesheet" href="/css/mailbox.css">' : null;?>
|
||||
<link rel="shortcut icon" href="/favicon.png" type="image/png">
|
||||
<link rel="icon" href="/favicon.png" type="image/png">
|
||||
</head>
|
||||
<body style="padding-top:70px">
|
||||
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/"><img height="32" alt="mailcow-logo" style="margin-top:-5px;" src="/img/cow_mailcow.svg" /></a>
|
||||
</div>
|
||||
<div id="navbar" class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<?php
|
||||
if (isset($_SESSION['mailcow_locale'])) {
|
||||
?>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><span class="lang-sm lang-lbl" lang="<?=$_SESSION['mailcow_locale'];?>"></span><span class="caret"></span></a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'de') ? 'class="active"' : ''?>> <a href="?<?= http_build_query(array_merge($_GET, array("lang" => "de"))) ?>"><span class="lang-xs lang-lbl-full" lang="de"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'en') ? 'class="active"' : ''?>> <a href="?<?= http_build_query(array_merge($_GET, array("lang" => "en"))) ?>"><span class="lang-xs lang-lbl-full" lang="en"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'es') ? 'class="active"' : ''?>> <a href="?<?= http_build_query(array_merge($_GET, array("lang" => "es"))) ?>"><span class="lang-xs lang-lbl-full" lang="es"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'nl') ? 'class="active"' : ''?>> <a href="?<?= http_build_query(array_merge($_GET, array("lang" => "nl"))) ?>"><span class="lang-xs lang-lbl-full" lang="nl"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'pt') ? 'class="active"' : ''?>> <a href="?<?= http_build_query(array_merge($_GET, array("lang" => "pt"))) ?>"><span class="lang-xs lang-lbl-full" lang="pt"></span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<?php
|
||||
}
|
||||
if (isset($_SESSION['mailcow_cc_role'])) {
|
||||
?>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><?=$lang['header']['mailcow_settings'];?><span class="caret"></span></a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<?php
|
||||
if (isset($_SESSION['mailcow_cc_role'])) {
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin") {
|
||||
?>
|
||||
<li <?=(preg_match("/admin/i", $_SERVER['REQUEST_URI'])) ? 'class="active"' : ''?>><a href="/admin.php"><?=$lang['header']['administration'];?></a></li>
|
||||
<?php
|
||||
}
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin") {
|
||||
?>
|
||||
<li <?=(preg_match("/mailbox/i", $_SERVER['REQUEST_URI'])) ? 'class="active"' : ''?>><a href="/mailbox.php"><?=$lang['header']['mailboxes'];?></a></li>
|
||||
<?php
|
||||
}
|
||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||
?>
|
||||
<li <?=(preg_match("/user/i", $_SERVER['REQUEST_URI'])) ? 'class="active"' : ''?>><a href="/user.php"><?=$lang['header']['user_settings'];?></a></li>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</li>
|
||||
<?php
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin"):
|
||||
?>
|
||||
<li><a href data-toggle="modal" data-target="#RestartSOGo"><span style="font-size:12px" class="glyphicon glyphicon-refresh" aria-hidden="true"></span> <?=$lang['header']['restart_sogo'];?></a></li>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
<?php
|
||||
}
|
||||
if (!isset($_SESSION["dual-login"]) && isset($_SESSION['mailcow_cc_username'])):
|
||||
?>
|
||||
<li><a style="border-left:1px solid #E7E7E7" href="#" onclick="logout.submit()"><?=sprintf($lang['header']['logged_in_as_logout'], $_SESSION['mailcow_cc_username']);?></a></li>
|
||||
<?php
|
||||
elseif (isset($_SESSION["dual-login"])):
|
||||
?>
|
||||
<li><a style="border-left:1px solid #E7E7E7" href="#" onclick="logout.submit()"><?=sprintf($lang['header']['logged_in_as_logout_dual'], $_SESSION['mailcow_cc_username'], $_SESSION["dual-login"]["username"]);?></a></li>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</ul>
|
||||
</div><!--/.nav-collapse -->
|
||||
</div><!--/.container-fluid -->
|
||||
</nav>
|
||||
<form action="/" method="post" id="logout"><input type="hidden" name="logout"></form>
|
281
data/web/inc/init.sql
Normal file
281
data/web/inc/init.sql
Normal file
@@ -0,0 +1,281 @@
|
||||
CREATE TABLE IF NOT EXISTS `admin` (
|
||||
`username` VARCHAR(255) NOT NULL,
|
||||
`password` VARCHAR(255) NOT NULL,
|
||||
`superadmin` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
`created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`username`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `alias` (
|
||||
`address` VARCHAR(255) NOT NULL,
|
||||
`goto` TEXT NOT NULL,
|
||||
`domain` VARCHAR(255) NOT NULL,
|
||||
`created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`address`),
|
||||
KEY `domain` (`domain`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `sender_acl` (
|
||||
`logged_in_as` VARCHAR(255) NOT NULL,
|
||||
`send_as` VARCHAR(255) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `spamalias` (
|
||||
`address` VARCHAR(255) NOT NULL,
|
||||
`goto` TEXT NOT NULL,
|
||||
`validity` INT(11) NOT NULL,
|
||||
PRIMARY KEY (`address`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `alias_domain` (
|
||||
`alias_domain` VARCHAR(255) NOT NULL,
|
||||
`target_domain` VARCHAR(255) NOT NULL,
|
||||
`created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`alias_domain`),
|
||||
KEY `active` (`active`),
|
||||
KEY `target_domain` (`target_domain`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `domain` (
|
||||
`domain` VARCHAR(255) NOT NULL,
|
||||
`description` VARCHAR(255),
|
||||
`aliases` INT(10) NOT NULL DEFAULT '0',
|
||||
`mailboxes` INT(10) NOT NULL DEFAULT '0',
|
||||
`maxquota` BIGINT(20) NOT NULL DEFAULT '0',
|
||||
`quota` BIGINT(20) NOT NULL DEFAULT '0',
|
||||
`transport` VARCHAR(255) NOT NULL,
|
||||
`backupmx` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
`relay_all_recipients` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
`created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`domain`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `domain_admins` (
|
||||
`username` VARCHAR(255) NOT NULL,
|
||||
`domain` VARCHAR(255) NOT NULL,
|
||||
`created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '1',
|
||||
KEY `username` (`username`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `mailbox` (
|
||||
`username` VARCHAR(255) NOT NULL,
|
||||
`password` VARCHAR(255) NOT NULL,
|
||||
`name` VARCHAR(255),
|
||||
`maildir` VARCHAR(255) NOT NULL,
|
||||
`quota` BIGINT(20) NOT NULL DEFAULT '0',
|
||||
`local_part` VARCHAR(255) NOT NULL,
|
||||
`domain` VARCHAR(255) NOT NULL,
|
||||
`created` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`modified` DATETIME NOT NULL DEFAULT '2016-01-01 00:00:00',
|
||||
`tls_enforce_in` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
`tls_enforce_out` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
`kind` VARCHAR(100) NOT NULL DEFAULT '',
|
||||
`multiple_bookings` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
`wants_tagged_subject` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`username`),
|
||||
KEY `domain` (`domain`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `quota2` (
|
||||
`username` VARCHAR(100) NOT NULL,
|
||||
`bytes` BIGINT(20) NOT NULL DEFAULT '0',
|
||||
`messages` INT(11) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`username`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `filterconf` (
|
||||
`object` VARCHAR(100) NOT NULL DEFAULT '',
|
||||
`option` VARCHAR(50) NOT NULL DEFAULT '',
|
||||
`value` VARCHAR(100) NOT NULL DEFAULT '',
|
||||
`prefid` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`prefid`),
|
||||
KEY `object` (`object`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `imapsync` (
|
||||
`id` INT NOT NULL AUTO_INCREMENT,
|
||||
`user2` VARCHAR(255) NOT NULL,
|
||||
`host1` VARCHAR(255) NOT NULL,
|
||||
`authmech1` ENUM('PLAIN','LOGIN','CRAM-MD5') DEFAULT 'PLAIN',
|
||||
`regextrans2` VARCHAR(255) DEFAULT '',
|
||||
`authmd51` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`domain2` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`subfolder2` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`user1` VARCHAR(255) NOT NULL,
|
||||
`password1` VARCHAR(255) NOT NULL,
|
||||
`exclude` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`maxage` SMALLINT NOT NULL DEFAULT '0',
|
||||
`mins_interval` VARCHAR(50) NOT NULL,
|
||||
`port1` SMALLINT NOT NULL,
|
||||
`enc1` ENUM('TLS','SSL','PLAIN') DEFAULT 'TLS',
|
||||
`delete2duplicates` TINYINT(1) NOT NULL DEFAULT '1',
|
||||
`returned_text` TEXT,
|
||||
`last_run` TIMESTAMP NULL DEFAULT NULL,
|
||||
`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `tfa` (
|
||||
`id` INT NOT NULL AUTO_INCREMENT,
|
||||
`username` VARCHAR(255) NOT NULL,
|
||||
`authmech` ENUM('yubi_otp', 'u2f', 'hotp', 'totp'),
|
||||
`secret` VARCHAR(255) DEFAULT NULL,
|
||||
`keyHandle` VARCHAR(255) DEFAULT NULL,
|
||||
`publicKey` VARCHAR(255) DEFAULT NULL,
|
||||
`counter` INT NOT NULL DEFAULT '0',
|
||||
`certificate` TEXT,
|
||||
`active` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
DROP VIEW IF EXISTS grouped_mail_aliases;
|
||||
DROP VIEW IF EXISTS grouped_sender_acl;
|
||||
DROP VIEW IF EXISTS grouped_domain_alias_address;
|
||||
|
||||
CREATE VIEW grouped_mail_aliases (username, aliases) AS
|
||||
SELECT goto, IFNULL(GROUP_CONCAT(address SEPARATOR ' '), '') AS address FROM alias
|
||||
WHERE address!=goto
|
||||
AND active = '1'
|
||||
AND address NOT LIKE '@%'
|
||||
GROUP BY goto;
|
||||
|
||||
CREATE VIEW grouped_sender_acl (username, send_as) AS
|
||||
SELECT logged_in_as, IFNULL(GROUP_CONCAT(send_as SEPARATOR ' '), '') AS send_as FROM sender_acl
|
||||
WHERE send_as NOT LIKE '@%'
|
||||
GROUP BY logged_in_as;
|
||||
|
||||
CREATE VIEW grouped_domain_alias_address (username, ad_alias) AS
|
||||
SELECT username, IFNULL(GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ' '), '') AS ad_alias FROM mailbox
|
||||
LEFT OUTER JOIN alias_domain on target_domain=domain GROUP BY username;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_acl (
|
||||
c_folder_id INTEGER NOT NULL,
|
||||
c_object character varying(255) NOT NULL,
|
||||
c_uid character varying(255) NOT NULL,
|
||||
c_role character varying(80) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_alarms_folder (
|
||||
c_path VARCHAR(255) NOT NULL,
|
||||
c_name VARCHAR(255) NOT NULL,
|
||||
c_uid VARCHAR(255) NOT NULL,
|
||||
c_recurrence_id INT(11) DEFAULT NULL,
|
||||
c_alarm_number INT(11) NOT NULL,
|
||||
c_alarm_date INT(11) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_cache_folder (
|
||||
c_uid VARCHAR(255) NOT NULL,
|
||||
c_path VARCHAR(255) NOT NULL,
|
||||
c_parent_path VARCHAR(255) DEFAULT NULL,
|
||||
c_type TINYINT(3) unsigned NOT NULL,
|
||||
c_creationdate INT(11) NOT NULL,
|
||||
c_lastmodified INT(11) NOT NULL,
|
||||
c_version INT(11) NOT NULL DEFAULT '0',
|
||||
c_deleted TINYINT(4) NOT NULL DEFAULT '0',
|
||||
c_content longTEXT,
|
||||
PRIMARY KEY (c_uid,c_path)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_folder_info (
|
||||
c_folder_id BIGINT(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
c_path VARCHAR(255) NOT NULL,
|
||||
c_path1 VARCHAR(255) NOT NULL,
|
||||
c_path2 VARCHAR(255) DEFAULT NULL,
|
||||
c_path3 VARCHAR(255) DEFAULT NULL,
|
||||
c_path4 VARCHAR(255) DEFAULT NULL,
|
||||
c_foldername VARCHAR(255) NOT NULL,
|
||||
c_location INTeger NULL,
|
||||
c_quick_location VARCHAR(2048) DEFAULT NULL,
|
||||
c_acl_location VARCHAR(2048) DEFAULT NULL,
|
||||
c_folder_type VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (c_path),
|
||||
UNIQUE KEY c_folder_id (c_folder_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_quick_appointment (
|
||||
c_folder_id INTeger NOT NULL,
|
||||
c_name character varying(255) NOT NULL,
|
||||
c_uid character varying(255) NOT NULL,
|
||||
c_startdate INTeger,
|
||||
c_enddate INTeger,
|
||||
c_cycleenddate INTeger,
|
||||
c_title character varying(1000) NOT NULL,
|
||||
c_participants TEXT,
|
||||
c_isallday INTeger,
|
||||
c_iscycle INTeger,
|
||||
c_cycleinfo TEXT,
|
||||
c_classification INTeger NOT NULL,
|
||||
c_isopaque INTeger NOT NULL,
|
||||
c_status INTeger NOT NULL,
|
||||
c_priority INTeger,
|
||||
c_location character varying(255),
|
||||
c_orgmail character varying(255),
|
||||
c_partmails TEXT,
|
||||
c_partstates TEXT,
|
||||
c_category character varying(255),
|
||||
c_sequence INTeger,
|
||||
c_component character varying(10) NOT NULL,
|
||||
c_nextalarm INTeger,
|
||||
c_description TEXT,
|
||||
CONSTRAINT sogo_quick_appointment_pkey PRIMARY KEY (c_folder_id, c_name)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_quick_contact (
|
||||
c_folder_id INTeger NOT NULL,
|
||||
c_name character varying(255) NOT NULL,
|
||||
c_givenname character varying(255),
|
||||
c_cn character varying(255),
|
||||
c_sn character varying(255),
|
||||
c_screenname character varying(255),
|
||||
c_l character varying(255),
|
||||
c_mail character varying(255),
|
||||
c_o character varying(255),
|
||||
c_ou character varying(255),
|
||||
c_telephonenumber character varying(255),
|
||||
c_categories character varying(255),
|
||||
c_component character varying(10) NOT NULL,
|
||||
CONSTRAINT sogo_quick_contact_pkey PRIMARY KEY (c_folder_id, c_name)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_sessions_folder (
|
||||
c_id VARCHAR(255) NOT NULL,
|
||||
c_value VARCHAR(255) NOT NULL,
|
||||
c_creationdate INT(11) NOT NULL,
|
||||
c_lastseen INT(11) NOT NULL,
|
||||
PRIMARY KEY (c_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_store (
|
||||
c_folder_id INTeger NOT NULL,
|
||||
c_name character varying(255) NOT NULL,
|
||||
c_content mediumTEXT NOT NULL,
|
||||
c_creationdate INTeger NOT NULL,
|
||||
c_lastmodified INTeger NOT NULL,
|
||||
c_version INTeger NOT NULL,
|
||||
c_deleted INTeger,
|
||||
CONSTRAINT sogo_store_pkey PRIMARY KEY (c_folder_id, c_name)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sogo_user_profile (
|
||||
c_uid VARCHAR(255) NOT NULL,
|
||||
c_defaults TEXT,
|
||||
c_settings TEXT,
|
||||
PRIMARY KEY (c_uid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
|
||||
|
||||
INSERT INTO `admin` (username, password, superadmin, created, modified, active) SELECT 'admin', '{SSHA256}K8eVJ6YsZbQCfuJvSUbaQRLr0HPLz5rC9IAp0PAFl0tmNDBkMDc0NDAyOTAxN2Rk', 1, NOW(), NOW(), 1 WHERE NOT EXISTS (SELECT * FROM `admin`);
|
||||
DELETE FROM `domain_admins`;
|
||||
INSERT INTO `domain_admins` (username, domain, created, active) SELECT `username`, 'ALL', NOW(), 1 FROM `admin` WHERE superadmin='1' AND `username` NOT IN (SELECT `username` FROM `domain_admins`);
|
1
data/web/inc/languages.min.css
vendored
Normal file
1
data/web/inc/languages.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
data/web/inc/languages.png
Normal file
BIN
data/web/inc/languages.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
506
data/web/inc/lib/U2F.php
Normal file
506
data/web/inc/lib/U2F.php
Normal file
@@ -0,0 +1,506 @@
|
||||
<?php
|
||||
/* Copyright (c) 2014 Yubico AB
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
namespace u2flib_server;
|
||||
|
||||
/** Constant for the version of the u2f protocol */
|
||||
const U2F_VERSION = "U2F_V2";
|
||||
|
||||
/** Error for the authentication message not matching any outstanding
|
||||
* authentication request */
|
||||
const ERR_NO_MATCHING_REQUEST = 1;
|
||||
|
||||
/** Error for the authentication message not matching any registration */
|
||||
const ERR_NO_MATCHING_REGISTRATION = 2;
|
||||
|
||||
/** Error for the signature on the authentication message not verifying with
|
||||
* the correct key */
|
||||
const ERR_AUTHENTICATION_FAILURE = 3;
|
||||
|
||||
/** Error for the challenge in the registration message not matching the
|
||||
* registration challenge */
|
||||
const ERR_UNMATCHED_CHALLENGE = 4;
|
||||
|
||||
/** Error for the attestation signature on the registration message not
|
||||
* verifying */
|
||||
const ERR_ATTESTATION_SIGNATURE = 5;
|
||||
|
||||
/** Error for the attestation verification not verifying */
|
||||
const ERR_ATTESTATION_VERIFICATION = 6;
|
||||
|
||||
/** Error for not getting good random from the system */
|
||||
const ERR_BAD_RANDOM = 7;
|
||||
|
||||
/** Error when the counter is lower than expected */
|
||||
const ERR_COUNTER_TOO_LOW = 8;
|
||||
|
||||
/** Error decoding public key */
|
||||
const ERR_PUBKEY_DECODE = 9;
|
||||
|
||||
/** Error user-agent returned error */
|
||||
const ERR_BAD_UA_RETURNING = 10;
|
||||
|
||||
/** Error old OpenSSL version */
|
||||
const ERR_OLD_OPENSSL = 11;
|
||||
|
||||
/** @internal */
|
||||
const PUBKEY_LEN = 65;
|
||||
|
||||
class U2F
|
||||
{
|
||||
/** @var string */
|
||||
private $appId;
|
||||
|
||||
/** @var null|string */
|
||||
private $attestDir;
|
||||
|
||||
/** @internal */
|
||||
private $FIXCERTS = array(
|
||||
'349bca1031f8c82c4ceca38b9cebf1a69df9fb3b94eed99eb3fb9aa3822d26e8',
|
||||
'dd574527df608e47ae45fbba75a2afdd5c20fd94a02419381813cd55a2a3398f',
|
||||
'1d8764f0f7cd1352df6150045c8f638e517270e8b5dda1c63ade9c2280240cae',
|
||||
'd0edc9a91a1677435a953390865d208c55b3183c6759c9b5a7ff494c322558eb',
|
||||
'6073c436dcd064a48127ddbf6032ac1a66fd59a0c24434f070d4e564c124c897',
|
||||
'ca993121846c464d666096d35f13bf44c1b05af205f9b4a1e00cf6cc10c5e511'
|
||||
);
|
||||
|
||||
/**
|
||||
* @param string $appId Application id for the running application
|
||||
* @param string|null $attestDir Directory where trusted attestation roots may be found
|
||||
* @throws Error If OpenSSL older than 1.0.0 is used
|
||||
*/
|
||||
public function __construct($appId, $attestDir = null)
|
||||
{
|
||||
if(OPENSSL_VERSION_NUMBER < 0x10000000) {
|
||||
throw new Error('OpenSSL has to be at least version 1.0.0, this is ' . OPENSSL_VERSION_TEXT, ERR_OLD_OPENSSL);
|
||||
}
|
||||
$this->appId = $appId;
|
||||
$this->attestDir = $attestDir;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to get a registration request to send to a user.
|
||||
* Returns an array of one registration request and a array of sign requests.
|
||||
*
|
||||
* @param array $registrations List of current registrations for this
|
||||
* user, to prevent the user from registering the same authenticator several
|
||||
* times.
|
||||
* @return array An array of two elements, the first containing a
|
||||
* RegisterRequest the second being an array of SignRequest
|
||||
* @throws Error
|
||||
*/
|
||||
public function getRegisterData(array $registrations = array())
|
||||
{
|
||||
$challenge = $this->createChallenge();
|
||||
$request = new RegisterRequest($challenge, $this->appId);
|
||||
$signs = $this->getAuthenticateData($registrations);
|
||||
return array($request, $signs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to verify and unpack a registration message.
|
||||
*
|
||||
* @param RegisterRequest $request this is a reply to
|
||||
* @param object $response response from a user
|
||||
* @param bool $includeCert set to true if the attestation certificate should be
|
||||
* included in the returned Registration object
|
||||
* @return Registration
|
||||
* @throws Error
|
||||
*/
|
||||
public function doRegister($request, $response, $includeCert = true)
|
||||
{
|
||||
if( !is_object( $request ) ) {
|
||||
throw new \InvalidArgumentException('$request of doRegister() method only accepts object.');
|
||||
}
|
||||
|
||||
if( !is_object( $response ) ) {
|
||||
throw new \InvalidArgumentException('$response of doRegister() method only accepts object.');
|
||||
}
|
||||
|
||||
if( property_exists( $response, 'errorCode') && $response->errorCode !== 0 ) {
|
||||
throw new Error('User-agent returned error. Error code: ' . $response->errorCode, ERR_BAD_UA_RETURNING );
|
||||
}
|
||||
|
||||
if( !is_bool( $includeCert ) ) {
|
||||
throw new \InvalidArgumentException('$include_cert of doRegister() method only accepts boolean.');
|
||||
}
|
||||
|
||||
$rawReg = $this->base64u_decode($response->registrationData);
|
||||
$regData = array_values(unpack('C*', $rawReg));
|
||||
$clientData = $this->base64u_decode($response->clientData);
|
||||
$cli = json_decode($clientData);
|
||||
|
||||
if($cli->challenge !== $request->challenge) {
|
||||
throw new Error('Registration challenge does not match', ERR_UNMATCHED_CHALLENGE );
|
||||
}
|
||||
|
||||
$registration = new Registration();
|
||||
$offs = 1;
|
||||
$pubKey = substr($rawReg, $offs, PUBKEY_LEN);
|
||||
$offs += PUBKEY_LEN;
|
||||
// decode the pubKey to make sure it's good
|
||||
$tmpKey = $this->pubkey_to_pem($pubKey);
|
||||
if($tmpKey === null) {
|
||||
throw new Error('Decoding of public key failed', ERR_PUBKEY_DECODE );
|
||||
}
|
||||
$registration->publicKey = base64_encode($pubKey);
|
||||
$khLen = $regData[$offs++];
|
||||
$kh = substr($rawReg, $offs, $khLen);
|
||||
$offs += $khLen;
|
||||
$registration->keyHandle = $this->base64u_encode($kh);
|
||||
|
||||
// length of certificate is stored in byte 3 and 4 (excluding the first 4 bytes)
|
||||
$certLen = 4;
|
||||
$certLen += ($regData[$offs + 2] << 8);
|
||||
$certLen += $regData[$offs + 3];
|
||||
|
||||
$rawCert = $this->fixSignatureUnusedBits(substr($rawReg, $offs, $certLen));
|
||||
$offs += $certLen;
|
||||
$pemCert = "-----BEGIN CERTIFICATE-----\r\n";
|
||||
$pemCert .= chunk_split(base64_encode($rawCert), 64);
|
||||
$pemCert .= "-----END CERTIFICATE-----";
|
||||
if($includeCert) {
|
||||
$registration->certificate = base64_encode($rawCert);
|
||||
}
|
||||
if($this->attestDir) {
|
||||
if(openssl_x509_checkpurpose($pemCert, -1, $this->get_certs()) !== true) {
|
||||
throw new Error('Attestation certificate can not be validated', ERR_ATTESTATION_VERIFICATION );
|
||||
}
|
||||
}
|
||||
|
||||
if(!openssl_pkey_get_public($pemCert)) {
|
||||
throw new Error('Decoding of public key failed', ERR_PUBKEY_DECODE );
|
||||
}
|
||||
$signature = substr($rawReg, $offs);
|
||||
|
||||
$dataToVerify = chr(0);
|
||||
$dataToVerify .= hash('sha256', $request->appId, true);
|
||||
$dataToVerify .= hash('sha256', $clientData, true);
|
||||
$dataToVerify .= $kh;
|
||||
$dataToVerify .= $pubKey;
|
||||
|
||||
if(openssl_verify($dataToVerify, $signature, $pemCert, 'sha256') === 1) {
|
||||
return $registration;
|
||||
} else {
|
||||
throw new Error('Attestation signature does not match', ERR_ATTESTATION_SIGNATURE );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to get an authentication request.
|
||||
*
|
||||
* @param array $registrations An array of the registrations to create authentication requests for.
|
||||
* @return array An array of SignRequest
|
||||
* @throws Error
|
||||
*/
|
||||
public function getAuthenticateData(array $registrations)
|
||||
{
|
||||
$sigs = array();
|
||||
foreach ($registrations as $reg) {
|
||||
if( !is_object( $reg ) ) {
|
||||
throw new \InvalidArgumentException('$registrations of getAuthenticateData() method only accepts array of object.');
|
||||
}
|
||||
|
||||
$sig = new SignRequest();
|
||||
$sig->appId = $this->appId;
|
||||
$sig->keyHandle = $reg->keyHandle;
|
||||
$sig->challenge = $this->createChallenge();
|
||||
$sigs[] = $sig;
|
||||
}
|
||||
return $sigs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to verify an authentication response
|
||||
*
|
||||
* @param array $requests An array of outstanding authentication requests
|
||||
* @param array $registrations An array of current registrations
|
||||
* @param object $response A response from the authenticator
|
||||
* @return Registration
|
||||
* @throws Error
|
||||
*
|
||||
* The Registration object returned on success contains an updated counter
|
||||
* that should be saved for future authentications.
|
||||
* If the Error returned is ERR_COUNTER_TOO_LOW this is an indication of
|
||||
* token cloning or similar and appropriate action should be taken.
|
||||
*/
|
||||
public function doAuthenticate(array $requests, array $registrations, $response)
|
||||
{
|
||||
if( !is_object( $response ) ) {
|
||||
throw new \InvalidArgumentException('$response of doAuthenticate() method only accepts object.');
|
||||
}
|
||||
|
||||
if( property_exists( $response, 'errorCode') && $response->errorCode !== 0 ) {
|
||||
throw new Error('User-agent returned error. Error code: ' . $response->errorCode, ERR_BAD_UA_RETURNING );
|
||||
}
|
||||
|
||||
/** @var object|null $req */
|
||||
$req = null;
|
||||
|
||||
/** @var object|null $reg */
|
||||
$reg = null;
|
||||
|
||||
$clientData = $this->base64u_decode($response->clientData);
|
||||
$decodedClient = json_decode($clientData);
|
||||
foreach ($requests as $req) {
|
||||
if( !is_object( $req ) ) {
|
||||
throw new \InvalidArgumentException('$requests of doAuthenticate() method only accepts array of object.');
|
||||
}
|
||||
|
||||
if($req->keyHandle === $response->keyHandle && $req->challenge === $decodedClient->challenge) {
|
||||
break;
|
||||
}
|
||||
|
||||
$req = null;
|
||||
}
|
||||
if($req === null) {
|
||||
throw new Error('No matching request found', ERR_NO_MATCHING_REQUEST );
|
||||
}
|
||||
foreach ($registrations as $reg) {
|
||||
if( !is_object( $reg ) ) {
|
||||
throw new \InvalidArgumentException('$registrations of doAuthenticate() method only accepts array of object.');
|
||||
}
|
||||
|
||||
if($reg->keyHandle === $response->keyHandle) {
|
||||
break;
|
||||
}
|
||||
$reg = null;
|
||||
}
|
||||
if($reg === null) {
|
||||
throw new Error('No matching registration found', ERR_NO_MATCHING_REGISTRATION );
|
||||
}
|
||||
$pemKey = $this->pubkey_to_pem($this->base64u_decode($reg->publicKey));
|
||||
if($pemKey === null) {
|
||||
throw new Error('Decoding of public key failed', ERR_PUBKEY_DECODE );
|
||||
}
|
||||
|
||||
$signData = $this->base64u_decode($response->signatureData);
|
||||
$dataToVerify = hash('sha256', $req->appId, true);
|
||||
$dataToVerify .= substr($signData, 0, 5);
|
||||
$dataToVerify .= hash('sha256', $clientData, true);
|
||||
$signature = substr($signData, 5);
|
||||
|
||||
if(openssl_verify($dataToVerify, $signature, $pemKey, 'sha256') === 1) {
|
||||
$ctr = unpack("Nctr", substr($signData, 1, 4));
|
||||
$counter = $ctr['ctr'];
|
||||
/* TODO: wrap-around should be handled somehow.. */
|
||||
if($counter > $reg->counter) {
|
||||
$reg->counter = $counter;
|
||||
return $reg;
|
||||
} else {
|
||||
throw new Error('Counter too low.', ERR_COUNTER_TOO_LOW );
|
||||
}
|
||||
} else {
|
||||
throw new Error('Authentication failed', ERR_AUTHENTICATION_FAILURE );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
private function get_certs()
|
||||
{
|
||||
$files = array();
|
||||
$dir = $this->attestDir;
|
||||
if($dir && $handle = opendir($dir)) {
|
||||
while(false !== ($entry = readdir($handle))) {
|
||||
if(is_file("$dir/$entry")) {
|
||||
$files[] = "$dir/$entry";
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $data
|
||||
* @return string
|
||||
*/
|
||||
private function base64u_encode($data)
|
||||
{
|
||||
return trim(strtr(base64_encode($data), '+/', '-_'), '=');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $data
|
||||
* @return string
|
||||
*/
|
||||
private function base64u_decode($data)
|
||||
{
|
||||
return base64_decode(strtr($data, '-_', '+/'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $key
|
||||
* @return null|string
|
||||
*/
|
||||
private function pubkey_to_pem($key)
|
||||
{
|
||||
if(strlen($key) !== PUBKEY_LEN || $key[0] !== "\x04") {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert the public key to binary DER format first
|
||||
* Using the ECC SubjectPublicKeyInfo OIDs from RFC 5480
|
||||
*
|
||||
* SEQUENCE(2 elem) 30 59
|
||||
* SEQUENCE(2 elem) 30 13
|
||||
* OID1.2.840.10045.2.1 (id-ecPublicKey) 06 07 2a 86 48 ce 3d 02 01
|
||||
* OID1.2.840.10045.3.1.7 (secp256r1) 06 08 2a 86 48 ce 3d 03 01 07
|
||||
* BIT STRING(520 bit) 03 42 ..key..
|
||||
*/
|
||||
$der = "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01";
|
||||
$der .= "\x06\x08\x2a\x86\x48\xce\x3d\x03\x01\x07\x03\x42";
|
||||
$der .= "\0".$key;
|
||||
|
||||
$pem = "-----BEGIN PUBLIC KEY-----\r\n";
|
||||
$pem .= chunk_split(base64_encode($der), 64);
|
||||
$pem .= "-----END PUBLIC KEY-----";
|
||||
|
||||
return $pem;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Error
|
||||
*/
|
||||
private function createChallenge()
|
||||
{
|
||||
$challenge = openssl_random_pseudo_bytes(32, $crypto_strong );
|
||||
if( $crypto_strong !== true ) {
|
||||
throw new Error('Unable to obtain a good source of randomness', ERR_BAD_RANDOM);
|
||||
}
|
||||
|
||||
$challenge = $this->base64u_encode( $challenge );
|
||||
|
||||
return $challenge;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fixes a certificate where the signature contains unused bits.
|
||||
*
|
||||
* @param string $cert
|
||||
* @return mixed
|
||||
*/
|
||||
private function fixSignatureUnusedBits($cert)
|
||||
{
|
||||
if(in_array(hash('sha256', $cert), $this->FIXCERTS)) {
|
||||
$cert[strlen($cert) - 257] = "\0";
|
||||
}
|
||||
return $cert;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class for building a registration request
|
||||
*
|
||||
* @package u2flib_server
|
||||
*/
|
||||
class RegisterRequest
|
||||
{
|
||||
/** Protocol version */
|
||||
public $version = U2F_VERSION;
|
||||
|
||||
/** Registration challenge */
|
||||
public $challenge;
|
||||
|
||||
/** Application id */
|
||||
public $appId;
|
||||
|
||||
/**
|
||||
* @param string $challenge
|
||||
* @param string $appId
|
||||
* @internal
|
||||
*/
|
||||
public function __construct($challenge, $appId)
|
||||
{
|
||||
$this->challenge = $challenge;
|
||||
$this->appId = $appId;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class for building up an authentication request
|
||||
*
|
||||
* @package u2flib_server
|
||||
*/
|
||||
class SignRequest
|
||||
{
|
||||
/** Protocol version */
|
||||
public $version = U2F_VERSION;
|
||||
|
||||
/** Authentication challenge */
|
||||
public $challenge;
|
||||
|
||||
/** Key handle of a registered authenticator */
|
||||
public $keyHandle;
|
||||
|
||||
/** Application id */
|
||||
public $appId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Class returned for successful registrations
|
||||
*
|
||||
* @package u2flib_server
|
||||
*/
|
||||
class Registration
|
||||
{
|
||||
/** The key handle of the registered authenticator */
|
||||
public $keyHandle;
|
||||
|
||||
/** The public key of the registered authenticator */
|
||||
public $publicKey;
|
||||
|
||||
/** The attestation certificate of the registered authenticator */
|
||||
public $certificate;
|
||||
|
||||
/** The counter associated with this registration */
|
||||
public $counter = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Error class, returned on errors
|
||||
*
|
||||
* @package u2flib_server
|
||||
*/
|
||||
class Error extends \Exception
|
||||
{
|
||||
/**
|
||||
* Override constructor and make message and code mandatory
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param \Exception|null $previous
|
||||
*/
|
||||
public function __construct($message, $code, \Exception $previous = null) {
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
475
data/web/inc/lib/Yubico.php
Normal file
475
data/web/inc/lib/Yubico.php
Normal file
@@ -0,0 +1,475 @@
|
||||
<?php
|
||||
/**
|
||||
* Class for verifying Yubico One-Time-Passcodes
|
||||
*
|
||||
* @category Auth
|
||||
* @package Auth_Yubico
|
||||
* @author Simon Josefsson <simon@yubico.com>, Olov Danielson <olov@yubico.com>
|
||||
* @copyright 2007-2015 Yubico AB
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version 2.0
|
||||
* @link http://www.yubico.com/
|
||||
*/
|
||||
|
||||
require_once 'PEAR.php';
|
||||
|
||||
/**
|
||||
* Class for verifying Yubico One-Time-Passcodes
|
||||
*
|
||||
* Simple example:
|
||||
* <code>
|
||||
* require_once 'Auth/Yubico.php';
|
||||
* $otp = "ccbbddeertkrctjkkcglfndnlihhnvekchkcctif";
|
||||
*
|
||||
* # Generate a new id+key from https://api.yubico.com/get-api-key/
|
||||
* $yubi = new Auth_Yubico('42', 'FOOBAR=');
|
||||
* $auth = $yubi->verify($otp);
|
||||
* if (PEAR::isError($auth)) {
|
||||
* print "<p>Authentication failed: " . $auth->getMessage();
|
||||
* print "<p>Debug output from server: " . $yubi->getLastResponse();
|
||||
* } else {
|
||||
* print "<p>You are authenticated!";
|
||||
* }
|
||||
* </code>
|
||||
*/
|
||||
class Auth_Yubico
|
||||
{
|
||||
/**#@+
|
||||
* @access private
|
||||
*/
|
||||
|
||||
/**
|
||||
* Yubico client ID
|
||||
* @var string
|
||||
*/
|
||||
var $_id;
|
||||
|
||||
/**
|
||||
* Yubico client key
|
||||
* @var string
|
||||
*/
|
||||
var $_key;
|
||||
|
||||
/**
|
||||
* URL part of validation server
|
||||
* @var string
|
||||
*/
|
||||
var $_url;
|
||||
|
||||
/**
|
||||
* List with URL part of validation servers
|
||||
* @var array
|
||||
*/
|
||||
var $_url_list;
|
||||
|
||||
/**
|
||||
* index to _url_list
|
||||
* @var int
|
||||
*/
|
||||
var $_url_index;
|
||||
|
||||
/**
|
||||
* Last query to server
|
||||
* @var string
|
||||
*/
|
||||
var $_lastquery;
|
||||
|
||||
/**
|
||||
* Response from server
|
||||
* @var string
|
||||
*/
|
||||
var $_response;
|
||||
|
||||
/**
|
||||
* Flag whether to use https or not.
|
||||
* @var boolean
|
||||
*/
|
||||
var $_https;
|
||||
|
||||
/**
|
||||
* Flag whether to verify HTTPS server certificates or not.
|
||||
* @var boolean
|
||||
*/
|
||||
var $_httpsverify;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Sets up the object
|
||||
* @param string $id The client identity
|
||||
* @param string $key The client MAC key (optional)
|
||||
* @param boolean $https Flag whether to use https (optional)
|
||||
* @param boolean $httpsverify Flag whether to use verify HTTPS
|
||||
* server certificates (optional,
|
||||
* default true)
|
||||
* @access public
|
||||
*/
|
||||
function __construct($id, $key = '', $https = 0, $httpsverify = 1)
|
||||
{
|
||||
$this->_id = $id;
|
||||
$this->_key = base64_decode($key);
|
||||
$this->_https = $https;
|
||||
$this->_httpsverify = $httpsverify;
|
||||
}
|
||||
|
||||
function Auth_Yubico($id, $key = '', $https = 0, $httpsverify = 1)
|
||||
{
|
||||
self::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify to use a different URL part for verification.
|
||||
* The default is "api.yubico.com/wsapi/verify".
|
||||
*
|
||||
* @param string $url New server URL part to use
|
||||
* @access public
|
||||
*/
|
||||
function setURLpart($url)
|
||||
{
|
||||
$this->_url = $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get URL part to use for validation.
|
||||
*
|
||||
* @return string Server URL part
|
||||
* @access public
|
||||
*/
|
||||
function getURLpart()
|
||||
{
|
||||
if ($this->_url) {
|
||||
return $this->_url;
|
||||
} else {
|
||||
return "api.yubico.com/wsapi/verify";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get next URL part from list to use for validation.
|
||||
*
|
||||
* @return mixed string with URL part of false if no more URLs in list
|
||||
* @access public
|
||||
*/
|
||||
function getNextURLpart()
|
||||
{
|
||||
if ($this->_url_list) $url_list=$this->_url_list;
|
||||
else $url_list=array('api.yubico.com/wsapi/2.0/verify',
|
||||
'api2.yubico.com/wsapi/2.0/verify',
|
||||
'api3.yubico.com/wsapi/2.0/verify',
|
||||
'api4.yubico.com/wsapi/2.0/verify',
|
||||
'api5.yubico.com/wsapi/2.0/verify');
|
||||
|
||||
if ($this->_url_index>=count($url_list)) return false;
|
||||
else return $url_list[$this->_url_index++];
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets index to URL list
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function URLreset()
|
||||
{
|
||||
$this->_url_index=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add another URLpart.
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function addURLpart($URLpart)
|
||||
{
|
||||
$this->_url_list[]=$URLpart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the last query sent to the server, if any.
|
||||
*
|
||||
* @return string Request to server
|
||||
* @access public
|
||||
*/
|
||||
function getLastQuery()
|
||||
{
|
||||
return $this->_lastquery;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the last data received from the server, if any.
|
||||
*
|
||||
* @return string Output from server
|
||||
* @access public
|
||||
*/
|
||||
function getLastResponse()
|
||||
{
|
||||
return $this->_response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse input string into password, yubikey prefix,
|
||||
* ciphertext, and OTP.
|
||||
*
|
||||
* @param string Input string to parse
|
||||
* @param string Optional delimiter re-class, default is '[:]'
|
||||
* @return array Keyed array with fields
|
||||
* @access public
|
||||
*/
|
||||
function parsePasswordOTP($str, $delim = '[:]')
|
||||
{
|
||||
if (!preg_match("/^((.*)" . $delim . ")?" .
|
||||
"(([cbdefghijklnrtuv]{0,16})" .
|
||||
"([cbdefghijklnrtuv]{32}))$/i",
|
||||
$str, $matches)) {
|
||||
/* Dvorak? */
|
||||
if (!preg_match("/^((.*)" . $delim . ")?" .
|
||||
"(([jxe\.uidchtnbpygk]{0,16})" .
|
||||
"([jxe\.uidchtnbpygk]{32}))$/i",
|
||||
$str, $matches)) {
|
||||
return false;
|
||||
} else {
|
||||
$ret['otp'] = strtr($matches[3], "jxe.uidchtnbpygk", "cbdefghijklnrtuv");
|
||||
}
|
||||
} else {
|
||||
$ret['otp'] = $matches[3];
|
||||
}
|
||||
$ret['password'] = $matches[2];
|
||||
$ret['prefix'] = $matches[4];
|
||||
$ret['ciphertext'] = $matches[5];
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/* TODO? Add functions to get parsed parts of server response? */
|
||||
|
||||
/**
|
||||
* Parse parameters from last response
|
||||
*
|
||||
* example: getParameters("timestamp", "sessioncounter", "sessionuse");
|
||||
*
|
||||
* @param array @parameters Array with strings representing
|
||||
* parameters to parse
|
||||
* @return array parameter array from last response
|
||||
* @access public
|
||||
*/
|
||||
function getParameters($parameters)
|
||||
{
|
||||
if ($parameters == null) {
|
||||
$parameters = array('timestamp', 'sessioncounter', 'sessionuse');
|
||||
}
|
||||
$param_array = array();
|
||||
foreach ($parameters as $param) {
|
||||
if(!preg_match("/" . $param . "=([0-9]+)/", $this->_response, $out)) {
|
||||
return PEAR::raiseError('Could not parse parameter ' . $param . ' from response');
|
||||
}
|
||||
$param_array[$param]=$out[1];
|
||||
}
|
||||
return $param_array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify Yubico OTP against multiple URLs
|
||||
* Protocol specification 2.0 is used to construct validation requests
|
||||
*
|
||||
* @param string $token Yubico OTP
|
||||
* @param int $use_timestamp 1=>send request with ×tamp=1 to
|
||||
* get timestamp and session information
|
||||
* in the response
|
||||
* @param boolean $wait_for_all If true, wait until all
|
||||
* servers responds (for debugging)
|
||||
* @param string $sl Sync level in percentage between 0
|
||||
* and 100 or "fast" or "secure".
|
||||
* @param int $timeout Max number of seconds to wait
|
||||
* for responses
|
||||
* @return mixed PEAR error on error, true otherwise
|
||||
* @access public
|
||||
*/
|
||||
function verify($token, $use_timestamp=null, $wait_for_all=False,
|
||||
$sl=null, $timeout=null)
|
||||
{
|
||||
/* Construct parameters string */
|
||||
$ret = $this->parsePasswordOTP($token);
|
||||
if (!$ret) {
|
||||
return PEAR::raiseError('Could not parse Yubikey OTP');
|
||||
}
|
||||
$params = array('id'=>$this->_id,
|
||||
'otp'=>$ret['otp'],
|
||||
'nonce'=>md5(uniqid(rand())));
|
||||
/* Take care of protocol version 2 parameters */
|
||||
if ($use_timestamp) $params['timestamp'] = 1;
|
||||
if ($sl) $params['sl'] = $sl;
|
||||
if ($timeout) $params['timeout'] = $timeout;
|
||||
ksort($params);
|
||||
$parameters = '';
|
||||
foreach($params as $p=>$v) $parameters .= "&" . $p . "=" . $v;
|
||||
$parameters = ltrim($parameters, "&");
|
||||
|
||||
/* Generate signature. */
|
||||
if($this->_key <> "") {
|
||||
$signature = base64_encode(hash_hmac('sha1', $parameters,
|
||||
$this->_key, true));
|
||||
$signature = preg_replace('/\+/', '%2B', $signature);
|
||||
$parameters .= '&h=' . $signature;
|
||||
}
|
||||
|
||||
/* Generate and prepare request. */
|
||||
$this->_lastquery=null;
|
||||
$this->URLreset();
|
||||
$mh = curl_multi_init();
|
||||
$ch = array();
|
||||
while($URLpart=$this->getNextURLpart())
|
||||
{
|
||||
/* Support https. */
|
||||
if ($this->_https) {
|
||||
$query = "https://";
|
||||
} else {
|
||||
$query = "http://";
|
||||
}
|
||||
$query .= $URLpart . "?" . $parameters;
|
||||
|
||||
if ($this->_lastquery) { $this->_lastquery .= " "; }
|
||||
$this->_lastquery .= $query;
|
||||
|
||||
$handle = curl_init($query);
|
||||
curl_setopt($handle, CURLOPT_USERAGENT, "PEAR Auth_Yubico");
|
||||
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
|
||||
if (!$this->_httpsverify) {
|
||||
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, 0);
|
||||
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
}
|
||||
curl_setopt($handle, CURLOPT_FAILONERROR, true);
|
||||
/* If timeout is set, we better apply it here as well
|
||||
in case the validation server fails to follow it.
|
||||
*/
|
||||
if ($timeout) curl_setopt($handle, CURLOPT_TIMEOUT, $timeout);
|
||||
curl_multi_add_handle($mh, $handle);
|
||||
|
||||
$ch[(int)$handle] = $handle;
|
||||
}
|
||||
|
||||
/* Execute and read request. */
|
||||
$this->_response=null;
|
||||
$replay=False;
|
||||
$valid=False;
|
||||
do {
|
||||
/* Let curl do its work. */
|
||||
while (($mrc = curl_multi_exec($mh, $active))
|
||||
== CURLM_CALL_MULTI_PERFORM)
|
||||
;
|
||||
|
||||
while ($info = curl_multi_info_read($mh)) {
|
||||
if ($info['result'] == CURLE_OK) {
|
||||
|
||||
/* We have a complete response from one server. */
|
||||
|
||||
$str = curl_multi_getcontent($info['handle']);
|
||||
$cinfo = curl_getinfo ($info['handle']);
|
||||
|
||||
if ($wait_for_all) { # Better debug info
|
||||
$this->_response .= 'URL=' . $cinfo['url'] ."\n"
|
||||
. $str . "\n";
|
||||
}
|
||||
|
||||
if (preg_match("/status=([a-zA-Z0-9_]+)/", $str, $out)) {
|
||||
$status = $out[1];
|
||||
|
||||
/*
|
||||
* There are 3 cases.
|
||||
*
|
||||
* 1. OTP or Nonce values doesn't match - ignore
|
||||
* response.
|
||||
*
|
||||
* 2. We have a HMAC key. If signature is invalid -
|
||||
* ignore response. Return if status=OK or
|
||||
* status=REPLAYED_OTP.
|
||||
*
|
||||
* 3. Return if status=OK or status=REPLAYED_OTP.
|
||||
*/
|
||||
if (!preg_match("/otp=".$params['otp']."/", $str) ||
|
||||
!preg_match("/nonce=".$params['nonce']."/", $str)) {
|
||||
/* Case 1. Ignore response. */
|
||||
}
|
||||
elseif ($this->_key <> "") {
|
||||
/* Case 2. Verify signature first */
|
||||
$rows = explode("\r\n", trim($str));
|
||||
$response=array();
|
||||
while (list($key, $val) = each($rows)) {
|
||||
/* = is also used in BASE64 encoding so we only replace the first = by # which is not used in BASE64 */
|
||||
$val = preg_replace('/=/', '#', $val, 1);
|
||||
$row = explode("#", $val);
|
||||
$response[$row[0]] = $row[1];
|
||||
}
|
||||
|
||||
$parameters=array('nonce','otp', 'sessioncounter', 'sessionuse', 'sl', 'status', 't', 'timeout', 'timestamp');
|
||||
sort($parameters);
|
||||
$check=Null;
|
||||
foreach ($parameters as $param) {
|
||||
if (array_key_exists($param, $response)) {
|
||||
if ($check) $check = $check . '&';
|
||||
$check = $check . $param . '=' . $response[$param];
|
||||
}
|
||||
}
|
||||
|
||||
$checksignature =
|
||||
base64_encode(hash_hmac('sha1', utf8_encode($check),
|
||||
$this->_key, true));
|
||||
|
||||
if($response['h'] == $checksignature) {
|
||||
if ($status == 'REPLAYED_OTP') {
|
||||
if (!$wait_for_all) { $this->_response = $str; }
|
||||
$replay=True;
|
||||
}
|
||||
if ($status == 'OK') {
|
||||
if (!$wait_for_all) { $this->_response = $str; }
|
||||
$valid=True;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Case 3. We check the status directly */
|
||||
if ($status == 'REPLAYED_OTP') {
|
||||
if (!$wait_for_all) { $this->_response = $str; }
|
||||
$replay=True;
|
||||
}
|
||||
if ($status == 'OK') {
|
||||
if (!$wait_for_all) { $this->_response = $str; }
|
||||
$valid=True;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$wait_for_all && ($valid || $replay))
|
||||
{
|
||||
/* We have status=OK or status=REPLAYED_OTP, return. */
|
||||
foreach ($ch as $h) {
|
||||
curl_multi_remove_handle($mh, $h);
|
||||
curl_close($h);
|
||||
}
|
||||
curl_multi_close($mh);
|
||||
if ($replay) return PEAR::raiseError('REPLAYED_OTP');
|
||||
if ($valid) return true;
|
||||
return PEAR::raiseError($status);
|
||||
}
|
||||
|
||||
curl_multi_remove_handle($mh, $info['handle']);
|
||||
curl_close($info['handle']);
|
||||
unset ($ch[(int)$info['handle']]);
|
||||
}
|
||||
curl_multi_select($mh);
|
||||
}
|
||||
} while ($active);
|
||||
|
||||
/* Typically this is only reached for wait_for_all=true or
|
||||
* when the timeout is reached and there is no
|
||||
* OK/REPLAYED_REQUEST answer (think firewall).
|
||||
*/
|
||||
|
||||
foreach ($ch as $h) {
|
||||
curl_multi_remove_handle ($mh, $h);
|
||||
curl_close ($h);
|
||||
}
|
||||
curl_multi_close ($mh);
|
||||
|
||||
if ($replay) return PEAR::raiseError('REPLAYED_OTP');
|
||||
if ($valid) return true;
|
||||
return PEAR::raiseError('NO_VALID_ANSWER');
|
||||
}
|
||||
}
|
||||
?>
|
103
data/web/inc/prerequisites.inc.php
Normal file
103
data/web/inc/prerequisites.inc.php
Normal file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
//ini_set("session.cookie_secure", 1);
|
||||
//ini_set("session.cookie_httponly", 1);
|
||||
session_start();
|
||||
if (isset($_POST["logout"])) {
|
||||
if (isset($_SESSION["dual-login"])) {
|
||||
$_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"];
|
||||
$_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"];
|
||||
unset($_SESSION["dual-login"]);
|
||||
}
|
||||
else {
|
||||
session_unset();
|
||||
session_destroy();
|
||||
session_write_close();
|
||||
setcookie(session_name(),'',0,'/');
|
||||
}
|
||||
}
|
||||
|
||||
require_once 'inc/vars.inc.php';
|
||||
if (file_exists('./inc/vars.local.inc.php')) {
|
||||
include_once 'inc/vars.local.inc.php';
|
||||
}
|
||||
|
||||
// Yubi OTP API
|
||||
require_once 'inc/lib/Yubico.php';
|
||||
|
||||
// U2F API
|
||||
require_once 'inc/lib/U2F.php';
|
||||
$scheme = isset($_SERVER['HTTPS']) ? "https://" : "http://";
|
||||
$u2f = new u2flib_server\U2F($scheme . $_SERVER['HTTP_HOST']);
|
||||
|
||||
// PDO
|
||||
$dsn = "$database_type:host=$database_host;dbname=$database_name";
|
||||
$opt = [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
];
|
||||
try {
|
||||
$pdo = new PDO($dsn, $database_user, $database_pass, $opt);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
?>
|
||||
<center style='font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;'>🐮 Connection failed, database may be in warm-up state, please try again later.<br /><br />The following error was reported:<br/> <?=$e->getMessage();?></center>
|
||||
<?php
|
||||
exit;
|
||||
}
|
||||
|
||||
$_SESSION['mailcow_locale'] = strtolower(trim($DEFAULT_LANG));
|
||||
setcookie('language', $DEFAULT_LANG);
|
||||
if (isset($_COOKIE['language'])) {
|
||||
switch ($_COOKIE['language']) {
|
||||
case "de":
|
||||
$_SESSION['mailcow_locale'] = 'de';
|
||||
setcookie('language', 'de');
|
||||
break;
|
||||
case "en":
|
||||
$_SESSION['mailcow_locale'] = 'en';
|
||||
setcookie('language', 'en');
|
||||
break;
|
||||
case "es":
|
||||
$_SESSION['mailcow_locale'] = 'es';
|
||||
setcookie('language', 'es');
|
||||
break;
|
||||
case "nl":
|
||||
$_SESSION['mailcow_locale'] = 'nl';
|
||||
setcookie('language', 'nl');
|
||||
break;
|
||||
case "pt":
|
||||
$_SESSION['mailcow_locale'] = 'pt';
|
||||
setcookie('language', 'pt');
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isset($_GET['lang'])) {
|
||||
switch ($_GET['lang']) {
|
||||
case "de":
|
||||
$_SESSION['mailcow_locale'] = 'de';
|
||||
setcookie('language', 'de');
|
||||
break;
|
||||
case "en":
|
||||
$_SESSION['mailcow_locale'] = 'en';
|
||||
setcookie('language', 'en');
|
||||
break;
|
||||
case "es":
|
||||
$_SESSION['mailcow_locale'] = 'es';
|
||||
setcookie('language', 'es');
|
||||
break;
|
||||
case "nl":
|
||||
$_SESSION['mailcow_locale'] = 'nl';
|
||||
setcookie('language', 'nl');
|
||||
break;
|
||||
case "pt":
|
||||
$_SESSION['mailcow_locale'] = 'pt';
|
||||
setcookie('language', 'pt');
|
||||
break;
|
||||
}
|
||||
}
|
||||
require_once 'lang/lang.en.php';
|
||||
include 'lang/lang.'.$_SESSION['mailcow_locale'].'.php';
|
||||
require_once 'inc/functions.inc.php';
|
||||
require_once 'inc/triggers.inc.php';
|
||||
(!isset($_SESSION['mailcow_cc_username'])) ? init_db_schema() : null;
|
133
data/web/inc/tfa_modals.php
Normal file
133
data/web/inc/tfa_modals.php
Normal file
@@ -0,0 +1,133 @@
|
||||
<div class="modal fade" id="YubiOTPModal" tabindex="-1" role="dialog" aria-labelledby="YubiOTPModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header"><b><?=$lang['tfa']['yubi_otp'];?></b></div>
|
||||
<div class="modal-body">
|
||||
<form role="form" method="post">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" name="key_id" id="key_id" placeholder="<?=$lang['tfa']['key_id'];?>" autocomplete="off" required>
|
||||
</div>
|
||||
<hr>
|
||||
<p class="help-block"><?=$lang['tfa']['api_register'];?></p>
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" name="yubico_id" id="yubico_id" placeholder="Yubico API ID" autocomplete="off" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" name="yubico_key" id="yubico_key" placeholder="Yubico API Key" autocomplete="off" required>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<input type="password" class="form-control" name="confirm_password" id="confirm_password" placeholder="<?=$lang['user']['password_now'];?>" autocomplete="off" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon" id="yubi-addon"><img alt="Yubicon Icon" src="/img/yubi.ico"></span>
|
||||
<input type="text" name="otp_token" class="form-control" placeholder="Touch Yubikey" aria-describedby="yubi-addon">
|
||||
<input type="hidden" name="tfa_method" value="yubi_otp">
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn btn-sm btn-default" type="submit" name="set_tfa"><?=$lang['user']['save_changes'];?></button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="U2FModal" tabindex="-1" role="dialog" aria-labelledby="U2FModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header"><b><?=$lang['tfa']['u2f'];?></b></div>
|
||||
<div class="modal-body">
|
||||
<form role="form" method="post" id="u2f_reg_form">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" name="key_id" id="key_id" placeholder="<?=$lang['tfa']['key_id'];?>" autocomplete="off" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="password" class="form-control" name="confirm_password" id="confirm_password" placeholder="<?=$lang['user']['password_now'];?>" autocomplete="off" required>
|
||||
</div>
|
||||
<hr>
|
||||
<p><?=$lang['tfa']['waiting_usb_register'];?></p>
|
||||
<div class="alert alert-danger" style="display:none" id="u2f_return_code"></div>
|
||||
<input type="hidden" name="token" id="u2f_register_data"/>
|
||||
<input type="hidden" name="tfa_method" value="u2f">
|
||||
<input type="hidden" name="set_tfa"/><br/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="DisableTFAModal" tabindex="-1" role="dialog" aria-labelledby="DisableTFAModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header"><b><?=$lang['tfa']['delete_tfa'];?></b></div>
|
||||
<div class="modal-body">
|
||||
<form role="form" method="post">
|
||||
<div class="input-group">
|
||||
<input type="password" class="form-control" name="confirm_password" id="confirm_password" placeholder="<?=$lang['user']['password_now'];?>" autocomplete="off" required>
|
||||
<span class="input-group-btn">
|
||||
<input type="hidden" name="tfa_method" value="none">
|
||||
<button class="btn btn-danger" type="submit" name="set_tfa"><?=$lang['tfa']['delete_tfa'];?></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
if (isset($_SESSION['pending_tfa_method'])):
|
||||
$tfa_method = $_SESSION['pending_tfa_method'];
|
||||
?>
|
||||
<div class="modal fade" id="ConfirmTFAModal" tabindex="-1" role="dialog" aria-labelledby="ConfirmTFAModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header"><button type="button" class="close" data-dismiss="modal">×</button><b><?=$lang['tfa'][$tfa_method];?></b></div>
|
||||
<div class="modal-body">
|
||||
<?php
|
||||
switch ($tfa_method) {
|
||||
case "yubi_otp":
|
||||
?>
|
||||
<form role="form" method="post">
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon" id="yubi-addon"><img alt="Yubicon Icon" src="/img/yubi.ico"></span>
|
||||
<input type="text" name="token" id="token" class="form-control" placeholder="Touch Yubikey" aria-describedby="yubi-addon">
|
||||
<input type="hidden" name="tfa_method" value="yubi_otp">
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn btn-sm btn-default" type="submit" name="verify_tfa_login"><?=$lang['login']['login'];?></button>
|
||||
</form>
|
||||
<?php
|
||||
break;
|
||||
case "u2f":
|
||||
?>
|
||||
<form role="form" method="post" id="u2f_auth_form">
|
||||
<p><?=$lang['tfa']['waiting_usb_auth'];?></p>
|
||||
<div class="alert alert-danger" style="display:none" id="u2f_return_code"></div>
|
||||
<input type="hidden" name="token" id="u2f_auth_data"/>
|
||||
<input type="hidden" name="tfa_method" value="u2f">
|
||||
<input type="hidden" name="verify_tfa_login"/><br/>
|
||||
</form>
|
||||
<?php
|
||||
break;
|
||||
case "totp":
|
||||
?>
|
||||
<div class="empty"></div>
|
||||
<?php
|
||||
break;
|
||||
case "hotp":
|
||||
?>
|
||||
<div class="empty"></div>
|
||||
<?php
|
||||
break;
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
173
data/web/inc/triggers.inc.php
Normal file
173
data/web/inc/triggers.inc.php
Normal file
@@ -0,0 +1,173 @@
|
||||
<?php
|
||||
if (isset($_POST["verify_tfa_login"])) {
|
||||
if (verify_tfa_login($_SESSION['pending_mailcow_cc_username'], $_POST["token"])) {
|
||||
$_SESSION['mailcow_cc_username'] = $_SESSION['pending_mailcow_cc_username'];
|
||||
$_SESSION['mailcow_cc_role'] = $_SESSION['pending_mailcow_cc_role'];
|
||||
unset($_SESSION['pending_mailcow_cc_username']);
|
||||
unset($_SESSION['pending_mailcow_cc_role']);
|
||||
unset($_SESSION['pending_tfa_method']);
|
||||
header("Location: /user.php");
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) {
|
||||
$login_user = strtolower(trim($_POST["login_user"]));
|
||||
$as = check_login($login_user, $_POST["pass_user"]);
|
||||
if ($as == "admin") {
|
||||
$_SESSION['mailcow_cc_username'] = $login_user;
|
||||
$_SESSION['mailcow_cc_role'] = "admin";
|
||||
header("Location: /admin.php");
|
||||
}
|
||||
elseif ($as == "domainadmin") {
|
||||
$_SESSION['mailcow_cc_username'] = $login_user;
|
||||
$_SESSION['mailcow_cc_role'] = "domainadmin";
|
||||
header("Location: /mailbox.php");
|
||||
}
|
||||
elseif ($as == "user") {
|
||||
$_SESSION['mailcow_cc_username'] = $login_user;
|
||||
$_SESSION['mailcow_cc_role'] = "user";
|
||||
header("Location: /user.php");
|
||||
}
|
||||
elseif ($as != "pending") {
|
||||
unset($_SESSION['pending_mailcow_cc_username']);
|
||||
unset($_SESSION['pending_mailcow_cc_role']);
|
||||
unset($_SESSION['pending_tfa_method']);
|
||||
unset($_SESSION['mailcow_cc_username']);
|
||||
unset($_SESSION['mailcow_cc_role']);
|
||||
$_SESSION['return'] = array(
|
||||
'type' => 'danger',
|
||||
'msg' => $lang['danger']['login_failed']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin") {
|
||||
if (isset($_GET["duallogin"])) {
|
||||
if (filter_var($_GET["duallogin"], FILTER_VALIDATE_EMAIL)) {
|
||||
$stmt = $pdo->prepare("SELECT `username` FROM `mailbox` WHERE `username` = :duallogin");
|
||||
$stmt->execute(array(':duallogin' => $_GET["duallogin"]));
|
||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||
if ($num_results != 0) {
|
||||
$_SESSION["dual-login"]["username"] = $_SESSION['mailcow_cc_username'];
|
||||
$_SESSION["dual-login"]["role"] = $_SESSION['mailcow_cc_role'];
|
||||
$_SESSION['mailcow_cc_username'] = $_GET["duallogin"];
|
||||
$_SESSION['mailcow_cc_role'] = "user";
|
||||
header("Location: /user.php");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_POST["edit_admin_account"])) {
|
||||
edit_admin_account($_POST);
|
||||
}
|
||||
if (isset($_POST["dkim_delete_key"])) {
|
||||
dkim_delete_key($_POST);
|
||||
}
|
||||
if (isset($_POST["dkim_add_key"])) {
|
||||
dkim_add_key($_POST);
|
||||
}
|
||||
if (isset($_POST["add_domain_admin"])) {
|
||||
add_domain_admin($_POST);
|
||||
}
|
||||
if (isset($_POST["delete_domain_admin"])) {
|
||||
delete_domain_admin($_POST);
|
||||
}
|
||||
}
|
||||
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "user") {
|
||||
if (isset($_POST["edit_user_account"])) {
|
||||
edit_user_account($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_reset_eas"])) {
|
||||
mailbox_reset_eas($_POST);
|
||||
}
|
||||
if (isset($_POST["edit_spam_score"])) {
|
||||
edit_spam_score($_POST);
|
||||
}
|
||||
if (isset($_POST["edit_delimiter_action"])) {
|
||||
edit_delimiter_action($_POST);
|
||||
}
|
||||
if (isset($_POST["add_policy_list_item"])) {
|
||||
add_policy_list_item($_POST);
|
||||
}
|
||||
if (isset($_POST["delete_policy_list_item"])) {
|
||||
delete_policy_list_item($_POST);
|
||||
}
|
||||
if (isset($_POST["edit_tls_policy"])) {
|
||||
edit_tls_policy($_POST);
|
||||
}
|
||||
if (isset($_POST["add_syncjob"])) {
|
||||
add_syncjob($_POST);
|
||||
}
|
||||
if (isset($_POST["edit_syncjob"])) {
|
||||
edit_syncjob($_POST);
|
||||
}
|
||||
if (isset($_POST["delete_syncjob"])) {
|
||||
delete_syncjob($_POST);
|
||||
}
|
||||
if (isset($_POST["set_time_limited_aliases"])) {
|
||||
set_time_limited_aliases($_POST);
|
||||
}
|
||||
}
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
if (isset($_POST["edit_domain_admin"])) {
|
||||
edit_domain_admin($_POST);
|
||||
}
|
||||
if (isset($_POST["set_tfa"])) {
|
||||
set_tfa($_POST);
|
||||
}
|
||||
if (isset($_POST["unset_tfa_key"])) {
|
||||
unset_tfa_key($_POST);
|
||||
}
|
||||
if (isset($_POST["add_policy_list_item"])) {
|
||||
add_policy_list_item($_POST);
|
||||
}
|
||||
if (isset($_POST["delete_policy_list_item"])) {
|
||||
delete_policy_list_item($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_add_domain"])) {
|
||||
mailbox_add_domain($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_add_alias"])) {
|
||||
mailbox_add_alias($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_add_alias_domain"])) {
|
||||
mailbox_add_alias_domain($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_add_mailbox"])) {
|
||||
mailbox_add_mailbox($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_add_resource"])) {
|
||||
mailbox_add_resource($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_edit_alias"])) {
|
||||
mailbox_edit_alias($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_edit_domain"])) {
|
||||
mailbox_edit_domain($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_edit_mailbox"])) {
|
||||
mailbox_edit_mailbox($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_edit_alias_domain"])) {
|
||||
mailbox_edit_alias_domain($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_edit_resource"])) {
|
||||
mailbox_edit_resource($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_delete_domain"])) {
|
||||
mailbox_delete_domain($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_delete_alias"])) {
|
||||
mailbox_delete_alias($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_delete_alias_domain"])) {
|
||||
mailbox_delete_alias_domain($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_delete_mailbox"])) {
|
||||
mailbox_delete_mailbox($_POST);
|
||||
}
|
||||
if (isset($_POST["mailbox_delete_resource"])) {
|
||||
mailbox_delete_resource($_POST);
|
||||
}
|
||||
}
|
||||
?>
|
38
data/web/inc/vars.inc.php
Normal file
38
data/web/inc/vars.inc.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
error_reporting(E_ERROR | E_WARNING);
|
||||
//error_reporting(E_ALL);
|
||||
|
||||
/*
|
||||
PLEASE USE THE FILE "vars.local.inc.php" TO OVERWRITE SETTINGS AND MAKE THEM PERSISTENT!
|
||||
This file will be reset on upgrades.
|
||||
*/
|
||||
|
||||
// SQL database connection variables
|
||||
$database_type = "mysql";
|
||||
$database_host = "mysql";
|
||||
$database_user = getenv('DBUSER');
|
||||
$database_pass = getenv('DBPASS');
|
||||
$database_name = getenv('DBNAME');
|
||||
|
||||
// Other variables
|
||||
$mailcow_hostname = getenv('MAILCOW_HOSTNAME');
|
||||
|
||||
// Where to go after adding and editing objects
|
||||
// Can be "form" or "previous"
|
||||
// "form" will stay in the current form, "previous" will redirect to previous page
|
||||
$FORM_ACTION = "previous";
|
||||
|
||||
// File locations should not be changed
|
||||
$MC_DKIM_TXTS = "/data/dkim/txt";
|
||||
$MC_DKIM_KEYS = "/data/dkim/keys";
|
||||
|
||||
// Change default language, "en", "pt", "de" or "nl"
|
||||
$DEFAULT_LANG = "en";
|
||||
|
||||
// Change theme (default: lumen)
|
||||
// Needs to be one of those: cerulean, cosmo, cyborg, darkly, flatly, journal, lumen, paper, readable, sandstone,
|
||||
// simplex, slate, spacelab, superhero, united, yeti
|
||||
// See https://bootswatch.com/
|
||||
$DEFAULT_THEME = "lumen";
|
||||
|
||||
?>
|
90
data/web/index.php
Normal file
90
data/web/index.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
require_once("inc/prerequisites.inc.php");
|
||||
|
||||
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin") {
|
||||
header('Location: /admin.php');
|
||||
exit();
|
||||
}
|
||||
elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "domainadmin") {
|
||||
header('Location: /mailbox.php');
|
||||
exit();
|
||||
}
|
||||
elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "user") {
|
||||
header('Location: /user.php');
|
||||
exit();
|
||||
}
|
||||
require_once("inc/header.inc.php");
|
||||
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||
?>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-offset-3 col-md-6">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading"><span class="glyphicon glyphicon-user" aria-hidden="true"></span> <?=$lang['login']['login'];?></div>
|
||||
<div class="panel-body">
|
||||
<center><img style="max-width:250px" src="/img/cow_mailcow.svg" alt="mailcow"></center>
|
||||
<legend>mailcow UI</legend>
|
||||
<form method="post" autofill="off">
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="login_user"><?=$lang['login']['username'];?></label>
|
||||
<div class="input-group">
|
||||
<div class="input-group-addon"><i class="glyphicon glyphicon-user"></i></div>
|
||||
<input name="login_user" autocorrect="off" autocapitalize="none" type="name" id="login_user" class="form-control" placeholder="<?=$lang['login']['username'];?>" required="" autofocus="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="pass_user"><?=$lang['login']['password'];?></label>
|
||||
<div class="input-group">
|
||||
<div class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></div>
|
||||
<input name="pass_user" type="password" id="pass_user" class="form-control" placeholder="<?=$lang['login']['password'];?>" required="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn-success" value="Login"><?=$lang['login']['login'];?></button>
|
||||
<div class="btn-group pull-right">
|
||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<span class="lang-sm lang-lbl" lang="<?=$_SESSION['mailcow_locale'];?>"></span> <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'de') ? 'class="active"' : ''?>><a href="?<?= http_build_query(array_merge($_GET, array("lang" => "de"))) ?>"><span class="lang-xs lang-lbl-full" lang="de"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'en') ? 'class="active"' : ''?>><a href="?<?= http_build_query(array_merge($_GET, array("lang" => "en"))) ?>"><span class="lang-xs lang-lbl-full" lang="en"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'es') ? 'class="active"' : ''?>><a href="?<?= http_build_query(array_merge($_GET, array("lang" => "es"))) ?>"><span class="lang-xs lang-lbl-full" lang="es"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'nl') ? 'class="active"' : ''?>><a href="?<?= http_build_query(array_merge($_GET, array("lang" => "nl"))) ?>"><span class="lang-xs lang-lbl-full" lang="nl"></span></a></li>
|
||||
<li <?=($_SESSION['mailcow_locale'] == 'pt') ? 'class="active"' : ''?>><a href="?<?= http_build_query(array_merge($_GET, array("lang" => "pt"))) ?>"><span class="lang-xs lang-lbl-full" lang="pt"></span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
if (isset($_SESSION['ldelay']) && $_SESSION['ldelay'] != "0"):
|
||||
?>
|
||||
<p><div class="alert alert-info"><?=sprintf($lang['login']['delayed'], $_SESSION['ldelay']);?></b></div></p>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
<legend>mailcow Apps</legend>
|
||||
<a href="/SOGo/" role="button" class="btn btn-lg btn-default"><?=$lang['start']['start_sogo'];?></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-offset-3 col-md-6">
|
||||
<div class="panel panel-default" style="">
|
||||
<div class="panel-heading">
|
||||
<a data-toggle="collapse" href="#collapse1"><span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span> <?=$lang['start']['help'];?></a>
|
||||
</div>
|
||||
<div id="collapse1" class="panel-collapse collapse">
|
||||
<div class="panel-body">
|
||||
<p><span style="border-bottom: 1px dotted #999">mailcow UI</span></p>
|
||||
<p><?=$lang['start']['mailcow_panel_detail'];?></p>
|
||||
<p><span style="border-bottom: 1px dotted #999">mailcow Apps</span></p>
|
||||
<p><?=$lang['start']['mailcow_apps_detail'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- /container -->
|
||||
<script src="js/index.js"></script>
|
||||
<?php
|
||||
require_once("inc/footer.inc.php");
|
||||
?>
|
18
data/web/js/add.js
Normal file
18
data/web/js/add.js
Normal file
@@ -0,0 +1,18 @@
|
||||
$(document).ready(function() {
|
||||
// add.php
|
||||
// Get max. possible quota for a domain when domain field changes
|
||||
$('#addSelectDomain').on('change', function() {
|
||||
$.get("json_api.php", { action:"get_domain_details", object:this.value }, function(data){
|
||||
var result = jQuery.parseJSON( data );
|
||||
max_new_mailbox_quota = ( result.max_new_mailbox_quota / 1048576);
|
||||
if (max_new_mailbox_quota != '0') {
|
||||
$("#quotaBadge").html('max. ' + max_new_mailbox_quota + ' MiB');
|
||||
$('#addInputQuota').attr({"disabled": false, "value": "", "type": "number", "max": max_new_mailbox_quota});
|
||||
}
|
||||
else {
|
||||
$("#quotaBadge").html('max. ' + max_new_mailbox_quota + ' MiB');
|
||||
$('#addInputQuota').attr({"disabled": true, "value": "", "type": "text", "value": "n/a"});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
31
data/web/js/admin.js
Normal file
31
data/web/js/admin.js
Normal file
@@ -0,0 +1,31 @@
|
||||
$(document).ready(function() {
|
||||
// Postfix restrictions, drag and drop functions
|
||||
$( "[id*=srr-sortable]" ).sortable({
|
||||
items: "li:not(.list-heading)",
|
||||
cancel: ".ui-state-disabled",
|
||||
connectWith: "[id*=srr-sortable]",
|
||||
dropOnEmpty: true,
|
||||
placeholder: "ui-state-highlight"
|
||||
});
|
||||
$( "[id*=ssr-sortable]" ).sortable({
|
||||
items: "li:not(.list-heading)",
|
||||
cancel: ".ui-state-disabled",
|
||||
connectWith: "[id*=ssr-sortable]",
|
||||
dropOnEmpty: true,
|
||||
placeholder: "ui-state-highlight"
|
||||
});
|
||||
$('#srr_form').submit(function(){
|
||||
var srr_joined_vals = $("[id^=srr-sortable-active] li").map(function() {
|
||||
return $(this).data("value");
|
||||
}).get().join(', ');
|
||||
var input = $("<input>").attr("type", "hidden").attr("name", "srr_value").val(srr_joined_vals);
|
||||
$('#srr_form').append($(input));
|
||||
});
|
||||
$('#ssr_form').submit(function(){
|
||||
var ssr_joined_vals = $("[id^=ssr-sortable-active] li").map(function() {
|
||||
return $(this).data("value");
|
||||
}).get().join(', ');
|
||||
var input = $("<input>").attr("type", "hidden").attr("name", "ssr_value").val(ssr_joined_vals);
|
||||
$('#ssr_form').append($(input));
|
||||
});
|
||||
});
|
9
data/web/js/bootstrap-select.min.js
vendored
Normal file
9
data/web/js/bootstrap-select.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
5
data/web/js/bootstrap-slider.min.js
vendored
Normal file
5
data/web/js/bootstrap-slider.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
data/web/js/bootstrap-switch.min.js
vendored
Normal file
10
data/web/js/bootstrap-switch.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
data/web/js/index.js
Normal file
3
data/web/js/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
$(document).ready(function() {
|
||||
$('nav').hide();
|
||||
});
|
54
data/web/js/mailbox.js
Normal file
54
data/web/js/mailbox.js
Normal file
@@ -0,0 +1,54 @@
|
||||
$(document).ready(function() {
|
||||
// Show element counter for tables
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
var rowCountDomainAlias = $('#domainaliastable >tbody >#data').length;
|
||||
var rowCountDomain = $('#domaintable >tbody >#data').length;
|
||||
var rowCountMailbox = $('#mailboxtable >tbody >#data').length;
|
||||
var rowCountAlias = $('#aliastable >tbody >#data').length;
|
||||
var rowCountResource = $('#resourcetable >tbody >#data').length;
|
||||
$("#numRowsDomainAlias").text(rowCountDomainAlias);
|
||||
$("#numRowsDomain").text(rowCountDomain);
|
||||
$("#numRowsMailbox").text(rowCountMailbox);
|
||||
$("#numRowsAlias").text(rowCountAlias);
|
||||
$("#numRowsResource").text(rowCountResource);
|
||||
|
||||
// Filter table function
|
||||
$.fn.extend({
|
||||
filterTable: function(){
|
||||
return this.each(function(){
|
||||
$(this).on('keyup', function(e){
|
||||
var $this = $(this),
|
||||
search = $this.val().toLowerCase(),
|
||||
target = $this.attr('data-filters'),
|
||||
$target = $(target),
|
||||
$rows = $target.find('tbody #data');
|
||||
$target.find('tbody .filterTable_no_results').remove();
|
||||
if(search == '') {
|
||||
$target.find('tbody #no-data').show();
|
||||
$rows.show();
|
||||
} else {
|
||||
$target.find('tbody #no-data').hide();
|
||||
$rows.each(function(){
|
||||
var $this = $(this);
|
||||
$this.text().toLowerCase().indexOf(search) === -1 ? $this.hide() : $this.show();
|
||||
})
|
||||
if($target.find('tbody #data:visible').size() === 0) {
|
||||
var col_count = $target.find('#data').first().find('td').size();
|
||||
var no_results = $('<tr class="filterTable_no_results"><td colspan="100%">-</td></tr>')
|
||||
$target.find('tbody').prepend(no_results);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
$('[data-action="filter"]').filterTable();
|
||||
$('.container').on('click', '.panel-heading span.filter', function(e){
|
||||
var $this = $(this),
|
||||
$panel = $this.parents('.panel');
|
||||
$panel.find('.panel-body').slideToggle("fast");
|
||||
if($this.css('display') != 'none') {
|
||||
$panel.find('.panel-body input').focus();
|
||||
}
|
||||
});
|
||||
});
|
236
data/web/js/sorttable.js
Normal file
236
data/web/js/sorttable.js
Normal file
@@ -0,0 +1,236 @@
|
||||
(function() {
|
||||
var SELECTOR, addEventListener, clickEvents, numberRegExp, sortable, touchDevice, trimRegExp;
|
||||
|
||||
SELECTOR = 'table[data-sortable]';
|
||||
|
||||
numberRegExp = /^-?[£$¤]?[\d,.]+%?$/;
|
||||
|
||||
trimRegExp = /^\s+|\s+$/g;
|
||||
|
||||
clickEvents = ['click'];
|
||||
|
||||
touchDevice = 'ontouchstart' in document.documentElement;
|
||||
|
||||
if (touchDevice) {
|
||||
clickEvents.push('touchstart');
|
||||
}
|
||||
|
||||
addEventListener = function(el, event, handler) {
|
||||
if (el.addEventListener != null) {
|
||||
return el.addEventListener(event, handler, false);
|
||||
} else {
|
||||
return el.attachEvent("on" + event, handler);
|
||||
}
|
||||
};
|
||||
|
||||
sortable = {
|
||||
init: function(options) {
|
||||
var table, tables, _i, _len, _results;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (options.selector == null) {
|
||||
options.selector = SELECTOR;
|
||||
}
|
||||
tables = document.querySelectorAll(options.selector);
|
||||
_results = [];
|
||||
for (_i = 0, _len = tables.length; _i < _len; _i++) {
|
||||
table = tables[_i];
|
||||
_results.push(sortable.initTable(table));
|
||||
}
|
||||
return _results;
|
||||
},
|
||||
initTable: function(table) {
|
||||
var i, th, ths, _i, _len, _ref;
|
||||
if (((_ref = table.tHead) != null ? _ref.rows.length : void 0) !== 1) {
|
||||
return;
|
||||
}
|
||||
if (table.getAttribute('data-sortable-initialized') === 'true') {
|
||||
return;
|
||||
}
|
||||
table.setAttribute('data-sortable-initialized', 'true');
|
||||
ths = table.querySelectorAll('th');
|
||||
for (i = _i = 0, _len = ths.length; _i < _len; i = ++_i) {
|
||||
th = ths[i];
|
||||
if (th.getAttribute('data-sortable') !== 'false') {
|
||||
sortable.setupClickableTH(table, th, i);
|
||||
}
|
||||
}
|
||||
return table;
|
||||
},
|
||||
setupClickableTH: function(table, th, i) {
|
||||
var eventName, onClick, type, _i, _len, _results;
|
||||
type = sortable.getColumnType(table, i);
|
||||
onClick = function(e) {
|
||||
var compare, item, newSortedDirection, position, row, rowArray, sorted, sortedDirection, tBody, ths, value, _compare, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1;
|
||||
if (e.handled !== true) {
|
||||
e.handled = true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
sorted = this.getAttribute('data-sorted') === 'true';
|
||||
sortedDirection = this.getAttribute('data-sorted-direction');
|
||||
if (sorted) {
|
||||
newSortedDirection = sortedDirection === 'ascending' ? 'descending' : 'ascending';
|
||||
} else {
|
||||
newSortedDirection = type.defaultSortDirection;
|
||||
}
|
||||
ths = this.parentNode.querySelectorAll('th');
|
||||
for (_i = 0, _len = ths.length; _i < _len; _i++) {
|
||||
th = ths[_i];
|
||||
th.setAttribute('data-sorted', 'false');
|
||||
th.removeAttribute('data-sorted-direction');
|
||||
}
|
||||
this.setAttribute('data-sorted', 'true');
|
||||
this.setAttribute('data-sorted-direction', newSortedDirection);
|
||||
tBody = table.tBodies[0];
|
||||
rowArray = [];
|
||||
if (!sorted) {
|
||||
if (type.compare != null) {
|
||||
_compare = type.compare;
|
||||
} else {
|
||||
_compare = function(a, b) {
|
||||
return b - a;
|
||||
};
|
||||
}
|
||||
compare = function(a, b) {
|
||||
if (a[0] === b[0]) {
|
||||
return a[2] - b[2];
|
||||
}
|
||||
if (type.reverse) {
|
||||
return _compare(b[0], a[0]);
|
||||
} else {
|
||||
return _compare(a[0], b[0]);
|
||||
}
|
||||
};
|
||||
_ref = tBody.rows;
|
||||
for (position = _j = 0, _len1 = _ref.length; _j < _len1; position = ++_j) {
|
||||
row = _ref[position];
|
||||
value = sortable.getNodeValue(row.cells[i]);
|
||||
if (type.comparator != null) {
|
||||
value = type.comparator(value);
|
||||
}
|
||||
rowArray.push([value, row, position]);
|
||||
}
|
||||
rowArray.sort(compare);
|
||||
for (_k = 0, _len2 = rowArray.length; _k < _len2; _k++) {
|
||||
row = rowArray[_k];
|
||||
tBody.appendChild(row[1]);
|
||||
}
|
||||
} else {
|
||||
_ref1 = tBody.rows;
|
||||
for (_l = 0, _len3 = _ref1.length; _l < _len3; _l++) {
|
||||
item = _ref1[_l];
|
||||
rowArray.push(item);
|
||||
}
|
||||
rowArray.reverse();
|
||||
for (_m = 0, _len4 = rowArray.length; _m < _len4; _m++) {
|
||||
row = rowArray[_m];
|
||||
tBody.appendChild(row);
|
||||
}
|
||||
}
|
||||
if (typeof window['CustomEvent'] === 'function') {
|
||||
return typeof table.dispatchEvent === "function" ? table.dispatchEvent(new CustomEvent('Sortable.sorted', {
|
||||
bubbles: true
|
||||
})) : void 0;
|
||||
}
|
||||
};
|
||||
_results = [];
|
||||
for (_i = 0, _len = clickEvents.length; _i < _len; _i++) {
|
||||
eventName = clickEvents[_i];
|
||||
_results.push(addEventListener(th, eventName, onClick));
|
||||
}
|
||||
return _results;
|
||||
},
|
||||
getColumnType: function(table, i) {
|
||||
var row, specified, text, type, _i, _j, _len, _len1, _ref, _ref1, _ref2;
|
||||
specified = (_ref = table.querySelectorAll('th')[i]) != null ? _ref.getAttribute('data-sortable-type') : void 0;
|
||||
if (specified != null) {
|
||||
return sortable.typesObject[specified];
|
||||
}
|
||||
_ref1 = table.tBodies[0].rows;
|
||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||
row = _ref1[_i];
|
||||
text = sortable.getNodeValue(row.cells[i]);
|
||||
_ref2 = sortable.types;
|
||||
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
|
||||
type = _ref2[_j];
|
||||
if (type.match(text)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
}
|
||||
return sortable.typesObject.alpha;
|
||||
},
|
||||
getNodeValue: function(node) {
|
||||
var dataValue;
|
||||
if (!node) {
|
||||
return '';
|
||||
}
|
||||
dataValue = node.getAttribute('data-value');
|
||||
if (dataValue !== null) {
|
||||
return dataValue;
|
||||
}
|
||||
if (typeof node.innerText !== 'undefined') {
|
||||
return node.innerText.replace(trimRegExp, '');
|
||||
}
|
||||
return node.textContent.replace(trimRegExp, '');
|
||||
},
|
||||
setupTypes: function(types) {
|
||||
var type, _i, _len, _results;
|
||||
sortable.types = types;
|
||||
sortable.typesObject = {};
|
||||
_results = [];
|
||||
for (_i = 0, _len = types.length; _i < _len; _i++) {
|
||||
type = types[_i];
|
||||
_results.push(sortable.typesObject[type.name] = type);
|
||||
}
|
||||
return _results;
|
||||
}
|
||||
};
|
||||
|
||||
sortable.setupTypes([
|
||||
{
|
||||
name: 'numeric',
|
||||
defaultSortDirection: 'descending',
|
||||
match: function(a) {
|
||||
return a.match(numberRegExp);
|
||||
},
|
||||
comparator: function(a) {
|
||||
return parseFloat(a.replace(/[^0-9.-]/g, ''), 10) || 0;
|
||||
}
|
||||
}, {
|
||||
name: 'date',
|
||||
defaultSortDirection: 'ascending',
|
||||
reverse: true,
|
||||
match: function(a) {
|
||||
return !isNaN(Date.parse(a));
|
||||
},
|
||||
comparator: function(a) {
|
||||
return Date.parse(a) || 0;
|
||||
}
|
||||
}, {
|
||||
name: 'alpha',
|
||||
defaultSortDirection: 'ascending',
|
||||
match: function() {
|
||||
return true;
|
||||
},
|
||||
compare: function(a, b) {
|
||||
return a.localeCompare(b);
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
||||
setTimeout(sortable.init, 0);
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function() {
|
||||
return sortable;
|
||||
});
|
||||
} else if (typeof exports !== 'undefined') {
|
||||
module.exports = sortable;
|
||||
} else {
|
||||
window.Sortable = sortable;
|
||||
}
|
||||
|
||||
}).call(this);
|
651
data/web/js/u2f-api.js
Normal file
651
data/web/js/u2f-api.js
Normal file
@@ -0,0 +1,651 @@
|
||||
// Copyright 2014-2015 Google Inc. All rights reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file or at
|
||||
// https://developers.google.com/open-source/licenses/bsd
|
||||
|
||||
/**
|
||||
* @fileoverview The U2F api.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/** Namespace for the U2F api.
|
||||
* @type {Object}
|
||||
*/
|
||||
var u2f = u2f || {};
|
||||
|
||||
/**
|
||||
* The U2F extension id
|
||||
* @type {string}
|
||||
* @const
|
||||
*/
|
||||
u2f.EXTENSION_ID = 'kmendfapggjehodndflmmgagdbamhnfd';
|
||||
|
||||
/**
|
||||
* Message types for messsages to/from the extension
|
||||
* @const
|
||||
* @enum {string}
|
||||
*/
|
||||
u2f.MessageTypes = {
|
||||
'U2F_REGISTER_REQUEST': 'u2f_register_request',
|
||||
'U2F_SIGN_REQUEST': 'u2f_sign_request',
|
||||
'U2F_REGISTER_RESPONSE': 'u2f_register_response',
|
||||
'U2F_SIGN_RESPONSE': 'u2f_sign_response'
|
||||
};
|
||||
|
||||
/**
|
||||
* Response status codes
|
||||
* @const
|
||||
* @enum {number}
|
||||
*/
|
||||
u2f.ErrorCodes = {
|
||||
'OK': 0,
|
||||
'OTHER_ERROR': 1,
|
||||
'BAD_REQUEST': 2,
|
||||
'CONFIGURATION_UNSUPPORTED': 3,
|
||||
'DEVICE_INELIGIBLE': 4,
|
||||
'TIMEOUT': 5
|
||||
};
|
||||
|
||||
/**
|
||||
* A message type for registration requests
|
||||
* @typedef {{
|
||||
* type: u2f.MessageTypes,
|
||||
* signRequests: Array<u2f.SignRequest>,
|
||||
* registerRequests: ?Array<u2f.RegisterRequest>,
|
||||
* timeoutSeconds: ?number,
|
||||
* requestId: ?number
|
||||
* }}
|
||||
*/
|
||||
u2f.Request;
|
||||
|
||||
/**
|
||||
* A message for registration responses
|
||||
* @typedef {{
|
||||
* type: u2f.MessageTypes,
|
||||
* responseData: (u2f.Error | u2f.RegisterResponse | u2f.SignResponse),
|
||||
* requestId: ?number
|
||||
* }}
|
||||
*/
|
||||
u2f.Response;
|
||||
|
||||
/**
|
||||
* An error object for responses
|
||||
* @typedef {{
|
||||
* errorCode: u2f.ErrorCodes,
|
||||
* errorMessage: ?string
|
||||
* }}
|
||||
*/
|
||||
u2f.Error;
|
||||
|
||||
/**
|
||||
* Data object for a single sign request.
|
||||
* @typedef {{
|
||||
* version: string,
|
||||
* challenge: string,
|
||||
* keyHandle: string,
|
||||
* appId: string
|
||||
* }}
|
||||
*/
|
||||
u2f.SignRequest;
|
||||
|
||||
/**
|
||||
* Data object for a sign response.
|
||||
* @typedef {{
|
||||
* keyHandle: string,
|
||||
* signatureData: string,
|
||||
* clientData: string
|
||||
* }}
|
||||
*/
|
||||
u2f.SignResponse;
|
||||
|
||||
/**
|
||||
* Data object for a registration request.
|
||||
* @typedef {{
|
||||
* version: string,
|
||||
* challenge: string,
|
||||
* appId: string
|
||||
* }}
|
||||
*/
|
||||
u2f.RegisterRequest;
|
||||
|
||||
/**
|
||||
* Data object for a registration response.
|
||||
* @typedef {{
|
||||
* registrationData: string,
|
||||
* clientData: string
|
||||
* }}
|
||||
*/
|
||||
u2f.RegisterResponse;
|
||||
|
||||
|
||||
// Low level MessagePort API support
|
||||
|
||||
/**
|
||||
* Sets up a MessagePort to the U2F extension using the
|
||||
* available mechanisms.
|
||||
* @param {function((MessagePort|u2f.WrappedChromeRuntimePort_))} callback
|
||||
*/
|
||||
u2f.getMessagePort = function(callback) {
|
||||
if (typeof chrome != 'undefined' && chrome.runtime) {
|
||||
// The actual message here does not matter, but we need to get a reply
|
||||
// for the callback to run. Thus, send an empty signature request
|
||||
// in order to get a failure response.
|
||||
var msg = {
|
||||
type: u2f.MessageTypes.U2F_SIGN_REQUEST,
|
||||
signRequests: []
|
||||
};
|
||||
chrome.runtime.sendMessage(u2f.EXTENSION_ID, msg, function() {
|
||||
if (!chrome.runtime.lastError) {
|
||||
// We are on a whitelisted origin and can talk directly
|
||||
// with the extension.
|
||||
u2f.getChromeRuntimePort_(callback);
|
||||
} else {
|
||||
// chrome.runtime was available, but we couldn't message
|
||||
// the extension directly, use iframe
|
||||
u2f.getIframePort_(callback);
|
||||
}
|
||||
});
|
||||
} else if (u2f.isAndroidChrome_()) {
|
||||
u2f.getAuthenticatorPort_(callback);
|
||||
} else {
|
||||
// chrome.runtime was not available at all, which is normal
|
||||
// when this origin doesn't have access to any extensions.
|
||||
u2f.getIframePort_(callback);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Detect chrome running on android based on the browser's useragent.
|
||||
* @private
|
||||
*/
|
||||
u2f.isAndroidChrome_ = function() {
|
||||
var userAgent = navigator.userAgent;
|
||||
return userAgent.indexOf('Chrome') != -1 &&
|
||||
userAgent.indexOf('Android') != -1;
|
||||
};
|
||||
|
||||
/**
|
||||
* Connects directly to the extension via chrome.runtime.connect
|
||||
* @param {function(u2f.WrappedChromeRuntimePort_)} callback
|
||||
* @private
|
||||
*/
|
||||
u2f.getChromeRuntimePort_ = function(callback) {
|
||||
var port = chrome.runtime.connect(u2f.EXTENSION_ID,
|
||||
{'includeTlsChannelId': true});
|
||||
setTimeout(function() {
|
||||
callback(new u2f.WrappedChromeRuntimePort_(port));
|
||||
}, 0);
|
||||
};
|
||||
|
||||
/**
|
||||
* Return a 'port' abstraction to the Authenticator app.
|
||||
* @param {function(u2f.WrappedAuthenticatorPort_)} callback
|
||||
* @private
|
||||
*/
|
||||
u2f.getAuthenticatorPort_ = function(callback) {
|
||||
setTimeout(function() {
|
||||
callback(new u2f.WrappedAuthenticatorPort_());
|
||||
}, 0);
|
||||
};
|
||||
|
||||
/**
|
||||
* A wrapper for chrome.runtime.Port that is compatible with MessagePort.
|
||||
* @param {Port} port
|
||||
* @constructor
|
||||
* @private
|
||||
*/
|
||||
u2f.WrappedChromeRuntimePort_ = function(port) {
|
||||
this.port_ = port;
|
||||
};
|
||||
|
||||
/**
|
||||
* Format a return a sign request.
|
||||
* @param {Array<u2f.SignRequest>} signRequests
|
||||
* @param {number} timeoutSeconds
|
||||
* @param {number} reqId
|
||||
* @return {Object}
|
||||
*/
|
||||
u2f.WrappedChromeRuntimePort_.prototype.formatSignRequest_ =
|
||||
function(signRequests, timeoutSeconds, reqId) {
|
||||
return {
|
||||
type: u2f.MessageTypes.U2F_SIGN_REQUEST,
|
||||
signRequests: signRequests,
|
||||
timeoutSeconds: timeoutSeconds,
|
||||
requestId: reqId
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Format a return a register request.
|
||||
* @param {Array<u2f.SignRequest>} signRequests
|
||||
* @param {Array<u2f.RegisterRequest>} signRequests
|
||||
* @param {number} timeoutSeconds
|
||||
* @param {number} reqId
|
||||
* @return {Object}
|
||||
*/
|
||||
u2f.WrappedChromeRuntimePort_.prototype.formatRegisterRequest_ =
|
||||
function(signRequests, registerRequests, timeoutSeconds, reqId) {
|
||||
return {
|
||||
type: u2f.MessageTypes.U2F_REGISTER_REQUEST,
|
||||
signRequests: signRequests,
|
||||
registerRequests: registerRequests,
|
||||
timeoutSeconds: timeoutSeconds,
|
||||
requestId: reqId
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Posts a message on the underlying channel.
|
||||
* @param {Object} message
|
||||
*/
|
||||
u2f.WrappedChromeRuntimePort_.prototype.postMessage = function(message) {
|
||||
this.port_.postMessage(message);
|
||||
};
|
||||
|
||||
/**
|
||||
* Emulates the HTML 5 addEventListener interface. Works only for the
|
||||
* onmessage event, which is hooked up to the chrome.runtime.Port.onMessage.
|
||||
* @param {string} eventName
|
||||
* @param {function({data: Object})} handler
|
||||
*/
|
||||
u2f.WrappedChromeRuntimePort_.prototype.addEventListener =
|
||||
function(eventName, handler) {
|
||||
var name = eventName.toLowerCase();
|
||||
if (name == 'message' || name == 'onmessage') {
|
||||
this.port_.onMessage.addListener(function(message) {
|
||||
// Emulate a minimal MessageEvent object
|
||||
handler({'data': message});
|
||||
});
|
||||
} else {
|
||||
console.error('WrappedChromeRuntimePort only supports onMessage');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Wrap the Authenticator app with a MessagePort interface.
|
||||
* @constructor
|
||||
* @private
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_ = function() {
|
||||
this.requestId_ = -1;
|
||||
this.requestObject_ = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Launch the Authenticator intent.
|
||||
* @param {Object} message
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_.prototype.postMessage = function(message) {
|
||||
var intentLocation = /** @type {string} */ (message);
|
||||
document.location = intentLocation;
|
||||
};
|
||||
|
||||
/**
|
||||
* Emulates the HTML 5 addEventListener interface.
|
||||
* @param {string} eventName
|
||||
* @param {function({data: Object})} handler
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_.prototype.addEventListener =
|
||||
function(eventName, handler) {
|
||||
var name = eventName.toLowerCase();
|
||||
if (name == 'message') {
|
||||
var self = this;
|
||||
/* Register a callback to that executes when
|
||||
* chrome injects the response. */
|
||||
window.addEventListener(
|
||||
'message', self.onRequestUpdate_.bind(self, handler), false);
|
||||
} else {
|
||||
console.error('WrappedAuthenticatorPort only supports message');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Callback invoked when a response is received from the Authenticator.
|
||||
* @param function({data: Object}) callback
|
||||
* @param {Object} message message Object
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_.prototype.onRequestUpdate_ =
|
||||
function(callback, message) {
|
||||
var messageObject = JSON.parse(message.data);
|
||||
var intentUrl = messageObject['intentURL'];
|
||||
|
||||
var errorCode = messageObject['errorCode'];
|
||||
var responseObject = null;
|
||||
if (messageObject.hasOwnProperty('data')) {
|
||||
responseObject = /** @type {Object} */ (
|
||||
JSON.parse(messageObject['data']));
|
||||
responseObject['requestId'] = this.requestId_;
|
||||
}
|
||||
|
||||
/* Sign responses from the authenticator do not conform to U2F,
|
||||
* convert to U2F here. */
|
||||
responseObject = this.doResponseFixups_(responseObject);
|
||||
callback({'data': responseObject});
|
||||
};
|
||||
|
||||
/**
|
||||
* Fixup the response provided by the Authenticator to conform with
|
||||
* the U2F spec.
|
||||
* @param {Object} responseData
|
||||
* @return {Object} the U2F compliant response object
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_.prototype.doResponseFixups_ =
|
||||
function(responseObject) {
|
||||
if (responseObject.hasOwnProperty('responseData')) {
|
||||
return responseObject;
|
||||
} else if (this.requestObject_['type'] != u2f.MessageTypes.U2F_SIGN_REQUEST) {
|
||||
// Only sign responses require fixups. If this is not a response
|
||||
// to a sign request, then an internal error has occurred.
|
||||
return {
|
||||
'type': u2f.MessageTypes.U2F_REGISTER_RESPONSE,
|
||||
'responseData': {
|
||||
'errorCode': u2f.ErrorCodes.OTHER_ERROR,
|
||||
'errorMessage': 'Internal error: invalid response from Authenticator'
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* Non-conformant sign response, do fixups. */
|
||||
var encodedChallengeObject = responseObject['challenge'];
|
||||
if (typeof encodedChallengeObject !== 'undefined') {
|
||||
var challengeObject = JSON.parse(atob(encodedChallengeObject));
|
||||
var serverChallenge = challengeObject['challenge'];
|
||||
var challengesList = this.requestObject_['signData'];
|
||||
var requestChallengeObject = null;
|
||||
for (var i = 0; i < challengesList.length; i++) {
|
||||
var challengeObject = challengesList[i];
|
||||
if (challengeObject['keyHandle'] == responseObject['keyHandle']) {
|
||||
requestChallengeObject = challengeObject;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
var responseData = {
|
||||
'errorCode': responseObject['resultCode'],
|
||||
'keyHandle': responseObject['keyHandle'],
|
||||
'signatureData': responseObject['signature'],
|
||||
'clientData': encodedChallengeObject
|
||||
};
|
||||
return {
|
||||
'type': u2f.MessageTypes.U2F_SIGN_RESPONSE,
|
||||
'responseData': responseData,
|
||||
'requestId': responseObject['requestId']
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Base URL for intents to Authenticator.
|
||||
* @const
|
||||
* @private
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_ =
|
||||
'intent:#Intent;action=com.google.android.apps.authenticator.AUTHENTICATE';
|
||||
|
||||
/**
|
||||
* Format a return a sign request.
|
||||
* @param {Array<u2f.SignRequest>} signRequests
|
||||
* @param {number} timeoutSeconds (ignored for now)
|
||||
* @param {number} reqId
|
||||
* @return {string}
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_.prototype.formatSignRequest_ =
|
||||
function(signRequests, timeoutSeconds, reqId) {
|
||||
if (!signRequests || signRequests.length == 0) {
|
||||
return null;
|
||||
}
|
||||
/* TODO(fixme): stash away requestId, as the authenticator app does
|
||||
* not return it for sign responses. */
|
||||
this.requestId_ = reqId;
|
||||
/* TODO(fixme): stash away the signRequests, to deal with the legacy
|
||||
* response format returned by the Authenticator app. */
|
||||
this.requestObject_ = {
|
||||
'type': u2f.MessageTypes.U2F_SIGN_REQUEST,
|
||||
'signData': signRequests,
|
||||
'requestId': reqId,
|
||||
'timeout': timeoutSeconds
|
||||
};
|
||||
|
||||
var appId = signRequests[0]['appId'];
|
||||
var intentUrl =
|
||||
u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_ +
|
||||
';S.appId=' + encodeURIComponent(appId) +
|
||||
';S.eventId=' + reqId +
|
||||
';S.challenges=' +
|
||||
encodeURIComponent(
|
||||
JSON.stringify(this.getBrowserDataList_(signRequests))) + ';end';
|
||||
return intentUrl;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the browser data objects from the challenge list
|
||||
* @param {Array} challenges list of challenges
|
||||
* @return {Array} list of browser data objects
|
||||
* @private
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_
|
||||
.prototype.getBrowserDataList_ = function(challenges) {
|
||||
return challenges
|
||||
.map(function(challenge) {
|
||||
var browserData = {
|
||||
'typ': 'navigator.id.getAssertion',
|
||||
'challenge': challenge['challenge']
|
||||
};
|
||||
var challengeObject = {
|
||||
'challenge' : browserData,
|
||||
'keyHandle' : challenge['keyHandle']
|
||||
};
|
||||
return challengeObject;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Format a return a register request.
|
||||
* @param {Array<u2f.SignRequest>} signRequests
|
||||
* @param {Array<u2f.RegisterRequest>} enrollChallenges
|
||||
* @param {number} timeoutSeconds (ignored for now)
|
||||
* @param {number} reqId
|
||||
* @return {Object}
|
||||
*/
|
||||
u2f.WrappedAuthenticatorPort_.prototype.formatRegisterRequest_ =
|
||||
function(signRequests, enrollChallenges, timeoutSeconds, reqId) {
|
||||
if (!enrollChallenges || enrollChallenges.length == 0) {
|
||||
return null;
|
||||
}
|
||||
// Assume the appId is the same for all enroll challenges.
|
||||
var appId = enrollChallenges[0]['appId'];
|
||||
var registerRequests = [];
|
||||
for (var i = 0; i < enrollChallenges.length; i++) {
|
||||
var registerRequest = {
|
||||
'challenge': enrollChallenges[i]['challenge'],
|
||||
'version': enrollChallenges[i]['version']
|
||||
};
|
||||
if (enrollChallenges[i]['appId'] != appId) {
|
||||
// Only include the appId when it differs from the first appId.
|
||||
registerRequest['appId'] = enrollChallenges[i]['appId'];
|
||||
}
|
||||
registerRequests.push(registerRequest);
|
||||
}
|
||||
var registeredKeys = [];
|
||||
if (signRequests) {
|
||||
for (i = 0; i < signRequests.length; i++) {
|
||||
var key = {
|
||||
'keyHandle': signRequests[i]['keyHandle'],
|
||||
'version': signRequests[i]['version']
|
||||
};
|
||||
// Only include the appId when it differs from the appId that's
|
||||
// being registered now.
|
||||
if (signRequests[i]['appId'] != appId) {
|
||||
key['appId'] = signRequests[i]['appId'];
|
||||
}
|
||||
registeredKeys.push(key);
|
||||
}
|
||||
}
|
||||
var request = {
|
||||
'type': u2f.MessageTypes.U2F_REGISTER_REQUEST,
|
||||
'appId': appId,
|
||||
'registerRequests': registerRequests,
|
||||
'registeredKeys': registeredKeys,
|
||||
'requestId': reqId,
|
||||
'timeoutSeconds': timeoutSeconds
|
||||
};
|
||||
var intentUrl =
|
||||
u2f.WrappedAuthenticatorPort_.INTENT_URL_BASE_ +
|
||||
';S.request=' + encodeURIComponent(JSON.stringify(request)) +
|
||||
';end';
|
||||
/* TODO(fixme): stash away requestId, this is is not necessary for
|
||||
* register requests, but here to keep parity with sign.
|
||||
*/
|
||||
this.requestId_ = reqId;
|
||||
return intentUrl;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Sets up an embedded trampoline iframe, sourced from the extension.
|
||||
* @param {function(MessagePort)} callback
|
||||
* @private
|
||||
*/
|
||||
u2f.getIframePort_ = function(callback) {
|
||||
// Create the iframe
|
||||
var iframeOrigin = 'chrome-extension://' + u2f.EXTENSION_ID;
|
||||
var iframe = document.createElement('iframe');
|
||||
iframe.src = iframeOrigin + '/u2f-comms.html';
|
||||
iframe.setAttribute('style', 'display:none');
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
var channel = new MessageChannel();
|
||||
var ready = function(message) {
|
||||
if (message.data == 'ready') {
|
||||
channel.port1.removeEventListener('message', ready);
|
||||
callback(channel.port1);
|
||||
} else {
|
||||
console.error('First event on iframe port was not "ready"');
|
||||
}
|
||||
};
|
||||
channel.port1.addEventListener('message', ready);
|
||||
channel.port1.start();
|
||||
|
||||
iframe.addEventListener('load', function() {
|
||||
// Deliver the port to the iframe and initialize
|
||||
iframe.contentWindow.postMessage('init', iframeOrigin, [channel.port2]);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// High-level JS API
|
||||
|
||||
/**
|
||||
* Default extension response timeout in seconds.
|
||||
* @const
|
||||
*/
|
||||
u2f.EXTENSION_TIMEOUT_SEC = 30;
|
||||
|
||||
/**
|
||||
* A singleton instance for a MessagePort to the extension.
|
||||
* @type {MessagePort|u2f.WrappedChromeRuntimePort_}
|
||||
* @private
|
||||
*/
|
||||
u2f.port_ = null;
|
||||
|
||||
/**
|
||||
* Callbacks waiting for a port
|
||||
* @type {Array<function((MessagePort|u2f.WrappedChromeRuntimePort_))>}
|
||||
* @private
|
||||
*/
|
||||
u2f.waitingForPort_ = [];
|
||||
|
||||
/**
|
||||
* A counter for requestIds.
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
u2f.reqCounter_ = 0;
|
||||
|
||||
/**
|
||||
* A map from requestIds to client callbacks
|
||||
* @type {Object.<number,(function((u2f.Error|u2f.RegisterResponse))
|
||||
* |function((u2f.Error|u2f.SignResponse)))>}
|
||||
* @private
|
||||
*/
|
||||
u2f.callbackMap_ = {};
|
||||
|
||||
/**
|
||||
* Creates or retrieves the MessagePort singleton to use.
|
||||
* @param {function((MessagePort|u2f.WrappedChromeRuntimePort_))} callback
|
||||
* @private
|
||||
*/
|
||||
u2f.getPortSingleton_ = function(callback) {
|
||||
if (u2f.port_) {
|
||||
callback(u2f.port_);
|
||||
} else {
|
||||
if (u2f.waitingForPort_.length == 0) {
|
||||
u2f.getMessagePort(function(port) {
|
||||
u2f.port_ = port;
|
||||
u2f.port_.addEventListener('message',
|
||||
/** @type {function(Event)} */ (u2f.responseHandler_));
|
||||
|
||||
// Careful, here be async callbacks. Maybe.
|
||||
while (u2f.waitingForPort_.length)
|
||||
u2f.waitingForPort_.shift()(u2f.port_);
|
||||
});
|
||||
}
|
||||
u2f.waitingForPort_.push(callback);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Handles response messages from the extension.
|
||||
* @param {MessageEvent.<u2f.Response>} message
|
||||
* @private
|
||||
*/
|
||||
u2f.responseHandler_ = function(message) {
|
||||
var response = message.data;
|
||||
var reqId = response['requestId'];
|
||||
if (!reqId || !u2f.callbackMap_[reqId]) {
|
||||
console.error('Unknown or missing requestId in response.');
|
||||
return;
|
||||
}
|
||||
var cb = u2f.callbackMap_[reqId];
|
||||
delete u2f.callbackMap_[reqId];
|
||||
cb(response['responseData']);
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispatches an array of sign requests to available U2F tokens.
|
||||
* @param {Array<u2f.SignRequest>} signRequests
|
||||
* @param {function((u2f.Error|u2f.SignResponse))} callback
|
||||
* @param {number=} opt_timeoutSeconds
|
||||
*/
|
||||
u2f.sign = function(signRequests, callback, opt_timeoutSeconds) {
|
||||
u2f.getPortSingleton_(function(port) {
|
||||
var reqId = ++u2f.reqCounter_;
|
||||
u2f.callbackMap_[reqId] = callback;
|
||||
var timeoutSeconds = (typeof opt_timeoutSeconds !== 'undefined' ?
|
||||
opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC);
|
||||
var req = port.formatSignRequest_(signRequests, timeoutSeconds, reqId);
|
||||
port.postMessage(req);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispatches register requests to available U2F tokens. An array of sign
|
||||
* requests identifies already registered tokens.
|
||||
* @param {Array<u2f.RegisterRequest>} registerRequests
|
||||
* @param {Array<u2f.SignRequest>} signRequests
|
||||
* @param {function((u2f.Error|u2f.RegisterResponse))} callback
|
||||
* @param {number=} opt_timeoutSeconds
|
||||
*/
|
||||
u2f.register = function(registerRequests, signRequests,
|
||||
callback, opt_timeoutSeconds) {
|
||||
u2f.getPortSingleton_(function(port) {
|
||||
var reqId = ++u2f.reqCounter_;
|
||||
u2f.callbackMap_[reqId] = callback;
|
||||
var timeoutSeconds = (typeof opt_timeoutSeconds !== 'undefined' ?
|
||||
opt_timeoutSeconds : u2f.EXTENSION_TIMEOUT_SEC);
|
||||
var req = port.formatRegisterRequest_(
|
||||
signRequests, registerRequests, timeoutSeconds, reqId);
|
||||
port.postMessage(req);
|
||||
});
|
||||
};
|
33
data/web/js/user.js
Normal file
33
data/web/js/user.js
Normal file
@@ -0,0 +1,33 @@
|
||||
$(document).ready(function() {
|
||||
// Show and activate password fields after box was checked
|
||||
// Hidden by default
|
||||
if ( !$("#togglePwNew").is(':checked') ) {
|
||||
$(".passFields").hide();
|
||||
}
|
||||
$('#togglePwNew').click(function() {
|
||||
$("#user_new_pass").attr("disabled", !this.checked);
|
||||
$("#user_new_pass2").attr("disabled", !this.checked);
|
||||
var $this = $(this);
|
||||
if ($this.is(':checked')) {
|
||||
$(".passFields").slideDown();
|
||||
} else {
|
||||
$(".passFields").slideUp();
|
||||
}
|
||||
});
|
||||
// Show generate button after time selection
|
||||
$('#generate_tla').hide();
|
||||
$('#validity').change(function(){
|
||||
$('#generate_tla').show();
|
||||
});
|
||||
|
||||
// Init Bootstrap Switch
|
||||
$.fn.bootstrapSwitch.defaults.onColor = 'success';
|
||||
$("[name='tls_out']").bootstrapSwitch();
|
||||
$("[name='tls_in']").bootstrapSwitch();
|
||||
|
||||
// Log modal
|
||||
$('#logModal').on('show.bs.modal', function(e) {
|
||||
var logText = $(e.relatedTarget).data('log-text');
|
||||
$(e.currentTarget).find('#logText').html('<pre style="background:none;font-size:11px;line-height:1.1;border:0px">' + logText + '</pre>');
|
||||
});
|
||||
});
|
57
data/web/json_api.php
Normal file
57
data/web/json_api.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
require_once 'inc/prerequisites.inc.php';
|
||||
error_reporting(E_ALL);
|
||||
if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_username'])) {
|
||||
if ($_GET['action'] && $_GET['object']) {
|
||||
$action = $_GET['action'];
|
||||
$object = $_GET['object'];
|
||||
switch ($action) {
|
||||
case "get_mailbox_details":
|
||||
$data = mailbox_get_mailbox_details($object);
|
||||
if (!$data || empty($data)) {
|
||||
echo '{}';
|
||||
}
|
||||
else {
|
||||
echo json_encode(mailbox_get_mailbox_details($object), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
break;
|
||||
case "get_domain_details":
|
||||
$data = mailbox_get_domain_details($object);
|
||||
if (!$data || empty($data)) {
|
||||
echo '{}';
|
||||
}
|
||||
else {
|
||||
echo json_encode(mailbox_get_domain_details($object), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
break;
|
||||
case "get_u2f_reg_challenge":
|
||||
if (
|
||||
($_SESSION["mailcow_cc_role"] == "admin" || $_SESSION["mailcow_cc_role"] == "domainadmin")
|
||||
&&
|
||||
($_SESSION["mailcow_cc_username"] == $object)
|
||||
) {
|
||||
$data = $u2f->getRegisterData(get_u2f_registrations($object));
|
||||
list($req, $sigs) = $data;
|
||||
$_SESSION['regReq'] = json_encode($req);
|
||||
echo 'var req = ' . json_encode($req) . '; var sigs = ' . json_encode($sigs) . ';';
|
||||
}
|
||||
else {
|
||||
echo '{}';
|
||||
}
|
||||
break;
|
||||
case "get_u2f_auth_challenge":
|
||||
if (isset($_SESSION['pending_mailcow_cc_username']) && $_SESSION['pending_mailcow_cc_username'] == $object) {
|
||||
$reqs = json_encode($u2f->getAuthenticateData(get_u2f_registrations($object)));
|
||||
$_SESSION['authReq'] = $reqs;
|
||||
echo 'var req = ' . $reqs . ';';
|
||||
}
|
||||
else {
|
||||
echo '{}';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
echo '{}';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
448
data/web/lang/lang.de.php
Normal file
448
data/web/lang/lang.de.php
Normal file
@@ -0,0 +1,448 @@
|
||||
<?php
|
||||
/*
|
||||
//
|
||||
// German language file
|
||||
//
|
||||
*/
|
||||
$lang['footer']['loading'] = 'Einen Moment bitte...';
|
||||
$lang['header']['restart_sogo'] = 'SOGo neustarten';
|
||||
$lang['footer']['restart_sogo'] = 'SOGo neustarten';
|
||||
$lang['footer']['restart_now'] = 'Jetzt neustarten';
|
||||
$lang['footer']['restart_sogo_info'] = 'Einige Änderungen an Domains benötigen einen Neustart SOGos. Hier können Sie SOGo neustarten.<br /><br /><b>Wichtig:</b> Ein korrekter Neustart SOGos kann eine Weile in Anspruch nehmen, bitte warten Sie, bis der Prozess vollständig beendet wurde.';
|
||||
$lang['dkim']['confirm'] = 'Sind Sie sicher?';
|
||||
$lang['danger']['dkim_not_found'] = 'DKIM-Key nicht gefunden';
|
||||
$lang['danger']['dkim_remove_failed'] = 'Kann DKIM-Key nicht entfernen';
|
||||
$lang['danger']['dkim_add_failed'] = 'Kann DKIM-Key nicht hinzufügen';
|
||||
$lang['danger']['dkim_domain_or_sel_invalid'] = 'DKIM-Domain oder -Selector nicht korrekt';
|
||||
$lang['danger']['dkim_key_length_invalid'] = 'DKIM Schlüssellänge ungültig';
|
||||
$lang['success']['dkim_removed'] = 'DKIM-Key wurde entfernt';
|
||||
$lang['success']['dkim_added'] = 'DKIM-Key wurde hinzugefügt';
|
||||
$lang['danger']['access_denied'] = 'Zugriff verweigert oder unvollständige/ungültige Daten';
|
||||
$lang['danger']['whitelist_from_invalid'] = 'Whitelist-Eintrag ist ungültig';
|
||||
$lang['danger']['domain_invalid'] = 'Domainname ist ungültig';
|
||||
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = 'Maximale Größe für Mailboxen überschreitet das Domain Speicherlimit';
|
||||
$lang['danger']['object_is_not_numeric'] = 'Wert %s ist nicht numerisch';
|
||||
$lang['success']['domain_added'] = 'Domain %s wurde angelegt';
|
||||
$lang['danger']['alias_empty'] = 'Alias-Adresse darf nicht leer sein';
|
||||
$lang['danger']['goto_empty'] = 'Ziel-Adresse darf nicht leer sein';
|
||||
$lang['danger']['policy_list_from_exists'] = 'Ein Eintrag mit diesem Wert existiert bereits';
|
||||
$lang['danger']['policy_list_from_invalid'] = 'Eintrag hat ungültiges Format';
|
||||
$lang['danger']['alias_invalid'] = 'Alias-Adrese ist ungültig';
|
||||
$lang['danger']['goto_invalid'] = 'Ziel-Adrese ist ungültig';
|
||||
$lang['danger']['last_key'] = 'Letzter Key kann nicht gelöscht werden';
|
||||
$lang['danger']['alias_domain_invalid'] = 'Alias-Domain ist ungültig';
|
||||
$lang['danger']['target_domain_invalid'] = 'Ziel-Domain ist ungültig';
|
||||
$lang['danger']['object_exists'] = 'Objekt %s existiert bereits';
|
||||
$lang['danger']['domain_exists'] = 'Domain %s existiert bereits';
|
||||
$lang['danger']['alias_goto_identical'] = 'Alias- und Ziel-Adresse dürfen nicht identisch sein';
|
||||
$lang['danger']['aliasd_targetd_identical'] = 'Alias-Domain darf nicht gleich Ziel-Domain sein';
|
||||
$lang['success']['alias_added'] = 'Alias-Adresse(n) wurden angelegt';
|
||||
$lang['success']['alias_modified'] = 'Änderungen an Alias %s wurden gespeichert';
|
||||
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
|
||||
$lang['success']['mailbox_modified'] = 'Änderungen an Mailbox %s wurden gespeichert';
|
||||
$lang['success']['resource_modified'] = "Änderungen an Ressource %s wurden gespeichert";
|
||||
$lang['success']['object_modified'] = "Änderungen an Objekt %s wurden gespeichert";
|
||||
$lang['success']['msg_size_saved'] = 'Limit wurde gesetzt';
|
||||
$lang['danger']['aliasd_not_found'] = 'Alias-Domain nicht gefunden';
|
||||
$lang['danger']['targetd_not_found'] = 'Ziel-Domain nicht gefunden';
|
||||
$lang['danger']['aliasd_exists'] = 'Alias-Domain existiert bereits';
|
||||
$lang['success']['aliasd_added'] = 'Alias-Domain %s wurde angelegt';
|
||||
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
|
||||
$lang['success']['domain_modified'] = 'Änderungen an Domain %s wurden gespeichert';
|
||||
$lang['success']['domain_admin_modified'] = 'Änderungen an Domain-Administrator %s wurden gespeichert';
|
||||
$lang['success']['domain_admin_added'] = 'Domain-Administrator %s wurde angelegt';
|
||||
$lang['success']['changes_general'] = 'Änderungen wurden gespeichert';
|
||||
$lang['success']['admin_modified'] = 'Änderungen am Administrator wurden gespeichert';
|
||||
$lang['danger']['exit_code_not_null'] = 'Fehler: Exit-Code ist %d';
|
||||
$lang['danger']['mailbox_not_available'] = 'Mailbox nicht verfügbar';
|
||||
$lang['danger']['username_invalid'] = 'Benutzername kann nicht verwendet werden';
|
||||
$lang['danger']['password_mismatch'] = 'Passwort-Wiederholung stimmt nicht überein';
|
||||
$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Vorgaben (Klein- und Großschreibung und mindestens eine Ziffer, mindestens 6 Zeichen lang)';
|
||||
$lang['danger']['password_empty'] = 'Passwort darf nicht leer sein';
|
||||
$lang['danger']['login_failed'] = 'Anmeldung fehlgeschlagen';
|
||||
$lang['danger']['mailbox_invalid'] = 'Mailboxname ist ungültig';
|
||||
$lang['danger']['resource_invalid'] = 'Ressourcenname ist ungültig';
|
||||
$lang['danger']['description_invalid'] = 'Ressourcenbeschreibung ist ungültig';
|
||||
$lang['danger']['mailbox_invalid_suggest'] = 'Mailboxname ist ungültig, meinten Sie vielleicht "%s"?';
|
||||
$lang['danger']['is_alias'] = '%s lautet bereits eine Alias-Adresse';
|
||||
$lang['danger']['is_alias_or_mailbox'] = "Eine Mailbox oder ein Alias mit der Adresse %s ist bereits vorhanden";
|
||||
$lang['danger']['is_spam_alias'] = '%s lautet bereits eine Spam-Alias-Adresse';
|
||||
$lang['danger']['quota_not_0_not_numeric'] = 'Speicherplatz muss numerisch und >= 0 sein';
|
||||
$lang['danger']['domain_not_found'] = 'Domain "%s" nicht gefunden.';
|
||||
$lang['danger']['max_mailbox_exceeded'] = 'Anzahl an Mailboxen überschritten (%d von %d)';
|
||||
$lang['danger']['mailbox_quota_exceeded'] = 'Speicherplatz überschreitet das Limit (max. %d MiB)';
|
||||
$lang['danger']['mailbox_quota_left_exceeded'] = 'Nicht genügend Speicherplatz vorhanden (Speicherplatz anwendbar: %d MiB)';
|
||||
$lang['success']['mailbox_added'] = 'Mailbox %s wurde angelegt';
|
||||
$lang['success']['resource_added'] = 'Ressource %s wurde angelegt';
|
||||
$lang['success']['domain_removed'] = 'Domain %s wurde entfernt';
|
||||
$lang['success']['alias_removed'] = 'Alias-Adresse %s wurde entfernt';
|
||||
$lang['success']['alias_domain_removed'] = 'Alias-Domain %s wurde entfernt';
|
||||
$lang['success']['domain_admin_removed'] = 'Domain-Administrator %s wurde entfernt';
|
||||
$lang['success']['mailbox_removed'] = 'Mailbox %s wurde entfernt';
|
||||
$lang['success']['eas_reset'] = "ActiveSync Gerät des Benutzers %s wurden zurückgesetzt";
|
||||
$lang['success']['resource_removed'] = 'Ressource %s wurde entfernt';
|
||||
$lang['danger']['max_quota_in_use'] = 'Mailbox Speicherplatzlimit muss größer oder gleich %d MiB sein';
|
||||
$lang['danger']['domain_quota_m_in_use'] = 'Domain Speicherplatzlimit muss größer oder gleich %d MiB sein';
|
||||
$lang['danger']['mailboxes_in_use'] = 'Maximale Anzahl an Mailboxen muss größer oder gleich %d sein';
|
||||
$lang['danger']['aliases_in_use'] = 'Maximale Anzahl an Aliassen muss größer oder gleich %d sein';
|
||||
$lang['danger']['sender_acl_invalid'] = 'Sender ACL Wert muss eine Adresse oder Domain sein';
|
||||
$lang['danger']['domain_not_empty'] = 'Kann nur leere Domains entfernen';
|
||||
$lang['warning']['spam_alias_temp_error'] = 'Kann zur Zeit keinen Spam-Alias erstellen, bitte versuchen Sie es später noch einmal.';
|
||||
$lang['danger']['spam_alias_max_exceeded'] = 'Maximale Anzahl an Spam-Alias-Adressen erreicht';
|
||||
$lang['danger']['validity_missing'] = 'Bitte geben Sie eine Gültigkeitsdauer an';
|
||||
$lang['user']['on'] = 'Ein';
|
||||
$lang['user']['off'] = 'Aus';
|
||||
$lang['user']['user_change_fn'] = '';
|
||||
$lang['user']['user_settings'] = 'Benutzereinstellungen';
|
||||
$lang['user']['mailbox_settings'] = 'Mailbox-Einstellungen';
|
||||
$lang['user']['mailbox_details'] = 'Mailbox-Details';
|
||||
$lang['user']['change_password'] = 'Passwort ändern';
|
||||
$lang['user']['new_password'] = 'Neues Passwort';
|
||||
$lang['user']['save_changes'] = 'Änderungen speichern';
|
||||
$lang['user']['password_now'] = 'Aktuelles Passwort (Änderungen bestätigen)';
|
||||
$lang['user']['new_password_repeat'] = 'Neues Passwort (Wiederholung)';
|
||||
$lang['user']['new_password_description'] = 'Mindestanforderung: 6 Zeichen lang, Buchstaben und Zahlen.';
|
||||
$lang['user']['did_you_know'] = '<b>Wussten Sie schon?</b> Sie können Ihre E-Mail-Adresse mit Tags versehen, etwa "ich+<b>Privat</b>@example.com", um Nachrichten automatisch in einem Unterordner (Beispiel: "Privat") abzulegen.';
|
||||
$lang['user']['spam_aliases'] = 'Temporäre E-Mail Aliasse';
|
||||
$lang['user']['alias'] = 'Alias';
|
||||
$lang['user']['aliases'] = 'Aliasse';
|
||||
$lang['user']['domain_aliases'] = 'Domain-Alias Adressen';
|
||||
$lang['user']['is_catch_all'] = 'Ist Catch-All Adresse für Domain(s)';
|
||||
$lang['user']['aliases_also_send_as'] = 'Darf außerdem versenden als';
|
||||
$lang['user']['aliases_send_as_all'] = 'Absender für folgende Domains nicht prüfen';
|
||||
$lang['user']['alias_create_random'] = 'Zufälligen Alias generieren';
|
||||
$lang['user']['alias_extend_all'] = 'Gültigkeit +1h';
|
||||
$lang['user']['alias_valid_until'] = 'Gültig bis';
|
||||
$lang['user']['alias_remove_all'] = 'Alle entfernen';
|
||||
$lang['user']['alias_time_left'] = 'Zeit verbleibend';
|
||||
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
|
||||
$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T';
|
||||
$lang['user']['alias_select_validity'] = 'Bitte Gültigkeit auswählen';
|
||||
$lang['user']['sync_jobs'] = 'Sync Jobs';
|
||||
$lang['user']['hour'] = 'Stunde';
|
||||
$lang['user']['hours'] = 'Stunden';
|
||||
$lang['user']['day'] = 'Tag';
|
||||
$lang['user']['week'] = 'Woche';
|
||||
$lang['user']['weeks'] = 'Wochen';
|
||||
$lang['user']['spamfilter'] = 'Spamfilter';
|
||||
$lang['user']['spamfilter_wl'] = 'Whitelist';
|
||||
$lang['user']['spamfilter_wl_desc'] = 'Für E-Mail-Adressen, die vom Spamfilter <b>nicht</b> erfasst werden sollen. Die Verwendung von Wildcards ist gestattet.';
|
||||
$lang['user']['spamfilter_bl'] = 'Blacklist';
|
||||
$lang['user']['spamfilter_bl_desc'] = 'Für E-Mail-Adressen, die vom Spamfilter <b>immer</b> als Spam erfasst und abgelehnt werden. Die Verwendung von Wildcards ist gestattet.';
|
||||
$lang['user']['spamfilter_table_rule'] = 'Regel';
|
||||
$lang['user']['spamfilter_table_action'] = 'Aktion';
|
||||
$lang['user']['spamfilter_table_empty'] = 'Keine Einträge vorhanden';
|
||||
$lang['user']['spamfilter_table_remove'] = 'entfernen';
|
||||
$lang['user']['spamfilter_table_add'] = 'Eintrag hinzufügen';
|
||||
$lang['user']['spamfilter_behavior'] = 'Bewertung';
|
||||
$lang['user']['spamfilter_default_score'] = 'Spam-Score:';
|
||||
$lang['user']['spamfilter_green'] = 'Grün: Die Nachricht ist kein Spam';
|
||||
$lang['user']['spamfilter_yellow'] = 'Gelb: Die Nachricht ist vielleicht Spam, wird als Spam markiert und in den Junk-Ordner verschoben';
|
||||
$lang['user']['spamfilter_red'] = 'Rot: Die Nachricht ist eindeutig Spam und wird vom Server abgelehnt';
|
||||
$lang['user']['spamfilter_default_score'] = 'Standardwert:';
|
||||
$lang['user']['spamfilter_hint'] = 'Der erste Wert beschreibt den "low spam score", der zweite Wert den "high spam score".';
|
||||
$lang['user']['spamfilter_table_domain_policy'] = "n.v. (Domainrichtlinie)";
|
||||
|
||||
$lang['user']['tls_policy_warning'] = '<strong>Vorsicht:</strong> Entscheiden Sie sich unverschlüsselte Verbindungen abzulehnen, kann dies dazu führen, dass Kontakte Sie nicht mehr erreichen.<br />Nachrichten, die die Richtlinie nicht erfüllen, werden durch einen Hard-Fail im Mailsystem abgewiesen.';
|
||||
$lang['user']['tls_policy'] = 'Verschlüsselungsrichtlinie';
|
||||
$lang['user']['tls_enforce_in'] = 'TLS eingehend erzwingen';
|
||||
$lang['user']['tls_enforce_out'] = 'TLS ausgehend erzwingen';
|
||||
$lang['user']['no_record'] = 'Kein Eintrag';
|
||||
|
||||
$lang['user']['misc_settings'] = 'Sonstige Kontoeinstellungen';
|
||||
$lang['user']['misc_delete_profile'] = 'Sonstige Kontoeinstellungen';
|
||||
|
||||
$lang['user']['tag_handling'] = 'Umgang mit getaggten E-Mails steuern';
|
||||
$lang['user']['tag_in_subfolder'] = 'In Unterordner';
|
||||
$lang['user']['tag_in_subject'] = 'In Betreff';
|
||||
$lang['user']['tag_help_explain'] = 'Als Unterordner: Es wird ein Ordner mit dem Namen des Tags unterhalb der Inbox erstellt ("INBOX/Facebook").<br />
|
||||
In Betreff: Der Name des Tags wird dem Betreff angefügt, etwa "[Facebook] Meine Neuigkeiten".';
|
||||
$lang['user']['tag_help_example'] = 'Beispiel für eine getaggte E-Mail-Adresse: ich<b>+Facebook</b>@example.org';
|
||||
$lang['user']['eas_reset'] = 'ActiveSync Geräte-Cache zurücksetzen';
|
||||
$lang['user']['eas_reset_now'] = 'Jetzt zurücksetzen';
|
||||
$lang['user']['eas_reset_help'] = 'In vielen Fällen kann ein ActiveSync Profil durch das Zurücksetzen des Caches repariert werden.<br /><b>Vorsicht:</b> Alle Elemente werden erneut heruntergeladen!';
|
||||
|
||||
$lang['user']['encryption'] = 'Verschlüsselung';
|
||||
$lang['user']['username'] = 'Benutzername';
|
||||
$lang['user']['password'] = 'Password';
|
||||
$lang['user']['last_run'] = 'Letzte Ausführung';
|
||||
$lang['user']['excludes'] = 'Ausschlüsse';
|
||||
$lang['user']['interval'] = 'Intervall';
|
||||
$lang['user']['active'] = 'Aktiv';
|
||||
$lang['user']['action'] = 'Aktion';
|
||||
$lang['user']['edit'] = 'Bearbeiten';
|
||||
$lang['user']['remove'] = 'Entfernen';
|
||||
$lang['user']['delete_now'] = 'Sofort löschen';
|
||||
$lang['user']['create_syncjob'] = 'Neuen Sync-Job erstellen';
|
||||
|
||||
$lang['start']['dashboard'] = '%s - Dashboard';
|
||||
$lang['start']['start_rc'] = 'Roundcube öffnen';
|
||||
$lang['start']['start_sogo'] = 'SOGo öffnen';
|
||||
$lang['start']['mailcow_apps_detail'] = 'Verwenden Sie mailcow Apps, um E-Mails abzurufen, Kalender- und Kontakte zu verwalten und vieles mehr.';
|
||||
$lang['start']['mailcow_panel'] = 'mailcow UI starten';
|
||||
$lang['start']['mailcow_panel_description'] = 'Die mailcow Steuerung steht sowohl für Administratoren als auch Mailbox-Benutzer zur Verfügung.';
|
||||
$lang['start']['mailcow_panel_detail'] = '<b>Domain-Administratoren</b> erstellen, verändern oder löschen Mailboxen, verwalten die Domäne und sehen sonstige Einstellungen ein.<br />
|
||||
Als <b>Mailbox-Benutzer</b> erstellen Sie hier zeitlich limitierte Aliasse, ändern das Verhalten des Spamfilters, setzen ein neues Passwort und vieles mehr.';
|
||||
$lang['start']['recommended_config'] = 'Empfohlene Software-Konfiguration (ohne ActiveSync)';
|
||||
$lang['start']['imap_smtp_server'] = 'IMAP- und SMTP-Server';
|
||||
$lang['start']['imap_smtp_server_description'] = 'Für eine optimale Verbindung empfehlen wir die Verwendung des <a href="%s" target="_blank"><b>Mozilla Thunderbirds</b></a>.';
|
||||
$lang['start']['imap_smtp_server_badge'] = 'E-Mail lesen und schreiben';
|
||||
$lang['start']['imap_smtp_server_auth_info'] = 'Bitte verwenden Sie Ihre vollständige E-Mail-Adresse sowie das PLAIN-Authentifizierungsverfahren.<br />
|
||||
Ihre Anmeldedaten werden durch die obligatorische Verschlüsselung entgegen des Begriffes "PLAIN" nicht unverschlüsselt übertragen.';
|
||||
$lang['start']['managesieve'] = 'ManageSieve';
|
||||
$lang['start']['managesieve_badge'] = 'E-Mail-Filter';
|
||||
$lang['start']['managesieve_description'] = 'Bitte verwenden Sie <b>Mozilla Thunderbirds</b> zusammen mit der <a style="text-decoration:none" target="_blank" href="%s"><b>Sieve Erweiterung</b></a>.<br />Nach dem Herunterladen der Erweiterung starten Sie Thunderbird, öffnen das Fenster für Erweiterungen und ziehen die heruntergeladene Datei in das offene Fenster.<br />Der Servername lautet <b>%s</b>, als Port konfigurieren Sie bitte <b>4190</b>. Die Anmeldedaten entsprechen dem E-Mail Login.';
|
||||
$lang['start']['service'] = 'Dienstname';
|
||||
$lang['start']['encryption'] = 'Verschlüsselungstyp';
|
||||
$lang['start']['help'] = 'Hilfe ein-/ausblenden';
|
||||
$lang['start']['hostname'] = 'Hostname';
|
||||
$lang['start']['port'] = 'Port';
|
||||
$lang['start']['footer'] = '';
|
||||
$lang['header']['mailcow_settings'] = 'Konfiguration';
|
||||
$lang['header']['administration'] = 'Administration';
|
||||
$lang['header']['mailboxes'] = 'Mailboxen';
|
||||
$lang['header']['user_settings'] = 'Benutzereinstellungen';
|
||||
$lang['header']['login'] = 'Anmeldung';
|
||||
$lang['header']['logged_in_as_logout'] = 'Eingeloggt als <b>%s</b> (abmelden)';
|
||||
$lang['header']['logged_in_as_logout_dual'] = 'Eingeloggt als <b>%s <span class="text-info">[%s]</span></b>';
|
||||
$lang['header']['locale'] = 'Sprache';
|
||||
$lang['mailbox']['domain'] = 'Domain';
|
||||
$lang['mailbox']['alias'] = 'Alias';
|
||||
$lang['mailbox']['aliases'] = 'Aliasse';
|
||||
$lang['mailbox']['multiple_bookings'] = 'Mehrfachbuchen';
|
||||
$lang['mailbox']['kind'] = 'Art';
|
||||
$lang['mailbox']['description'] = 'Beschreibung';
|
||||
$lang['mailbox']['resources'] = 'Ressourcen';
|
||||
$lang['mailbox']['resource_name'] = 'Ressourcenname';
|
||||
$lang['mailbox']['domains'] = 'Domains';
|
||||
$lang['mailbox']['mailboxes'] = 'Mailboxen';
|
||||
$lang['mailbox']['mailbox_quota'] = 'Max. Größe einer Mailbox';
|
||||
$lang['mailbox']['domain_quota'] = 'Gesamtspeicher';
|
||||
$lang['mailbox']['ratelimit'] = 'Limit ausgehend/Stunde';
|
||||
$lang['mailbox']['active'] = 'Aktiv';
|
||||
$lang['mailbox']['action'] = 'Aktion';
|
||||
$lang['mailbox']['backup_mx'] = 'Backup MX';
|
||||
$lang['mailbox']['domain_aliases'] = 'Domain-Aliasse';
|
||||
$lang['mailbox']['target_domain'] = 'Ziel-Domain';
|
||||
$lang['mailbox']['target_address'] = 'Ziel-Adresse';
|
||||
$lang['mailbox']['username'] = 'Benutzername';
|
||||
$lang['mailbox']['fname'] = 'Name';
|
||||
$lang['mailbox']['filter_table'] = 'Tabelle filtern';
|
||||
$lang['mailbox']['yes'] = '✔';
|
||||
$lang['mailbox']['no'] = '✘';
|
||||
$lang['mailbox']['quota'] = 'Speicherplatz';
|
||||
$lang['mailbox']['in_use'] = 'Prozentualer Gebrauch';
|
||||
$lang['mailbox']['msg_num'] = 'Anzahl Nachrichten';
|
||||
$lang['mailbox']['remove'] = 'Entfernen';
|
||||
$lang['mailbox']['edit'] = 'Bearbeiten';
|
||||
$lang['mailbox']['archive'] = 'Archiv-Zugriff';
|
||||
$lang['mailbox']['no_record'] = 'Kein Eintrag für Objekt %s';
|
||||
$lang['mailbox']['no_record_single'] = 'Kein Eintrag';
|
||||
$lang['mailbox']['add_domain'] = 'Domain hinzufügen';
|
||||
$lang['mailbox']['add_domain_alias'] = 'Domain-Alias hinzufügen';
|
||||
$lang['mailbox']['add_mailbox'] = 'Mailbox hinzufügen';
|
||||
$lang['mailbox']['add_resource'] = 'Ressource hinzufügen';
|
||||
$lang['mailbox']['add_alias'] = 'Alias hinzufügen';
|
||||
|
||||
$lang['info']['no_action'] = 'Keine Aktion anwendbar';
|
||||
|
||||
$lang['delete']['title'] = 'Objekt entfernen';
|
||||
$lang['delete']['remove_domain_warning'] = '<b>Warnung:</b> Sie entfernen die Domain <b>%s</b>!';
|
||||
$lang['delete']['remove_domainalias_warning'] = '<b>Warnung:</b> Sie entfernen die Alias-Domain <b>%s</b>!';
|
||||
$lang['delete']['remove_domainadmin_warning'] = '<b>Warnung:</b> Sie entfernen den Domain-Administrator <b>%s</b>!';
|
||||
$lang['delete']['remove_alias_warning'] = '<b>Warnung:</b> Sie entfernen die Alias-Adresse <b>%s</b>!';
|
||||
$lang['delete']['remove_syncjob_warning'] = '<b>Warnung:</b> Sie entfernen einen Sync-Job des Benutzers <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_warning'] = '<b>Warnung:</b> Sie entfernen die Mailbox <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_details'] = 'Die Mailbox wird <b>vollständig und permanent</b> entfernt!';
|
||||
$lang['delete']['remove_resource_warning'] = '<b>Warnung:</b> Sie entfernen die Ressource <b>%s</b>!';
|
||||
$lang['delete']['remove_resource_details'] = 'Die Ressource wird <b>vollständig und permanent</b> entfernt!';
|
||||
$lang['delete']['remove_domain_details'] = 'Diese Aktion entfernt ebenfalls Domain-Aliasse.<br /><br /><b>Eine Domain muss leer sein, um entfernt zu werden.</b>';
|
||||
$lang['delete']['remove_syncjob_details'] = 'Objekte dieses Sync-Jobs werden nicht mehr vom entfernten Server abgeholt.';
|
||||
$lang['delete']['remove_alias_details'] = 'Benutzer werden keine Nachrichten mehr von dieser Adresse erhalten und versenden koennen!</b>';
|
||||
$lang['delete']['remove_button'] = 'Entfernen';
|
||||
$lang['delete']['previous'] = 'Vorherige Seite';
|
||||
|
||||
$lang['edit']['syncjob'] = 'Sync-Job bearbeiten';
|
||||
$lang['edit']['save'] = 'Änderungen speichern';
|
||||
$lang['edit']['username'] = 'Benutzername';
|
||||
$lang['edit']['hostname'] = 'Servername';
|
||||
$lang['edit']['encryption'] = 'Verschlüsselungsmethode';
|
||||
$lang['edit']['maxage'] = 'Maximales Alter in Tagen einer Nachricht, die kopiert werden soll</br ><small>(0 = alle Nachrichten kopieren)</small>';
|
||||
$lang['edit']['subfolder2'] = 'Ziel-Ordner<br /><small>(leer = kein Unterordner)</small>';
|
||||
$lang['edit']['mins_interval'] = 'Intervall (min)';
|
||||
$lang['edit']['exclude'] = 'Elemente ausschließen (Regex)';
|
||||
$lang['edit']['archive'] = 'Archiv-Zugriff';
|
||||
$lang['edit']['max_mailboxes'] = 'Max. Mailboxanzahl:';
|
||||
$lang['edit']['title'] = 'Objekt bearbeiten';
|
||||
$lang['edit']['target_address'] = 'Ziel-Adresse(n) <small>(getrennt durch Komma)</small>:';
|
||||
$lang['edit']['active'] = 'Aktiv';
|
||||
$lang['edit']['target_domain'] = 'Ziel-Domain:';
|
||||
$lang['edit']['password'] = 'Passwort:';
|
||||
$lang['edit']['ratelimit'] = 'Limit ausgehender Nachrichten/Stunde:';
|
||||
$lang['danger']['ratelimt_less_one'] = 'Limit ausgehender Nachrichten/Stunde darf nicht kleiner als 1 sein';
|
||||
$lang['edit']['password_repeat'] = 'Passwort (Wiederholung):';
|
||||
$lang['edit']['domain_admin'] = 'Domain-Administrator bearbeiten';
|
||||
$lang['edit']['domain'] = 'Domain bearbeiten';
|
||||
$lang['edit']['edit_alias_domain'] = 'Alias-Domain bearbeiten';
|
||||
$lang['edit']['alias_domain'] = 'Alias-Domain';
|
||||
$lang['edit']['domains'] = 'Domains';
|
||||
$lang['edit']['destroy'] = 'Manuelle Eingabe des Wertes';
|
||||
$lang['edit']['alias'] = 'Alias bearbeiten';
|
||||
$lang['edit']['mailbox'] = 'Mailbox bearbeiten';
|
||||
$lang['edit']['description'] = 'Beschreibung:';
|
||||
$lang['edit']['max_aliases'] = 'Max. Aliasse:';
|
||||
$lang['edit']['max_quota'] = 'Max. Größe per Mailbox (MiB):';
|
||||
$lang['edit']['domain_quota'] = 'Domain Speicherplatz gesamt (MiB):';
|
||||
$lang['edit']['backup_mx_options'] = 'Backup MX Optionen:';
|
||||
$lang['edit']['relay_domain'] = 'Relay Domain';
|
||||
$lang['edit']['relay_all'] = 'Alle Empfänger-Adressen relayen';
|
||||
$lang['edit']['dkim_signature'] = 'DKIM-Signatur:';
|
||||
$lang['edit']['dkim_record_info'] = '<small>Bitte hinterlegen Sie einen TXT-Record mit obigem Wert in den DNS-Einstellungen Ihrer Domainverwaltung.</small>';
|
||||
$lang['edit']['relay_all_info'] = '<small>Wenn Sie <b>nicht</b> alle Empfänger-Adressen relayen möchten, müssen Sie eine ("blinde") Mailbox für jede Adresse, die relayt werden soll, erstellen.</small>';
|
||||
$lang['edit']['full_name'] = 'Voller Name';
|
||||
$lang['edit']['quota_mb'] = 'Speicherplatz (MiB)';
|
||||
$lang['edit']['sender_acl'] = 'Darf Nachrichten versenden als';
|
||||
$lang['edit']['sender_acl_info'] = 'Aliasse sind nicht abwählbar und vorausgewählt.';
|
||||
$lang['edit']['dkim_txt_name'] = 'TXT-Record Name:';
|
||||
$lang['edit']['dkim_txt_value'] = 'TXT-Record Wert:';
|
||||
$lang['edit']['previous'] = 'Vorherige Seite';
|
||||
$lang['edit']['unchanged_if_empty'] = 'Unverändert, wenn leer';
|
||||
$lang['edit']['dont_check_sender_acl'] = 'Absender für Domain %s nicht prüfen';
|
||||
$lang['edit']['multiple_bookings'] = 'Mehrfaches Buchen';
|
||||
$lang['edit']['kind'] = 'Art';
|
||||
$lang['edit']['resource'] = 'Ressource';
|
||||
|
||||
$lang['add']['syncjob'] = 'Sync-Job erstellen';
|
||||
$lang['add']['syncjob_hint'] = 'Passwörter werden unverschlüsselt abgelegt!';
|
||||
$lang['add']['hostname'] = 'Servername';
|
||||
$lang['add']['username'] = 'Benutzername';
|
||||
$lang['add']['enc_method'] = 'Verschlüsselungsmethode';
|
||||
$lang['add']['maxage'] = 'Maximum age of messages that will be polled from remote (0 = ignore age)';
|
||||
$lang['add']['subfolder2'] = 'Sync into subfolder on destination';
|
||||
$lang['add']['mins_interval'] = 'Abrufintervall (Minuten)';
|
||||
$lang['add']['exclude'] = 'Elemente ausschließen (Regex)';
|
||||
$lang['add']['delete2duplicates'] = 'Lösche Duplikate im Ziel';
|
||||
|
||||
$lang['add']['title'] = 'Objekt anlegen';
|
||||
$lang['add']['domain'] = 'Domain';
|
||||
$lang['add']['active'] = 'Aktiv';
|
||||
$lang['add']['multiple_bookings'] = 'Mehrfaches Buchen möglich';
|
||||
$lang['add']['save'] = 'Änderungen speichern';
|
||||
$lang['add']['description'] = 'Beschreibung:';
|
||||
$lang['add']['max_aliases'] = 'Max. mögliche Aliasse:';
|
||||
$lang['add']['max_mailboxes'] = 'Max. mögliche Mailboxen:';
|
||||
$lang['add']['mailbox_quota_m'] = 'Max. Speicherplatz pro Mailbox (MiB):';
|
||||
$lang['add']['domain_quota_m'] = 'Domain Speicherplatz gesamt (MiB):';
|
||||
$lang['add']['backup_mx_options'] = 'Backup MX Optionen:';
|
||||
$lang['add']['relay_all'] = 'Alle Empfänger-Adressen relayen';
|
||||
$lang['add']['relay_domain'] = 'Relay Domain';
|
||||
$lang['add']['relay_all_info'] = '<small>Wenn Sie <b>nicht</b> alle Empfänger-Adressen relayen möchten, müssen Sie eine Mailbox für jede Adresse, die relayt werden soll, erstellen.</small>';
|
||||
$lang['add']['alias'] = 'Alias(se)';
|
||||
$lang['add']['alias_spf_fail'] = '<b>Hinweis:</b> Wählen Sie ein externes Postfach als Ziel-Adresse, kann es unter Umständen zu fehlerhaften Spam-Erkennungen <b>beim Empfänger</b> kommen. Weitere Informationen zu diesem Thema finden Sie <a href="https://www.heinlein-support.de/blog/news/gmx-de-und-web-de-haben-mail-rejects-durch-spf/" target="_blank">hier.</a>';
|
||||
$lang['add']['alias_address'] = 'Alias-Adresse(n):';
|
||||
$lang['add']['alias_address_info'] = '<small>Vollständige E-Mail-Adresse(n) oder @example.com, um alle Nachrichten einer Domain weiterzuleiten. Getrennt durch Komma. <b>Nur eigene Domains</b>.</small>';
|
||||
$lang['add']['alias_domain_info'] = '<small>Nur gültige Domains. Getrennt durch Komma.</small>';
|
||||
$lang['add']['target_address'] = 'Ziel-Adresse(n):';
|
||||
$lang['add']['target_address_info'] = '<small>Vollständige E-Mail-Adresse(n). Getrennt durch Komma.</small>';
|
||||
$lang['add']['alias_domain'] = 'Alias-Domain';
|
||||
$lang['add']['select'] = 'Bitte auswählen';
|
||||
$lang['add']['target_domain'] = 'Ziel-Domain:';
|
||||
$lang['add']['mailbox'] = 'Mailbox';
|
||||
$lang['add']['resource'] = 'Ressource';
|
||||
$lang['add']['kind'] = 'Art';
|
||||
$lang['add']['mailbox_username'] = 'Benutzername (linker Teil der E-Mail-Adresse):';
|
||||
$lang['add']['resource_name'] = 'Ressourcenname:';
|
||||
$lang['add']['full_name'] = 'Vor- und Zuname:';
|
||||
$lang['add']['quota_mb'] = 'Speicherplatz (MiB):';
|
||||
$lang['add']['select_domain'] = 'Bitte zuerst eine Domain auswählen';
|
||||
$lang['add']['password'] = 'Passwort:';
|
||||
$lang['add']['password_repeat'] = 'Passwort (Wiederholung):';
|
||||
$lang['add']['previous'] = 'Vorherige Seite';
|
||||
$lang['add']['restart_sogo_hint'] = 'Der SOGo Container muss nach dem Hinzufügen einer neuen Domain neugestartet werden!';
|
||||
|
||||
$lang['login']['title'] = 'Anmeldung';
|
||||
$lang['login']['administration'] = 'Administration';
|
||||
$lang['login']['administration_details'] = 'Bitte verwenden Sie Ihre Administrator Anmeldedaten, um administrative Aufgaben wie das Anlegen einer Mailbox zu starten.';
|
||||
$lang['login']['user_settings'] = 'Benutzereinstellungen';
|
||||
$lang['login']['user_settings_details'] = 'Als E-Mail Benutzer vewenden Sie bitte Ihre E-Mail Anmeldedaten, um Passwörter zu verändern, temporäre (Spam-)Aliasse zu erstellen, den Spamfilter einzustellen oder auch um E-Mails zu importieren.';
|
||||
$lang['login']['username'] = 'Benutzername';
|
||||
$lang['login']['password'] = 'Passwort';
|
||||
$lang['login']['reset_password'] = 'Mein Passwort zurücksetzen';
|
||||
$lang['login']['login'] = 'Anmelden';
|
||||
$lang['login']['previous'] = 'Vorherige Seite';
|
||||
$lang['login']['delayed'] = 'Login wurde zur Sicherheit um %s Sekunde/n verzögert.';
|
||||
|
||||
$lang['tfa']['tfa'] = "Two-Factor Authentication";
|
||||
$lang['tfa']['set_tfa'] = "Konfiguriere Two-Factor Authentication Methode";
|
||||
$lang['tfa']['yubi_otp'] = "Yubico OTP Authentifizierung";
|
||||
$lang['tfa']['key_id'] = "Ein Name für diesen YubiKey";
|
||||
$lang['tfa']['api_register'] = 'mailcow verwendet die Yubico Cloud API. Ein API-Key für den Yubico Stick kann <a href="https://upgrade.yubico.com/getapikey/" target="_blank">hier</a> bezogen werden.';
|
||||
$lang['tfa']['u2f'] = "U2F Authentifizierung";
|
||||
$lang['tfa']['hotp'] = "HOTP Authentifizierung";
|
||||
$lang['tfa']['totp'] = "TOTP Authentifizierung";
|
||||
$lang['tfa']['none'] = "Deaktiviert";
|
||||
$lang['tfa']['delete_tfa'] = "Deaktiviere TFA";
|
||||
$lang['tfa']['disable_tfa'] = "Deaktiviere TFA bis zur nächsten erfolgreichen Anmeldung";
|
||||
$lang['tfa']['confirm_tfa'] = "Please confirm your one-time password in the below field";
|
||||
$lang['tfa']['confirm'] = "Bestätigen";
|
||||
$lang['tfa']['otp'] = "Einmalpasswort";
|
||||
$lang['tfa']['trash_login'] = "Login verwerfen";
|
||||
$lang['tfa']['select'] = "Bitte auswählen";
|
||||
$lang['tfa']['waiting_usb_auth'] = "<i>Warte auf USB-Gerät...</i><br /><br />Bitte jetzt den vorgesehenen Taster des U2F USB-Gerätes berühren.";
|
||||
$lang['tfa']['waiting_usb_register'] = "<i>Warte auf USB-Gerät...</i><br /><br />Bitte zuerst das obere Passwortfeld ausfüllen und erst dann den vorgesehenen Taster des U2F USB-Gerätes berühren.";
|
||||
|
||||
$lang['admin']['search_domain_da'] = 'Domains durchsuchen';
|
||||
$lang['admin']['restrictions'] = 'Postifx Restriktionen';
|
||||
$lang['admin']['rr'] = 'Postifx Recipient Restriktionen';
|
||||
$lang['admin']['sr'] = 'Postifx Sender Restriktionen';
|
||||
$lang['admin']['reset_defaults'] = 'Standard wiederherstellen';
|
||||
$lang['admin']['r_inactive'] = 'Inaktive Restriktionen';
|
||||
$lang['admin']['r_active'] = 'Aktive Restriktionen';
|
||||
$lang['admin']['r_info'] = 'Ausgegraute/deaktivierte Elemente sind mailcow nicht bekannt und können nicht in die Liste inaktiver Elemente verschoben werden. Unbekannte Restriktionen werden trotzdem in Reihenfolge der Erscheinung gesetzt.<br />Sie können ein Element in der Datei <code>inc/vars.local.inc.php</code> als bekannt hinzufügen, um es zu bewegen.';
|
||||
$lang['admin']['public_folders'] = 'Öffentliche Ordner';
|
||||
$lang['admin']['public_folders_text'] = 'Ein Namespace "Public" wird erstellt. Der untenstehende Ordnername betrifft den Namen der automatisch erstellten Mailbox in diesem Namespace.';
|
||||
$lang['admin']['public_folder_name'] = 'Ordnername <small>(alphanumerisch)</small>';
|
||||
$lang['admin']['public_folder_enable'] = 'Öffentliche Ordner aktivieren';
|
||||
$lang['admin']['public_folder_enable_text'] = 'Das Umschalten dieser Option entfernt keine Nachrichten aus den öffentlichen Ordnern.';
|
||||
$lang['admin']['public_folder_pusf'] = 'Aktiviere "per-user seen flag"';
|
||||
$lang['admin']['public_folder_pusf_text'] = 'Ein "per-user seen flag"-aktiviertes System markiert Nachrichten nicht als gelesen, wenn nur ein Benutzer sie gelesen hat. Jeder Benutzer verwaltet seine eigenen "seen flags".';
|
||||
$lang['admin']['privacy'] = 'Datenschutz';
|
||||
$lang['admin']['privacy_text'] = 'Diese Option aktiviert eine PCRE-Prüfung, die die Werte der Kopfzeilen "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" sowie "Received: from" durch "localhost" bzw. "127.0.0.1" ersetzt.';
|
||||
$lang['admin']['privacy_anon_mail'] = 'Anonymisiere ausgehende Kopfzeilen';
|
||||
$lang['admin']['msg_size'] = 'Aktuelles Limit der Nachrichtengröße';
|
||||
$lang['admin']['msg_size_limit'] = 'Aktuelles Limit der Nachrichtengröße';
|
||||
$lang['admin']['msg_size_limit_details'] = 'Diese Einstellung wird Postfix und den Webserver neuladen.';
|
||||
$lang['admin']['save'] = 'Änderungen speichern';
|
||||
$lang['admin']['maintenance'] = 'Wartung und Information';
|
||||
$lang['admin']['sys_info'] = 'Systeminformation';
|
||||
$lang['admin']['dkim_add_key'] = 'DKIM-Key hinzufügen';
|
||||
$lang['admin']['dkim_keys'] = 'DKIM-Keys';
|
||||
$lang['admin']['dkim_key_valid'] = 'Key gültig';
|
||||
$lang['admin']['dkim_key_unused'] = 'Key ohne Zuweisung';
|
||||
$lang['admin']['dkim_key_missing'] = 'Key fehlt';
|
||||
$lang['admin']['dkim_key_hint'] = 'Der Selector für DKIM-Keys lautet immer <code>dkim</code>.';
|
||||
$lang['admin']['add'] = 'Hinzufügen';
|
||||
$lang['admin']['configuration'] = 'Konfiguration';
|
||||
$lang['admin']['password'] = 'Passwort';
|
||||
$lang['admin']['password_repeat'] = 'Passwort (Wiederholung)';
|
||||
$lang['admin']['active'] = 'Aktiv';
|
||||
$lang['admin']['action'] = 'Aktion';
|
||||
$lang['admin']['add_domain_admin'] = 'Domain-Administrator hinzufügen';
|
||||
$lang['admin']['admin_domains'] = 'Domain-Zuweisungen';
|
||||
$lang['admin']['domain_admins'] = 'Domain-Administratoren';
|
||||
$lang['admin']['username'] = 'Benutzername';
|
||||
$lang['admin']['edit'] = 'Bearbeiten';
|
||||
$lang['admin']['remove'] = 'Entfernen';
|
||||
$lang['admin']['save'] = 'Änderungen speichern';
|
||||
$lang['admin']['admin'] = 'Administrator';
|
||||
$lang['admin']['admin_details'] = 'Administrator bearbeiten';
|
||||
$lang['admin']['unchanged_if_empty'] = 'Unverändert, wenn leer';
|
||||
$lang['admin']['yes'] = '✔';
|
||||
$lang['admin']['no'] = '✘';
|
||||
$lang['admin']['access'] = 'Zugang';
|
||||
$lang['admin']['invalid_max_msg_size'] = 'Invalid max. message size'; // NEEDS TRANSLATION
|
||||
$lang['admin']['site_not_found'] = 'Kann mailcow Site-Konfiguration nicht finden';
|
||||
$lang['admin']['public_folder_empty'] = 'Public folder name must not be empty'; // NEEDS TRANSLATION
|
||||
$lang['admin']['set_rr_failed'] = 'Kann Postfix Restriktionen nicht setzen';
|
||||
$lang['admin']['no_record'] = 'Kein Eintrag';
|
||||
?>
|
458
data/web/lang/lang.en.php
Normal file
458
data/web/lang/lang.en.php
Normal file
@@ -0,0 +1,458 @@
|
||||
<?php
|
||||
/*
|
||||
//
|
||||
// English language file
|
||||
//
|
||||
*/
|
||||
$lang['footer']['loading'] = "Please wait...";
|
||||
$lang['header']['restart_sogo'] = 'Restart SOGo';
|
||||
$lang['footer']['restart_sogo'] = 'Restart SOGo';
|
||||
$lang['footer']['restart_now'] = 'Restart now';
|
||||
$lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to complete, please wait for it to finish.';
|
||||
$lang['dkim']['confirm'] = "Are you sure?";
|
||||
$lang['danger']['dkim_not_found'] = "DKIM key not found";
|
||||
$lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM key";
|
||||
$lang['danger']['dkim_add_failed'] = "Cannot add given DKIM key";
|
||||
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domain or selector invalid";
|
||||
$lang['danger']['dkim_key_length_invalid'] = "DKIM key length invalid";
|
||||
$lang['success']['dkim_removed'] = "DKIM key has been removed";
|
||||
$lang['success']['dkim_added'] = "DKIM key has been saved";
|
||||
$lang['danger']['access_denied'] = "Access denied or invalid form data";
|
||||
$lang['danger']['whitelist_from_invalid'] = "Whitelist entry invalid";
|
||||
$lang['danger']['domain_invalid'] = "Domain name is invalid";
|
||||
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. quota exceeds domain quota limit";
|
||||
$lang['danger']['object_is_not_numeric'] = "Value %s is not numeric";
|
||||
$lang['success']['domain_added'] = "Added domain %s";
|
||||
$lang['danger']['alias_empty'] = "Alias address must not be empty";
|
||||
$lang['danger']['last_key'] = 'Last key cannot be deleted';
|
||||
$lang['danger']['goto_empty'] = "Goto address must not be empty";
|
||||
$lang['danger']['policy_list_from_exists'] = "A record with given name exists";
|
||||
$lang['danger']['policy_list_from_invalid'] = "Record has invalid format";
|
||||
$lang['danger']['whitelist_exists'] = "A whitelist record with that name exists";
|
||||
$lang['danger']['whitelist_from_invalid'] = "Whitelist record has invalid format";
|
||||
$lang['danger']['alias_invalid'] = "Alias address is invalid";
|
||||
$lang['danger']['goto_invalid'] = "Goto address is invalid";
|
||||
$lang['danger']['alias_domain_invalid'] = "Alias domain is invalid";
|
||||
$lang['danger']['target_domain_invalid'] = "Goto domain is invalid";
|
||||
$lang['danger']['object_exists'] = "Object %s already exists";
|
||||
$lang['danger']['domain_exists'] = "Domain %s already exists";
|
||||
$lang['danger']['alias_goto_identical'] = "Alias and goto address must not be identical";
|
||||
$lang['danger']['aliasd_targetd_identical'] = "Alias domain must not be equal to target domain";
|
||||
$lang['success']['alias_added'] = "Alias address/es has/have been added";
|
||||
$lang['success']['alias_modified'] = "Changes to alias have been saved";
|
||||
$lang['success']['aliasd_modified'] = "Changes to alias domain have been saved";
|
||||
$lang['success']['mailbox_modified'] = "Changes to mailbox %s have been saved";
|
||||
$lang['success']['resource_modified'] = "Changes to mailbox %s have been saved";
|
||||
$lang['success']['object_modified'] = "Changes to object %s have been saved";
|
||||
$lang['success']['msg_size_saved'] = "Message size limit has been set";
|
||||
$lang['danger']['aliasd_not_found'] = "Alias domain not found";
|
||||
$lang['danger']['targetd_not_found'] = "Target domain not found";
|
||||
$lang['danger']['aliasd_exists'] = "Alias domain already exists";
|
||||
$lang['success']['aliasd_added'] = "Added alias domain %s";
|
||||
$lang['success']['aliasd_modified'] = "Changes to alias domain %s have been saved";
|
||||
$lang['success']['domain_modified'] = "Changes to domain %s have been saved";
|
||||
$lang['success']['domain_admin_modified'] = "Changes to domain administrator %s have been saved";
|
||||
$lang['success']['domain_admin_added'] = "Domain administrator %s has been added";
|
||||
$lang['success']['changes_general'] = 'Changes have been saved';
|
||||
$lang['success']['admin_modified'] = "Changes to administrator have been saved";
|
||||
$lang['danger']['exit_code_not_null'] = "Error: Exit code was %d";
|
||||
$lang['danger']['mailbox_not_available'] = "Mailbox not available";
|
||||
$lang['danger']['username_invalid'] = "Username cannot be used";
|
||||
$lang['danger']['password_mismatch'] = "Confirmation password is not identical";
|
||||
$lang['danger']['password_complexity'] = "Password does not meet requirements (upper and lowercase letters and at least one number, min. 6 characters long)";
|
||||
$lang['danger']['password_empty'] = "Password must not be empty";
|
||||
$lang['danger']['login_failed'] = "Login failed";
|
||||
$lang['danger']['mailbox_invalid'] = "Mailbox name is invalid";
|
||||
$lang['danger']['description_invalid'] = 'Resource description is invalid';
|
||||
$lang['danger']['resource_invalid'] = "Resource name is invalid";
|
||||
$lang['danger']['mailbox_invalid_suggest'] = 'Mailbox name is invalid, did you mean to type "%s"?';
|
||||
$lang['danger']['is_alias'] = "%s is already known as an alias address";
|
||||
$lang['danger']['is_alias_or_mailbox'] = "%s is already known as an alias or a mailbox";
|
||||
$lang['danger']['is_spam_alias'] = "%s is already known as a spam alias address";
|
||||
$lang['danger']['quota_not_0_not_numeric'] = "Quota must be numeric and >= 0";
|
||||
$lang['danger']['domain_not_found'] = "Domain not found.";
|
||||
$lang['danger']['max_mailbox_exceeded'] = "Max. mailboxes exceeded (%d of %d)";
|
||||
$lang['danger']['mailbox_quota_exceeded'] = "Quota exceeds the domain limit (max. %d MiB)";
|
||||
$lang['danger']['mailbox_quota_left_exceeded'] = "Not enough space left (space left: %d MiB)";
|
||||
$lang['success']['mailbox_added'] = "Mailbox %s has been added";
|
||||
$lang['success']['resource_added'] = "Resource %s has been added";
|
||||
$lang['success']['domain_removed'] = "Domain %s has been removed";
|
||||
$lang['success']['alias_removed'] = "Alias-Adresse %s has been removed";
|
||||
$lang['success']['alias_domain_removed'] = "Alias domain %s has been removed";
|
||||
$lang['success']['domain_admin_removed'] = "Domain administrator %s has been removed";
|
||||
$lang['success']['mailbox_removed'] = "Mailbox %s has been removed";
|
||||
$lang['success']['eas_reset'] = "ActiveSync devices for user %s were reset";
|
||||
$lang['success']['resource_removed'] = "Resource %s has been removed";
|
||||
$lang['danger']['max_quota_in_use'] = "Mailbox quota must be greater or equal to %d MiB";
|
||||
$lang['danger']['domain_quota_m_in_use'] = "Domain quota must be greater or equal to %s MiB";
|
||||
$lang['danger']['mailboxes_in_use'] = "Max. mailboxes must be greater or equal to %d";
|
||||
$lang['danger']['aliases_in_use'] = "Max. aliases must be greater or equal to %d";
|
||||
$lang['danger']['sender_acl_invalid'] = "Sender ACL value is invalid";
|
||||
$lang['danger']['domain_not_empty'] = "Cannot remove non-empty domain";
|
||||
$lang['warning']['spam_alias_temp_error'] = "Temporary error: Cannot add spam alias, please try again later.";
|
||||
$lang['danger']['spam_alias_max_exceeded'] = "Max. allowed spam alias addresses exceeded";
|
||||
$lang['danger']['validity_missing'] = 'Please assign a period of validity';
|
||||
$lang['user']['on'] = "On";
|
||||
$lang['user']['off'] = "Off";
|
||||
$lang['user']['user_change_fn'] = "";
|
||||
$lang['user']['user_settings'] = 'User settings';
|
||||
$lang['user']['mailbox_settings'] = 'Mailbox settings';
|
||||
$lang['user']['mailbox_details'] = 'Mailbox details';
|
||||
$lang['user']['change_password'] = 'Change password';
|
||||
$lang['user']['new_password'] = 'New password';
|
||||
$lang['user']['save_changes'] = 'Save changes';
|
||||
$lang['user']['password_now'] = 'Current password (confirm changes)';
|
||||
$lang['user']['new_password_repeat'] = 'Confirmation password (repeat)';
|
||||
$lang['user']['new_password_description'] = 'Requirement: 6 characters long, letters and numbers.';
|
||||
$lang['user']['did_you_know'] = '<b>Did you know?</b> You can use tags in your email address ("me+<b>privat</b>@example.com") to move messages to a folder automatically (example: "privat").';
|
||||
$lang['user']['spam_aliases'] = 'Temporary email aliases';
|
||||
$lang['user']['alias'] = 'Alias';
|
||||
$lang['user']['aliases'] = 'Aliases';
|
||||
$lang['user']['domain_aliases'] = 'Domain alias addresses';
|
||||
$lang['user']['is_catch_all'] = 'Catch-all for domain/s';
|
||||
$lang['user']['aliases_also_send_as'] = 'Also allowed to send as';
|
||||
$lang['user']['aliases_send_as_all'] = 'Do not check sender access for following domain/s';
|
||||
$lang['user']['alias_create_random'] = 'Generate random alias';
|
||||
$lang['user']['alias_extend_all'] = 'Extend aliases by 1 hour';
|
||||
$lang['user']['alias_valid_until'] = 'Valid until';
|
||||
$lang['user']['alias_remove_all'] = 'Remove all aliases';
|
||||
$lang['user']['alias_time_left'] = 'Time left';
|
||||
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
|
||||
$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T';
|
||||
$lang['user']['alias_select_validity'] = 'Period of validity';
|
||||
$lang['user']['sync_jobs'] = 'Sync jobs';
|
||||
$lang['user']['hour'] = 'Hour';
|
||||
$lang['user']['hours'] = 'Hours';
|
||||
$lang['user']['day'] = 'Day';
|
||||
$lang['user']['week'] = 'Week';
|
||||
$lang['user']['weeks'] = 'Weeks';
|
||||
$lang['user']['spamfilter'] = 'Spam filter';
|
||||
$lang['user']['spamfilter_wl'] = 'Whitelist';
|
||||
$lang['user']['spamfilter_wl_desc'] = 'Whitelisted email addresses to <b>never</b> classify as spam. Wildcards maybe used.';
|
||||
$lang['user']['spamfilter_bl'] = 'Blacklist';
|
||||
$lang['user']['spamfilter_bl_desc'] = 'Blacklisted email addresses to <b>always</b> classify as spam and reject. Wildcards maybe used.';
|
||||
$lang['user']['spamfilter_behavior'] = 'Rating';
|
||||
$lang['user']['spamfilter_table_rule'] = 'Rule';
|
||||
$lang['user']['spamfilter_table_action'] = 'Action';
|
||||
$lang['user']['spamfilter_table_empty'] = 'No data to display';
|
||||
$lang['user']['spamfilter_table_remove'] = 'remove';
|
||||
$lang['user']['spamfilter_table_add'] = 'Add item';
|
||||
$lang['user']['spamfilter_default_score'] = 'Spam score:';
|
||||
$lang['user']['spamfilter_green'] = 'Green: this message is not spam';
|
||||
$lang['user']['spamfilter_yellow'] = 'Yellow: this message may be spam, will be tagged as spam and moved to your junk folder';
|
||||
$lang['user']['spamfilter_red'] = 'Red: This message is spam and will be rejected by the server';
|
||||
$lang['user']['spamfilter_default_score'] = 'Default values:';
|
||||
$lang['user']['spamfilter_hint'] = 'The first value describes the "low spam score", the second represents the "high spam score".';
|
||||
$lang['user']['spamfilter_table_domain_policy'] = "n/a (domain policy)";
|
||||
|
||||
$lang['user']['tls_policy_warning'] = '<strong>Warning:</strong> If you decide to enforce encrypted mail transfer, you may lose emails.<br />Messages to not satisfy the policy will be bounced with a hard fail by the mail system.';
|
||||
$lang['user']['tls_policy'] = 'Encryption policy';
|
||||
$lang['user']['tls_enforce_in'] = 'Enforce TLS incoming';
|
||||
$lang['user']['tls_enforce_out'] = 'Enforce TLS outgoing';
|
||||
$lang['user']['no_record'] = 'No record';
|
||||
|
||||
$lang['user']['misc_settings'] = 'Other profile settings';
|
||||
$lang['user']['misc_delete_profile'] = 'Other profile settings';
|
||||
|
||||
$lang['user']['tag_handling'] = 'Set handling for tagged mail';
|
||||
$lang['user']['tag_in_subfolder'] = 'In subfolder';
|
||||
$lang['user']['tag_in_subject'] = 'In subject';
|
||||
$lang['user']['tag_help_explain'] = 'In subfolder: a new subfolder named after the tag will be created below INBOX ("INBOX/Facebook").<br />
|
||||
In subject: the tags name will be prepended to the mails subject, example: "[Facebook] Meine Neuigkeiten".';
|
||||
$lang['user']['tag_help_example'] = 'Example for a tagged email address: ich<b>+Facebook</b>@example.org';
|
||||
$lang['user']['eas_reset'] = 'Reset ActiveSync device cache';
|
||||
$lang['user']['eas_reset_now'] = 'Reset now';
|
||||
$lang['user']['eas_reset_help'] = 'In many cases a device cache reset will help to recover a broken ActiveSync profile.<br /><b>Attention:</b> All elements will be redownloaded!';
|
||||
|
||||
$lang['user']['encryption'] = 'Encyrption';
|
||||
$lang['user']['username'] = 'Username';
|
||||
$lang['user']['password'] = 'Password';
|
||||
$lang['user']['last_run'] = 'Last run';
|
||||
$lang['user']['excludes'] = 'Excludes';
|
||||
$lang['user']['interval'] = 'Interval';
|
||||
$lang['user']['active'] = 'Active';
|
||||
$lang['user']['action'] = 'Action';
|
||||
$lang['user']['edit'] = 'Edit';
|
||||
$lang['user']['remove'] = 'Remove';
|
||||
$lang['user']['delete_now'] = 'Remove now';
|
||||
$lang['user']['create_syncjob'] = 'Create new sync job';
|
||||
|
||||
$lang['start']['dashboard'] = '%s - dashboard';
|
||||
$lang['start']['start_rc'] = 'Open Roundcube';
|
||||
$lang['start']['start_sogo'] = 'Open SOGo';
|
||||
$lang['start']['mailcow_apps_detail'] = 'Use a mailcow app to access your mails, calendar, contacts and more.';
|
||||
$lang['start']['mailcow_panel'] = 'Start mailcow UI';
|
||||
$lang['start']['mailcow_panel_description'] = 'The mailcow UI is available for administrators and mailbox users.';
|
||||
$lang['start']['mailcow_panel_detail'] = '<b>Domain administrators</b> create, modify or delete mailboxes and aliases, change domains and read further information about their assigned domains.<br />
|
||||
<b>Mailbox users</b> are able to create time-limited aliases (spam aliases), change their password and spam filter settings.';
|
||||
$lang['start']['recommended_config'] = 'Recommended configuration (without ActiveSync)';
|
||||
$lang['start']['imap_smtp_server'] = 'IMAP- and SMTP server data';
|
||||
$lang['start']['imap_smtp_server_description'] = 'For the best experience we recommend to use <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
|
||||
$lang['start']['imap_smtp_server_badge'] = 'Read/Write emails';
|
||||
$lang['start']['imap_smtp_server_auth_info'] = 'Please use your full email address and the PLAIN authentication mechanism.<br />
|
||||
Your login data will be encrypted by the server-side mandatory encryption.';
|
||||
$lang['start']['managesieve'] = 'ManageSieve';
|
||||
$lang['start']['managesieve_badge'] = 'Email filter';
|
||||
$lang['start']['managesieve_description'] = 'Please use <b>Mozilla Thunderbird</b> with the <a style="text-decoration:none" target="_blank" href="%s"><b>nightly sieve extension</b></a>.<br />Start Thunderbird, open the add-on settings and drop the newly downloaded xpi file into the opened window.<br />The server name is <b>%s</b>, use port <b>4190</b> if you are asked for. The login data match your email login.';
|
||||
$lang['start']['service'] = 'Service';
|
||||
$lang['start']['encryption'] = 'Encryption method';
|
||||
$lang['start']['help'] = 'Show/Hide help panel';
|
||||
$lang['start']['hostname'] = 'Hostname';
|
||||
$lang['start']['port'] = 'Port';
|
||||
$lang['start']['footer'] = '';
|
||||
$lang['header']['mailcow_settings'] = 'Configuration';
|
||||
$lang['header']['administration'] = 'Administration';
|
||||
$lang['header']['mailboxes'] = 'Mailboxes';
|
||||
$lang['header']['user_settings'] = 'User settings';
|
||||
$lang['header']['login'] = 'Login';
|
||||
$lang['header']['logged_in_as_logout'] = 'Logged in as <b>%s</b> (logout)';
|
||||
$lang['header']['logged_in_as_logout_dual'] = 'Logged in as <b>%s <span class="text-info">[%s]</span></b>';
|
||||
$lang['header']['locale'] = 'Language';
|
||||
$lang['mailbox']['domain'] = 'Domain';
|
||||
$lang['mailbox']['multiple_bookings'] = 'Multiple bookings';
|
||||
$lang['mailbox']['kind'] = 'Kind';
|
||||
$lang['mailbox']['description'] = 'Description';
|
||||
$lang['mailbox']['alias'] = 'Alias';
|
||||
$lang['mailbox']['resource_name'] = 'Resource name';
|
||||
$lang['mailbox']['aliases'] = 'Aliases';
|
||||
$lang['mailbox']['domains'] = 'Domains';
|
||||
$lang['mailbox']['mailboxes'] = 'Mailboxes';
|
||||
$lang['mailbox']['resources'] = 'Resources';
|
||||
$lang['mailbox']['mailbox_quota'] = 'Max. size of a mailbox';
|
||||
$lang['mailbox']['domain_quota'] = 'Quota';
|
||||
$lang['mailbox']['active'] = 'Active';
|
||||
$lang['mailbox']['action'] = 'Action';
|
||||
$lang['mailbox']['ratelimit'] = 'Outgoing rate limit/h';
|
||||
$lang['mailbox']['backup_mx'] = 'Backup MX';
|
||||
$lang['mailbox']['domain_aliases'] = 'Domain aliases';
|
||||
$lang['mailbox']['target_domain'] = 'Target domain';
|
||||
$lang['mailbox']['target_address'] = 'Goto address';
|
||||
$lang['mailbox']['username'] = 'Username';
|
||||
$lang['mailbox']['fname'] = 'Full name';
|
||||
$lang['mailbox']['filter_table'] = 'Filter table';
|
||||
$lang['mailbox']['yes'] = '✔';
|
||||
$lang['mailbox']['no'] = '✘';
|
||||
$lang['mailbox']['quota'] = 'Quota';
|
||||
$lang['mailbox']['in_use'] = 'In use (%)';
|
||||
$lang['mailbox']['msg_num'] = 'Message #';
|
||||
$lang['mailbox']['remove'] = 'Remove';
|
||||
$lang['mailbox']['edit'] = 'Edit';
|
||||
$lang['mailbox']['archive'] = 'Archive';
|
||||
$lang['mailbox']['no_record'] = 'No record for object %s';
|
||||
$lang['mailbox']['no_record_single'] = 'No record';
|
||||
$lang['mailbox']['add_domain'] = 'Add domain';
|
||||
$lang['mailbox']['add_domain_alias'] = 'Add domain alias';
|
||||
$lang['mailbox']['add_mailbox'] = 'Add mailbox';
|
||||
$lang['mailbox']['add_resource'] = 'Add resource';
|
||||
$lang['mailbox']['add_alias'] = 'Add alias';
|
||||
|
||||
$lang['info']['no_action'] = 'No action applicable';
|
||||
|
||||
$lang['delete']['title'] = 'Remove object';
|
||||
$lang['delete']['remove_domain_warning'] = '<b>Warning:</b> You are about to remove the domain <b>%s</b>!';
|
||||
$lang['delete']['remove_syncjob_warning'] = '<b>Warning:</b> You are about to remove a sync job for user <b>%s</b>!';
|
||||
$lang['delete']['remove_domainalias_warning'] = '<b>Warning:</b> You are about to remove the domain alias <b>%s</b>!';
|
||||
$lang['delete']['remove_domainadmin_warning'] = '<b>Warning:</b> You are about to remove the domain administrator <b>%s</b>!';
|
||||
$lang['delete']['remove_alias_warning'] = '<b>Warning:</b> You are about to remove the alias address <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_warning'] = '<b>Warning:</b> You are about to remove the mailbox <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_details'] = 'The mailbox will be <b>purged permanently</b>!';
|
||||
$lang['delete']['remove_resource_warning'] = '<b>Warning:</b> You are about to remove the resource <b>%s</b>!';
|
||||
$lang['delete']['remove_resource_details'] = 'The resource will be <b>purged permanently</b>!';
|
||||
$lang['delete']['remove_domain_details'] = 'This also removes domain aliases.<br /><br /><b>A domain must be empty to be removed.</b>';
|
||||
$lang['delete']['remove_syncjob_details'] = 'Objects from this sync job will not be pulled from the remote server anymore.';
|
||||
$lang['delete']['remove_alias_details'] = 'Users will no longer be able to receive mail for or send mail from this address.</b>';
|
||||
$lang['delete']['remove_button'] = 'Remove';
|
||||
$lang['delete']['previous'] = 'Previous page';
|
||||
|
||||
$lang['edit']['syncjob'] = 'Edit sync job';
|
||||
$lang['edit']['save'] = 'Save changes';
|
||||
$lang['edit']['username'] = 'Username';
|
||||
$lang['edit']['hostname'] = 'Hostname';
|
||||
$lang['edit']['encryption'] = 'Encryption';
|
||||
$lang['edit']['maxage'] = 'Maximum age of messages in days that will be polled from remote<br /><small>(0 = ignore age)</small>';
|
||||
$lang['edit']['subfolder2'] = 'Sync into subfolder on destination<br /><small>(empty = do not use subfolder)</small>';
|
||||
$lang['edit']['mins_interval'] = 'Interval (min)';
|
||||
$lang['edit']['exclude'] = 'Exclude objects (regex)';
|
||||
$lang['edit']['save'] = 'Save changes';
|
||||
$lang['edit']['archive'] = 'Archive access';
|
||||
$lang['edit']['max_mailboxes'] = 'Max. possible mailboxes';
|
||||
$lang['edit']['title'] = 'Edit object';
|
||||
$lang['edit']['target_address'] = 'Goto address/es <small>(comma-separated)</small>';
|
||||
$lang['edit']['active'] = 'Active';
|
||||
$lang['edit']['target_domain'] = 'Target domain';
|
||||
$lang['edit']['password'] = 'Password';
|
||||
$lang['edit']['ratelimit'] = 'Outgoing rate limit/h';
|
||||
$lang['danger']['ratelimt_less_one'] = 'Outgoing rate limit/h must not be less than 1';
|
||||
$lang['edit']['password_repeat'] = 'Confirmation password (repeat)';
|
||||
$lang['edit']['domain_admin'] = 'Edit domain administrator';
|
||||
$lang['edit']['domain'] = 'Edit domain';
|
||||
$lang['edit']['alias_domain'] = 'Alias domain';
|
||||
$lang['edit']['edit_alias_domain'] = 'Edit Alias domain';
|
||||
$lang['edit']['domains'] = 'Domains';
|
||||
$lang['edit']['destroy'] = 'Manual data input';
|
||||
$lang['edit']['alias'] = 'Edit alias';
|
||||
$lang['edit']['mailbox'] = 'Edit mailbox';
|
||||
$lang['edit']['description'] = 'Description';
|
||||
$lang['edit']['max_aliases'] = 'Max. aliases';
|
||||
$lang['edit']['max_quota'] = 'Max. quota per mailbox (MiB)';
|
||||
$lang['edit']['domain_quota'] = 'Domain quota';
|
||||
$lang['edit']['backup_mx_options'] = 'Backup MX options';
|
||||
$lang['edit']['relay_domain'] = 'Relay domain';
|
||||
$lang['edit']['relay_all'] = 'Relay all recipients';
|
||||
$lang['edit']['dkim_signature'] = 'DKIM signature';
|
||||
$lang['edit']['dkim_record_info'] = '<small>Please add a TXT record with the given value to your DNS settings.</small>';
|
||||
$lang['edit']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
|
||||
$lang['edit']['full_name'] = 'Full name';
|
||||
$lang['edit']['quota_mb'] = 'Quota (MiB)';
|
||||
$lang['edit']['sender_acl'] = 'Allow to send as';
|
||||
$lang['edit']['sender_acl_info'] = 'Aliases cannot be deselected.';
|
||||
$lang['edit']['dkim_txt_name'] = 'TXT record name:';
|
||||
$lang['edit']['dkim_txt_value'] = 'TXT record value:';
|
||||
$lang['edit']['previous'] = 'Previous page';
|
||||
$lang['edit']['unchanged_if_empty'] = 'If unchanged leave blank';
|
||||
$lang['edit']['dont_check_sender_acl'] = 'Do not check sender for domain %s';
|
||||
$lang['edit']['multiple_bookings'] = 'Multiple bookings';
|
||||
$lang['edit']['kind'] = 'Kind';
|
||||
$lang['edit']['resource'] = 'Resource';
|
||||
|
||||
$lang['add']['syncjob'] = 'Add sync job';
|
||||
$lang['add']['syncjob_hint'] = 'Be aware that passwords need to be saved plain-text!';
|
||||
$lang['add']['hostname'] = 'Hostname';
|
||||
$lang['add']['username'] = 'Username';
|
||||
$lang['add']['enc_method'] = 'Encryption method';
|
||||
$lang['add']['mins_interval'] = 'Polling interval (minutes)';
|
||||
$lang['add']['maxage'] = 'Maximum age of messages that will be polled from remote (0 = ignore age)';
|
||||
$lang['add']['subfolder2'] = 'Sync into subfolder on destination';
|
||||
$lang['add']['exclude'] = 'Exclude objects (regex)';
|
||||
$lang['add']['delete2duplicates'] = 'Delete duplicates on destination';
|
||||
|
||||
$lang['add']['title'] = 'Add object';
|
||||
$lang['add']['domain'] = 'Domain';
|
||||
$lang['add']['active'] = 'Active';
|
||||
$lang['add']['multiple_bookings'] = 'Multiple bookings';
|
||||
$lang['add']['save'] = 'Save changes';
|
||||
$lang['add']['description'] = 'Description:';
|
||||
$lang['add']['max_aliases'] = 'Max. possible aliases:';
|
||||
$lang['add']['resource_name'] = 'Resource name';
|
||||
$lang['add']['max_mailboxes'] = 'Max. possible mailboxes:';
|
||||
$lang['add']['mailbox_quota_m'] = 'Max. quota per mailbox (MiB):';
|
||||
$lang['add']['domain_quota_m'] = 'Total domain quota (MiB):';
|
||||
$lang['add']['backup_mx_options'] = 'Backup MX options:';
|
||||
$lang['add']['relay_all'] = 'Relay all recipients';
|
||||
$lang['add']['relay_domain'] = 'Relay this domain';
|
||||
$lang['add']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
|
||||
$lang['add']['alias'] = 'Alias(es)';
|
||||
$lang['add']['alias_spf_fail'] = '<b>Note:</b> If your chosen destination address is an external mailbox, the <b>receiving mailserver</b> may reject your message due to an SPF failure.</a>';
|
||||
$lang['add']['alias_address'] = 'Alias address/es:';
|
||||
$lang['add']['alias_address_info'] = '<small>Full email address/es or @example.com, to catch all messages for a domain (comma-separated). <b>mailcow domains only</b>.</small>';
|
||||
$lang['add']['alias_domain_info'] = '<small>Valid domain names only (comma-separated).</small>';
|
||||
$lang['add']['target_address'] = 'Goto addresses:';
|
||||
$lang['add']['target_address_info'] = '<small>Full email address/es (comma-separated).</small>';
|
||||
$lang['add']['alias_domain'] = 'Alias domain';
|
||||
$lang['add']['select'] = 'Please select...';
|
||||
$lang['add']['target_domain'] = 'Target domain:';
|
||||
$lang['add']['mailbox'] = 'Mailbox';
|
||||
$lang['add']['resource'] = 'Resource';
|
||||
$lang['add']['kind'] = 'Kind';
|
||||
$lang['add']['mailbox_username'] = 'Username (left part of an email address):';
|
||||
$lang['add']['full_name'] = 'Full name:';
|
||||
$lang['add']['quota_mb'] = 'Quota (MiB):';
|
||||
$lang['add']['select_domain'] = 'Please select a domain first';
|
||||
$lang['add']['password'] = 'Password:';
|
||||
$lang['add']['password_repeat'] = 'Confirmation password (repeat):';
|
||||
$lang['add']['previous'] = 'Previous page';
|
||||
$lang['add']['restart_sogo_hint'] = 'You will need to restart the SOGo service container after adding a new domain!';
|
||||
|
||||
$lang['login']['title'] = 'Login';
|
||||
$lang['login']['administration'] = 'Administration';
|
||||
$lang['login']['administration_details'] = 'Please use your Administrator login to perform administrative tasks.';
|
||||
$lang['login']['user_settings'] = 'User settings';
|
||||
$lang['login']['user_settings_details'] = 'Mailbox users can use mailcow UI to change their passwords, create temporary aliases (spam aliases), adjust the spam filter behaviour or import messages from a remote IMAP server.';
|
||||
$lang['login']['username'] = 'Username';
|
||||
$lang['login']['password'] = 'Password';
|
||||
$lang['login']['reset_password'] = 'Reset my password';
|
||||
$lang['login']['login'] = 'Login';
|
||||
$lang['login']['previous'] = "Previous page";
|
||||
$lang['login']['delayed'] = 'Login was delayed by %s seconds.';
|
||||
|
||||
$lang['tfa']['tfa'] = "Two-factor authentication";
|
||||
$lang['tfa']['set_tfa'] = "Set two-factor authentication method";
|
||||
$lang['tfa']['yubi_otp'] = "Yubico OTP authentication";
|
||||
$lang['tfa']['key_id'] = "An identifier for your YubiKey";
|
||||
$lang['tfa']['api_register'] = 'mailcow uses the Yubico Cloud API. Please get an API key for your key <a href="https://upgrade.yubico.com/getapikey/" target="_blank">here</a>';
|
||||
$lang['tfa']['u2f'] = "U2F authentication";
|
||||
$lang['tfa']['hotp'] = "HOTP authentication";
|
||||
$lang['tfa']['totp'] = "TOTP authentication";
|
||||
$lang['tfa']['none'] = "Deaktiviert";
|
||||
$lang['tfa']['delete_tfa'] = "Disable TFA";
|
||||
$lang['tfa']['disable_tfa'] = "Disable TFA until next successful login";
|
||||
$lang['tfa']['confirm_tfa'] = "Please confirm your one-time password in the below field";
|
||||
$lang['tfa']['confirm'] = "Confirm";
|
||||
$lang['tfa']['otp'] = "One-time password";
|
||||
$lang['tfa']['trash_login'] = "Trash login";
|
||||
$lang['tfa']['select'] = "Please select";
|
||||
$lang['tfa']['waiting_usb_auth'] = "<i>Waiting for USB device...</i><br /><br />Please tap the button on your U2F USB device now.";
|
||||
$lang['tfa']['waiting_usb_register'] = "<i>Waiting for USB device...</i><br /><br />Please enter your password above and confirm your U2F registration by tapping the button on your U2F USB device.";
|
||||
|
||||
$lang['admin']['search_domain_da'] = 'Search domains';
|
||||
$lang['admin']['restrictions'] = 'Postifx Restrictions';
|
||||
$lang['admin']['rr'] = 'Postifx Recipient Restrictions';
|
||||
$lang['admin']['sr'] = 'Postifx Sender Restrictions';
|
||||
$lang['admin']['reset_defaults'] = 'Reset to defaults';
|
||||
$lang['admin']['sr'] = 'Postifx Sender Restrictions';
|
||||
$lang['admin']['r_inactive'] = 'Inactive restrictions';
|
||||
$lang['admin']['r_active'] = 'Active restrictions';
|
||||
$lang['admin']['r_info'] = 'Greyed out/disabled elements on the list of active restrictions are not known as valid restrictions to mailcow and cannot be moved. Unknown restrictions will be set in order of appearance anyway. <br />You can add new elements in <code>inc/vars.local.inc.php</code> to be able to toggle them.';
|
||||
$lang['admin']['public_folders'] = 'Public Folders';
|
||||
$lang['admin']['public_folders_text'] = 'A namespace "Public" is created. Below\'s public folder name indicates the name of the first auto-created mailbox within this namespace.';
|
||||
$lang['admin']['public_folder_name'] = 'Folder name <small>(alphanumeric)</small>';
|
||||
$lang['admin']['public_folder_enable'] = 'Enable public folder';
|
||||
$lang['admin']['public_folder_enable_text'] = 'Toggling this option does not delete mail in any public folder.';
|
||||
$lang['admin']['public_folder_pusf'] = 'Enable per-user seen flag';
|
||||
$lang['admin']['public_folder_pusf_text'] = 'A "per-user seen flag"-enabled system will not mark a mail as read for User B, when User A has seen it, but User B did not.';
|
||||
$lang['admin']['privacy'] = 'Privacy';
|
||||
$lang['admin']['privacy_text'] = 'This option enables a PCRE table to remove "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" and replaces "Received: from" headers with localhost/127.0.0.1.';
|
||||
$lang['admin']['privacy_anon_mail'] = 'Anonymize outgoing mail';
|
||||
$lang['admin']['dkim_txt_name'] = 'TXT record name:';
|
||||
$lang['admin']['dkim_txt_value'] = 'TXT record value:';
|
||||
$lang['admin']['dkim_key_length'] = 'DKIM key length (bits)';
|
||||
$lang['admin']['dkim_key_valid'] = 'Key valid';
|
||||
$lang['admin']['dkim_key_unused'] = 'Key unused';
|
||||
$lang['admin']['dkim_key_missing'] = 'Key missing';
|
||||
$lang['admin']['dkim_key_hint'] = 'Selector for DKIM keys is always <code>dkim</code>.';
|
||||
$lang['admin']['previous'] = 'Previous page';
|
||||
$lang['admin']['quota_mb'] = 'Quota (MiB):';
|
||||
$lang['admin']['sender_acl'] = 'Allow to send as:';
|
||||
$lang['admin']['msg_size'] = 'Message size';
|
||||
$lang['admin']['msg_size_limit'] = 'Message size limit now';
|
||||
$lang['admin']['msg_size_limit_details'] = 'Applying a new limit will reload Postfix and the webserver.';
|
||||
$lang['admin']['save'] = 'Save changes';
|
||||
$lang['admin']['maintenance'] = 'Maintenance and Information';
|
||||
$lang['admin']['sys_info'] = 'System information';
|
||||
$lang['admin']['dkim_add_key'] = 'Add DKIM key';
|
||||
$lang['admin']['dkim_keys'] = 'DKIM keys';
|
||||
$lang['admin']['add'] = 'Add';
|
||||
$lang['admin']['configuration'] = 'Configuration';
|
||||
$lang['admin']['password'] = 'Password';
|
||||
$lang['admin']['password_repeat'] = 'Confirmation password (repeat)';
|
||||
$lang['admin']['active'] = 'Active';
|
||||
$lang['admin']['action'] = 'Action';
|
||||
$lang['admin']['add_domain_admin'] = 'Add Domain administrator';
|
||||
$lang['admin']['admin_domains'] = 'Domain assignments';
|
||||
$lang['admin']['domain_admins'] = 'Domain administrators';
|
||||
$lang['admin']['username'] = 'Username';
|
||||
$lang['admin']['edit'] = 'Edit';
|
||||
$lang['admin']['remove'] = 'Remove';
|
||||
$lang['admin']['save'] = 'Save changes';
|
||||
$lang['admin']['admin'] = 'Administrator';
|
||||
$lang['admin']['admin_details'] = 'Edit administrator details';
|
||||
$lang['admin']['unchanged_if_empty'] = 'If unchanged leave blank';
|
||||
$lang['admin']['yes'] = '✔';
|
||||
$lang['admin']['no'] = '✘';
|
||||
$lang['admin']['access'] = 'Access';
|
||||
$lang['admin']['invalid_max_msg_size'] = 'Invalid max. message size';
|
||||
$lang['admin']['site_not_found'] = 'Cannot locate mailcow site configuration';
|
||||
$lang['admin']['public_folder_empty'] = 'Public folder name must not be empty';
|
||||
$lang['admin']['set_rr_failed'] = 'Cannot set Postfix restrictions';
|
||||
$lang['admin']['no_record'] = 'No record';
|
||||
?>
|
378
data/web/lang/lang.es.php
Normal file
378
data/web/lang/lang.es.php
Normal file
@@ -0,0 +1,378 @@
|
||||
<?php
|
||||
/*
|
||||
//
|
||||
// Spanish language file
|
||||
//
|
||||
*/
|
||||
$lang['footer']['loading'] = "Espere Por Favor...";
|
||||
$lang['header']['restart_sogo'] = 'Reiniciar SOGo';
|
||||
$lang['footer']['restart_sogo'] = 'Reiniciar SOGo';
|
||||
$lang['footer']['restart_now'] = 'Reiniciar ahora';
|
||||
$lang['footer']['restart_sogo_info'] = 'Algunas tareas, por ejemplo agregar un dominio, requieren que reinicies SOGo para detectar cambios hechos en la UI de mailcow.<br /><br /><b>Importante:</b> Un reinicio sencillo puede tardar un poco en completarse, por favor espere a que termine.';
|
||||
$lang['dkim']['confirm'] = "¿Estás Seguro?";
|
||||
$lang['danger']['dkim_not_found'] = "Registro DKIM no encontrado";
|
||||
$lang['danger']['dkim_remove_failed'] = "No se puede eliminar el registro DKIM seleccionado";
|
||||
$lang['danger']['dkim_add_failed'] = "No se puede agregar el registro DKIM dado";
|
||||
$lang['danger']['dkim_domain_or_sel_invalid'] = "Dominio DKIM ó selector inválido";
|
||||
$lang['danger']['dkim_key_length_invalid'] = "Longitud de la llave DKIM inválida";
|
||||
$lang['success']['dkim_removed'] = "Registro DKIM removido";
|
||||
$lang['success']['dkim_added'] = "Registro DKIM guardado";
|
||||
$lang['danger']['access_denied'] = "Acceso denegado o datos del formulario inválidos";
|
||||
$lang['danger']['whitelist_from_invalid'] = "Entrada de la lista blanca inválida";
|
||||
$lang['danger']['domain_invalid'] = "Nombre de dominio inválido";
|
||||
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Cuota máx. excede el limite de cuota del dominio";
|
||||
$lang['danger']['object_is_not_numeric'] = "El valor %s no es numérico";
|
||||
$lang['success']['domain_added'] = "Dominio agregado %s";
|
||||
$lang['danger']['alias_empty'] = "Dirección alias no debe estar vacía";
|
||||
$lang['danger']['goto_empty'] = "Dirección \"goto\" no debe estar vacía";
|
||||
$lang['danger']['policy_list_from_exists'] = "Un registro con ese nombre ya existe";
|
||||
$lang['danger']['policy_list_from_invalid'] = "El registro tiene formato inválido";
|
||||
$lang['danger']['whitelist_exists'] = "Ya existe un registro con ese nombre en la lista blanca";
|
||||
$lang['danger']['whitelist_from_invalid'] = "Formato inválido para el registro de lista blanca";
|
||||
$lang['danger']['alias_invalid'] = "Dirección alias inválida";
|
||||
$lang['danger']['goto_invalid'] = "Dirección \"goto\" inválida";
|
||||
$lang['danger']['alias_domain_invalid'] = "El dominio alias es inválido";
|
||||
$lang['danger']['target_domain_invalid'] = "El dominio \"goto\" es inválido";
|
||||
$lang['danger']['object_exists'] = "El objeto %s ya existe";
|
||||
$lang['danger']['domain_exists'] = "El dominio %s ya existe";
|
||||
$lang['danger']['alias_goto_identical'] = "Las direcciones alias y \"goto\" no deben ser idénticas";
|
||||
$lang['danger']['aliasd_targetd_identical'] = "El dominio alias no debe ser igual al dominio destino";
|
||||
$lang['success']['alias_added'] = "Dirección/es alias ha/han sidgo agregada";
|
||||
$lang['success']['alias_modified'] = "Cambios al alias guardados";
|
||||
$lang['success']['aliasd_modified'] = "Cambios al dominio alias guardados";
|
||||
$lang['success']['mailbox_modified'] = "Cambios al buzón %s guardados";
|
||||
$lang['success']['msg_size_saved'] = "Limite del mensaje establecido";
|
||||
$lang['danger']['aliasd_not_found'] = "Dominio alias no encontrado";
|
||||
$lang['danger']['targetd_not_found'] = "Dominio destino no encontrado";
|
||||
$lang['danger']['aliasd_exists'] = "Dominio alias ya existe";
|
||||
$lang['success']['aliasd_added'] = "Agregado dominio alias %s";
|
||||
$lang['success']['aliasd_modified'] = "Cambios al dominio alias %s guardados";
|
||||
$lang['success']['domain_modified'] = "Cambios al dominio %s guardados";
|
||||
$lang['success']['domain_admin_modified'] = "Cambios al administrador del dominio %s guardados";
|
||||
$lang['success']['domain_admin_added'] = "Administrador del dominio %s agregado";
|
||||
$lang['success']['changes_general'] = 'Cambios guardados';
|
||||
$lang['success']['admin_modified'] = "Cambios al administrador guardados";
|
||||
$lang['danger']['exit_code_not_null'] = "Error: Código de salida es %d";
|
||||
$lang['danger']['mailbox_not_available'] = "Buzón no disponible";
|
||||
$lang['danger']['username_invalid'] = "Nombre de usuario no se puede utilizar";
|
||||
$lang['danger']['password_mismatch'] = "Confirmación de contraseña no es identica";
|
||||
$lang['danger']['password_complexity'] = "La contraseña no cumple con los requisitos";
|
||||
$lang['danger']['password_empty'] = "El campo de la contraseña no debe estar vacío";
|
||||
$lang['danger']['login_failed'] = "Inicio de sesión fallido";
|
||||
$lang['danger']['mailbox_invalid'] = "Nombre de buzón inválido";
|
||||
$lang['danger']['mailbox_invalid_suggest'] = 'El nombre del buzón es inválido, ¿pretendías escribir "%s"?';
|
||||
$lang['info']['fetchmail_planned'] = "La tarea para buscar correos se ha planeado. Por favor verifica el proceso más tarde.";
|
||||
$lang['danger']['fetchmail_source_empty'] = "Por favor define una carpeta fuente";
|
||||
$lang['danger']['fetchmail_dest_empty'] = "Por favor define una carpeta destino";
|
||||
$lang['danger']['is_alias'] = "%s ya está definida como una dirección alias";
|
||||
$lang['danger']['is_alias_or_mailbox'] = "%s ya está definido como un alias ó como un buzón";
|
||||
$lang['danger']['is_spam_alias'] = "%s ya está definida como una dirección alias de correo no deseado";
|
||||
$lang['danger']['quota_not_0_not_numeric'] = "Cuota debe ser numérica y >= 0";
|
||||
$lang['danger']['domain_not_found'] = "Dominio no encontrado.";
|
||||
$lang['danger']['max_mailbox_exceeded'] = "Máx. de buzones superado (%d de %d)";
|
||||
$lang['danger']['mailbox_quota_exceeded'] = "Cuota excede el límite de dominio (máx. %d MiB)";
|
||||
$lang['danger']['mailbox_quota_left_exceeded'] = "No queda espacio suficiente (espacio libre: %d MiB)";
|
||||
$lang['success']['mailbox_added'] = "Buzón %s agregado";
|
||||
$lang['success']['domain_removed'] = "Dominio %s removido";
|
||||
$lang['success']['alias_removed'] = "Dirección alias %s removida";
|
||||
$lang['success']['alias_domain_removed'] = "Dominio alias %s removido";
|
||||
$lang['success']['domain_admin_removed'] = "Administrador del dominio %s removido";
|
||||
$lang['success']['mailbox_removed'] = "Buzón %s removido";
|
||||
$lang['danger']['max_quota_in_use'] = "Cuota del buzón debe ser mayor o igual a %d MiB";
|
||||
$lang['danger']['domain_quota_m_in_use'] = "Cuota del dominio debe ser mayor o igual a %d MiB";
|
||||
$lang['danger']['mailboxes_in_use'] = "Máx. de buzones debe ser mayor o igual a %d";
|
||||
$lang['danger']['aliases_in_use'] = "Máx. de alias debe ser mayor o igual a %d";
|
||||
$lang['danger']['sender_acl_invalid'] = "Valor del remitente ACL inválido";
|
||||
$lang['danger']['domain_not_empty'] = "No se puede eliminar un dominio que no esté vacío";
|
||||
$lang['warning']['spam_alias_temp_error'] = "Error temporal: No se puede agregar ese \"spam alias\", inténtelo más tarde.";
|
||||
$lang['danger']['spam_alias_max_exceeded'] = "Máx. direcciones \"spam alias\" permitidas excedido";
|
||||
$lang['danger']['fetchmail_active'] = "Un proceso ya se está ejecutando, por favor espera a que termine.";
|
||||
$lang['danger']['validity_missing'] = 'Por favor asigna un periodo de validez';
|
||||
$lang['user']['off'] = "Apagado";
|
||||
$lang['user']['user_change_fn'] = "";
|
||||
$lang['user']['user_settings'] = 'Configuración del usuario';
|
||||
$lang['user']['mailbox_settings'] = 'Configuración del buzón';
|
||||
$lang['user']['mailbox_details'] = 'Detalles del buzón';
|
||||
$lang['user']['change_password'] = 'Cambiar contraseña';
|
||||
$lang['user']['new_password'] = 'Nueva contraseña:';
|
||||
$lang['user']['save_changes'] = 'Guardar cambios';
|
||||
$lang['user']['password_now'] = 'Contraseña actual (confirmar cambios):';
|
||||
$lang['user']['new_password_repeat'] = 'Confirmación de contraseña (repetir):';
|
||||
$lang['user']['new_password_description'] = 'Requisitos: longitud de 6 caracteres, letras y números.';
|
||||
$lang['user']['did_you_know'] = '<b>¿Sabías qué?</b> Puedes utilizar etiquetas en tu dirección email ("me+<b>privat</b>@example.com") para mover mensajes a una carpeta automáticamente (ejemplo: "privat").';
|
||||
$lang['user']['spam_aliases'] = 'Alias de email temporales';
|
||||
$lang['user']['alias'] = 'Alias';
|
||||
$lang['user']['aliases'] = 'Alias';
|
||||
$lang['user']['is_catch_all'] = 'Atrapa-Todo para el/los dominio/s';
|
||||
$lang['user']['aliases_also_send_as'] = 'También permitido para mandarse como';
|
||||
$lang['user']['aliases_send_as_all'] = 'No verifiques el acceso del remitente para los siguientes dominios';
|
||||
$lang['user']['alias_create_random'] = 'Generar alias aleatorio';
|
||||
$lang['user']['alias_extend_all'] = 'Extender alias por 1 hora';
|
||||
$lang['user']['alias_valid_until'] = 'Válido hasta';
|
||||
$lang['user']['alias_remove_all'] = 'Eliminar todos los alias';
|
||||
$lang['user']['alias_time_left'] = 'Tiempo restante';
|
||||
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
|
||||
$lang['user']['alias_select_validity'] = 'Periodo de validez';
|
||||
$lang['user']['hour'] = 'Hora';
|
||||
$lang['user']['hours'] = 'Horas';
|
||||
$lang['user']['day'] = 'Día';
|
||||
$lang['user']['week'] = 'Semana';
|
||||
$lang['user']['weeks'] = 'Semanas';
|
||||
$lang['user']['spamfilter'] = 'Filtro de spam';
|
||||
$lang['user']['spamfilter_wl'] = 'Lista blanca';
|
||||
$lang['user']['spamfilter_wl_desc'] = 'Direcciones en la lista blanca <b>nunca</b> clasificarán como spam. Probablemente se usará un comodín.';
|
||||
$lang['user']['spamfilter_bl'] = 'Lista negra';
|
||||
$lang['user']['spamfilter_bl_desc'] = 'Direcciones en la lista negra <b>siempre</b> clasificarán como spam. Probablemente se usará un comodín.';
|
||||
$lang['user']['spamfilter_behavior'] = 'Clasificación';
|
||||
$lang['user']['spamfilter_table_rule'] = 'Regla';
|
||||
$lang['user']['spamfilter_table_action'] = 'Acción';
|
||||
$lang['user']['spamfilter_table_empty'] = 'No hay datos para mostrar';
|
||||
$lang['user']['spamfilter_table_remove'] = 'eliminar';
|
||||
$lang['user']['spamfilter_table_add'] = 'Agregar elemento';
|
||||
$lang['user']['spamfilter_default_score'] = 'Calificación de spam:';
|
||||
$lang['user']['spamfilter_green'] = 'Verde: éste mensaje no es spam';
|
||||
$lang['user']['spamfilter_yellow'] = 'Amarillo: éste mensaje puede ser spam, será etiquetado como spam y trasladado a tu carpeta basura';
|
||||
$lang['user']['spamfilter_red'] = 'Rojo: Este mensaje es spam y sera rechazado por el servidor';
|
||||
$lang['user']['spamfilter_default_score'] = 'Valores por defecto:';
|
||||
$lang['user']['spamfilter_hint'] = 'El primer valor representa la "calificación baja de spam", el segundo representa la "calificación alta de spam".';
|
||||
|
||||
$lang['user']['tls_policy_warning'] = '<strong>Advertencia:</strong> Si decides forzar la transmisión de correo encriptado, puedes perder correos.<br />Mensajes que no satisfagan la política serán rebotados con una falla grave en el sistema de correos .';
|
||||
$lang['user']['tls_policy'] = 'Política de encriptación';
|
||||
$lang['user']['tls_enforce_in'] = 'Aplicar TLS entrante';
|
||||
$lang['user']['tls_enforce_out'] = 'Aplicar TLS saliente';
|
||||
$lang['user']['no_record'] = 'Sin registro';
|
||||
|
||||
$lang['user']['misc_settings'] = 'Otras configuraciones de usuario';
|
||||
$lang['user']['misc_delete_profile'] = 'Otras configuraciones de usuario';
|
||||
|
||||
$lang['user']['tag_handling'] = 'Establecer manejo para el correo etiquetado';
|
||||
$lang['user']['tag_in_subfolder'] = 'En subcarpeta';
|
||||
$lang['user']['tag_in_subject'] = 'En asunto';
|
||||
$lang['user']['tag_help_explain'] = 'En subcarpeta: una nueva subcarpeta llamada como la etiqueta será creada debajo de INBOX ("INBOX/Facebook").<br />
|
||||
En asunto: los nombres de las etiquetas serán añadidos al asunto de los correos, ejemplo: "[Facebook] Mis Noticias".';
|
||||
$lang['user']['tag_help_example'] = 'Ejemplo de una dirección email etiquetada: mi<b>+Facebook</b>@ejemplo.org';
|
||||
|
||||
$lang['start']['dashboard'] = '%s - panel';
|
||||
$lang['start']['start_rc'] = 'Abrir Roundcube';
|
||||
$lang['start']['start_sogo'] = 'Abrir SOGo';
|
||||
$lang['start']['mailcow_apps_detail'] = 'Utiliza una aplicación de mailcow para acceder a tus correos, calendario, contactos y más.';
|
||||
$lang['start']['mailcow_panel'] = 'Iniciar mailcow UI';
|
||||
$lang['start']['mailcow_panel_description'] = 'Mailcow UI está disponible para administradores y usuarios de buzón.';
|
||||
$lang['start']['mailcow_panel_detail'] = '<b>Administradores del dominio</b> crean, modifican o eliminan buzones y alias, cambia dominios y lee información más detallada sobre sus dominios asignados<br />
|
||||
<b>Usuarios de buzón</b> son capaces de crear alias de tiempo limitado (spam alias), cambiar su contraseña y la configuración del filtro de spam.';
|
||||
$lang['start']['recommended_config'] = 'Configuración recomendada (sin ActiveSync)';
|
||||
$lang['start']['imap_smtp_server'] = 'IMAP- y SMTP datos del servidor';
|
||||
$lang['start']['imap_smtp_server_description'] = 'Para la mejor experiencia recomendamos utilizar <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
|
||||
$lang['start']['imap_smtp_server_badge'] = 'Leer/Escribir correos';
|
||||
$lang['start']['imap_smtp_server_auth_info'] = 'Por favor utiliza tu dirección de correo completa y el mecanismo de autenticación PLANO.<br />
|
||||
Tus datos para iniciar sesión serán encriptados por la encriptación obligatoria del servidor';
|
||||
$lang['start']['managesieve'] = 'ManageSieve';
|
||||
$lang['start']['managesieve_badge'] = 'Filtro de correos';
|
||||
$lang['start']['managesieve_description'] = 'Por favor utiliza <b>Mozilla Thunderbird</b> con la <a style="text-decoration:none" target="_blank" href="%s"><b>extensión nightly sieve</b></a>.<br />Inicia Thunderbird, abre la configuración de complementos y suelta el archivo xpi descargado en la ventana abierta.<br />El servidor es <b>%s</b>, utiliza el puerto <b>4190</b> si se te pregunta. Los datos para iniciar sesión coinciden con los datos de tu correo.';
|
||||
$lang['start']['service'] = 'Servicio';
|
||||
$lang['start']['encryption'] = 'Método de encriptación';
|
||||
$lang['start']['help'] = 'Mostrar/Ocultar panel de ayuda';
|
||||
$lang['start']['hostname'] = 'Hostname';
|
||||
$lang['start']['port'] = 'Port';
|
||||
$lang['start']['footer'] = '';
|
||||
$lang['header']['mailcow_settings'] = 'Configuracion';
|
||||
$lang['header']['administration'] = 'Administración';
|
||||
$lang['header']['mailboxes'] = 'Buzones';
|
||||
$lang['header']['user_settings'] = 'Configuraciones de usuario';
|
||||
$lang['header']['login'] = 'Inicio de sesión';
|
||||
$lang['header']['logged_in_as_logout'] = 'Sesión iniciada como <b>%s</b> (cerrar sesión)';
|
||||
$lang['header']['locale'] = 'Idioma';
|
||||
$lang['mailbox']['domain'] = 'Dominio';
|
||||
$lang['mailbox']['alias'] = 'Alias';
|
||||
$lang['mailbox']['aliases'] = 'Alias';
|
||||
$lang['mailbox']['domains'] = 'Dominios';
|
||||
$lang['mailbox']['mailboxes'] = 'Buzones';
|
||||
$lang['mailbox']['mailbox_quota'] = 'Tamaño máx. de cuota';
|
||||
$lang['mailbox']['domain_quota'] = 'Cuota';
|
||||
$lang['mailbox']['active'] = 'Activo';
|
||||
$lang['mailbox']['action'] = 'Acción';
|
||||
$lang['mailbox']['ratelimit'] = 'Límite de la tarifa saliente/h';
|
||||
$lang['mailbox']['backup_mx'] = 'Respaldar MX';
|
||||
$lang['mailbox']['domain_aliases'] = 'Alias de dominio';
|
||||
$lang['mailbox']['target_domain'] = 'Dominio destino';
|
||||
$lang['mailbox']['target_address'] = 'Dirección Goto';
|
||||
$lang['mailbox']['username'] = 'Nombre de usuario';
|
||||
$lang['mailbox']['fname'] = 'Nombre completo';
|
||||
$lang['mailbox']['filter_table'] = 'Filtrar tabla';
|
||||
$lang['mailbox']['yes'] = '✔';
|
||||
$lang['mailbox']['no'] = '✘';
|
||||
$lang['mailbox']['quota'] = 'Cuota';
|
||||
$lang['mailbox']['in_use'] = 'En uso (%)';
|
||||
$lang['mailbox']['msg_num'] = 'Mensaje #';
|
||||
$lang['mailbox']['remove'] = 'Eliminar';
|
||||
$lang['mailbox']['edit'] = 'Editar';
|
||||
$lang['mailbox']['archive'] = 'Archivar';
|
||||
$lang['mailbox']['no_record'] = 'Sin registro';
|
||||
$lang['mailbox']['add_domain'] = 'Agregar dominio';
|
||||
$lang['mailbox']['add_domain_alias'] = 'Agregar alias de dominio';
|
||||
$lang['mailbox']['add_mailbox'] = 'Agregar buzón';
|
||||
$lang['mailbox']['add_alias'] = 'Agregar alias';
|
||||
|
||||
$lang['info']['no_action'] = 'No hay acción aplicable';
|
||||
|
||||
$lang['delete']['title'] = 'Eliminar objeto';
|
||||
$lang['delete']['remove_domain_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el dominio <b>%s</b>!';
|
||||
$lang['delete']['remove_domainalias_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el alias de dominio <b>%s</b>!';
|
||||
$lang['delete']['remove_domainadmin_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el administrador de dominio <b>%s</b>!';
|
||||
$lang['delete']['remove_alias_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar la dirección alias <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el buzón <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_details'] = 'El buzón será <b>purgado permanentemente</b>!';
|
||||
$lang['delete']['remove_domain_details'] = 'Esto también eliminará alias de dominio.<br /><br /><b>Un dominio debe estar vacío para poder ser eliminado.</b>';
|
||||
$lang['delete']['remove_alias_details'] = 'Los usuarios ya no serán capaces de recibir correos o enviar correos desde esta dirección.</b>';
|
||||
$lang['delete']['remove_button'] = 'Eliminar';
|
||||
$lang['delete']['previous'] = 'Página anterior';
|
||||
|
||||
$lang['edit']['save'] = 'Guardar cambios';
|
||||
$lang['edit']['archive'] = 'Acceso a archivos';
|
||||
$lang['edit']['max_mailboxes'] = 'Máx. buzones posibles:';
|
||||
$lang['edit']['title'] = 'Editas objeto';
|
||||
$lang['edit']['target_address'] = 'Dirección/es goto <small>(separadas por coma)</small>:';
|
||||
$lang['edit']['active'] = 'Activo';
|
||||
$lang['edit']['target_domain'] = 'Dominio destino:';
|
||||
$lang['edit']['password'] = 'Contraseña:';
|
||||
$lang['edit']['ratelimit'] = 'Límite de la tarifa saliente/h:';
|
||||
$lang['danger']['ratelimt_less_one'] = 'El límite de la tarifa saliente/h no puede ser menos que 1';
|
||||
$lang['edit']['password_repeat'] = 'Confirmación de contraseña (repetir):';
|
||||
$lang['edit']['domain_admin'] = 'Editar administrador del dominio';
|
||||
$lang['edit']['domain'] = 'Editar dominio';
|
||||
$lang['edit']['alias_domain'] = 'Alias de dominio';
|
||||
$lang['edit']['edit_alias_domain'] = 'Editar alias de dominio';
|
||||
$lang['edit']['domains'] = 'Dominios';
|
||||
$lang['edit']['destroy'] = 'Entrada manual de datos';
|
||||
$lang['edit']['alias'] = 'Editar alias';
|
||||
$lang['edit']['mailbox'] = 'Editar buzón';
|
||||
$lang['edit']['description'] = 'Descripción:';
|
||||
$lang['edit']['max_aliases'] = 'Máx. alias:';
|
||||
$lang['edit']['max_quota'] = 'Máx. cuota por buzón (MiB):';
|
||||
$lang['edit']['domain_quota'] = 'Cuota de dominio:';
|
||||
$lang['edit']['backup_mx_options'] = 'Opciones del respaldo MX:';
|
||||
$lang['edit']['relay_domain'] = 'Dominio de retransmisión';
|
||||
$lang['edit']['relay_all'] = 'Retransmitir todos los recipientes';
|
||||
$lang['edit']['dkim_signature'] = 'Firma DKIM:';
|
||||
$lang['edit']['dkim_record_info'] = '<small>Por favor agrega un registro TXT con el siguiente valor a tu configuración DNS.</small>';
|
||||
$lang['edit']['relay_all_info'] = '<small>Si eliges <b>no</b> retransmitir a todos los recipientes, necesitas agregar un buzón "blind"("ciego") por cada recipiente que debe ser retransmitido.</small>';
|
||||
$lang['edit']['full_name'] = 'Nombre completo';
|
||||
$lang['edit']['full_name'] = 'Nombre completo';
|
||||
$lang['edit']['quota_mb'] = 'Cuota (MiB)';
|
||||
$lang['edit']['sender_acl'] = 'Permitir envío como:';
|
||||
$lang['edit']['sender_acl_info'] = 'Los alias no pueden deseleccionarse.';
|
||||
$lang['edit']['dkim_txt_name'] = 'Nombre del registro TXT:';
|
||||
$lang['edit']['dkim_txt_value'] = 'Valor del registro TXT:';
|
||||
$lang['edit']['previous'] = 'Página anterior';
|
||||
$lang['edit']['unchanged_if_empty'] = 'Si no hay cambios dejalo en blanco';
|
||||
$lang['edit']['dont_check_sender_acl'] = 'No verifiques remitente para el dominio %s';
|
||||
|
||||
$lang['add']['title'] = 'Agregar objeto';
|
||||
$lang['add']['domain'] = 'Dominio';
|
||||
$lang['add']['active'] = 'Activo';
|
||||
$lang['add']['save'] = 'Guardar cambios';
|
||||
$lang['add']['description'] = 'Descripción:';
|
||||
$lang['add']['max_aliases'] = 'Máx. alias posibles:';
|
||||
$lang['add']['max_mailboxes'] = 'Máx. buzones posibles:';
|
||||
$lang['add']['mailbox_quota_m'] = 'Máx. cuota por buzón (MiB):';
|
||||
$lang['add']['domain_quota_m'] = 'Cuota total del dominio (MiB):';
|
||||
$lang['add']['backup_mx_options'] = 'Opciones del respaldo MX:';
|
||||
$lang['add']['relay_all'] = 'Retransmitir todos los recipientes';
|
||||
$lang['add']['relay_domain'] = 'Retransmitir este dominio';
|
||||
$lang['add']['relay_all_info'] = '<small>Si eliges <b>no</b> retransmitir a todos los recipientes, necesitas agregar un buzón "blind"("ciego") por cada recipiente que debe ser retransmitido.</small>';
|
||||
$lang['add']['alias'] = 'Alias';
|
||||
$lang['add']['alias_spf_fail'] = '<b>Nota:</b> Si tu dirección destino está en un buzón externo, el <b>servidor de correo que recibe</b> puede rechazar tu mensaje por una falla SPF.</a>';
|
||||
$lang['add']['alias_address'] = 'Dirección/es alias:';
|
||||
$lang['add']['alias_address_info'] = '<small>Dirección/es de correo completa/s ó @ejemplo.com, para atrapar todos los mensajes para un dominio (separado por coma). <b>Dominios mailcow solamente</b>.</small>';
|
||||
$lang['add']['alias_domain_info'] = '<small>Nombres de dominio válidos solamente (separado por coma).</small>';
|
||||
$lang['add']['target_address'] = 'Direcciones goto:';
|
||||
$lang['add']['target_address_info'] = '<small>Dirección/es de correo completa/s (separado por coma).</small>';
|
||||
$lang['add']['alias_domain'] = 'Dominio alias';
|
||||
$lang['add']['select'] = 'Por favor selecciona...';
|
||||
$lang['add']['target_domain'] = 'Dominio destino:';
|
||||
$lang['add']['mailbox'] = 'Buzón';
|
||||
$lang['add']['mailbox_username'] = 'Nombre de usuario (parte izquierda de una dirección de correo):';
|
||||
$lang['add']['full_name'] = 'Nombre completo:';
|
||||
$lang['add']['quota_mb'] = 'Cuota (MiB):';
|
||||
$lang['add']['select_domain'] = 'Por favor elige un dominio primero';
|
||||
$lang['add']['password'] = 'Constraseña:';
|
||||
$lang['add']['password_repeat'] = 'Confirmación de contraseña (repetir):';
|
||||
$lang['add']['previous'] = 'Página anterior';
|
||||
$lang['add']['restart_sogo_hint'] = '¡Necesitas reiniciar el contenedor del servicio SOGo antes de agregar un nuevo dominio!';
|
||||
|
||||
$lang['login']['title'] = 'Inicio de sesión';
|
||||
$lang['login']['administration'] = 'Administración';
|
||||
$lang['login']['administration_details'] = 'Por favor utiliza tu inicio de sesión de Administrador para realizar tareas administrativas.';
|
||||
$lang['login']['user_settings'] = 'Configuración de usuario';
|
||||
$lang['login']['user_settings_details'] = 'Usuarios de buzón pueden utilizar mailcow UI para cambiar sus contraseñas, crear alias temporales (alias de spam), ajustar el comportamiento del filtro de spam ó importar mensajes desde un servidor IMAP remoto.';
|
||||
$lang['login']['username'] = 'Nombre de usuario';
|
||||
$lang['login']['password'] = 'Contraseña';
|
||||
$lang['login']['reset_password'] = 'Reiniciar mi contraseña';
|
||||
$lang['login']['login'] = 'Inicio de sesión';
|
||||
$lang['login']['previous'] = "Página anterior";
|
||||
$lang['login']['delayed'] = 'El inicio de sesión ha sido retrasado %s segundos.';
|
||||
|
||||
$lang['login']['tfa'] = "Autenticación de dos factores";
|
||||
$lang['login']['tfa_details'] = "Por favor confirma tu contraseña de un solo uso en el campo de abajo";
|
||||
$lang['login']['confirm'] = "Confirmar";
|
||||
$lang['login']['otp'] = "Contraseña de un solo uso";
|
||||
$lang['login']['trash_login'] = "Inicio de sesión basura";
|
||||
|
||||
$lang['admin']['search_domain_da'] = 'Buscar dominios';
|
||||
$lang['admin']['restrictions'] = 'Restricciones Postfix';
|
||||
$lang['admin']['rr'] = 'Restricciones Postfix para recipientes';
|
||||
$lang['admin']['sr'] = 'Restricciones Postfix para remitentes';
|
||||
$lang['admin']['reset_defaults'] = 'Restablecer los valores predeterminados';
|
||||
$lang['admin']['sr'] = 'Restricciones Postfix para remitentes';
|
||||
$lang['admin']['r_inactive'] = 'Restricciones inactivas';
|
||||
$lang['admin']['r_active'] = 'Restricciones activas';
|
||||
$lang['admin']['r_info'] = 'Elementos en gris/deshabilitados en la lista de restricciones activas no son reconocidas como restricciones válidas para mailcow y no pueden ser movidas. Restricciones desconocidas serán establecidas en el orden de aparicion de todas maneras. <br />Puedes agregar nuevos elementos en <code>inc/vars.local.inc.php</code> para ser capaz de habilitarlas.';
|
||||
$lang['admin']['public_folders'] = 'Carpetas Públicas';
|
||||
$lang['admin']['public_folders_text'] = 'Un espacio de nombres "Public" (Público) será creado. Debajo del nombre de la carpeta pública se indica el nombre del primer buzón creado automáticamente dentro de este espacio de nombres';
|
||||
$lang['admin']['public_folder_name'] = 'Nombre de la carpeta <small>(alfanumérico)</small>';
|
||||
$lang['admin']['public_folder_enable'] = 'Habilitar carpeta pública';
|
||||
$lang['admin']['public_folder_enable_text'] = 'Activar ésta opción no elimina correos en cualquier otra carpeta pública.';
|
||||
$lang['admin']['public_folder_pusf'] = 'Habilitar el indicador visto por usuario';
|
||||
$lang['admin']['public_folder_pusf_text'] = 'Un sistema habilitado por indicador "por usuario visto" no marcará un correo como leído para el Usuario B, cuando el Usuario A lo haya visto, pero el Usuario B no.';
|
||||
$lang['admin']['privacy'] = 'Privacidad';
|
||||
$lang['admin']['privacy_text'] = 'Ésta opción activa una tabla PCRE para remover "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" y remplaza las cabezeras "Received: from" con localhost/127.0.0.1.';
|
||||
$lang['admin']['privacy_anon_mail'] = 'Anonimizar correo saliente';
|
||||
$lang['admin']['dkim_txt_name'] = 'Nombre del registro TXT:';
|
||||
$lang['admin']['dkim_txt_value'] = 'Valor del registro TXT:';
|
||||
$lang['admin']['dkim_key_length'] = 'Longitud de la llave DKIM (bits)';
|
||||
$lang['admin']['previous'] = 'Página anterior';
|
||||
$lang['admin']['quota_mb'] = 'Cuota (MiB):';
|
||||
$lang['admin']['sender_acl'] = 'Permitir envío como:';
|
||||
$lang['admin']['msg_size'] = 'Tamaño del mensaje';
|
||||
$lang['admin']['msg_size_limit'] = 'Límite del tamaño del mensaje ahora';
|
||||
$lang['admin']['msg_size_limit_details'] = 'Aplicando un nuebo límite reiniciará Postfix y el servidor web.';
|
||||
$lang['admin']['save'] = 'Guardar cambios';
|
||||
$lang['admin']['maintenance'] = 'Mantenimiento e Información';
|
||||
$lang['admin']['sys_info'] = 'información del sistema';
|
||||
$lang['admin']['dkim_add_key'] = 'Agregar registro DKIM';
|
||||
$lang['admin']['dkim_keys'] = 'Registros DKIM';
|
||||
$lang['admin']['add'] = 'Agregar';
|
||||
$lang['admin']['configuration'] = 'Configuración';
|
||||
$lang['admin']['password'] = 'Contraseña';
|
||||
$lang['admin']['password_repeat'] = 'Confirmación de contraseña (repetir)';
|
||||
$lang['admin']['active'] = 'Activo';
|
||||
$lang['admin']['action'] = 'Acción';
|
||||
$lang['admin']['add_domain_admin'] = 'Agregar Administrador del dominio';
|
||||
$lang['admin']['admin_domains'] = 'Asignaciones de dominio';
|
||||
$lang['admin']['domain_admins'] = 'Administradores de dominio';
|
||||
$lang['admin']['username'] = 'Nombre de usuario';
|
||||
$lang['admin']['edit'] = 'Editar';
|
||||
$lang['admin']['remove'] = 'Eliminar';
|
||||
$lang['admin']['save'] = 'Guardar cambios';
|
||||
$lang['admin']['admin'] = 'Administrador';
|
||||
$lang['admin']['admin_details'] = 'Editar detalles del administrador';
|
||||
$lang['admin']['unchanged_if_empty'] = 'Si no hay cambios dejalo en blanco';
|
||||
$lang['admin']['yes'] = '✔';
|
||||
$lang['admin']['no'] = '✘';
|
||||
$lang['admin']['access'] = 'Acceso';
|
||||
$lang['admin']['invalid_max_msg_size'] = 'Tamaño máx. del mensaje no válido';
|
||||
$lang['admin']['site_not_found'] = 'No se puede localizar la configuración del sitio de mailcow';
|
||||
$lang['admin']['public_folder_empty'] = 'El nombre de la carpeta pública no debe estar vacío';
|
||||
$lang['admin']['set_rr_failed'] = 'No se pueden establecer las restricciones de Postfix';
|
||||
$lang['admin']['no_record'] = 'Sin registro';
|
||||
?>
|
369
data/web/lang/lang.nl.php
Normal file
369
data/web/lang/lang.nl.php
Normal file
@@ -0,0 +1,369 @@
|
||||
<?php
|
||||
/*
|
||||
//
|
||||
// Dutch language file
|
||||
*/
|
||||
$lang['footer']['loading'] = "Even geduld a.u.b. ...";
|
||||
$lang['header']['restart_sogo'] = 'SOGo herstarten';
|
||||
$lang['footer']['restart_sogo'] = 'SOGo herstarten';
|
||||
$lang['footer']['restart_now'] = 'Nu opnieuw starten';
|
||||
$lang['footer']['restart_sogo_info'] = 'Sommige taken, zoals het toevoegen van een domein, vereisen een herstart van SOGo om de veranderingen door te voeren.<br /><br /><b>Belangrijk:</b> Het opnieuw opstarten kan een poos duren, wacht a.u.b. totdat dit volledig voltooid is.';
|
||||
$lang['dkim']['confirm'] = "Weet u het zeker?";
|
||||
$lang['danger']['dkim_not_found'] = "DKIM record niet gevonden.";
|
||||
$lang['danger']['dkim_remove_failed'] = "Kan geselecteerde DKIM record niet verwijderen.";
|
||||
$lang['danger']['dkim_add_failed'] = "Kan DKIM record niet toevoegen.";
|
||||
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domein of selector zijn ongeldig.";
|
||||
$lang['danger']['dkim_key_length_invalid'] = "Lengte DKIM sleutel ongeldig.";
|
||||
$lang['success']['dkim_removed'] = "DKIM record is verwijderd.";
|
||||
$lang['success']['dkim_added'] = "DKIM record is opgeslagen.";
|
||||
$lang['danger']['access_denied'] = "Toegang geweigerd of ongeldige gegevens.";
|
||||
$lang['danger']['whitelist_from_invalid'] = "Witte lijst invoer ongeldig.";
|
||||
$lang['danger']['domain_invalid'] = "Domeinnaam is ongeldig.";
|
||||
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. quotum > Domeinquotum.";
|
||||
$lang['danger']['object_is_not_numeric'] = "%s is niet numeriek.";
|
||||
$lang['success']['domain_added'] = "Domein toegevoegd: %s.";
|
||||
$lang['danger']['alias_empty'] = "Aliasadres mag niet leeg blijven.";
|
||||
$lang['danger']['goto_empty'] = "Doeladres mag niet leeg blijven.";
|
||||
$lang['danger']['policy_list_from_exists'] = "Deze invoer bestaat al.";
|
||||
$lang['danger']['policy_list_from_invalid'] = "Deze invoer heeft een ongeldig format.";
|
||||
$lang['danger']['whitelist_exists'] = "Deze invoer staat op de witte lijst.";
|
||||
$lang['danger']['whitelist_from_invalid'] = "Witte lijst invoer heeft een ongeldig format.";
|
||||
$lang['danger']['alias_invalid'] = "Aliasadres is ongeldig.";
|
||||
$lang['danger']['goto_invalid'] = "Doeladres is ongeldig.";
|
||||
$lang['danger']['alias_domain_invalid'] = "Aliasdomein is ongeldig.";
|
||||
$lang['danger']['target_domain_invalid'] = "Doeldomein is ongeldig.";
|
||||
$lang['danger']['object_exists'] = "Object %s bestaat reeds.";
|
||||
$lang['danger']['domain_exists'] = "Domein %s bestaat reeds.";
|
||||
$lang['danger']['alias_goto_identical'] = "Het Aliasadres en het Doeladres moeten van elkaar verschillen.";
|
||||
$lang['danger']['aliasd_targetd_identical'] = "Het Aliasdomein kan niet gelijk zijn aan het doel.";
|
||||
$lang['success']['alias_added'] = "Aliasadres(sen) toegevoegd.";
|
||||
$lang['success']['alias_modified'] = "Wijzigingen aan Alias zijn opgeslagen.";
|
||||
$lang['success']['mailbox_modified'] = "Wijzigingen aan postvak %s zijn opgeslagen.";
|
||||
$lang['success']['msg_size_saved'] = "Maximale berichtgrootte opgeslagen.";
|
||||
$lang['danger']['aliasd_not_found'] = "Aliasdomein werd niet gevonden.";
|
||||
$lang['danger']['targetd_not_found'] = "Doeldomein werd niet gevonden.";
|
||||
$lang['danger']['aliasd_exists'] = "Aliasdomein bestaat al.";
|
||||
$lang['success']['aliasd_added'] = "Aliasdomein %s toegevoegd.";
|
||||
$lang['success']['aliasd_modified'] = "Wijzigingen aan aliasdomein %s zijn opgeslagen.";
|
||||
$lang['success']['domain_modified'] = "Wijzigingen aan domein %s zijn opgeslagen.";
|
||||
$lang['success']['domain_admin_modified'] = "Wijzigingen aan domeinbeheerder %s zijn opgeslagen.";
|
||||
$lang['success']['domain_admin_added'] = "Domeinbeheerder %s is toegevoegd.";
|
||||
$lang['success']['changes_general'] = 'Wijzigingen zijn opgeslagen.';
|
||||
$lang['success']['admin_modified'] = "Wijzigingen aan de beheerder zijn opgeslagen.";
|
||||
$lang['danger']['exit_code_not_null'] = "Fout: Exitcode was %d.";
|
||||
$lang['danger']['mailbox_not_available'] = "Postvak niet beschikbaar.";
|
||||
$lang['danger']['username_invalid'] = "Gebruikersnaam kan niet worden gebruikt.";
|
||||
$lang['danger']['password_mismatch'] = "Bevestigingswachtwoord verschilt.";
|
||||
$lang['danger']['password_complexity'] = "Het wachtwoord voldoet niet aan de vereisten.";
|
||||
$lang['danger']['password_empty'] = "Er moet een wachtwoord worden ingesteld.";
|
||||
$lang['danger']['login_failed'] = "Aanmelding mislukt.";
|
||||
$lang['danger']['mailbox_invalid'] = "De naam van het postvak is ongeldig.";
|
||||
$lang['danger']['mailbox_invalid_suggest'] = "De naam van het postvak is ongeldig, bedoelde u \"%s\"?";
|
||||
$lang['info']['fetchmail_planned'] = "Taak voor het ophalen van e-mails is gepland. Controleer dit proces later.";
|
||||
$lang['danger']['fetchmail_source_empty'] = "Geef een bron-map op.";
|
||||
$lang['danger']['fetchmail_dest_empty'] = "Geef een doel-map op.";
|
||||
$lang['danger']['is_alias'] = "%s is reeds een Aliasadres.";
|
||||
$lang['danger']['is_alias_or_mailbox'] = "%s is reeds een Alias of een postvak.";
|
||||
$lang['danger']['is_spam_alias'] = "%s is reeds bekend als spam-alias adres.";
|
||||
$lang['danger']['quota_not_0_not_numeric'] = "Quotum moet numeriek zijn en >= 0.";
|
||||
$lang['danger']['domain_not_found'] = "Domein werd niet gevonden.";
|
||||
$lang['danger']['max_mailbox_exceeded'] = "Max. aantal postvakken overschreden (%d van %d).";
|
||||
$lang['danger']['mailbox_quota_exceeded'] = "Quotum heeft het domeinlimiet overschreven (max. %d MiB).";
|
||||
$lang['danger']['mailbox_quota_left_exceeded'] = "Onvoldoende ruimte beschikbaar (%d MiB).";
|
||||
$lang['success']['mailbox_added'] = "Postvak %s is toegevoegd.";
|
||||
$lang['success']['domain_removed'] = "Domein %s is verwijderd.";
|
||||
$lang['success']['alias_removed'] = "Aliasadres %s is verwijderd.";
|
||||
$lang['success']['alias_domain_removed'] = "Aliasdomein %s is verwijderd.";
|
||||
$lang['success']['domain_admin_removed'] = "Domeinbeheerder %s is verwijderd.";
|
||||
$lang['success']['mailbox_removed'] = "Postvak %s is verwijderd.";
|
||||
$lang['danger']['max_quota_in_use'] = "Postvakquotum moet >= %d MiB.";
|
||||
$lang['danger']['domain_quota_m_in_use'] = "Domeinquotum moet >= %s MiB.";
|
||||
$lang['danger']['mailboxes_in_use'] = "Maximaal aantal postvakken moet >= %d.";
|
||||
$lang['danger']['aliases_in_use'] = "Maximaal aantal aliassen moet >= %d.";
|
||||
$lang['danger']['sender_acl_invalid'] = "Verzender ACL-waarde is ongeldig.";
|
||||
$lang['danger']['domain_not_empty'] = "Kan domein in gebruik niet verwijderen.";
|
||||
$lang['warning']['spam_alias_temp_error'] = "Tijdelijke fout: Kan geen spam-alias toevoegen. Probeer het later nogmaals.";
|
||||
$lang['danger']['spam_alias_max_exceeded'] = "Maximaal aantal spam-aliassen bereikt.";
|
||||
$lang['danger']['fetchmail_active'] = "Er draait reeds een proces, wacht tot deze klaar is.";
|
||||
$lang['danger']['validity_missing'] = 'Voer een geldigheidstermijn in.';
|
||||
$lang['user']['on'] = "Aan";
|
||||
$lang['user']['off'] = "Uit";
|
||||
$lang['user']['user_change_fn'] = "";
|
||||
$lang['user']['user_settings'] = 'Gebruikersinstellingen';
|
||||
$lang['user']['mailbox_settings'] = 'Postvakinstellingen';
|
||||
$lang['user']['mailbox_details'] = 'Postvakdetails';
|
||||
$lang['user']['change_password'] = 'Verander wachtwoord';
|
||||
$lang['user']['new_password'] = 'Nieuw wachtwoord';
|
||||
$lang['user']['save_changes'] = 'Wijzigingen opslaan';
|
||||
$lang['user']['password_now'] = 'Huidig wachtwoord (bevestig wijzigingen)';
|
||||
$lang['user']['new_password_repeat'] = 'Bevestig wachtwoord (herhalen)';
|
||||
$lang['user']['new_password_description'] = 'Vereisten: 6 karakters lang, letters en nummers.';
|
||||
$lang['user']['did_you_know'] = '<b>Wist u dat?</b> U kunt tags in het e-mailadres gebruiken ("me+<b>prive</b>@voorbeeld.nl") om berichten automatisch naar een bijbehorende map te sturen (voorbeeld: "prive").';
|
||||
$lang['user']['spam_aliases'] = 'Tijdelijk e-mailadres';
|
||||
$lang['user']['alias'] = 'Alias';
|
||||
$lang['user']['alias_create_random'] = 'Creëer willekeurige alias';
|
||||
$lang['user']['alias_extend_all'] = 'Verleng alias met 1 uur';
|
||||
$lang['user']['alias_valid_until'] = 'Geldig tot';
|
||||
$lang['user']['alias_remove_all'] = 'Verwijder alle aliassen';
|
||||
$lang['user']['alias_time_left'] = 'Tijd over';
|
||||
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
|
||||
$lang['user']['alias_select_validity'] = 'Geldigheid';
|
||||
$lang['user']['hour'] = 'Uur';
|
||||
$lang['user']['hours'] = 'Uren';
|
||||
$lang['user']['day'] = 'Dag';
|
||||
$lang['user']['week'] = 'Week';
|
||||
$lang['user']['weeks'] = 'Weken';
|
||||
$lang['user']['spamfilter'] = 'Spam filter';
|
||||
$lang['user']['spamfilter_wl'] = 'Witte lijst';
|
||||
$lang['user']['spamfilter_wl_desc'] = 'Zet e-mailadressen op de witte lijst om ze <b>nooit</b> als spam te classificeren. Wildcards (*) zijn toegestaan.';
|
||||
$lang['user']['spamfilter_bl'] = 'Zwarte lijst';
|
||||
$lang['user']['spamfilter_bl_desc'] = 'E-mailadressen op de zwarte lijst worden <b>altijd</b> als spam geclassificeerd en geweigerd. Wildcards (*) zijn toegestaan.';
|
||||
$lang['user']['spamfilter_behavior'] = 'Beoordeling';
|
||||
$lang['user']['spamfilter_table_rule'] = 'Regel';
|
||||
$lang['user']['spamfilter_table_action'] = 'Handeling';
|
||||
$lang['user']['spamfilter_table_empty'] = 'Geen gegevens om weer te geven.';
|
||||
$lang['user']['spamfilter_table_remove'] = 'verwijder';
|
||||
$lang['user']['spamfilter_table_add'] = 'Voeg item toe';
|
||||
$lang['user']['spamfilter_default_score'] = 'Spamscore:';
|
||||
$lang['user']['spamfilter_green'] = 'Groen: Dit bericht is geen spam.';
|
||||
$lang['user']['spamfilter_yellow'] = 'Geel: Dit bericht is mogelijk spam, zal worden gelabeled en verplaatst worden naar de Junk-map.';
|
||||
$lang['user']['spamfilter_red'] = 'Rood: Dit bericht is spam en zal worden geweigerd.';
|
||||
$lang['user']['spamfilter_default_score'] = 'Standaardwaarden:';
|
||||
$lang['user']['spamfilter_hint'] = 'De eerste waarde omschrijft een "lage spam score", de tweede waarde een "hoge spam score".';
|
||||
|
||||
$lang['user']['tls_policy_warning'] = '<strong>Attentie:</strong> Door versleutelde e-mails te forceren, worden mogelijk niet alle e-mails afgeleverd.<br />Berichten die niet aan het ingestelde beleid voldoen worden resoluut geweigerd (bounced met hard-fail).';
|
||||
$lang['user']['tls_policy'] = 'Versleutelbeleid';
|
||||
$lang['user']['tls_enforce_in'] = 'Forceer TLS-gebruik inkomend';
|
||||
$lang['user']['tls_enforce_out'] = 'Forceer TLS-gebruik uitgaand';
|
||||
$lang['user']['no_record'] = 'Geen vermelding.';
|
||||
|
||||
$lang['user']['misc_settings'] = 'Andere profielinstellingen';
|
||||
$lang['user']['misc_delete_profile'] = 'Andere profielinstellingen';
|
||||
$lang['user']['tag_handling'] = 'Omgaan met e-mail tags';
|
||||
$lang['user']['tag_in_subfolder'] = 'In onderliggende map';
|
||||
$lang['user']['tag_in_subject'] = 'In onderwerp';
|
||||
$lang['user']['tag_help_explain'] = 'In onderliggende map: maakt onder INBOX een nieuwe map aan met de naam van de tag (bijv.: "INBOX/Facebook").<br />
|
||||
In onderwerp: de tag wordt vóór het oorspronkelijke e-mail onderwerp geplaatst (bijv.: "[Facebook] Mijn nieuws").';
|
||||
$lang['user']['tag_help_example'] = 'Voorbeeld van een e-mailadres met tag: ik<b>+Facebook</b>@voorbeeld.org';
|
||||
$lang['start']['dashboard'] = '%s - startpagina';
|
||||
$lang['start']['start_rc'] = 'Open Roundcube';
|
||||
$lang['start']['start_sogo'] = 'Open SOGo';
|
||||
$lang['start']['mailcow_apps_detail'] = 'Gebruik een mailcow app om toegang te hebben tot uw e-mails, kalender, contactpersonen en meer.';
|
||||
$lang['start']['mailcow_panel'] = 'Start mailcow UI';
|
||||
$lang['start']['mailcow_panel_description'] = 'De mailcow UI is beschikbaar voor zowel beheerders als gebruikers.';
|
||||
$lang['start']['mailcow_panel_detail'] = '<b>Domeinbeheerders</b> kunnen postvakken en aliassen aanmaken, wijzigen of verwijderen, domeinen veranderen of informatie krijgen over hun domein.<br />
|
||||
<b>Gebruikers</b> kunnen tijdsgelimiteerde aliassen (spam-aliasses) aanmaken, hun wachtwoord wijzigen en spamfilterinstellingen wijzigen.';
|
||||
$lang['start']['recommended_config'] = 'Aanbevoen instellingen (zonder ActiveSync)';
|
||||
$lang['start']['imap_smtp_server'] = 'IMAP- en SMTP-server gegevens';
|
||||
$lang['start']['imap_smtp_server_description'] = 'Voor de best mogelijke ervaring bevelen wij <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a> aan.';
|
||||
$lang['start']['imap_smtp_server_badge'] = 'Lees/schrijf e-mails';
|
||||
$lang['start']['imap_smtp_server_auth_info'] = 'Gebruik uw volledige e-mailadres en de onversleutelde (PLAIN) verificatiemechanisme.<br />
|
||||
De aanmeldgegevens zullen door de server worden versleuteld.';
|
||||
$lang['start']['managesieve'] = 'ManageSieve';
|
||||
$lang['start']['managesieve_badge'] = 'Emailfilter';
|
||||
$lang['start']['managesieve_description'] = 'Gebruik <b>Mozilla Thunderbird</b> met een <a style="text-decoration:none" target="_blank" href="%s"><b>nightly sieve addon</b></a>.<br />Start Thunderbird, open de add-on instellingen en sleep het gedownloadde xpi-bestand naar dit venster.<br />Servernaam <b>%s</b>, Poort <b>4190</b>. De aanmeldgegevens zijn gelijk aan de gegevens voor uw e-mail.';
|
||||
$lang['start']['service'] = 'Service';
|
||||
$lang['start']['encryption'] = 'Versleutelmethode';
|
||||
$lang['start']['help'] = 'Toon/Verberg Hulppaneel';
|
||||
$lang['start']['hostname'] = 'Hostname';
|
||||
$lang['start']['port'] = 'Poort';
|
||||
$lang['start']['footer'] = '';
|
||||
$lang['header']['mailcow_settings'] = 'Instellingen';
|
||||
$lang['header']['administration'] = 'Beheer';
|
||||
$lang['header']['mailboxes'] = 'Postvakken';
|
||||
$lang['header']['user_settings'] = 'Gebruikersinstellingen';
|
||||
$lang['header']['login'] = 'Aanmelden';
|
||||
$lang['header']['logged_in_as_logout'] = 'Aangemeld als <b>%s</b> (Afmelden)';
|
||||
$lang['header']['locale'] = 'Taal';
|
||||
$lang['mailbox']['domain'] = 'Domein';
|
||||
$lang['mailbox']['alias'] = 'Alias';
|
||||
$lang['mailbox']['aliases'] = 'Aliassen';
|
||||
$lang['mailbox']['domains'] = 'Domeinen';
|
||||
$lang['mailbox']['mailboxes'] = 'Mailboxen';
|
||||
$lang['mailbox']['mailbox_quota'] = 'Max. grootte van een postvak';
|
||||
$lang['mailbox']['domain_quota'] = 'Quotum';
|
||||
$lang['mailbox']['active'] = 'Actief';
|
||||
$lang['mailbox']['action'] = 'Handeling';
|
||||
$lang['mailbox']['ratelimit'] = 'Maximale snelheid uitgaand/uur';
|
||||
$lang['mailbox']['backup_mx'] = 'Backup MX';
|
||||
$lang['mailbox']['domain_aliases'] = 'Domein-aliassen';
|
||||
$lang['mailbox']['target_domain'] = 'Doeldomein';
|
||||
$lang['mailbox']['target_address'] = 'Doeladres';
|
||||
$lang['mailbox']['username'] = 'Gebruikersnaam';
|
||||
$lang['mailbox']['fname'] = 'Volledige naam';
|
||||
$lang['mailbox']['filter_table'] = 'Filter tabel';
|
||||
$lang['mailbox']['yes'] = '✔';
|
||||
$lang['mailbox']['no'] = '✘';
|
||||
$lang['mailbox']['quota'] = 'Quotum';
|
||||
$lang['mailbox']['in_use'] = 'In gebruik (%)';
|
||||
$lang['mailbox']['msg_num'] = 'Berichten #';
|
||||
$lang['mailbox']['remove'] = 'Verwijder';
|
||||
$lang['mailbox']['edit'] = 'Wijzig';
|
||||
$lang['mailbox']['archive'] = 'Archief';
|
||||
$lang['mailbox']['no_record'] = 'Geen vermelding';
|
||||
$lang['mailbox']['add_domain'] = 'Toevoegen domein';
|
||||
$lang['mailbox']['add_domain_alias'] = 'Toevoegen domein-alias';
|
||||
$lang['mailbox']['add_mailbox'] = 'Toevoegen postvak';
|
||||
$lang['mailbox']['add_alias'] = 'Toevoegen alias';
|
||||
|
||||
$lang['info']['no_action'] = 'Geen handelingen uitvoerbaar';
|
||||
|
||||
$lang['delete']['title'] = 'Verwijder object';
|
||||
$lang['delete']['remove_domain_warning'] = '<b>Let op:</b> U staat op het punt domein <b>%s</b> te verwijderen!';
|
||||
$lang['delete']['remove_domainalias_warning'] = '<b>Let op:</b> U staat op het punt domeinalias <b>%s</b> te verwijderen!';
|
||||
$lang['delete']['remove_domainadmin_warning'] = '<b>Let op:</b> U staat op het punt domeinbeheerder <b>%s</b> te verwijderen!';
|
||||
$lang['delete']['remove_alias_warning'] = '<b>Let op:</b> U staat op het punt alias <b>%s</b> te verwijderen!';
|
||||
$lang['delete']['remove_mailbox_warning'] = '<b>Let op::</b> U staat op het punt postvak <b>%s</b> te verwijderen!';
|
||||
$lang['delete']['remove_mailbox_details'] = 'Het postvak zal <b>permanent</b> worden verwijderd!';
|
||||
$lang['delete']['remove_domain_details'] = 'Dit verwijdert ook de domeinaliassen. <br /><br /><b>Een domein moet leeg zijn alvorens deze verwijderd kan worden.</b>';
|
||||
$lang['delete']['remove_alias_details'] = '<b>Gebruikers zullen niet meer in staat zijn e-mails te ontvangen op -of te versturen vanaf- dit adres.</b>';
|
||||
$lang['delete']['remove_button'] = 'Verwijder';
|
||||
$lang['delete']['previous'] = 'Vorige pagina';
|
||||
|
||||
$lang['edit']['save'] = 'Wijzigingen opslaan';
|
||||
$lang['edit']['archive'] = 'Toegang tot archief';
|
||||
$lang['edit']['max_mailboxes'] = 'Max. aantal postvakken:';
|
||||
$lang['edit']['title'] = 'Wijzig object';
|
||||
$lang['edit']['target_address'] = 'Doeladres(sen) <small>(scheiden met komma)</small>:';
|
||||
$lang['edit']['active'] = 'Actief';
|
||||
$lang['edit']['target_domain'] = 'Doeldomein:';
|
||||
$lang['edit']['password'] = 'Wachtwoord:';
|
||||
$lang['edit']['ratelimit'] = 'Uitgaande e-mail beperking (aantal/uur):';
|
||||
$lang['danger']['ratelimt_less_one'] = 'De uitgaande e-mail beperking moet >= 1';
|
||||
$lang['edit']['password_repeat'] = 'Bevestig wachtwoord (herhalen):';
|
||||
$lang['edit']['domain_admin'] = 'Wijzig domeinbeheerder';
|
||||
$lang['edit']['domain'] = 'Wijzig domein';
|
||||
$lang['edit']['alias_domain'] = 'Aliasdomein';
|
||||
$lang['edit']['edit_alias_domain'] = 'Wijzig aliasdomein';
|
||||
$lang['edit']['domains'] = 'Domeinen';
|
||||
$lang['edit']['destroy'] = 'Handmatige invoer';
|
||||
$lang['edit']['alias'] = 'Wijzig alias';
|
||||
$lang['edit']['mailbox'] = 'Wijzig postvak';
|
||||
$lang['edit']['description'] = 'Beschrijving:';
|
||||
$lang['edit']['max_aliases'] = 'Max. aliassen:';
|
||||
$lang['edit']['max_quota'] = 'Max. grootte per postvak (MiB):';
|
||||
$lang['edit']['domain_quota'] = 'Domeinquotum';
|
||||
$lang['edit']['backup_mx_options'] = 'Backup MX opties:';
|
||||
$lang['edit']['relay_domain'] = 'Doorschakeldomein';
|
||||
$lang['edit']['relay_all'] = 'Schakel alle ontvangers door';
|
||||
$lang['edit']['dkim_signature'] = 'DKIM handtekening:';
|
||||
$lang['edit']['dkim_record_info'] = '<small>Voeg de volgende TXT-record toe aan de DNS-instellingen van uw domein.</small>';
|
||||
$lang['edit']['relay_all_info'] = '<small>Indien u ervoor kiest om <b>niet</b> alle ontvangers door te schakelen, dient u per ontvanger die u wenst door te schakelen een (lege) postvak aan te maken.</small>';
|
||||
$lang['edit']['full_name'] = 'Volledige naam';
|
||||
$lang['edit']['quota_mb'] = 'Quotum (MiB)';
|
||||
$lang['edit']['sender_acl'] = 'Toestaan te verzenden als:';
|
||||
$lang['edit']['sender_acl_info'] = 'Aliassen kunnen niet worden deselecteerd.';
|
||||
$lang['edit']['dkim_txt_name'] = 'Naam TXT-record:';
|
||||
$lang['edit']['dkim_txt_value'] = 'Waarde TXT-record:';
|
||||
$lang['edit']['previous'] = 'Vorige pagina';
|
||||
$lang['edit']['unchanged_if_empty'] = 'Leeg laten indien niet veranderd.';
|
||||
$lang['edit']['dont_check_sender_acl'] = 'Geen zenderverificatie uitvoeren voor domein %s.';
|
||||
|
||||
$lang['add']['title'] = 'Object toevoegen';
|
||||
$lang['add']['domain'] = 'Domein';
|
||||
$lang['add']['active'] = 'Actief';
|
||||
$lang['add']['save'] = 'Wijzigingen opslaan';
|
||||
$lang['add']['description'] = 'Beschrijving:';
|
||||
$lang['add']['max_aliases'] = 'Max. aantal aliassen:';
|
||||
$lang['add']['max_mailboxes'] = 'Max. aantal postvakken:';
|
||||
$lang['add']['mailbox_quota_m'] = 'Max. grootte postvak (MiB):';
|
||||
$lang['add']['domain_quota_m'] = 'Totale grootte domein (MiB):';
|
||||
$lang['add']['backup_mx_options'] = 'Backup MX opties:';
|
||||
$lang['add']['relay_all'] = 'Doorschakelen van alle ontvangers';
|
||||
$lang['add']['relay_domain'] = 'Schakel dit domein door';
|
||||
$lang['add']['relay_all_info'] = '<small>Indien u ervoor kiest om <b>niet</b> alle ontvangers door te schakelen, moet u voor iedere ontvanger die u wenst door te schakelen een een (lege) mailbox aanmaken.</small>';
|
||||
$lang['add']['alias'] = 'Alias(sen)';
|
||||
$lang['add']['alias_spf_fail'] = '<b>Opmerking:</b> Als het gekozen doeladres een extern postvak is, kan de <b>ontvangende mailservver</b> mogelijk het bericht weigeren vanwege niet kloppende SPF-gegevens.</a>';
|
||||
$lang['add']['alias_address'] = 'Aliasadres(sen):';
|
||||
$lang['add']['alias_address_info'] = '<small>Volledig(e) emailadres(sen) of @voorbeeld.nl om alle berichten op te vangen van een domein (scheiden met komma). <b>Alleen mailcow-domeinen!</b></small>';
|
||||
$lang['add']['alias_domain_info'] = '<small>Alleen geldige domeinen (scheiden met komma).</small>';
|
||||
$lang['add']['target_address'] = 'Doeladressen:';
|
||||
$lang['add']['target_address_info'] = '<small>Volledig(e) e-mailadres(sen) (scheiden met komma).</small>';
|
||||
$lang['add']['alias_domain'] = 'Aliasdomein';
|
||||
$lang['add']['select'] = 'Kies uit...';
|
||||
$lang['add']['target_domain'] = 'Doeldomein:';
|
||||
$lang['add']['mailbox'] = 'Postvak';
|
||||
$lang['add']['mailbox_username'] = 'Gebruikersnaam (linker deel van het e-mailadres):';
|
||||
$lang['add']['full_name'] = 'Volledige naam:';
|
||||
$lang['add']['quota_mb'] = 'Quotum (MiB):';
|
||||
$lang['add']['select_domain'] = 'Selecteer eerst een domein';
|
||||
$lang['add']['password'] = 'Wachtwoord:';
|
||||
$lang['add']['password_repeat'] = 'Bevestig wachtwoord (herhalen):';
|
||||
$lang['add']['previous'] = 'Vorige pagina';
|
||||
$lang['add']['restart_sogo_hint'] = 'SOGo dient opnieuw te worden gestart nadat een domein is toegevoegd!';
|
||||
|
||||
$lang['login']['title'] = 'Aanmelden';
|
||||
$lang['login']['administration'] = 'Beheer';
|
||||
$lang['login']['administration_details'] = 'Gebruik uw beheerders-login om administratieve taken uit te voeren.';
|
||||
$lang['login']['user_settings'] = 'Gebruikersinstellingen';
|
||||
$lang['login']['user_settings_details'] = 'Mailbox-gebruikers kunnen in het mailcow-gebruikersbeheer hun wachtwoorden wijzigen, tijdelijke aliassen aanmaken (tegengaan van spam), de spamfilter aanpassen of berichten van externe IMAP-servers importeren.';
|
||||
$lang['login']['username'] = 'Gebruikersnaam';
|
||||
$lang['login']['password'] = 'Wachtwoord';
|
||||
$lang['login']['reset_password'] = 'Wijzig mijn wachtwoord';
|
||||
$lang['login']['login'] = 'Aanmelden';
|
||||
$lang['login']['previous'] = "Vorige pagina";
|
||||
$lang['login']['delayed'] = 'Aanmelding met %s sec. vertraagd.';
|
||||
|
||||
$lang['login']['tfa'] = "Two-factor authentication";
|
||||
$lang['login']['tfa_details'] = "Voer uw eenmalige wachtwoord hieronder in.";
|
||||
$lang['login']['confirm'] = "Bevestigen";
|
||||
$lang['login']['otp'] = "Eenmalig wachtwoord";
|
||||
$lang['login']['trash_login'] = "Verwijder login";
|
||||
|
||||
$lang['admin']['search_domain_da'] = 'Doorzoek domeinen';
|
||||
$lang['admin']['restrictions'] = 'Postfix beperkingen';
|
||||
$lang['admin']['rr'] = 'Postfix ontvangersbeperkingen';
|
||||
$lang['admin']['sr'] = 'Postifx verzendersbeperkingen';
|
||||
$lang['admin']['reset_defaults'] = 'Herstel standaardwaarden';
|
||||
$lang['admin']['r_inactive'] = 'Inactieve beperkingen';
|
||||
$lang['admin']['r_active'] = 'Actieve beperkignen';
|
||||
$lang['admin']['r_info'] = 'Grijze, uitgeschakelde, elementen in de lijst met actieve beperkingen zijn voor mailcow niet bekend als valide en kunnen daarom niet verplaatst worden.<br />U kunt nieuwe elementen toevoegen in <code>inc/vars.inc.php</code> om ze te (de)activeren.';
|
||||
$lang['admin']['public_folders'] = 'Gemeenschappelijke mappen';
|
||||
$lang['admin']['public_folders_text'] = 'Een namespace "Public" wordt aangemaakt. Onder deze map worden de automatisch aangemaakte postvakken in deze namespace weergegeven.';
|
||||
$lang['admin']['public_folder_name'] = 'Mapnaam <small>(alphanumeriek)</small>';
|
||||
$lang['admin']['public_folder_enable'] = 'Inschakelen gemeenschappelijke map';
|
||||
$lang['admin']['public_folder_enable_text'] = 'Deze optie uitschakelen verwijderd géén e-mails uit de gemeenschappelijke mappen.';
|
||||
$lang['admin']['public_folder_pusf'] = 'De \'gelezen\'-markering per gebruiker';
|
||||
$lang['admin']['public_folder_pusf_text'] = 'Deze "\'gelezen\'-markering per gebruiker"-optie zorgt ervoor dat er per gebruiker afzonderlijk wordt bepaald of deze het bericht heeft gelezen.';
|
||||
$lang['admin']['privacy'] = 'Privacy';
|
||||
$lang['admin']['privacy_text'] = 'Deze optie activeert een PCRE-tabel die de "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP"-headers verwijderd en de "Received: from"-headers vervangt met localhost/127.0.0.1.';
|
||||
$lang['admin']['privacy_anon_mail'] = 'Anonimiseer uitgaande e-mails';
|
||||
$lang['admin']['dkim_txt_name'] = 'Naam TXT-record:';
|
||||
$lang['admin']['dkim_txt_value'] = 'Waarde TXT-record:';
|
||||
$lang['admin']['dkim_key_length'] = 'DKIM sleutel lengte (bits)';
|
||||
$lang['admin']['previous'] = 'Vorige pagina';
|
||||
$lang['admin']['quota_mb'] = 'Quotum (MiB):';
|
||||
$lang['admin']['sender_acl'] = 'Toestaan te verzenden als:';
|
||||
$lang['admin']['msg_size'] = 'Berichtgrootte';
|
||||
$lang['admin']['msg_size_limit'] = 'Huidige limiet berichtgroote';
|
||||
$lang['admin']['msg_size_limit_details'] = 'Een nieuw limiet doorvoeren zal Postfix en de webserver herladen.';
|
||||
$lang['admin']['save'] = 'Wijzigingen opslaan';
|
||||
$lang['admin']['maintenance'] = 'Onderhoud en informatie';
|
||||
$lang['admin']['sys_info'] = 'Systeeminformatie';
|
||||
$lang['admin']['dkim_add_key'] = 'DKIM-record toevoegen';
|
||||
$lang['admin']['dkim_keys'] = 'DKIM records';
|
||||
$lang['admin']['add'] = 'Toevoegen';
|
||||
$lang['admin']['configuration'] = 'Instellingen';
|
||||
$lang['admin']['password'] = 'Wachtwoord';
|
||||
$lang['admin']['password_repeat'] = 'Bevestig wachtwoord (herhalen)';
|
||||
$lang['admin']['active'] = 'Actief';
|
||||
$lang['admin']['action'] = 'Handeling';
|
||||
$lang['admin']['add_domain_admin'] = 'Voeg domeinbeheerder toe';
|
||||
$lang['admin']['admin_domains'] = 'Toegewezen domein';
|
||||
$lang['admin']['domain_admins'] = 'Domeinbeheerders';
|
||||
$lang['admin']['username'] = 'Gebruikersnaam';
|
||||
$lang['admin']['edit'] = 'Wijzig';
|
||||
$lang['admin']['remove'] = 'Verwijder';
|
||||
$lang['admin']['save'] = 'Wijzigingen opslaan';
|
||||
$lang['admin']['admin'] = 'Beheerder';
|
||||
$lang['admin']['admin_details'] = 'Wijzig details beheerder';
|
||||
$lang['admin']['unchanged_if_empty'] = 'Leeg laten indien onveranderd';
|
||||
$lang['admin']['yes'] = '✔';
|
||||
$lang['admin']['no'] = '✘';
|
||||
$lang['admin']['access'] = 'Toegang';
|
||||
$lang['admin']['invalid_max_msg_size'] = 'Ongeldige max. berichtgrootte';
|
||||
$lang['admin']['site_not_found'] = 'Kan mailcow instellingenbeheer niet vinden';
|
||||
$lang['admin']['public_folder_empty'] = 'Namen van gemeenschappelijke mappen mogen niet leeg blijven.';
|
||||
$lang['admin']['set_rr_failed'] = 'Kan Postfix beperkingen niet opleggen.';
|
||||
$lang['admin']['no_record'] = 'Geen vermelding';
|
||||
?>
|
355
data/web/lang/lang.pt.php
Normal file
355
data/web/lang/lang.pt.php
Normal file
@@ -0,0 +1,355 @@
|
||||
<?php
|
||||
/*
|
||||
//
|
||||
// Portuguese (pt) language file - Português do Brasil (pt_BR) - ISO-8859-1
|
||||
//
|
||||
*/
|
||||
$lang['footer']['loading'] = "Aguarde...";
|
||||
$lang['getmail']['no_status'] = "Nenhum registro anterior encontrado";
|
||||
$lang['dkim']['confirm'] = "Tem certeza?";
|
||||
$lang['danger']['dkim_not_found'] = "Registro DKIM não encontrado";
|
||||
$lang['danger']['dkim_remove_failed'] = "Não foi possível remover o registro DKIM selecionado";
|
||||
$lang['danger']['dkim_add_failed'] = "Não foi possível adicionar o registro DKIM fornecido";
|
||||
$lang['danger']['dkim_domain_or_sel_invalid'] = " Registro DKIM inválido";
|
||||
$lang['danger']['dkim_key_length_invalid'] = "Registro DKIM com tamanho inválido";
|
||||
$lang['success']['dkim_removed'] = " Registro DKIM removido com sucesso";
|
||||
$lang['success']['dkim_added'] = "Registro DKIM salvo com sucesso";
|
||||
$lang['danger']['access_denied'] = "Acesso negado ou dados inválidos";
|
||||
$lang['danger']['domain_invalid'] = "Domínio inválido";
|
||||
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. espaço excede o espaço do domínio";
|
||||
$lang['danger']['object_is_not_numeric'] = "Valor %s não é numérico";
|
||||
$lang['success']['domain_added'] = "Domínio adicionado %s";
|
||||
$lang['danger']['alias_empty'] = "Você deve preencher o campo do Apelido";
|
||||
$lang['danger']['goto_empty'] = "Você deve preencher o campo Encaminhar para";
|
||||
$lang['danger']['blacklist_exists'] = "O registro já existe na BlackList";
|
||||
$lang['danger']['blacklist_from_invalid'] = "O registro Blacklist possui formato inválido";
|
||||
$lang['danger']['whitelist_exists'] = "O registro já existe na WhiteList";
|
||||
$lang['danger']['whitelist_from_invalid'] = "O registro Whitelist possui formato inválido";
|
||||
$lang['danger']['alias_invalid'] = "O endereço digitado como Apelido é inválido";
|
||||
$lang['danger']['goto_invalid'] = "O endereço digitado como Encaminhar para é inválido";
|
||||
$lang['danger']['alias_domain_invalid'] = "O endereço do Encaminhamento de Domínio é inválido";
|
||||
$lang['danger']['target_domain_invalid'] = "O endereço de Domínio Destino é inválido";
|
||||
$lang['danger']['object_exists'] = "Objeto %s já existe";
|
||||
$lang['danger']['domain_exists'] = "Domínio %s já existe";
|
||||
$lang['danger']['alias_goto_identical'] = "o Apelido e o Encaminhar para devem ser diferentes";
|
||||
$lang['danger']['aliasd_targetd_identical'] = "o Encaminhamento de Domínio não pode ser igual ao Domínio Destino";
|
||||
$lang['success']['alias_added'] = "Apelido(s) adicionado(s) com sucesso";
|
||||
$lang['success']['alias_modified'] = "Apelido(s) alterados(s) com sucesso";
|
||||
$lang['success']['aliasd_modified'] = "Direcionamento de Domínio(s) alterados(s) com sucesso";
|
||||
$lang['success']['mailbox_modified'] = "A conta %s foi alterada com sucesso";
|
||||
$lang['success']['msg_size_saved'] = "Limite do tamanho de mensagem ajustado com sucesso";
|
||||
$lang['danger']['aliasd_not_found'] = "Encaminhamento de Domínio não encontrado";
|
||||
$lang['danger']['targetd_not_found'] = "Domínio de Destino não encontrado";
|
||||
$lang['danger']['aliasd_exists'] = "Encaminhamento de Domínio já existe";
|
||||
$lang['success']['aliasd_added'] = "Adicionado Encaminhamento de Domínio %s";
|
||||
$lang['success']['aliasd_modified'] = "Encaminhamento de Domínio %s alterado com sucesso";
|
||||
$lang['success']['domain_modified'] = "Domínio %s alterado com sucesso";
|
||||
$lang['success']['domain_admin_modified'] = "Changes to domain administrator %s have been saved";
|
||||
$lang['success']['domain_admin_added'] = "Domínio administrator %s has been added";
|
||||
$lang['success']['changes_general'] = 'Alteração efetuada com sucesso';
|
||||
$lang['success']['admin_modified'] = "Administrador alterado com sucesso";
|
||||
$lang['danger']['exit_code_not_null'] = "Falha: código de erro %d";
|
||||
$lang['danger']['mailbox_not_available'] = "Conta não disponível";
|
||||
$lang['danger']['username_invalid'] = "Nome de usuário inválido";
|
||||
$lang['danger']['password_mismatch'] = "As senhas não estão iguais";
|
||||
$lang['danger']['password_complexity'] = "A senha não atende aos parâmetros de segurança";
|
||||
$lang['danger']['password_empty'] = "A senha não pode ser vazia ou em branco";
|
||||
$lang['danger']['login_failed'] = "Login falhou";
|
||||
$lang['danger']['mailbox_invalid'] = "Conta inválida";
|
||||
$lang['danger']['mailbox_invalid_suggest'] = 'Conta inválida, sugestão: "%s"?';
|
||||
$lang['info']['fetchmail_planned'] = "Procedimento de retirada de emails foi agendado. Verifique o processo mais tarde.";
|
||||
$lang['danger']['fetchmail_source_empty'] = "Definir a pasta de origem";
|
||||
$lang['danger']['fetchmail_dest_empty'] = "Definir a pasta de destino";
|
||||
$lang['danger']['is_alias'] = "o endereço %s já é um Apelido";
|
||||
$lang['danger']['is_alias_or_mailbox'] = "o endereço %s já é uma Conta ou Apelido";
|
||||
$lang['danger']['is_spam_alias'] = "%s foi registrado como Apelido para Spam";
|
||||
$lang['danger']['quota_not_0_not_numeric'] = "Espaço deve ser um campo numérico >= 0";
|
||||
$lang['danger']['domain_not_found'] = "Domínio não encontrado.";
|
||||
$lang['danger']['max_mailbox_exceeded'] = "Número máximo de contas exedido (%d of %d)";
|
||||
$lang['danger']['mailbox_quota_exceeded'] = "Espaço excede o limite do domínio (max. %d MiB)";
|
||||
$lang['danger']['mailbox_quota_left_exceeded'] = "Não existe espaço suficiente (espaço disponível: %d MiB)";
|
||||
$lang['success']['mailbox_added'] = "Conta %s adicionada com sucesso";
|
||||
$lang['success']['domain_removed'] = "Domínio %s removido com sucesso";
|
||||
$lang['success']['alias_removed'] = "Apelido %s removido com sucesso";
|
||||
$lang['success']['alias_domain_removed'] = "Encaminhamento de Domínio %s removido com sucesso";
|
||||
$lang['success']['domain_admin_removed'] = "Administrator do domínio %s removido com sucesso";
|
||||
$lang['success']['mailbox_removed'] = "Conta %s removida com sucesso";
|
||||
$lang['danger']['max_quota_in_use'] = "Espaço da Conta deve ser maior ou igual a %d MiB";
|
||||
$lang['danger']['domain_quota_m_in_use'] = "Espaço do Domínio deve ser maior ou igual a %s MiB";
|
||||
$lang['danger']['mailboxes_in_use'] = "O máximo de Contas deve ser maior ou igual a %d";
|
||||
$lang['danger']['aliases_in_use'] = "O máximo de Apelidos deve ser maior ou igual a %d";
|
||||
$lang['danger']['sender_acl_invalid'] = "Campo Sender ACL é inválido";
|
||||
$lang['danger']['domain_not_empty'] = "Não é possível remover um domínio com Contas/Apelidos/Direcionamentos";
|
||||
$lang['warning']['spam_alias_temp_error'] = "Falha Temporária: Não foi possível adicionar Apelido para Spam.";
|
||||
$lang['danger']['spam_alias_max_exceeded'] = "O número máximo de Apelidos para Spam foi excedido";
|
||||
$lang['danger']['fetchmail_active'] = "O processo esta em andamento, aguarde o seu término.";
|
||||
$lang['danger']['validity_missing'] = 'Você deve definir um período de validade';
|
||||
$lang['user']['on'] = "On";
|
||||
$lang['user']['off'] = "Off";
|
||||
$lang['user']['user_change_fn'] = "";
|
||||
$lang['user']['user_settings'] = 'Configurações do usuário';
|
||||
$lang['user']['mailbox_settings'] = 'Configrações da conta';
|
||||
$lang['user']['mailbox_details'] = 'Detalhes da conta';
|
||||
$lang['user']['change_password'] = 'Alterar senha';
|
||||
$lang['user']['new_password'] = 'Nova senha';
|
||||
$lang['user']['save_changes'] = 'Salvar';
|
||||
$lang['user']['password_now'] = 'Senha atual (confirme a alteração)';
|
||||
$lang['user']['new_password_repeat'] = 'Confirmar senha (repetir)';
|
||||
$lang['user']['new_password_description'] = 'Requerido: mínimo de 6 characteres com letras e números.';
|
||||
$lang['user']['did_you_know'] = '<b>Você sabia?</b> Você pode usar tags no endereço de email ("conta+<b>privado</b>@example.com") para classificar as mensagens automaticamente para uma determinada pasta (exemplo: "privado").';
|
||||
$lang['user']['spam_aliases'] = 'Apelidos temporários';
|
||||
$lang['user']['alias'] = 'Apelido';
|
||||
$lang['user']['aliases'] = 'Apelidos';
|
||||
$lang['user']['aliases_send_as_all'] = 'Não verificar remetente para os domínios';
|
||||
$lang['user']['alias_create_random'] = 'Gerar um apelido automaticamente';
|
||||
$lang['user']['alias_extend_all'] = 'Extender apelido por 1 hora';
|
||||
$lang['user']['alias_valid_until'] = 'Válido até';
|
||||
$lang['user']['alias_remove_all'] = 'Remover todos os apelidos';
|
||||
$lang['user']['alias_time_left'] = 'Tempo restante';
|
||||
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
|
||||
$lang['user']['alias_select_validity'] = 'Período de validade';
|
||||
$lang['user']['hour'] = 'Hora';
|
||||
$lang['user']['hours'] = 'Horas';
|
||||
$lang['user']['day'] = 'Dia';
|
||||
$lang['user']['week'] = 'Semana';
|
||||
$lang['user']['weeks'] = 'Semanas';
|
||||
$lang['user']['spamfilter'] = 'Filtro de Spam';
|
||||
$lang['user']['spamfilter_wl'] = 'WhiteList';
|
||||
$lang['user']['spamfilter_wl_desc'] = 'Endereços em WhiteList <b>nunca</b> classificar como spam. Pode ser usado coringa *@example.com.';
|
||||
$lang['user']['spamfilter_bl'] = 'BlackList';
|
||||
$lang['user']['spamfilter_bl_desc'] = 'Endereços em BlackList <b>sempre</b> classificar como spam e rejeitar. Pode ser usado coringa *@example.com.';
|
||||
$lang['user']['spamfilter_behavior'] = 'Classificação';
|
||||
$lang['user']['spamfilter_table_rule'] = 'Regra';
|
||||
$lang['user']['spamfilter_table_action'] = 'Ação';
|
||||
$lang['user']['spamfilter_table_empty'] = 'Nenhum registro';
|
||||
$lang['user']['spamfilter_table_remove'] = 'remover';
|
||||
$lang['user']['spamfilter_table_add'] = "Adicionar registro";
|
||||
$lang['user']['spamfilter_behavior'] = 'Verificar';
|
||||
$lang['user']['spamfilter_default_score'] = 'Nivel de Spam:';
|
||||
$lang['user']['spamfilter_green'] = 'Verde: essa mensagem <b>não é</b> spam';
|
||||
$lang['user']['spamfilter_yellow'] = 'Amarelo: essa mensagem <b>pode ser</b> spam, será marcada como spam e classificada na pasta Spam';
|
||||
$lang['user']['spamfilter_red'] = 'Vermelho: essa mensagem <b>é mesmo spam</b> e será rejeitada definitivamente pelo servidor';
|
||||
$lang['user']['spamfilter_default_score'] = 'Valores padrão:';
|
||||
$lang['user']['spamfilter_hint'] = 'O primeiro espaço indica "baixo nível de spam", a segunda representa "alto nível de spam".';
|
||||
$lang['user']['tls_policy_warning'] = '<strong>Aviso:</strong> Se você selecionar para forçar o envio encryptado , alguns emails poderão ser rejeitados.<br />Mensages que não satisfizerem as politicas dos outros servidores serão rejeitadas definitivamente.';
|
||||
$lang['user']['tls_policy'] = 'Regras de Encryptação';
|
||||
$lang['user']['tls_enforce_in'] = 'Forçar TLS na entrada';
|
||||
$lang['user']['tls_enforce_out'] = 'Forçar TLS na saída';
|
||||
$lang['user']['misc_settings'] = 'Outras configurações';
|
||||
$lang['user']['misc_delete_profile'] = 'Outras configurações';
|
||||
$lang['user']['no_record'] = 'Nenhum registro';
|
||||
$lang['start']['dashboard'] = '%s - Painel';
|
||||
$lang['start']['start_rc'] = 'Webmail Roundcube';
|
||||
$lang['start']['start_sogo'] = 'Abrir SOGo';
|
||||
$lang['start']['mailcow_apps_detail'] = 'Use um mailcow app para acessar seus emails, calendário, contatos e outras informações.';
|
||||
$lang['start']['mailcow_panel'] = 'Iniciar mailcow UI';
|
||||
$lang['start']['mailcow_panel_description'] = 'O mailcow UI está disponível para Administradores e Usuários.';
|
||||
$lang['start']['mailcow_panel_detail'] = '<b>Administradores:</b> podem criar, alterar ou apagar contas e apelidos , alterar domínios e outras informações de seus domínios atribuídos.<br />
|
||||
<b>Usuários:</b> podem criar apelidos por tempo determinado , alterar senha e configuração do nível do filtro de spam.';
|
||||
$lang['start']['recommended_config'] = 'Configuração recomendada (sem o ActiveSync)';
|
||||
$lang['start']['imap_smtp_server'] = 'IMAP e SMTP server data';
|
||||
$lang['start']['imap_smtp_server_description'] = 'Para uma melhor utilização use o <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
|
||||
$lang['start']['imap_smtp_server_badge'] = 'Ler/Criar emails';
|
||||
$lang['start']['imap_smtp_server_auth_info'] = 'Utilize o endereço de email completo com o método de autentucação PLAIN.<br />
|
||||
Os dados de login serão encryptados pelo servidor.';
|
||||
$lang['start']['managesieve'] = 'ManageSieve';
|
||||
$lang['start']['managesieve_badge'] = 'Filtro de email';
|
||||
$lang['start']['managesieve_description'] = 'Utilize o <b>Mozilla Thunderbird</b> com a <a style="text-decoration:none" target="_blank" href="%s"><b>extensão para sieve</b></a>.<br />Inicie o Thunderbird, acesse os Complementos e solte o arquivo xpi que foi baixado, na janela aberta.<br />Preencha com o servidor <b>%s</b>, porta <b>4190</b> se for solicitado. Os dados de acesso são os mesmos da sua conta de email.';
|
||||
$lang['start']['service'] = 'Serviço';
|
||||
$lang['start']['encryption'] = 'Método de criptografia';
|
||||
$lang['start']['help'] = 'Mostrar/Ocultar painel de ajuda';
|
||||
$lang['start']['hostname'] = 'Hostname';
|
||||
$lang['start']['port'] = 'Porta';
|
||||
$lang['start']['footer'] = 'Rodapé';
|
||||
$lang['header']['mailcow_settings'] = 'Configuração';
|
||||
$lang['header']['administration'] = 'Administração';
|
||||
$lang['header']['mailboxes'] = 'Contas';
|
||||
$lang['header']['user_settings'] = 'Configurações do usuário';
|
||||
$lang['header']['login'] = 'Entrar';
|
||||
$lang['header']['logged_in_as_logout'] = 'Olá <b>%s</b> (Clique para Sair)';
|
||||
$lang['header']['locale'] = 'Idioma';
|
||||
$lang['mailbox']['domain'] = 'Domínio';
|
||||
$lang['mailbox']['alias'] = 'Apelido';
|
||||
$lang['mailbox']['aliases'] = 'Apelidos';
|
||||
$lang['mailbox']['domains'] = 'Domínios';
|
||||
$lang['mailbox']['mailboxes'] = 'Contas';
|
||||
$lang['mailbox']['mailbox_quota'] = 'Espaço máximo da Conta';
|
||||
$lang['mailbox']['domain_quota'] = 'Espaço';
|
||||
$lang['mailbox']['active'] = 'Ativo';
|
||||
$lang['mailbox']['action'] = 'Ação';
|
||||
$lang['mailbox']['ratelimit'] = 'Limite de envios por hora';
|
||||
$lang['mailbox']['backup_mx'] = 'Backup MX';
|
||||
$lang['mailbox']['domain_aliases'] = 'Encaminhamento de Domínio';
|
||||
$lang['mailbox']['target_domain'] = 'Domínio Destino';
|
||||
$lang['mailbox']['target_address'] = 'Encaminhar para';
|
||||
$lang['mailbox']['username'] = 'Usuário';
|
||||
$lang['mailbox']['fname'] = 'Nome';
|
||||
$lang['mailbox']['filter_table'] = 'Procurar';
|
||||
$lang['mailbox']['yes'] = '✔';
|
||||
$lang['mailbox']['no'] = '✘';
|
||||
$lang['mailbox']['quota'] = 'Espaço';
|
||||
$lang['mailbox']['in_use'] = 'Em uso (%)';
|
||||
$lang['mailbox']['msg_num'] = 'Mensagens';
|
||||
$lang['mailbox']['remove'] = 'Remover';
|
||||
$lang['mailbox']['edit'] = 'Alterar';
|
||||
$lang['mailbox']['archive'] = 'Arquivo';
|
||||
$lang['mailbox']['no_record'] = 'Nenhum registro';
|
||||
$lang['mailbox']['add_domain'] = 'Adicionar Domínio';
|
||||
$lang['mailbox']['add_domain_alias'] = 'Adicionar Apelido de Domínio';
|
||||
$lang['mailbox']['add_mailbox'] = 'Adicionar Conta de Email';
|
||||
$lang['mailbox']['add_alias'] = 'Adicionar Apelido';
|
||||
$lang['info']['no_action'] = 'Nenhuma ação foi definida';
|
||||
$lang['delete']['title'] = 'Remover objeto';
|
||||
$lang['delete']['remove_domain_warning'] = '<b>Aviso:</b> Você está prestes a remover o Domínio <b>%s</b>!';
|
||||
$lang['delete']['remove_domainalias_warning'] = '<b>Aviso:</b> Você está prestes a remover o Encaminhamento de Domínio <b>%s</b>!';
|
||||
$lang['delete']['remove_domainadmin_warning'] = '<b>Aviso:</b> Você está prestes a remover o Administrador <b>%s</b>!';
|
||||
$lang['delete']['remove_alias_warning'] = '<b>Aviso:</b> Você está prestes a remover o Apelido <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_warning'] = '<b>Aviso:</b> Você está prestes a remover a Conta <b>%s</b>!';
|
||||
$lang['delete']['remove_mailbox_details'] = 'A Conta será <b>excluída permanentemente</b>!';
|
||||
$lang['delete']['remove_domain_details'] = 'Esse procedimento removerá o Encaminhamento de Domínio.<br /><br /><b>O Domínio deve estar sem nenhuma configuração para ser removido.</b>';
|
||||
$lang['delete']['remove_alias_details'] = 'Os usuários não poderão mais enviar ou receber emails através deste endereço.</b>';
|
||||
$lang['delete']['remove_button'] = 'Remover';
|
||||
$lang['delete']['previous'] = 'Voltar';
|
||||
$lang['edit']['save'] = 'Salvar';
|
||||
$lang['edit']['archive'] = 'Acesso ao arquivo';
|
||||
$lang['edit']['max_mailboxes'] = 'Máximo de contas:';
|
||||
$lang['edit']['title'] = 'Editar dos Objetos';
|
||||
$lang['edit']['target_address'] = 'Enviar para os emails <small>(separar por vírgula)</small>:';
|
||||
$lang['edit']['active'] = 'Ativo';
|
||||
$lang['edit']['target_domain'] = 'Domínio de Destino:';
|
||||
$lang['edit']['password'] = 'Senha:';
|
||||
$lang['edit']['ratelimit'] = 'Volume de envios por hora:';
|
||||
$lang['danger']['ratelimt_less_one'] = 'Limite da taxa de saída por hora não pode ser inferior a 1';
|
||||
$lang['edit']['password_repeat'] = 'Confirmar senha (repetir):';
|
||||
$lang['edit']['domain_admin'] = 'Editar administrador de domínio';
|
||||
$lang['edit']['domain'] = 'Editar domínio';
|
||||
$lang['edit']['alias_domain'] = 'Encaminhar domínio';
|
||||
$lang['edit']['edit_alias_domain'] = 'Editar encaminhamento de domínio';
|
||||
$lang['edit']['domains'] = 'Domínios';
|
||||
$lang['edit']['destroy'] = 'Inserir manualmente';
|
||||
$lang['edit']['alias'] = 'Editar apelido';
|
||||
$lang['edit']['mailbox'] = 'Editar conta';
|
||||
$lang['edit']['description'] = 'Descrição:';
|
||||
$lang['edit']['max_aliases'] = 'Máximo apelidos:';
|
||||
$lang['edit']['max_quota'] = 'Máximo espaço por conta (MiB):';
|
||||
$lang['edit']['domain_quota'] = 'Espaço do domínio:';
|
||||
$lang['edit']['backup_mx_options'] = 'Opções de Backup MX:';
|
||||
$lang['edit']['relay_domain'] = 'Relay de domínio';
|
||||
$lang['edit']['relay_all'] = 'Relay para todas as contas';
|
||||
$lang['edit']['dkim_signature'] = 'Assinatura DKIM:';
|
||||
$lang['edit']['dkim_record_info'] = '<small>Adicione um registro TXT com o mesmo a mesma configuração dos registros DNS.</small>';
|
||||
$lang['edit']['relay_all_info'] = '<small>Se você escolher <b>não</b> direcionar todas as contas de email, você deve adicionar um ("blind") para cada uma das contas.</small>';
|
||||
$lang['edit']['full_name'] = 'Nome completo';
|
||||
$lang['edit']['quota_mb'] = 'Espaço (MiB)';
|
||||
$lang['edit']['sender_acl'] = 'Permitir Enviar como';
|
||||
$lang['edit']['sender_acl_info'] = 'Apelidos não podem ser removidos.';
|
||||
$lang['edit']['dkim_txt_name'] = 'Nome do registro TXT:';
|
||||
$lang['edit']['dkim_txt_value'] = 'Valor do registro TXT:';
|
||||
$lang['edit']['previous'] = 'Voltar';
|
||||
$lang['edit']['unchanged_if_empty'] = 'Deixar em branco para não modificar';
|
||||
$lang['edit']['dont_check_sender_acl'] = 'Não verificar o remetente para o domínio %s';
|
||||
$lang['add']['title'] = 'Adicionar objeto';
|
||||
$lang['add']['domain'] = 'Domínio';
|
||||
$lang['add']['active'] = 'Ativo';
|
||||
$lang['add']['save'] = 'Salvar';
|
||||
$lang['add']['description'] = 'Descrição:';
|
||||
$lang['add']['max_aliases'] = 'Máximo de apelidos:';
|
||||
$lang['add']['max_mailboxes'] = 'Máximo de contas:';
|
||||
$lang['add']['mailbox_quota_m'] = 'Máximo espaço por conta (MiB):';
|
||||
$lang['add']['domain_quota_m'] = 'Total de espaço por domínio(MiB):';
|
||||
$lang['add']['backup_mx_options'] = 'Opções Backup MX:';
|
||||
$lang['add']['relay_all'] = 'Relay para todas as contas';
|
||||
$lang['add']['relay_domain'] = 'Relay para todo domínio';
|
||||
$lang['add']['relay_all_info'] = '<small>Se <b>não</b> selecionar para retransmitir todas as contas, você deve adicionar uma ("blind") para cada conta que será direcionada.</small>';
|
||||
$lang['add']['alias'] = 'Apelido(s)';
|
||||
$lang['add']['alias_spf_fail'] = '<b>Aviso:</b> Se você escolher uma conta externa, o <b>servidor externo</b> poderá rejeitar algumas mensagens por erro de SPF.</a>';
|
||||
$lang['add']['alias_address'] = 'Apelidos:';
|
||||
$lang['add']['alias_address_info'] = '<small>Endereço de email completo ou @example.com, para uma conta coringa -catch all. (separado por vírgula). <b>apenas domínios cadastrados</b>.</small>';
|
||||
$lang['add']['alias_domain_info'] = '<small>Domínios válidos apenas (separado por vírgulas).</small>';
|
||||
$lang['add']['target_address'] = 'Encaminhar para:';
|
||||
$lang['add']['target_address_info'] = '<small>Endereço de email completo (separado por vírgulas).</small>';
|
||||
$lang['add']['alias_domain'] = 'Encaminhamento de Domínio';
|
||||
$lang['add']['select'] = 'Selecione...';
|
||||
$lang['add']['target_domain'] = 'Domínio de Destino:';
|
||||
$lang['add']['mailbox'] = 'Conta';
|
||||
$lang['add']['mailbox_username'] = 'Usuário (primeira parte do endereço de email):';
|
||||
$lang['add']['full_name'] = 'Nome:';
|
||||
$lang['add']['quota_mb'] = 'Espaço (MiB):';
|
||||
$lang['add']['select_domain'] = 'Selecione um domínio antes';
|
||||
$lang['add']['password'] = 'Senha:';
|
||||
$lang['add']['password_repeat'] = 'Confirmar a senha (repetir):';
|
||||
$lang['add']['previous'] = 'Voltar';
|
||||
$lang['login']['title'] = 'Entrar';
|
||||
$lang['login']['administration'] = 'Administração';
|
||||
$lang['login']['administration_details'] = 'Utilize o login de Administrador para efetuar tarefas de administração.';
|
||||
$lang['login']['user_settings'] = 'Configuração do usuário';
|
||||
$lang['login']['user_settings_details'] = 'Usuários podem utilizar o mailcow UI para alterar suas senhas, criar apelidos temporários (Apelido Anti-Spam), adjustar a sensibilidade do filtro the spam ou importar mensagens de um servidor IMAP.';
|
||||
$lang['login']['username'] = 'Usuário';
|
||||
$lang['login']['password'] = 'Senha';
|
||||
$lang['login']['reset_password'] = 'Esqueci minha senha';
|
||||
$lang['login']['login'] = 'Entrar';
|
||||
$lang['login']['previous'] = "Voltar";
|
||||
$lang['login']['delayed'] = 'Sua entrada será atrasada por %s segundos.';
|
||||
$lang['login']['tfa'] = "Autenticação em duas etapas";
|
||||
$lang['login']['tfa_details'] = "Confirme sua senha no campo abaixo";
|
||||
$lang['login']['confirm'] = "Confirmar";
|
||||
$lang['login']['otp'] = "Senha única";
|
||||
$lang['login']['trash_login'] = "Tentativas de entrada";
|
||||
$lang['admin']['search_domain_da'] = 'Selecione o(s) domínio(s)';
|
||||
$lang['admin']['restrictions'] = 'Postfix Restrictions';
|
||||
$lang['admin']['rr'] = 'Postfix Recipient Restrictions';
|
||||
$lang['admin']['sr'] = 'Postfix Sender Restrictions';
|
||||
$lang['admin']['reset_defaults'] = 'Voltar configuração padrão';
|
||||
$lang['admin']['sr'] = 'Postfix Sender Restrictions';
|
||||
$lang['admin']['r_inactive'] = 'Restrictions Inativos';
|
||||
$lang['admin']['r_active'] = 'Restrictions Ativos';
|
||||
$lang['admin']['r_info'] = 'Greyed out/disabled elements on the list of active restrictions are not known as valid restrictions to mailcow and cannot be moved. Unknown restrictions will be set in order of appearance anyway. <br />You can add new elements in <code>inc/vars.local.inc.php</code> to be able to toggle them.';
|
||||
$lang['admin']['public_folders'] = 'Pastas públicas';
|
||||
$lang['admin']['public_folders_text'] = 'A pasta "Public" esta criada. Abaixo a pasta pública indica o nome da primeira pasta criada automaticamente na conta, com este nome.';
|
||||
$lang['admin']['public_folder_name'] = 'Nome da Pasta <small>(alfa numérico)</small>';
|
||||
$lang['admin']['public_folder_enable'] = 'Habilitar Pasta Pública';
|
||||
$lang['admin']['public_folder_enable_text'] = 'Ao alterar esta configuração os emails das pastas públicas não serão apagados.';
|
||||
$lang['admin']['public_folder_pusf'] = 'Habilitar visualização por usuário';
|
||||
$lang['admin']['public_folder_pusf_text'] = 'A "per-user seen flag"-enabled system will not mark a mail as read for User B, when User A has seen it, but User B did not.';
|
||||
$lang['admin']['privacy'] = 'Privacidade';
|
||||
$lang['admin']['privacy_text'] = 'Esta opção habilita a tabela PCRE para remover "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" e substitui pelo Header "Received: from" localhost/127.0.0.1.';
|
||||
$lang['admin']['privacy_anon_mail'] = 'Limpar o Cabeçalho dos emails de saída';
|
||||
$lang['admin']['dkim_txt_name'] = 'Registro TXT:';
|
||||
$lang['admin']['dkim_txt_value'] = 'Valor do TXT:';
|
||||
$lang['admin']['dkim_key_length'] = 'Tamanho do registro DKIM (bits)';
|
||||
$lang['admin']['previous'] = 'Voltar';
|
||||
$lang['admin']['quota_mb'] = 'Espaço (MiB):';
|
||||
$lang['admin']['sender_acl'] = 'Permitir Enviar como:';
|
||||
$lang['admin']['msg_size'] = 'Tamanho da mensagem';
|
||||
$lang['admin']['msg_size_limit'] = 'Tamanho limite de mensagem atual';
|
||||
$lang['admin']['msg_size_limit_details'] = 'Ao aplicar um novo limite os Serviços de Email e Web serão reiniciados.';
|
||||
$lang['admin']['save'] = 'Salvar';
|
||||
$lang['admin']['maintenance'] = 'Manutenção e Informação';
|
||||
$lang['admin']['sys_info'] = 'Informações de Sistema';
|
||||
$lang['admin']['dkim_add_key'] = 'Adicionar registro DKIM';
|
||||
$lang['admin']['dkim_keys'] = 'Registro DKIM';
|
||||
$lang['admin']['add'] = 'Salvar';
|
||||
$lang['admin']['configuration'] = 'Configuração';
|
||||
$lang['admin']['password'] = 'Senha';
|
||||
$lang['admin']['password_repeat'] = 'Confirmar senha (repetir)';
|
||||
$lang['admin']['active'] = 'Ativo';
|
||||
$lang['admin']['action'] = 'Ação';
|
||||
$lang['admin']['add_domain_admin'] = 'Adicionar administrador de domínio(s)';
|
||||
$lang['admin']['admin_domains'] = 'Acesso aos Domínios';
|
||||
$lang['admin']['domain_admins'] = 'Administradores de domínio';
|
||||
$lang['admin']['username'] = 'Administrador';
|
||||
$lang['admin']['edit'] = 'Editar';
|
||||
$lang['admin']['remove'] = 'Remover';
|
||||
$lang['admin']['save'] = 'Salvar';
|
||||
$lang['admin']['admin'] = 'Administrador';
|
||||
$lang['admin']['admin_details'] = 'Editar informações do administrator';
|
||||
$lang['admin']['unchanged_if_empty'] = 'Deixar em branco para não alterar';
|
||||
$lang['admin']['yes'] = '✔';
|
||||
$lang['admin']['no'] = '✘';
|
||||
$lang['admin']['access'] = 'Acessos';
|
||||
$lang['admin']['invalid_max_msg_size'] = 'Tamanho máximo da mensagem inválido';
|
||||
$lang['admin']['site_not_found'] = 'Não foi possível localizar as configuração do painel mailcow';
|
||||
$lang['admin']['public_folder_empty'] = 'O nome da Pasta Pública deve ser preenchido';
|
||||
$lang['admin']['set_rr_failed'] = 'Não foi possível alterar Postfix Restrictions';
|
||||
$lang['admin']['no_record'] = 'Nenhum registro';
|
||||
?>
|
426
data/web/mailbox.php
Normal file
426
data/web/mailbox.php
Normal file
@@ -0,0 +1,426 @@
|
||||
<?php
|
||||
require_once "inc/prerequisites.inc.php";
|
||||
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
require_once "inc/header.inc.php";
|
||||
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||
?>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['mailbox']['domains'];?> <span class="badge" id="numRowsDomain"></span></h3>
|
||||
<div class="pull-right">
|
||||
<span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
|
||||
<i class="glyphicon glyphicon-filter"></i>
|
||||
</span>
|
||||
<?php
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin"):
|
||||
?>
|
||||
<a href="/add.php?domain"><span class="glyphicon glyphicon-plus"></span></a>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<input type="text" class="form-control" id="domaintable-filter" data-action="filter" data-filters="#domaintable" placeholder="Filter" />
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped sortable-theme-bootstrap" data-sortable id="domaintable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
|
||||
<th class="sort-table" style="min-width: 81px;"><?=$lang['mailbox']['aliases'];?></th>
|
||||
<th class="sort-table" style="min-width: 99px;"><?=$lang['mailbox']['mailboxes'];?></th>
|
||||
<th class="sort-table" style="min-width: 172px;"><?=$lang['mailbox']['mailbox_quota'];?></th>
|
||||
<th class="sort-table" style="min-width: 117px;"><?=$lang['mailbox']['domain_quota'];?></th>
|
||||
<?php
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin"):
|
||||
?>
|
||||
<th class="sort-table" style="min-width: 105px;"><?=$lang['mailbox']['backup_mx'];?></th>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
<th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
|
||||
<th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$domains = mailbox_get_domains();
|
||||
if (!empty($domains)):
|
||||
foreach ($domains as $domain):
|
||||
$domaindata = mailbox_get_domain_details($domain);
|
||||
?>
|
||||
<tr id="data">
|
||||
<td><?=htmlspecialchars($domaindata['domain_name']);?></td>
|
||||
<td><?=$domaindata['aliases_in_domain'];?> / <?=$domaindata['max_num_aliases_for_domain'];?></td>
|
||||
<td><?=$domaindata['mboxes_in_domain'];?> / <?=$domaindata['max_num_mboxes_for_domain'];?></td>
|
||||
<td><?=formatBytes($domaindata['max_quota_for_mbox']);?></td>
|
||||
<td><?=formatBytes($domaindata['quota_used_in_domain'], 2);?> / <?=formatBytes($domaindata['max_quota_for_domain'], 2);?></td>
|
||||
<?php
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin"):
|
||||
?>
|
||||
<td><?=$domaindata['backupmx'];?></td>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
<td><?=$domaindata['active'];?></td>
|
||||
<?php
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin"):
|
||||
?>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="/edit.php?domain=<?=urlencode($domaindata['domain_name']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
|
||||
<a href="/delete.php?domain=<?=urlencode($domaindata['domain_name']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
|
||||
</div>
|
||||
</td>
|
||||
<?php
|
||||
else:
|
||||
?>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="/edit.php?domain=<?=urlencode($domaindata['domain_name']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
endif;
|
||||
endforeach;
|
||||
else:
|
||||
?>
|
||||
<tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=$lang['mailbox']['no_record_single'];?></td></tr>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</tbody>
|
||||
<?php
|
||||
if ($_SESSION['mailcow_cc_role'] == "admin"):
|
||||
?>
|
||||
<tfoot>
|
||||
<tr id="no-data">
|
||||
<td colspan="8" style="text-align: center; font-style: normal; border-top: 1px solid #e7e7e7;">
|
||||
<a href="/add.php?domain"><?=$lang['mailbox']['add_domain'];?></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['mailbox']['mailboxes'];?> <span class="badge" id="numRowsMailbox"></span></h3>
|
||||
<div class="pull-right">
|
||||
<span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
|
||||
<i class="glyphicon glyphicon-filter"></i>
|
||||
</span>
|
||||
<a href="/add.php?mailbox"><span class="glyphicon glyphicon-plus"></span></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<input type="text" class="form-control" id="mailboxtable-filter" data-action="filter" data-filters="#mailboxtable" placeholder="Filter" />
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped sortable-theme-bootstrap" data-sortable id="mailboxtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sort-table" style="min-width: 100px;"><?=$lang['mailbox']['username'];?></th>
|
||||
<th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['fname'];?></th>
|
||||
<th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
|
||||
<th class="sort-table" style="min-width: 75px;"><?=$lang['mailbox']['quota'];?></th>
|
||||
<th class="sort-table" style="min-width: 99px;"><?=$lang['mailbox']['in_use'];?></th>
|
||||
<th class="sort-table" style="min-width: 100px;"><?=$lang['mailbox']['msg_num'];?></th>
|
||||
<th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
|
||||
<th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach (mailbox_get_domains() as $domain) {
|
||||
$mailboxes = mailbox_get_mailboxes($domain);
|
||||
if (!empty($mailboxes)) {
|
||||
foreach ($mailboxes as $mailbox) {
|
||||
$mailboxdata = mailbox_get_mailbox_details($mailbox);
|
||||
?>
|
||||
<tr id="data">
|
||||
<td><?=($mailboxdata['is_relayed'] == "0") ? htmlspecialchars($mailboxdata['username']) : '<span data-toggle="tooltip" title="Relayed"><i class="glyphicon glyphicon-forward"></i>' . htmlspecialchars($mailboxdata['username']) . '</span>';?></td>
|
||||
<td><?=htmlspecialchars($mailboxdata['name'], ENT_QUOTES, 'UTF-8');?></td>
|
||||
<td><?=htmlspecialchars($mailboxdata['domain']);?></td>
|
||||
<td><?=formatBytes($mailboxdata['quota_used'], 2);?> / <?=formatBytes($mailboxdata['quota'], 2);?></td>
|
||||
<td style="min-width:120px;">
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-<?=$mailboxdata['percent_class'];?>" role="progressbar" aria-valuenow="<?=$mailboxdata['percent_in_use'];?>" aria-valuemin="0" aria-valuemax="100" style="min-width:2em;width: <?=$mailboxdata['percent_in_use'];?>%;">
|
||||
<?=$mailboxdata['percent_in_use'];?>%
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td><?=$mailboxdata['messages'];?></td>
|
||||
<td><?=$mailboxdata['active'];?></td>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="/edit.php?mailbox=<?=urlencode($mailboxdata['username']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
|
||||
<a href="/delete.php?mailbox=<?=urlencode($mailboxdata['username']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
|
||||
<?php if ($_SESSION['mailcow_cc_role'] == "admin"): ?>
|
||||
<a href="/index.php?duallogin=<?=urlencode($mailboxdata['username']);?>" class="btn btn-xs btn-success"><span class="glyphicon glyphicon-user"></span> Login</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr id="no-data">
|
||||
<td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
|
||||
<a href="/add.php?mailbox"><?=$lang['mailbox']['add_mailbox'];?></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['mailbox']['resources'];?> <span class="badge" id="numRowsResource"></span></h3>
|
||||
<div class="pull-right">
|
||||
<span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
|
||||
<i class="glyphicon glyphicon-filter"></i>
|
||||
</span>
|
||||
<a href="/add.php?resource"><span class="glyphicon glyphicon-plus"></span></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<input type="text" class="form-control" id="resourcetable-filter" data-action="filter" data-filters="#resourcetable" placeholder="Filter" />
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped sortable-theme-bootstrap" data-sortable id="resourcetable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['description'];?></th>
|
||||
<th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['kind'];?></th>
|
||||
<th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
|
||||
<th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['multiple_bookings'];?></th>
|
||||
<th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
|
||||
<th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach (mailbox_get_domains() as $domain) {
|
||||
$resources = mailbox_get_resources($domain);
|
||||
if (!empty($resources)) {
|
||||
foreach ($resources as $resource) {
|
||||
$resourcedata = mailbox_get_resource_details($resource);
|
||||
?>
|
||||
<tr id="data">
|
||||
<td><?=htmlspecialchars($resourcedata['description'], ENT_QUOTES, 'UTF-8');?></td>
|
||||
<td><?=$resourcedata['kind'];?></td>
|
||||
<td><?=htmlspecialchars($resourcedata['domain']);?></td>
|
||||
<td><?=$resourcedata['multiple_bookings'];?></td>
|
||||
<td><?=$resourcedata['active'];?></td>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="/edit.php?resource=<?=urlencode($resourcedata['name']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
|
||||
<a href="/delete.php?resource=<?=urlencode($resourcedata['name']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr id="no-data">
|
||||
<td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
|
||||
<a href="/add.php?resource"><?=$lang['mailbox']['add_resource'];?></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['mailbox']['domain_aliases'];?> <span class="badge" id="numRowsDomainAlias"></span></h3>
|
||||
<div class="pull-right">
|
||||
<span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
|
||||
<i class="glyphicon glyphicon-filter"></i>
|
||||
</span>
|
||||
<a href="/add.php?aliasdomain"><span class="glyphicon glyphicon-plus"></span></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<input type="text" class="form-control" id="domainaliastable-filter" data-action="filter" data-filters="#domainaliastable" placeholder="Filter" />
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped sortable-theme-bootstrap" data-sortable id="domainaliastable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sort-table" style="min-width: 67px;"><?=$lang['mailbox']['alias'];?></th>
|
||||
<th class="sort-table" style="min-width: 127px;"><?=$lang['mailbox']['target_domain'];?></th>
|
||||
<th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
|
||||
<th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach (mailbox_get_domains() as $domain) {
|
||||
$alias_domains = mailbox_get_alias_domains($domain);
|
||||
if (!empty($alias_domains)) {
|
||||
foreach ($alias_domains as $alias_domain) {
|
||||
$aliasdomaindata = mailbox_get_alias_domain_details($alias_domain);
|
||||
?>
|
||||
<tr id="data">
|
||||
<td><?=htmlspecialchars($aliasdomaindata['alias_domain']);?></td>
|
||||
<td><?=htmlspecialchars($aliasdomaindata['target_domain']);?></td>
|
||||
<td><?=$aliasdomaindata['active'];?></td>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="/edit.php?aliasdomain=<?=urlencode($aliasdomaindata['alias_domain']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
|
||||
<a href="/delete.php?aliasdomain=<?=urlencode($aliasdomaindata['alias_domain']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr id="no-data">
|
||||
<td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
|
||||
<a href="/add.php?aliasdomain"><?=$lang['mailbox']['add_domain_alias'];?></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title"><?=$lang['mailbox']['aliases'];?> <span class="badge" id="numRowsAlias"></span></h3>
|
||||
<div class="pull-right">
|
||||
<span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
|
||||
<i class="glyphicon glyphicon-filter"></i>
|
||||
</span>
|
||||
<a href="/add.php?alias"><span class="glyphicon glyphicon-plus"></span></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<input type="text" class="form-control" id="aliastable-filter" data-action="filter" data-filters="#aliastable" placeholder="Filter" />
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped sortable-theme-bootstrap" data-sortable id="aliastable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sort-table" style="min-width: 67px;"><?=$lang['mailbox']['alias'];?></th>
|
||||
<th class="sort-table" style="min-width: 119px;"><?=$lang['mailbox']['target_address'];?></th>
|
||||
<th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
|
||||
<th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
|
||||
<th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach (array_merge(mailbox_get_domains(), mailbox_get_alias_domains()) as $domain) {
|
||||
$aliases = mailbox_get_aliases($domain);
|
||||
if (!empty($aliases)) {
|
||||
foreach ($aliases as $alias) {
|
||||
$aliasdata = mailbox_get_alias_details($alias);
|
||||
?>
|
||||
<tr id="data">
|
||||
<td>
|
||||
<?= ($aliasdata['is_catch_all'] == "1") ? '<span class="glyphicon glyphicon-pushpin" aria-hidden="true"></span> Catch-all ' . htmlspecialchars($aliasdata['address']) : htmlspecialchars($aliasdata['address']); ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php
|
||||
foreach(explode(",", $aliasdata['goto']) as $goto) {
|
||||
echo nl2br(htmlspecialchars($goto.PHP_EOL));
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td><?=htmlspecialchars($aliasdata['domain']);?></td>
|
||||
<td><?=$aliasdata['active'];?></td>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="/edit.php?alias=<?=urlencode($aliasdata['address']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
|
||||
<a href="/delete.php?alias=<?=urlencode($aliasdata['address']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr id="no-data">
|
||||
<td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
|
||||
<a href="/add.php?alias"><?=$lang['mailbox']['add_alias'];?></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- /container -->
|
||||
<script src="js/sorttable.js"></script>
|
||||
<script src="js/mailbox.js"></script>
|
||||
<?php
|
||||
require_once("inc/footer.inc.php");
|
||||
} else {
|
||||
header('Location: /');
|
||||
exit();
|
||||
}
|
||||
?>
|
2
data/web/robots.txt
Normal file
2
data/web/robots.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow: /
|
157
data/web/u2f_api.php
Normal file
157
data/web/u2f_api.php
Normal file
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
require_once('inc/prerequisites.inc.php');
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
|
||||
|
||||
$scheme = isset($_SERVER['HTTPS']) ? "https://" : "http://";
|
||||
$u2f = new u2flib_server\U2F($scheme . $_SERVER['HTTP_HOST']);
|
||||
|
||||
function getRegs($username) {
|
||||
global $pdo;
|
||||
$sel = $pdo->prepare("select * from tfa where username = ?");
|
||||
$sel->execute(array($username));
|
||||
return $sel->fetchAll();
|
||||
}
|
||||
function addReg($username, $reg) {
|
||||
global $pdo;
|
||||
$ins = $pdo->prepare("INSERT INTO `tfa` (`username`, `keyHandle`, `publicKey`, `certificate`, `counter`) values (?, ?, ?, ?, ?)");
|
||||
$ins->execute(array($username, $reg->keyHandle, $reg->publicKey, $reg->certificate, $reg->counter));
|
||||
}
|
||||
function updateReg($reg) {
|
||||
global $pdo;
|
||||
$upd = $pdo->prepare("update tfa set counter = ? where id = ?");
|
||||
$upd->execute(array($reg->counter, $reg->id));
|
||||
}
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<script src="js/u2f-api.js"></script>
|
||||
<?php
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
if ((empty($_POST['u2f_username'])) || (!isset($_POST['action']) && !isset($_POST['u2f_register_data']) && !isset($_POST['u2f_auth_data']))) {
|
||||
print_r($_POST);
|
||||
exit();
|
||||
}
|
||||
else {
|
||||
$username = $_POST['u2f_username'];
|
||||
if (isset($_POST['action'])) {
|
||||
switch($_POST['action']) {
|
||||
case 'register':
|
||||
try {
|
||||
$data = $u2f->getRegisterData(getRegs($username));
|
||||
list($req, $sigs) = $data;
|
||||
$_SESSION['regReq'] = json_encode($req);
|
||||
?>
|
||||
<script>
|
||||
var req = <?=json_encode($req);?>;
|
||||
var sigs = <?=json_encode($sigs);?>;
|
||||
var username = "<?=$username;?>";
|
||||
setTimeout(function() {
|
||||
console.log("Register: ", req);
|
||||
u2f.register([req], sigs, function(data) {
|
||||
var form = document.getElementById('u2f_form');
|
||||
var reg = document.getElementById('u2f_register_data');
|
||||
var user = document.getElementById('u2f_username');
|
||||
var status = document.getElementById('u2f_status');
|
||||
console.log("Register callback", data);
|
||||
if (data.errorCode && data.errorCode != 0) {
|
||||
var div = document.getElementById('u2f_return_code');
|
||||
div.innerHTML = 'Error code: ' + data.errorCode;
|
||||
return;
|
||||
}
|
||||
reg.value = JSON.stringify(data);
|
||||
user.value = username;
|
||||
status.value = "1";
|
||||
form.submit();
|
||||
});
|
||||
}, 1000);
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
catch( Exception $e ) {
|
||||
echo "U2F error: " . $e->getMessage();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'authenticate':
|
||||
try {
|
||||
$reqs = json_encode($u2f->getAuthenticateData(getRegs($username)));
|
||||
$_SESSION['authReq'] = $reqs;
|
||||
?>
|
||||
<script>
|
||||
var req = <?=$reqs;?>;
|
||||
var username = "<?=$username;?>";
|
||||
setTimeout(function() {
|
||||
console.log("sign: ", req);
|
||||
u2f.sign(req, function(data) {
|
||||
var form = document.getElementById('u2f_form');
|
||||
var auth = document.getElementById('u2f_auth_data');
|
||||
var user = document.getElementById('u2f_username');
|
||||
console.log("Authenticate callback", data);
|
||||
auth.value = JSON.stringify(data);
|
||||
user.value = username;
|
||||
form.submit();
|
||||
});
|
||||
}, 1000);
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
catch (Exception $e) {
|
||||
echo "U2F error: " . $e->getMessage();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!empty($_POST['u2f_register_data'])) {
|
||||
try {
|
||||
$reg = $u2f->doRegister(json_decode($_SESSION['regReq']), json_decode($_POST['u2f_register_data']));
|
||||
addReg($username, $reg);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
echo "U2F error: " . $e->getMessage();
|
||||
}
|
||||
finally {
|
||||
echo "Success";
|
||||
$_SESSION['regReq'] = null;
|
||||
}
|
||||
}
|
||||
if (!empty($_POST['u2f_auth_data'])) {
|
||||
try {
|
||||
$reg = $u2f->doAuthenticate(json_decode($_SESSION['authReq']), getRegs($username), json_decode($_POST['u2f_auth_data']));
|
||||
updateReg($reg);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
echo "U2F error: " . $e->getMessage();
|
||||
}
|
||||
finally {
|
||||
echo "Success";
|
||||
$_SESSION['authReq'] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
</head>
|
||||
<body>
|
||||
<div id="u2f_return_code"></div>
|
||||
<form method="POST" id="u2f_form">
|
||||
<input type="hidden" name="u2f_register_data" id="u2f_register_data"/>
|
||||
<input type="hidden" name="u2f_auth_data" id="u2f_auth_data"/>
|
||||
<input type="hidden" name="u2f_username" id="u2f_username"/><br/>
|
||||
<input type="hidden" name="u2f_status" id="u2f_status"/><br/>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<form method="POST" id="post_form">
|
||||
Username: <input name="u2f_username" id="u2f_username"/><br/><hr>
|
||||
Action: <br />
|
||||
<input value="register" name="action" type="radio"/> Register<br/>
|
||||
<input value="authenticate" name="action" type="radio"/> Authenticate<br/>
|
||||
<button type="submit">Submit!</button>
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
529
data/web/user.php
Normal file
529
data/web/user.php
Normal file
@@ -0,0 +1,529 @@
|
||||
<?php
|
||||
require_once("inc/prerequisites.inc.php");
|
||||
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'domainadmin') {
|
||||
|
||||
/*
|
||||
/ DOMAIN ADMIN
|
||||
*/
|
||||
|
||||
require_once("inc/header.inc.php");
|
||||
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||
$tfa_data = get_tfa();
|
||||
$username = $_SESSION['mailcow_cc_username'];
|
||||
?>
|
||||
<div class="container">
|
||||
<h3><?=$lang['user']['user_settings'];?></h3>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading"><?=$lang['user']['user_settings'];?></div>
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<p><a href="#pwChangeModal" data-toggle="modal">[<?=$lang['user']['change_password'];?>]</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['tfa']['tfa'];?></div>
|
||||
<div class="col-sm-9 col-xs-7">
|
||||
<p id="tfa_pretty"><?=$tfa_data['pretty'];?></p>
|
||||
<div id="tfa_additional">
|
||||
<?php if($tfa_data['additional']):
|
||||
foreach ($tfa_data['additional'] as $key_info): ?>
|
||||
<form style="display:inline;" method="post">
|
||||
<input type="hidden" name="unset_tfa_key" value="<?=$key_info['id'];?>" />
|
||||
<div class="label label-default">🔑 <?=$key_info['key_id'];?> <a href="#" style="font-weight:bold;color:white" onClick="$(this).closest('form').submit()">[<?=strtolower($lang['admin']['remove']);?>]</a></div>
|
||||
</form>
|
||||
<?php endforeach;
|
||||
endif;?>
|
||||
</div>
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['tfa']['set_tfa'];?></div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<select id="selectTFA" class="selectpicker" title="<?=$lang['tfa']['select'];?>">
|
||||
<option value="yubi_otp"><?=$lang['tfa']['yubi_otp'];?></option>
|
||||
<option value="u2f"><?=$lang['tfa']['u2f'];?></option>
|
||||
<option value="none"><?=$lang['tfa']['none'];?></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user') {
|
||||
|
||||
/*
|
||||
/ USER
|
||||
*/
|
||||
|
||||
require_once("inc/header.inc.php");
|
||||
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||
$username = $_SESSION['mailcow_cc_username'];
|
||||
$get_tls_policy = get_tls_policy($_SESSION['mailcow_cc_username']);
|
||||
?>
|
||||
<div class="container">
|
||||
<h3><?=$lang['user']['user_settings'];?></h3>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading"><?=$lang['user']['mailbox_details'];?></div>
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<p><a href="#pwChangeModal" data-toggle="modal">[<?=$lang['user']['change_password'];?>]</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<?php // Get user information about aliases
|
||||
$user_get_alias_details = user_get_alias_details($username);?>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['aliases'];?>:</div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<p><?=$user_get_alias_details['aliases'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['domain_aliases'];?>:</div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<p><?=$user_get_alias_details['ad_alias'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['aliases_also_send_as'];?>:</div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<p><?=$user_get_alias_details['aliases_also_send_as'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['aliases_send_as_all'];?>:</div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<p><?=$user_get_alias_details['aliases_send_as_all'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['is_catch_all'];?>:</div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<p><?=$user_get_alias_details['is_catch_all'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<?php // Show tagging options ?>
|
||||
<form class="form-horizontal" role="form" method="post">
|
||||
<?php $get_tagging_options = get_delimiter_action()['wants_tagged_subject'];?>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['tag_handling'];?>:</div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<input type="hidden" name="edit_delimiter_action" value="1">
|
||||
<select name="tagged_mail_handler" class="selectpicker" onchange="this.form.submit()">
|
||||
<option value="subfolder" <?=($get_tagging_options == "0") ? 'selected' : null; ?>><?=$lang['user']['tag_in_subfolder'];?></option>
|
||||
<option value="subject" <?=($get_tagging_options == "1") ? 'selected' : null; ?>><?=$lang['user']['tag_in_subject'];?></option>
|
||||
</select>
|
||||
<p class="help-block"><?=$lang['user']['tag_help_explain'];?></p>
|
||||
<p class="help-block"><?=$lang['user']['tag_help_example'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php // Rest EAS devices ?>
|
||||
<form class="form-horizontal" role="form" method="post">
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['eas_reset'];?>:</div>
|
||||
<div class="col-md-9 col-xs-7">
|
||||
<button type="submit" name="mailbox_reset_eas" id="mailbox_reset_eas" value="1" class="btn btn-xs btn-default"><?=$lang['user']['eas_reset_now'];?></button>
|
||||
<p class="help-block"><?=$lang['user']['eas_reset_help'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Nav tabs -->
|
||||
<ul class="nav nav-pills nav-justified" role="tablist">
|
||||
<li role="presentation" class="active"><a href="#SpamAliases" aria-controls="SpamAliases" role="tab" data-toggle="tab"><?=$lang['user']['spam_aliases'];?></a></li>
|
||||
<li role="presentation"><a href="#Spamfilter" aria-controls="Spamfilter" role="tab" data-toggle="tab"><?=$lang['user']['spamfilter'];?></a></li>
|
||||
<li role="presentation"><a href="#TLSPolicy" aria-controls="TLSPolicy" role="tab" data-toggle="tab"><?=$lang['user']['tls_policy'];?></a></li>
|
||||
<li role="presentation"><a href="#Syncjobs" aria-controls="Syncjobs" role="tab" data-toggle="tab"><?=$lang['user']['sync_jobs'];?></a></li>
|
||||
</ul>
|
||||
<hr>
|
||||
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="SpamAliases">
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<p><b><?=$lang['user']['alias'];?></b></p>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<p><b><?=$lang['user']['alias_valid_until'];?></b></p>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<p><b><?=$lang['user']['action'];?></b></p>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
$get_time_limited_aliases = get_time_limited_aliases($username);
|
||||
if (!empty($get_time_limited_aliases)):
|
||||
foreach ($get_time_limited_aliases as $row):
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<p><?=htmlspecialchars($row['address']);?></p>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<p><?=htmlspecialchars(date($lang['user']['alias_full_date'], $row['validity']));?></p>
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<form class="form-inline" role="form" method="post">
|
||||
<a class="text-danger" href="#" onclick="$(this).closest('form').submit()"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
<input type="hidden" name="set_time_limited_aliases" value="delete">
|
||||
<input type="hidden" name="item" value="<?=htmlspecialchars($row['address']);?>">
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<form class="form-inline" role="form" method="post">
|
||||
<a href="#" onclick="$(this).closest('form').submit()"><span class="glyphicon glyphicon-time"></span> + 1h</a>
|
||||
<input type="hidden" name="set_time_limited_aliases" value="extend">
|
||||
<input type="hidden" name="item" value="<?=htmlspecialchars($row['address']);?>">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
endforeach;
|
||||
else:
|
||||
?>
|
||||
<div class="col-xs-12">
|
||||
<center><i><?=$lang['user']['no_record'];?></i></center>
|
||||
</div>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
<form class="form-horizontal" role="form" method="post">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-9">
|
||||
<select id="validity" name="validity" title="<?=$lang['user']['alias_select_validity'];?>">
|
||||
<option value="1">1 <?=$lang['user']['hour'];?></option>
|
||||
<option value="6">6 <?=$lang['user']['hours'];?></option>
|
||||
<option value="24">1 <?=$lang['user']['day'];?></option>
|
||||
<option value="168">1 <?=$lang['user']['week'];?></option>
|
||||
<option value="672">4 <?=$lang['user']['weeks'];?></option>
|
||||
</select>
|
||||
<button type="submit" name="set_time_limited_aliases" id="generate_tla" value="generate" class="btn btn-success"><?=$lang['user']['alias_create_random'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-12">
|
||||
<button type="submit" name="set_time_limited_aliases" value="deleteall" class="btn-danger btn btn-sm">
|
||||
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> <?=$lang['user']['alias_remove_all'];?>
|
||||
</button>
|
||||
<button type="submit" name="set_time_limited_aliases" value="extendall" class="btn-default btn btn-sm">
|
||||
<span class="glyphicon glyphicon-time" aria-hidden="true"></span> <?=$lang['user']['alias_extend_all'];?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="Spamfilter">
|
||||
<h4><?=$lang['user']['spamfilter_behavior'];?></h4>
|
||||
<form class="form-horizontal" role="form" method="post">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<input name="score" id="score" type="text"
|
||||
data-provide="slider"
|
||||
data-slider-min="1"
|
||||
data-slider-max="30"
|
||||
data-slider-step="0.5"
|
||||
data-slider-range="true"
|
||||
data-slider-tooltip='always'
|
||||
data-slider-id="slider1"
|
||||
data-slider-value="[<?=get_spam_score($username);?>]"
|
||||
data-slider-step="1" />
|
||||
<br /><br />
|
||||
<ul>
|
||||
<li><?=$lang['user']['spamfilter_green'];?></li>
|
||||
<li><?=$lang['user']['spamfilter_yellow'];?></li>
|
||||
<li><?=$lang['user']['spamfilter_red'];?></li>
|
||||
</ul>
|
||||
<p><i><?=$lang['user']['spamfilter_default_score'];?> 5:15</i></p>
|
||||
<p><?=$lang['user']['spamfilter_hint'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" id="edit_spam_score" name="edit_spam_score" class="btn btn-success"><?=$lang['user']['save_changes'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h4><span class="glyphicon glyphicon-thumbs-up" aria-hidden="true"></span> <?=$lang['user']['spamfilter_wl'];?></h4>
|
||||
<p><?=$lang['user']['spamfilter_wl_desc'];?></p>
|
||||
<div class="row">
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_rule'];?></b></div>
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_action'];?></b></div>
|
||||
</div>
|
||||
<?php
|
||||
$get_policy_list = get_policy_list($username);
|
||||
if (empty($get_policy_list['whitelist'])):
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-sm-12"><i><?=$lang['user']['spamfilter_table_empty'];?></i></div>
|
||||
</div>
|
||||
<?php
|
||||
else:
|
||||
foreach($get_policy_list['whitelist'] as $wl):
|
||||
?>
|
||||
<div class="row striped">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6"><code><?=$wl['value'];?></code></div>
|
||||
<div class="col-xs-6">
|
||||
<input type="hidden" name="delete_prefid" value="<?=$wl['prefid'];?>">
|
||||
<?php
|
||||
if (filter_var($wl['object'], FILTER_VALIDATE_EMAIL)):
|
||||
?>
|
||||
<input type="hidden" name="delete_policy_list_item">
|
||||
<a href="#" onclick="$(this).closest('form').submit()" data-toggle="tooltip" data-placement="left" title="<?=$lang['user']['delete_now'];?>"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
<?php
|
||||
else:
|
||||
?>
|
||||
<span style="cursor:not-allowed"><?=$lang['user']['spamfilter_table_domain_policy'];?></span>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
endforeach;
|
||||
endif;
|
||||
?>
|
||||
<hr style="margin:5px 0px 7px 0px">
|
||||
<div class="row">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6">
|
||||
<input type="text" class="form-control input-sm" name="object_from" id="object_from" placeholder="*@example.org" required>
|
||||
<input type="hidden" name="object_list" value="wl">
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
<button type="submit" id="add_policy_list_item" name="add_policy_list_item" class="btn btn-xs btn-default"><?=$lang['user']['spamfilter_table_add'];?></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<h4><span class="glyphicon glyphicon-thumbs-down" aria-hidden="true"></span> <?=$lang['user']['spamfilter_bl'];?></h4>
|
||||
<p><?=$lang['user']['spamfilter_bl_desc'];?></p>
|
||||
<div class="row">
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_rule'];?></b></div>
|
||||
<div class="col-sm-6"><b><?=$lang['user']['spamfilter_table_action'];?></b></div>
|
||||
</div>
|
||||
<?php
|
||||
if (empty($get_policy_list['blacklist'])):
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-sm-12"><i><?=$lang['user']['spamfilter_table_empty'];?></i></div>
|
||||
</div>
|
||||
<?php
|
||||
else:
|
||||
foreach($get_policy_list['blacklist'] as $bl):
|
||||
?>
|
||||
<div class="row striped">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6"><code><?=$bl['value'];?></code></div>
|
||||
<div class="col-xs-6">
|
||||
<?php
|
||||
if (filter_var($bl['object'], FILTER_VALIDATE_EMAIL)):
|
||||
?>
|
||||
<input type="hidden" name="delete_prefid" value="<?=$bl['prefid'];?>">
|
||||
<input type="hidden" name="delete_policy_list_item">
|
||||
<a href="#" onclick="$(this).closest('form').submit()" data-toggle="tooltip" data-placement="left" title="<?=$lang['user']['delete_now'];?>"><span class="glyphicon glyphicon-remove"></span></a>
|
||||
<?php
|
||||
else:
|
||||
?>
|
||||
<span style="cursor:not-allowed"><?=$lang['user']['spamfilter_table_domain_policy'];?></span>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
endforeach;
|
||||
endif;
|
||||
?>
|
||||
<hr style="margin:5px 0px 7px 0px">
|
||||
<div class="row">
|
||||
<form class="form-inline" method="post">
|
||||
<div class="col-xs-6">
|
||||
<input type="text" class="form-control input-sm" name="object_from" id="object_from" placeholder="*@example.org" required>
|
||||
<input type="hidden" name="object_list" value="bl">
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
<button type="submit" id="add_policy_list_item" name="add_policy_list_item" class="btn btn-xs btn-default"><?=$lang['user']['spamfilter_table_add'];?></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="TLSPolicy">
|
||||
<form class="form-horizontal" role="form" method="post">
|
||||
<p class="help-block"><?=$lang['user']['tls_policy_warning'];?></p>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-6">
|
||||
<div class="checkbox">
|
||||
<h4><span class="glyphicon glyphicon-download" aria-hidden="true"></span> <?=$lang['user']['tls_enforce_in'];?></h4>
|
||||
<input type="checkbox" id="tls_in" name="tls_in" <?=($get_tls_policy['tls_enforce_in'] == "1") ? "checked" : null;?> data-on-text="<?=$lang['user']['on'];?>" data-off-text="<?=$lang['user']['off'];?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="checkbox">
|
||||
<h4><span class="glyphicon glyphicon-upload" aria-hidden="true"></span> <?=$lang['user']['tls_enforce_out'];?></h4>
|
||||
<input type="checkbox" id="tls_out" name="tls_out" <?=($get_tls_policy['tls_enforce_out'] == "1") ? "checked" : null;?> data-on-text="<?=$lang['user']['on'];?>" data-off-text="<?=$lang['user']['off'];?>">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-12">
|
||||
<button type="submit" id="edit_tls_policy" name="edit_tls_policy" class="btn btn-default"><?=$lang['user']['save_changes'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="Syncjobs">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped sortable-theme-bootstrap" data-sortable id="timelimitedaliases">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sort-table" style="min-width: 96px;">Server:Port</th>
|
||||
<th class="sort-table" style="min-width: 96px;"><?=$lang['user']['encryption'];?></th>
|
||||
<th class="sort-table" style="min-width: 96px;"><?=$lang['user']['username'];?></th>
|
||||
<th class="sort-table" style="min-width: 96px;"><?=$lang['user']['excludes'];?></th>
|
||||
<th class="sort-table" style="min-width: 35px;"><?=$lang['user']['interval'];?></th>
|
||||
<th class="sort-table" style="min-width: 35px;"><?=$lang['user']['last_run'];?></th>
|
||||
<th class="sort-table" style="min-width: 35px;">Log</th>
|
||||
<th class="sort-table" style="max-width: 35px;"><?=$lang['user']['active'];?></th>
|
||||
<th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['user']['action'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$get_syncjobs = get_syncjobs($username);
|
||||
if (!empty($get_syncjobs)):
|
||||
foreach ($get_syncjobs as $row):
|
||||
?>
|
||||
<tr id="data">
|
||||
<td><?=htmlspecialchars($row['host1'] . ':' . $row['port1']);?></td>
|
||||
<td><?=htmlspecialchars($row['enc1']);?></td>
|
||||
<td><?=htmlspecialchars($row['user1']);?></td>
|
||||
<td><?=($row['exclude'] == '') ? '✘' : '<code>' . $row['exclude'] . '</code>';?></td>
|
||||
<td><?=htmlspecialchars($row['mins_interval']);?> min</td>
|
||||
<td><?=(empty($row['last_run'])) ? '✘' : htmlspecialchars(date($lang['user']['syncjob_full_date'], strtotime($row['last_run'] . ' UTC')));?></td>
|
||||
<td>
|
||||
<?php
|
||||
if (empty($row['returned_text'])) {
|
||||
echo '✘';
|
||||
}
|
||||
else {
|
||||
?>
|
||||
<a href="#logModal" data-toggle="modal" data-log-text="<?=htmlspecialchars($row['returned_text']);?>">Open logs</a>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td><?=($row['active'] == '1') ? '✔' : '✘';?></td>
|
||||
<td style="text-align: right;">
|
||||
<div class="btn-group">
|
||||
<a href="/edit.php?syncjob=<?=urlencode($row['id']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['user']['edit'];?></a>
|
||||
<a href="/delete.php?syncjob=<?=urlencode($row['id']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['user']['remove'];?></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
endforeach;
|
||||
else:
|
||||
?>
|
||||
<tr id="no-data"><td colspan="9" style="text-align: center; font-style: italic;"><?=$lang['user']['no_record'];?></td></tr>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr id="no-data">
|
||||
<td colspan="9" style="text-align: center; font-style: normal; border-top: 1px solid #e7e7e7;">
|
||||
<a href="/add.php?syncjob"><?=$lang['user']['create_syncjob'];?></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
}
|
||||
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "user" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
|
||||
|
||||
/*
|
||||
/ USER OR DOMAIN ADMIN
|
||||
*/
|
||||
|
||||
?>
|
||||
<div class="modal fade" id="logModal" tabindex="-1" role="dialog" aria-labelledby="logTextLabel">
|
||||
<div class="modal-dialog" style="width:90%" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<span id="logText"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom:200px;"></div>
|
||||
<div class="modal fade" id="pwChangeModal" tabindex="-1" role="dialog" aria-labelledby="pwChangeModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal" role="form" method="post" autocomplete="off">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_new_pass"><?=$lang['user']['new_password'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_new_pass" id="user_new_pass" autocomplete="off" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_new_pass2"><?=$lang['user']['new_password_repeat'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_new_pass2" id="user_new_pass2" autocomplete="off" required>
|
||||
<p class="help-block"><?=$lang['user']['new_password_description'];?></p>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="user_old_pass"><?=$lang['user']['password_now'];?></label>
|
||||
<div class="col-sm-5">
|
||||
<input type="password" class="form-control" name="user_old_pass" id="user_old_pass" autocomplete="off" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<button type="submit" name="edit_<?=($_SESSION['mailcow_cc_role'] == "domainadmin") ? "domain_admin" : "user_account";?>" class="btn btn-sm btn-success"><?=$lang['user']['change_password'];?></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- /container -->
|
||||
<script src="js/sorttable.js"></script>
|
||||
<script src="js/user.js"></script>
|
||||
<?php
|
||||
require_once("inc/footer.inc.php");
|
||||
}
|
||||
else {
|
||||
header('Location: /');
|
||||
exit();
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user