Deployed dfc88cc with MkDocs version: 0.16.1
				
					
				
			This commit is contained in:
		
							
								
								
									
										385
									
								
								data/web/add.php
									
									
									
									
									
								
							
							
						
						
									
										385
									
								
								data/web/add.php
									
									
									
									
									
								
							| @@ -1,385 +0,0 @@ | ||||
| <?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"); | ||||
| ?> | ||||
| @@ -1,311 +0,0 @@ | ||||
| <?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(); | ||||
| } | ||||
| ?> | ||||
| @@ -1,69 +0,0 @@ | ||||
| <?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> | ||||
| @@ -1,142 +0,0 @@ | ||||
| <?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 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| ?> | ||||
| @@ -1,40 +0,0 @@ | ||||
| <?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
									
									
								
							
							
						
						
									
										6
									
								
								data/web/css/bootstrap-select.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										41
									
								
								data/web/css/bootstrap-slider.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								data/web/css/bootstrap-slider.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										10
									
								
								data/web/css/bootstrap-switch.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								data/web/css/bootstrap-switch.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,19 +0,0 @@ | ||||
| .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; | ||||
| } | ||||
| @@ -1,46 +0,0 @@ | ||||
| #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;} | ||||
| @@ -1,79 +0,0 @@ | ||||
| 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; | ||||
| } | ||||
| @@ -1,212 +0,0 @@ | ||||
| <?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"); | ||||
| ?> | ||||
| @@ -1,664 +0,0 @@ | ||||
| <?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"); | ||||
| ?> | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 6.7 KiB | 
| @@ -1,197 +0,0 @@ | ||||
| <?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> | ||||
| Before Width: | Height: | Size: 12 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.1 KiB | 
| @@ -1,225 +0,0 @@ | ||||
| <?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; ?> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,104 +0,0 @@ | ||||
| <!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> | ||||
| @@ -1,281 +0,0 @@ | ||||
| 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
									
									
								
							
							
						
						
									
										1
									
								
								data/web/inc/languages.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 44 KiB | 
| @@ -1,506 +0,0 @@ | ||||
| <?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); | ||||
|     } | ||||
| } | ||||
| @@ -1,475 +0,0 @@ | ||||
| <?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'); | ||||
| 	} | ||||
| } | ||||
| ?> | ||||
| @@ -1,103 +0,0 @@ | ||||
| <?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; | ||||
| @@ -1,133 +0,0 @@ | ||||
| <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; | ||||
| ?> | ||||
| @@ -1,173 +0,0 @@ | ||||
| <?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); | ||||
| 	} | ||||
| } | ||||
| ?> | ||||
| @@ -1,38 +0,0 @@ | ||||
| <?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"; | ||||
|  | ||||
| ?> | ||||
| @@ -1,90 +0,0 @@ | ||||
| <?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"); | ||||
| ?> | ||||
| @@ -1,18 +0,0 @@ | ||||
| $(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"}); | ||||
| 			} | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| @@ -1,31 +0,0 @@ | ||||
| $(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
									
									
								
							
							
						
						
									
										9
									
								
								data/web/js/bootstrap-select.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										5
									
								
								data/web/js/bootstrap-slider.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								data/web/js/bootstrap-slider.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										10
									
								
								data/web/js/bootstrap-switch.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								data/web/js/bootstrap-switch.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,3 +0,0 @@ | ||||
| $(document).ready(function() { | ||||
| 	$('nav').hide(); | ||||
| }); | ||||
| @@ -1,54 +0,0 @@ | ||||
| $(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(); | ||||
| 		} | ||||
| 	}); | ||||
| }); | ||||
| @@ -1,236 +0,0 @@ | ||||
| (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); | ||||
| @@ -1,651 +0,0 @@ | ||||
| // 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); | ||||
|     }); | ||||
| }; | ||||
| @@ -1,33 +0,0 @@ | ||||
| $(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>'); | ||||
|   }); | ||||
| }); | ||||
| @@ -1,57 +0,0 @@ | ||||
| <?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; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -1,448 +0,0 @@ | ||||
| <?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'; | ||||
| ?> | ||||
| @@ -1,458 +0,0 @@ | ||||
| <?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'; | ||||
| ?> | ||||
| @@ -1,378 +0,0 @@ | ||||
| <?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'; | ||||
| ?> | ||||
| @@ -1,369 +0,0 @@ | ||||
| <?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'; | ||||
| ?> | ||||
| @@ -1,355 +0,0 @@ | ||||
| <?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'; | ||||
| ?> | ||||
| @@ -1,426 +0,0 @@ | ||||
| <?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(); | ||||
| } | ||||
| ?> | ||||
| @@ -1,2 +0,0 @@ | ||||
| User-agent: * | ||||
| Disallow: / | ||||
| @@ -1,157 +0,0 @@ | ||||
| <?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> | ||||
| @@ -1,529 +0,0 @@ | ||||
| <?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