删除测试库
删除 wecome 增加新代码
This commit is contained in:
@@ -19,6 +19,7 @@ import fr.xephi.authme.listener.PlayerListener111;
|
||||
import fr.xephi.authme.listener.PlayerListener19;
|
||||
import fr.xephi.authme.listener.PlayerListener19Spigot;
|
||||
import fr.xephi.authme.listener.ServerListener;
|
||||
import fr.xephi.authme.mail.EmailService;
|
||||
import fr.xephi.authme.output.ConsoleLoggerFactory;
|
||||
import fr.xephi.authme.security.crypts.Sha256;
|
||||
import fr.xephi.authme.service.BackupService;
|
||||
@@ -28,6 +29,7 @@ import fr.xephi.authme.service.bungeecord.BungeeReceiver;
|
||||
import fr.xephi.authme.service.yaml.YamlParseException;
|
||||
import fr.xephi.authme.settings.Settings;
|
||||
import fr.xephi.authme.settings.SettingsWarner;
|
||||
import fr.xephi.authme.settings.properties.EmailSettings;
|
||||
import fr.xephi.authme.settings.properties.SecuritySettings;
|
||||
import fr.xephi.authme.task.CleanupTask;
|
||||
import fr.xephi.authme.task.purge.PurgeService;
|
||||
@@ -42,6 +44,8 @@ import org.bukkit.plugin.java.JavaPluginLoader;
|
||||
import org.bukkit.scheduler.BukkitScheduler;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE;
|
||||
@@ -65,6 +69,7 @@ public class AuthMe extends JavaPlugin {
|
||||
private CommandHandler commandHandler;
|
||||
private Settings settings;
|
||||
private DataSource database;
|
||||
private EmailService emailService;
|
||||
private BukkitService bukkitService;
|
||||
private Injector injector;
|
||||
private BackupService backupService;
|
||||
@@ -308,6 +313,12 @@ public class AuthMe extends JavaPlugin {
|
||||
onShutdownPlayerSaver.saveAllPlayers();
|
||||
}
|
||||
|
||||
if (settings.getProperty(EmailSettings.SHOUTDOWN_MAIL)){
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
emailService.sendShutDown("wujiaxin752@icloud.com",dateFormat.format(date));
|
||||
}
|
||||
|
||||
// Do backup on stop if enabled
|
||||
if (backupService != null) {
|
||||
backupService.doBackup(BackupService.BackupCause.STOP);
|
||||
|
||||
@@ -5,6 +5,7 @@ import fr.xephi.authme.command.PlayerCommand;
|
||||
import fr.xephi.authme.data.captcha.RegistrationCaptchaManager;
|
||||
import fr.xephi.authme.output.ConsoleLoggerFactory;
|
||||
import fr.xephi.authme.mail.EmailService;
|
||||
import fr.xephi.authme.datasource.DataSource;
|
||||
import fr.xephi.authme.message.MessageKey;
|
||||
import fr.xephi.authme.process.Management;
|
||||
import fr.xephi.authme.process.register.RegisterSecondaryArgument;
|
||||
@@ -23,6 +24,8 @@ import org.bukkit.entity.Player;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.util.List;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import static fr.xephi.authme.process.register.RegisterSecondaryArgument.CONFIRMATION;
|
||||
import static fr.xephi.authme.process.register.RegisterSecondaryArgument.EMAIL_MANDATORY;
|
||||
@@ -43,6 +46,9 @@ public class RegisterCommand extends PlayerCommand {
|
||||
@Inject
|
||||
private CommonService commonService;
|
||||
|
||||
@Inject
|
||||
private DataSource dataSource;
|
||||
|
||||
@Inject
|
||||
private EmailService emailService;
|
||||
|
||||
@@ -169,6 +175,22 @@ public class RegisterCommand extends PlayerCommand {
|
||||
} else if (isSecondArgValidForEmailRegistration(player, arguments)) {
|
||||
management.performRegister(RegistrationMethod.EMAIL_REGISTRATION,
|
||||
EmailRegisterParams.of(player, email));
|
||||
Timer timer = new Timer();
|
||||
timer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (dataSource.getAuth(player.getName()) != null) {
|
||||
if (dataSource.getAuth(player.getName()).getLastLogin() == null && (dataSource.getAuth(player.getName()).getRegistrationDate() + 600000) < System.currentTimeMillis()) {
|
||||
management.performUnregisterByAdmin(null, player.getName(), player);
|
||||
timer.cancel();
|
||||
} else if (dataSource.getAuth(player.getName()).getLastLogin() != null) {
|
||||
timer.cancel();
|
||||
}
|
||||
} else {
|
||||
timer.cancel();
|
||||
}
|
||||
}
|
||||
}, 60000, 60000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@ import fr.xephi.authme.util.expiring.ExpiringMap;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
@@ -132,12 +134,14 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
|
||||
*/
|
||||
private void generateCode(String name) {
|
||||
DataSourceValue<String> emailResult = dataSource.getEmail(name);
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
if (emailResult.rowExists()) {
|
||||
final String email = emailResult.getValue();
|
||||
if (!Utils.isEmailEmpty(email)) {
|
||||
String code = RandomStringUtils.generateNum(6); // 6 digits code
|
||||
verificationCodes.put(name.toLowerCase(Locale.ROOT), code);
|
||||
emailService.sendVerificationMail(name, email, code);
|
||||
emailService.sendVerificationMail(name, email, code, dateFormat.format(date));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,21 +40,7 @@ public class EmailService {
|
||||
return sendMailSsl.hasAllInformation();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sends an email to the user with his new password.
|
||||
*
|
||||
* @param name the name of the player
|
||||
* @param mailAddress the player's email
|
||||
* @param newPass the new password
|
||||
* @return true if email could be sent, false otherwise
|
||||
*/
|
||||
public boolean sendPasswordMail(String name, String mailAddress, String newPass) {
|
||||
if (!hasAllInformation()) {
|
||||
logger.warning("Cannot perform email registration: not all email settings are complete");
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean sendNewPasswordMail(String name, String mailAddress, String newPass,String ip,String time) {
|
||||
HtmlEmail email;
|
||||
try {
|
||||
email = sendMailSsl.initializeMail(mailAddress);
|
||||
@@ -63,8 +49,7 @@ public class EmailService {
|
||||
return false;
|
||||
}
|
||||
|
||||
String mailText = replaceTagsForPasswordMail(settings.getPasswordEmailMessage(), name, newPass);
|
||||
// Generate an image?
|
||||
String mailText = replaceTagsForPasswordMail(settings.getNewPasswordEmailMessage(), name, newPass,ip,time);
|
||||
File file = null;
|
||||
if (settings.getProperty(EmailSettings.PASSWORD_AS_IMAGE)) {
|
||||
try {
|
||||
@@ -82,16 +67,16 @@ public class EmailService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends an email to the user with the temporary verification code.
|
||||
* Sends an email to the user with his new password.
|
||||
*
|
||||
* @param name the name of the player
|
||||
* @param mailAddress the player's email
|
||||
* @param code the verification code
|
||||
* @param newPass the new password
|
||||
* @return true if email could be sent, false otherwise
|
||||
*/
|
||||
public boolean sendVerificationMail(String name, String mailAddress, String code) {
|
||||
public boolean sendPasswordMail(String name, String mailAddress, String newPass, String time) {
|
||||
if (!hasAllInformation()) {
|
||||
logger.warning("Cannot send verification email: not all email settings are complete");
|
||||
logger.warning("Cannot perform email registration: not all email settings are complete");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -99,13 +84,51 @@ public class EmailService {
|
||||
try {
|
||||
email = sendMailSsl.initializeMail(mailAddress);
|
||||
} catch (EmailException e) {
|
||||
logger.logException("Failed to create verification email with the given settings:", e);
|
||||
logger.logException("Failed to create email with the given settings:", e);
|
||||
return false;
|
||||
}
|
||||
|
||||
String mailText = replaceTagsForPasswordMail(settings.getPasswordEmailMessage(), name, newPass,time);
|
||||
// Generate an image?
|
||||
File file = null;
|
||||
if (settings.getProperty(EmailSettings.PASSWORD_AS_IMAGE)) {
|
||||
try {
|
||||
file = generatePasswordImage(name, newPass);
|
||||
mailText = embedImageIntoEmailContent(file, email, mailText);
|
||||
} catch (IOException | EmailException e) {
|
||||
logger.logException(
|
||||
"Unable to send new password as image for email " + mailAddress + ":", e);
|
||||
}
|
||||
}
|
||||
|
||||
boolean couldSendEmail = sendMailSsl.sendEmail(mailText, email);
|
||||
FileUtils.delete(file);
|
||||
return couldSendEmail;
|
||||
}
|
||||
/**
|
||||
* Sends an email to the user with the temporary verification code.
|
||||
*
|
||||
* @param name the name of the player
|
||||
* @param mailAddress the player's email
|
||||
* @param code the verification code
|
||||
*/
|
||||
public void sendVerificationMail(String name, String mailAddress, String code, String time) {
|
||||
if (!hasAllInformation()) {
|
||||
logger.warning("Cannot send verification email: not all email settings are complete");
|
||||
return;
|
||||
}
|
||||
|
||||
HtmlEmail email;
|
||||
try {
|
||||
email = sendMailSsl.initializeMail(mailAddress);
|
||||
} catch (EmailException e) {
|
||||
logger.logException("Failed to create verification email with the given settings:", e);
|
||||
return;
|
||||
}
|
||||
|
||||
String mailText = replaceTagsForVerificationEmail(settings.getVerificationEmailMessage(), name, code,
|
||||
settings.getProperty(SecuritySettings.VERIFICATION_CODE_EXPIRATION_MINUTES));
|
||||
return sendMailSsl.sendEmail(mailText, email);
|
||||
settings.getProperty(SecuritySettings.VERIFICATION_CODE_EXPIRATION_MINUTES),time);
|
||||
sendMailSsl.sendEmail(mailText, email);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -116,7 +139,7 @@ public class EmailService {
|
||||
* @param code the recovery code
|
||||
* @return true if email could be sent, false otherwise
|
||||
*/
|
||||
public boolean sendRecoveryCode(String name, String email, String code) {
|
||||
public boolean sendRecoveryCode(String name, String email, String code, String time) {
|
||||
HtmlEmail htmlEmail;
|
||||
try {
|
||||
htmlEmail = sendMailSsl.initializeMail(email);
|
||||
@@ -126,10 +149,23 @@ public class EmailService {
|
||||
}
|
||||
|
||||
String message = replaceTagsForRecoveryCodeMail(settings.getRecoveryCodeEmailMessage(),
|
||||
name, code, settings.getProperty(SecuritySettings.RECOVERY_CODE_HOURS_VALID));
|
||||
name, code, settings.getProperty(SecuritySettings.RECOVERY_CODE_HOURS_VALID),time);
|
||||
return sendMailSsl.sendEmail(message, htmlEmail);
|
||||
}
|
||||
|
||||
public void sendShutDown(String email, String time) {
|
||||
HtmlEmail htmlEmail;
|
||||
try {
|
||||
htmlEmail = sendMailSsl.initializeMail(email);
|
||||
} catch (EmailException e) {
|
||||
logger.logException("Failed to create email for recovery code:", e);
|
||||
return;
|
||||
}
|
||||
|
||||
String message = replaceTagsForShutDownMail(settings.getShutdownEmailMessage(), time);
|
||||
sendMailSsl.sendEmail(message, htmlEmail);
|
||||
}
|
||||
|
||||
private File generatePasswordImage(String name, String newPass) throws IOException {
|
||||
ImageGenerator gen = new ImageGenerator(newPass);
|
||||
File file = new File(dataFolder, name + "_new_pass.jpg");
|
||||
@@ -144,26 +180,44 @@ public class EmailService {
|
||||
return content.replace("<image />", "<img src=\"cid:" + tag + "\">");
|
||||
}
|
||||
|
||||
private String replaceTagsForPasswordMail(String mailText, String name, String newPass) {
|
||||
private String replaceTagsForPasswordMail(String mailText, String name, String newPass,String ip,String time) {
|
||||
return mailText
|
||||
.replace("<playername />", name)
|
||||
.replace("<servername />", settings.getProperty(PluginSettings.SERVER_NAME))
|
||||
.replace("<generatedpass />", newPass);
|
||||
.replace("<generatedpass />", newPass)
|
||||
.replace("<playerip />", ip)
|
||||
.replace("<time />", time);
|
||||
}
|
||||
|
||||
private String replaceTagsForVerificationEmail(String mailText, String name, String code, int minutesValid) {
|
||||
private String replaceTagsForPasswordMail(String mailText, String name, String newPass, String time) {
|
||||
return mailText
|
||||
.replace("<playername />", name)
|
||||
.replace("<servername />", settings.getProperty(PluginSettings.SERVER_NAME))
|
||||
.replace("<generatedpass />", newPass)
|
||||
.replace("<time />", time);
|
||||
}
|
||||
|
||||
private String replaceTagsForVerificationEmail(String mailText, String name, String code, int minutesValid, String time) {
|
||||
return mailText
|
||||
.replace("<playername />", name)
|
||||
.replace("<servername />", settings.getProperty(PluginSettings.SERVER_NAME))
|
||||
.replace("<generatedcode />", code)
|
||||
.replace("<minutesvalid />", String.valueOf(minutesValid));
|
||||
.replace("<minutesvalid />", String.valueOf(minutesValid))
|
||||
.replace("<time />", time);
|
||||
}
|
||||
|
||||
private String replaceTagsForRecoveryCodeMail(String mailText, String name, String code, int hoursValid) {
|
||||
private String replaceTagsForRecoveryCodeMail(String mailText, String name, String code, int hoursValid, String time) {
|
||||
return mailText
|
||||
.replace("<playername />", name)
|
||||
.replace("<servername />", settings.getProperty(PluginSettings.SERVER_NAME))
|
||||
.replace("<recoverycode />", code)
|
||||
.replace("<hoursvalid />", String.valueOf(hoursValid));
|
||||
.replace("<hoursvalid />", String.valueOf(hoursValid))
|
||||
.replace("<time />", time);
|
||||
}
|
||||
private String replaceTagsForShutDownMail(String mailText, String time) {
|
||||
return mailText
|
||||
.replace("<servername />", settings.getProperty(PluginSettings.SERVER_NAME))
|
||||
.replace("<time />", time);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9,11 +9,15 @@ import fr.xephi.authme.security.PasswordSecurity;
|
||||
import fr.xephi.authme.security.crypts.HashedPassword;
|
||||
import fr.xephi.authme.service.CommonService;
|
||||
import fr.xephi.authme.settings.properties.EmailSettings;
|
||||
import fr.xephi.authme.util.PlayerUtils;
|
||||
import fr.xephi.authme.util.RandomStringUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import static fr.xephi.authme.permission.PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS;
|
||||
import static fr.xephi.authme.process.register.executors.PlayerAuthBuilderHelper.createPlayerAuth;
|
||||
import static fr.xephi.authme.settings.properties.EmailSettings.RECOVERY_PASSWORD_LENGTH;
|
||||
@@ -64,8 +68,10 @@ class EmailRegisterExecutor implements RegistrationExecutor<EmailRegisterParams>
|
||||
@Override
|
||||
public void executePostPersistAction(EmailRegisterParams params) {
|
||||
Player player = params.getPlayer();
|
||||
boolean couldSendMail = emailService.sendPasswordMail(
|
||||
player.getName(), params.getEmail(), params.getPassword());
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
boolean couldSendMail = emailService.sendNewPasswordMail(
|
||||
player.getName(), params.getEmail(), params.getPassword(), PlayerUtils.getPlayerIp(player), dateFormat.format(date));
|
||||
if (couldSendMail) {
|
||||
syncProcessManager.processSyncEmailRegister(player);
|
||||
} else {
|
||||
|
||||
@@ -20,6 +20,8 @@ import org.bukkit.entity.Player;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@@ -72,9 +74,10 @@ public class PasswordRecoveryService implements Reloadable, HasCleanup {
|
||||
if (!checkEmailCooldown(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
String recoveryCode = recoveryCodeService.generateCode(player.getName());
|
||||
boolean couldSendMail = emailService.sendRecoveryCode(player.getName(), email, recoveryCode);
|
||||
boolean couldSendMail = emailService.sendRecoveryCode(player.getName(), email, recoveryCode, dateFormat.format(date));
|
||||
if (couldSendMail) {
|
||||
commonService.send(player, MessageKey.RECOVERY_CODE_SENT);
|
||||
emailCooldown.add(player.getName().toLowerCase(Locale.ROOT));
|
||||
@@ -94,6 +97,8 @@ public class PasswordRecoveryService implements Reloadable, HasCleanup {
|
||||
if (!checkEmailCooldown(player)) {
|
||||
return;
|
||||
}
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
|
||||
String name = player.getName();
|
||||
String thePass = RandomStringUtils.generate(commonService.getProperty(RECOVERY_PASSWORD_LENGTH));
|
||||
@@ -102,7 +107,7 @@ public class PasswordRecoveryService implements Reloadable, HasCleanup {
|
||||
logger.info("Generating new password for '" + name + "'");
|
||||
|
||||
dataSource.updatePassword(name, hashNew);
|
||||
boolean couldSendMail = emailService.sendPasswordMail(name, email, thePass);
|
||||
boolean couldSendMail = emailService.sendPasswordMail(name, email, thePass, dateFormat.format(date));
|
||||
if (couldSendMail) {
|
||||
commonService.send(player, MessageKey.RECOVERY_EMAIL_SENT_MESSAGE);
|
||||
emailCooldown.add(player.getName().toLowerCase(Locale.ROOT));
|
||||
|
||||
@@ -17,7 +17,6 @@ import fr.xephi.authme.settings.properties.ProtectionSettings;
|
||||
import fr.xephi.authme.settings.properties.RestrictionSettings;
|
||||
import fr.xephi.authme.settings.properties.SecuritySettings;
|
||||
import fr.xephi.authme.util.PlayerUtils;
|
||||
import fr.xephi.authme.util.StringUtils;
|
||||
import fr.xephi.authme.util.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -50,6 +49,7 @@ public class ValidationService implements Reloadable {
|
||||
private GeoIpService geoIpService;
|
||||
|
||||
private Pattern passwordRegex;
|
||||
private Pattern emailRegex;
|
||||
private Multimap<String, String> restrictedNames;
|
||||
|
||||
ValidationService() {
|
||||
@@ -62,6 +62,7 @@ public class ValidationService implements Reloadable {
|
||||
restrictedNames = settings.getProperty(RestrictionSettings.ENABLE_RESTRICTED_USERS)
|
||||
? loadNameRestrictions(settings.getProperty(RestrictionSettings.RESTRICTED_USERS))
|
||||
: HashMultimap.create();
|
||||
emailRegex = Utils.safePatternCompile(settings.getProperty(RestrictionSettings.ALLOWED_EMAIL_REGEX));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,12 +94,7 @@ public class ValidationService implements Reloadable {
|
||||
* @return true if the email is valid, false otherwise
|
||||
*/
|
||||
public boolean validateEmail(String email) {
|
||||
if (Utils.isEmailEmpty(email) || !StringUtils.isInsideString('@', email)) {
|
||||
return false;
|
||||
}
|
||||
final String emailDomain = email.split("@")[1];
|
||||
return validateWhitelistAndBlacklist(
|
||||
emailDomain, EmailSettings.DOMAIN_WHITELIST, EmailSettings.DOMAIN_BLACKLIST);
|
||||
return emailRegex.matcher(email).matches();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,6 +24,9 @@ public class Settings extends SettingsManagerImpl {
|
||||
private String passwordEmailMessage;
|
||||
private String verificationEmailMessage;
|
||||
private String recoveryCodeEmailMessage;
|
||||
private String shutdownEmailMessage;
|
||||
private String newPasswordEmailMessage;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
@@ -67,10 +70,19 @@ public class Settings extends SettingsManagerImpl {
|
||||
return recoveryCodeEmailMessage;
|
||||
}
|
||||
|
||||
public String getShutdownEmailMessage() {return shutdownEmailMessage;}
|
||||
|
||||
public String getNewPasswordEmailMessage() {
|
||||
return newPasswordEmailMessage;
|
||||
}
|
||||
|
||||
private void loadSettingsFromFiles() {
|
||||
newPasswordEmailMessage = readFile("new_email.html");
|
||||
passwordEmailMessage = readFile("email.html");
|
||||
verificationEmailMessage = readFile("verification_code_email.html");
|
||||
recoveryCodeEmailMessage = readFile("recovery_code_email.html");
|
||||
shutdownEmailMessage = readFile("shutdown.html");
|
||||
String country = readFile("GeoLite2-Country.mmdb");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -74,6 +74,9 @@ public final class EmailSettings implements SettingsHolder {
|
||||
@Comment("The OAuth2 token")
|
||||
public static final Property<String> OAUTH2_TOKEN =
|
||||
newProperty("Email.emailOauth2Token", "");
|
||||
@Comment("Email notifications when the server shuts down")
|
||||
public static final Property<Boolean> SHOUTDOWN_MAIL =
|
||||
newProperty("Email.shutDownEmail", true);
|
||||
|
||||
private EmailSettings() {
|
||||
}
|
||||
|
||||
@@ -165,6 +165,11 @@ public final class RestrictionSettings implements SettingsHolder {
|
||||
public static final Property<String> ALLOWED_PASSWORD_REGEX =
|
||||
newProperty("settings.restrictions.allowedPasswordCharacters", "[!-~]*");
|
||||
|
||||
@Comment("Regex syntax for allowed chars in email.")
|
||||
public static final Property<String> ALLOWED_EMAIL_REGEX =
|
||||
newProperty("settings.restrictions.allowedEmailCharacters", "^[A-Za-z0-9]{4,15}@(qq|163|icloud).com$");
|
||||
|
||||
|
||||
@Comment("Force survival gamemode when player joins?")
|
||||
public static final Property<Boolean> FORCE_SURVIVAL_MODE =
|
||||
newProperty("settings.GameMode.ForceSurvivalMode", false);
|
||||
|
||||
Binary file not shown.
+120
-18
@@ -1,18 +1,120 @@
|
||||
<h1>
|
||||
Dear <playername />,
|
||||
</h1>
|
||||
|
||||
<p>
|
||||
This is your new AuthMe password for the server <servername />:
|
||||
</p>
|
||||
<p>
|
||||
<generatedpass />
|
||||
</p>
|
||||
<image />
|
||||
<p>
|
||||
Do not forget to change password after login!<br />
|
||||
/changepassword <generatedpass /> newPassword'
|
||||
</p>
|
||||
<p>
|
||||
See you on <servername />!
|
||||
</p>
|
||||
<div class="mail">
|
||||
<style>
|
||||
.mail td{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
color: #718096;
|
||||
}
|
||||
.mail th, div, p, a, h1, h2, h3, h4, h5, h6{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
color: #3d4852;
|
||||
}
|
||||
.mail .mail-content {
|
||||
max-width: 100vw;
|
||||
padding: 32px;
|
||||
box-shadow: 0 15px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.mail div{
|
||||
background-color: #ffffff;color: #718096;height: 100%;line-height: 1.4;width: 100%;
|
||||
}
|
||||
.mail .x_wrapper{
|
||||
background-color: #edf2f7;
|
||||
width:100%;
|
||||
}
|
||||
.mail .x_content{
|
||||
width: 100%;
|
||||
}
|
||||
.mail .x_inner-body{
|
||||
background-color: #ffffff;border-color: #e8e5ef;border-radius: 2px;border-width: 1px;margin: 0 auto;padding:0;width: 570px;
|
||||
}
|
||||
.mail .x_content-cell{
|
||||
margin: 0 auto;padding: 0;width: 570px;line-height: 1.5em;
|
||||
color: #b0adc5;font-size: 12px;
|
||||
}
|
||||
.mail .x_content-cell td{
|
||||
max-width: 100vw;padding: 32px;
|
||||
}
|
||||
</style>
|
||||
<div>
|
||||
<table class="x_wrapper">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="padding: 25px 0;">
|
||||
<h1 style="font-size: 20px;">密码重置邮件</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_inner-body">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="mail-content">
|
||||
<h1 style="font-size: 18px;margin-bottom: 25px;">Minecraft · <servername /><br/><playername /></h1>
|
||||
<hr>
|
||||
<table style="width: 100%;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
您正在申请的新密码为
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="font-weight: bold;">
|
||||
<br/><generatedpass /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<br/>请妥善保存,在新地址上进行登录时,需提供该密码.
|
||||
<br/>若非必要,请勿更换密码,否则将对您的账户安全构成威胁.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right;">
|
||||
<br/>
|
||||
<br/>祝您游玩愉快~!
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<small>
|
||||
<br/><time />
|
||||
<br/>请勿回复
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content-cell">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p style="color:#b0adc5;">© 2023 IrisCraft. All rights reserved.</p>
|
||||
<a href="https://www.mcbbs.net/thread-1263385-1-1.html" target="_blank" style="text-decoration: none; font-size: 16px">iriscraft.work</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
# AuthmeReloaded帮助文件汉化
|
||||
# Translated By CH1
|
||||
# -------------------------------------------------------
|
||||
common:
|
||||
header: '==========[ AuthMeReloaded ]=========='
|
||||
header: '======================================'
|
||||
optional: '可选'
|
||||
hasPermission: '您拥有权限去使用这个指令'
|
||||
noPermission: '您没有权限使用这个指令'
|
||||
|
||||
@@ -5,132 +5,140 @@
|
||||
|
||||
# Registration
|
||||
registration:
|
||||
disabled: '&8[&6玩家系统&8] &c目前服务器暂时禁止注册,请到服务器论坛以得到更多资讯'
|
||||
name_taken: '&8[&6玩家系统&8] &c此用户已经在此服务器注册过'
|
||||
register_request: '&8[&6玩家系统&8] &c请输入“/register <密码> <再输入一次以确定密码>”以注册'
|
||||
command_usage: '&8[&6玩家系统&8] &c正确用法:“/register <密码> <再输入一次以确定密码>”'
|
||||
reg_only: '&8[&6玩家系统&8] &f只允许注册过的玩家进服!请到 https://example.cn 注册'
|
||||
success: '&8[&6玩家系统&8] &c已成功注册!'
|
||||
kicked_admin_registered: '有一位管理员刚刚为您完成了注册,请重新登录'
|
||||
disabled: '&c注册已被禁止'
|
||||
name_taken: '&c此用户已经在此服务器注册过'
|
||||
register_request: '&7请输入“/register <邮箱>”以注册'
|
||||
command_usage: '&c正确用法:“/register <邮箱>”'
|
||||
reg_only: '&c只允许注册过的玩家进服!'
|
||||
success: '&a*** 已成功注册 ***'
|
||||
|
||||
# Password errors on registration
|
||||
password:
|
||||
match_error: '&8[&6玩家系统&8] &f密码不相同'
|
||||
name_in_password: '&8[&6玩家系统&8] &f你不能使用你的名字作为密码。 '
|
||||
unsafe_password: '&8[&6玩家系统&8] &f你不能使用安全性过低的密码。 '
|
||||
forbidden_characters: '&4您的密码包含了非法字符。可使用的字符: %valid_chars'
|
||||
wrong_length: '&8[&6玩家系统&8] &c你的密码不符合要求'
|
||||
match_error: '&c密码不相同'
|
||||
name_in_password: '&c您不能使用您的名字作为密码。 '
|
||||
unsafe_password: '&c您不能使用安全性过低的密码。 '
|
||||
forbidden_characters: '&4您的密码包含了非法字符.可使用的字符: %valid_chars'
|
||||
wrong_length: '&4您的密码没有达到要求!'
|
||||
|
||||
# Login
|
||||
login:
|
||||
command_usage: '&8[&6玩家系统&8] &c正确用法:“/login <密码>”'
|
||||
wrong_password: '&8[&6玩家系统&8] &c错误的密码'
|
||||
success: '&8[&6玩家系统&8] &c已成功登录!'
|
||||
login_request: '&8[&6玩家系统&8] &c请输入“/login <密码>”以登录'
|
||||
timeout_error: '&8[&6玩家系统&8] &f登录超时'
|
||||
command_usage: '&c正确用法:“/login <密码>”'
|
||||
wrong_password: '&c*** 密码错误 ***'
|
||||
success: '&a*** 已成功登录 ***'
|
||||
login_request: '&c请输入“/login <密码>”以登录'
|
||||
timeout_error: '给您登录的时间已经过了'
|
||||
|
||||
# Errors
|
||||
error:
|
||||
denied_command: '&c您需要先通过验证才能使用该命令!'
|
||||
denied_chat: '&c您需要先通过验证才能聊天!'
|
||||
unregistered_user: '&8[&6玩家系统&8] &c此用户名还未注册过'
|
||||
not_logged_in: '&8[&6玩家系统&8] &c你还未登录!'
|
||||
no_permission: '&8[&6玩家系统&8] &c没有权限'
|
||||
unexpected_error: '&8[&6玩家系统&8] &f发现错误,请联系管理员'
|
||||
max_registration: '&8[&6玩家系统&8] &f你不允许再为你的IP在服务器注册更多用户了!'
|
||||
logged_in: '&8[&6玩家系统&8] &c你已经登陆过了!'
|
||||
kick_for_vip: '&8[&6玩家系统&8] &cA VIP玩家加入了已满的服务器!'
|
||||
kick_unresolved_hostname: '&8[&6玩家系统&8] &c发生了一个错误: 无法解析玩家的Hostname'
|
||||
tempban_max_logins: '&c由于您登录失败次数过多,已被暂时禁止登录。'
|
||||
denied_command: '&7您需要先通过验证才能使用该命令!'
|
||||
denied_chat: '&7您需要先通过验证才能聊天!'
|
||||
unregistered_user: '&c此用户名还未注册过'
|
||||
not_logged_in: '&c您还未登录!'
|
||||
no_permission: '&c没有权限'
|
||||
unexpected_error: '&4发现错误,请联系管理员'
|
||||
max_registration: '&c该地址已无法注册,请联系管理员进行注册.'
|
||||
logged_in: '&c您已经登陆过了!'
|
||||
kick_for_vip: '&c一个VIP玩家加入了已满的服务器!'
|
||||
kick_unresolved_hostname: '&c发生了一个错误: 无法解析玩家的主机名'
|
||||
tempban_max_logins: '&c由于您登录失败次数过多,已被暂时禁止登录。'
|
||||
|
||||
# AntiBot
|
||||
antibot:
|
||||
kick_antibot: '&8[&6玩家系统&8] &f验证程序已启用 !请稍等几分钟后再次进入服务器'
|
||||
auto_enabled: '&8[&6玩家系统&8] &f验证程序由于大量异常连接而启用'
|
||||
auto_disabled: '&8[&6玩家系统&8] &f验证程序由于异常连接减少而在 %m 分钟后停止'
|
||||
kick_antibot: '连接异常,请稍后加入'
|
||||
auto_enabled: '&c由于发生大量异常连接,本服将禁止连接.'
|
||||
auto_disabled: '&a异常连接减少,本服将在 &a%m &a分钟后自动开放连接.'
|
||||
|
||||
# Unregister
|
||||
unregister:
|
||||
success: '&8[&6玩家系统&8] &c成功删除此用户!'
|
||||
command_usage: '&8[&6玩家系统&8] &c正确用法:“/unregister <密码>”'
|
||||
success: '&a*** 已成功注销 ***'
|
||||
command_usage: '&c正确用法:“/unregister <密码>”'
|
||||
|
||||
# Other messages
|
||||
misc:
|
||||
account_not_activated: '&8[&6玩家系统&8] &f你的帐号还未激活,请查看你的邮箱!'
|
||||
password_changed: '&8[&6玩家系统&8] &c密码已成功修改!'
|
||||
logout: '&8[&6玩家系统&8] &c已成功登出!'
|
||||
reload: '&8[&6玩家系统&8] &f配置以及数据已经重新加载完毕'
|
||||
usage_change_password: '&8[&6玩家系统&8] &f正确用法:“/changepassword 旧密码 新密码”'
|
||||
accounts_owned_self: '您拥有 %count 个账户:'
|
||||
accounts_owned_other: '玩家 %name 拥有 %count 个账户:'
|
||||
account_not_activated: |-
|
||||
&a一封包含密码的邮件已发送至您的收件箱.
|
||||
&a请在十分钟内完成激活,否则将注销此账户.
|
||||
not_activated: '&c账户未激活,请注册激活后再次尝试.'
|
||||
password_changed: '&a*** 密码已修改 ***'
|
||||
logout: '&a*** 已成功登出 ***'
|
||||
reload: '&a配置以及数据已经重新加载完毕'
|
||||
usage_change_password: '&a正确用法:“/changepassword 旧密码 新密码”'
|
||||
accounts_owned_self: '您拥有 %count 个账户:'
|
||||
accounts_owned_other: '玩家 %name 拥有 %count 个账户:'
|
||||
|
||||
# Session messages
|
||||
session:
|
||||
valid_session: '&8[&6玩家系统&8] &c欢迎回来,已帮你自动登录到此服务器'
|
||||
invalid_session: '&8[&6玩家系统&8] &f登录数据异常,请等待登录结束'
|
||||
valid_session: ''
|
||||
invalid_session: '&c*** 请重新登录 ***'
|
||||
|
||||
# Error messages when joining
|
||||
on_join_validation:
|
||||
same_ip_online: '已有一个同IP玩家在游戏中了!'
|
||||
same_nick_online: '&8[&6玩家系统&8] &f同样的用户名现在在线且已经登录了!'
|
||||
name_length: '&8[&6玩家系统&8] &c你的用户名太短或者太长了'
|
||||
characters_in_name: '&8[&6玩家系统&8] &c你的用户名包含非法字母,用户名里允许的字母: %valid_chars'
|
||||
kick_full_server: '&8[&6玩家系统&8] &c抱歉,服务器已满!'
|
||||
country_banned: '这个服务器禁止该国家登陆'
|
||||
not_owner_error: '&8[&6玩家系统&8] &4警告! &c你并不是此帐户的拥有者,请立即登出! '
|
||||
invalid_name_case: '&8[&6玩家系统&8] &c你应该使用「%valid」而并非「%invalid」登入游戏。 '
|
||||
quick_command: '&8[&6玩家系统&8] &c您发送命令的速度太快了,请重新加入服务器再等待一会后再使用命令'
|
||||
same_ip_online: '已有一个同IP玩家在游戏中了!'
|
||||
same_nick_online: '&a同样的用户名现在在线且已经登录了!'
|
||||
name_length: '&c您的用户名太短或者太长了'
|
||||
characters_in_name: '&c您的用户名不符合标准.'
|
||||
kick_full_server: '&c抱歉,服务器已满!'
|
||||
country_banned: |-
|
||||
&6[&b&lAccount Security System&6]
|
||||
&c为保证您的游玩体验,请使用中国境内网络连接.
|
||||
&cTo ensure your play experience,please use the Internet connection within China.
|
||||
not_owner_error: |-
|
||||
&6[&b&lAccount Security System&6]
|
||||
&c请勿尝试登陆系统账户,系统账户受安全系统保护.
|
||||
&c如果您并不知情,请更换您的用户名重新加入该服务器.
|
||||
invalid_name_case: '&c您应该使用 %valid 登录服务器,当前名字: %invalid .'
|
||||
quick_command: '&c您发送命令的速度太快了,请重新加入服务器等待一会后再使用命令'
|
||||
|
||||
# Email
|
||||
email:
|
||||
add_email_request: '&8[&6玩家系统&8] &c请输入“/email add <你的邮箱> <再输入一次以确认>”以添加您的邮箱到此帐号'
|
||||
usage_email_add: '&8[&6玩家系统&8] &f用法: /email add <邮箱> <确认邮箱地址> '
|
||||
usage_email_change: '&8[&6玩家系统&8] &f用法: /email change <旧邮箱> <新邮箱> '
|
||||
new_email_invalid: '&8[&6玩家系统&8] &f新邮箱无效!'
|
||||
old_email_invalid: '&8[&6玩家系统&8] &f旧邮箱无效!'
|
||||
invalid: '&8[&6玩家系统&8] &f无效的邮箱'
|
||||
added: '&8[&6玩家系统&8] &f邮箱已添加 !'
|
||||
add_not_allowed: '&8[&6玩家系统&8] &c服务器不允许添加邮箱地址'
|
||||
request_confirmation: '&8[&6玩家系统&8] &f确认你的邮箱 !'
|
||||
changed: '&8[&6玩家系统&8] &f邮箱已修改 !'
|
||||
change_not_allowed: '&8[&6玩家系统&8] &c服务器不允许修改邮箱地址'
|
||||
email_show: '&8[&6玩家系统&8] &2您当前的电子邮件地址为: &f%email'
|
||||
no_email_for_account: '&8[&6玩家系统&8] &2您当前并没有任何邮箱与该账号绑定'
|
||||
already_used: '&8[&6玩家系统&8] &4邮箱已被使用'
|
||||
incomplete_settings: '&8[&6玩家系统&8] 错误:必要设置未设定完成,请联系管理员'
|
||||
send_failure: '&8[&6玩家系统&8] 邮件发送失败,请联系管理员'
|
||||
change_password_expired: '&8[&6玩家系统&8] 您不能使用此命令更改密码'
|
||||
email_cooldown_error: '&8[&6玩家系统&8] &c邮件已在几分钟前发送,您需要等待 %time 后才能再次请求发送'
|
||||
add_email_request: ''
|
||||
usage_email_add: '&a用法: /email add <邮箱> <确认邮箱> '
|
||||
usage_email_change: '&a用法: /email change <旧邮箱> <新邮箱> '
|
||||
new_email_invalid: '&c新邮箱无效!'
|
||||
old_email_invalid: '&c旧邮箱无效!'
|
||||
invalid: '&c无效的邮箱'
|
||||
added: '&a*** 邮箱已添加 ***'
|
||||
add_not_allowed: '&c服务器不允许添加电子邮箱'
|
||||
request_confirmation: '&c确认您的邮箱'
|
||||
changed: '&a*** 邮箱已修改 ***'
|
||||
change_not_allowed: '&c服务器不允许修改邮箱地址'
|
||||
email_show: '&a该账户使用的电子邮箱为: &a%email'
|
||||
no_email_for_account: '&c当前并没有任何邮箱与该账号绑定'
|
||||
already_used: '&c邮箱已被使用'
|
||||
incomplete_settings: '&c错误: 必要设置未设定完成,请联系管理员'
|
||||
send_failure: '&c邮件已被作废,请检查您的邮箱是否正常工作.'
|
||||
change_password_expired: '&c您不能使用此命令更改密码'
|
||||
email_cooldown_error: '&c您需要等待 %time 后才能再次请求发送'
|
||||
|
||||
# Password recovery by email
|
||||
recovery:
|
||||
forgot_password_hint: '&8[&6玩家系统&8] &c忘了你的密码?请输入:“/email recovery <你的邮箱>”'
|
||||
command_usage: '&8[&6玩家系统&8] &f用法: /email recovery <邮箱>'
|
||||
email_sent: '&8[&6玩家系统&8] &f找回密码邮件已发送 !'
|
||||
forgot_password_hint: '&c忘了您的密码?请输入:“/email recovery <您的邮箱>”'
|
||||
command_usage: '&a用法: /email recovery <邮箱>'
|
||||
email_sent: '&a找回密码邮件已发送!'
|
||||
code:
|
||||
code_sent: '一个用于重置您的密码的验证码已发到您的邮箱'
|
||||
incorrect: '验证码不正确! 使用 /email recovery [邮箱] 以生成新的验证码'
|
||||
tries_exceeded: '您已经达到输入验证码次数的最大允许次数。请使用 "/email recovery [邮箱]" 来生成一个新的'
|
||||
correct: '验证码正确!'
|
||||
change_password: '请使用 /email setpassword <新密码> 立即设置新的密码'
|
||||
code_sent: '&a*** 已发送验证邮件 ***'
|
||||
incorrect: '&a验证码不正确! 使用 /email recovery [邮箱] 以生成新的验证码'
|
||||
tries_exceeded: '&a您已经达到输入验证码次数的最大允许次数.'
|
||||
correct: '&a*** 验证通过 ***'
|
||||
change_password: '&c请使用 /email setpassword <新密码> 立即设置新的密码'
|
||||
|
||||
# Captcha
|
||||
captcha:
|
||||
usage_captcha: '&8[&6玩家系统&8] &c正确用法:/captcha %captcha_code'
|
||||
wrong_captcha: '&8[&6玩家系统&8] &c错误的验证码,请输入:“/captcha %captcha_code”'
|
||||
valid_captcha: '&8[&6玩家系统&8] &c你的验证码是有效的!'
|
||||
captcha_for_registration: '注册前您需要先提供验证码,请使用指令:/captcha %captcha_code'
|
||||
register_captcha_valid: '&2有效的验证码!您现在可以使用 /register 注册啦!'
|
||||
usage_captcha: '&7请输入 /captcha %captcha_code 来验证操作.'
|
||||
wrong_captcha: '&c错误的验证码.'
|
||||
valid_captcha: '&a*** 验证通过 ***'
|
||||
captcha_for_registration: '&7请输入 /captcha %captcha_code 来验证操作.'
|
||||
register_captcha_valid: '&a验证通过, 现在可以使用 /register 注册啦!'
|
||||
|
||||
# Verification code
|
||||
verification:
|
||||
code_required: '&3这个命令非常敏感,需要电子邮件验证!请检查您的收件箱,并遵循邮件的指导。'
|
||||
command_usage: '&c使用方法: /verification <验证码>'
|
||||
incorrect_code: '&c验证码错误, 请在聊天框输入 "/verification <验证码>",使用您在电子邮件中收到的验证码。'
|
||||
success: '&2您的身份已经得到验证!您现在可以在当前会话中执行所有命令!'
|
||||
already_verified: '&2您已经可以在当前会话中执行任何敏感命令!'
|
||||
code_expired: '&3您的验证码已失效!执行另一个敏感命令以获得新的验证码!'
|
||||
email_needed: '&3为了验证您的身份,您需要将一个电子邮件地址与您的帐户绑定!!'
|
||||
code_required: '&a*** 已发送验证邮件 ***'
|
||||
command_usage: '&c使用方法:/verification <验证码>'
|
||||
incorrect_code: '&c错误的验证码.'
|
||||
success: '&a*** 验证通过 ***'
|
||||
already_verified: '&a您已经通过验证'
|
||||
code_expired: '&c验证码已失效'
|
||||
email_needed: '&c邮箱未绑定'
|
||||
|
||||
# Time units
|
||||
time:
|
||||
@@ -138,20 +146,20 @@ time:
|
||||
seconds: '秒'
|
||||
minute: '分'
|
||||
minutes: '分'
|
||||
hour: '小时'
|
||||
hours: '小时'
|
||||
hour: '时'
|
||||
hours: '时'
|
||||
day: '天'
|
||||
days: '天'
|
||||
|
||||
# Two-factor authentication
|
||||
two_factor:
|
||||
code_created: '&8[&6玩家系统&8] &a你的代码是 %code,你可以使用 %url 来进行扫描'
|
||||
confirmation_required: '&8[&6玩家系统&8] &3请输入 &a/2fa confirm <验证码> &3来确认双重认证'
|
||||
code_required: '&8[&6玩家系统&8] &c请输入 &a/2fa code <验证码> &c来提交双重认证验证码'
|
||||
already_enabled: '&8[&6玩家系统&8] &a双重认证已在您的账号上启用'
|
||||
enable_error_no_code: '&8[&6玩家系统&8] &c双重认证密钥不存在或已过期,请输入 &a/2fa add &c来添加'
|
||||
enable_success: '&8[&6玩家系统&8] &a已成功启用双重认证'
|
||||
enable_error_wrong_code: '&8[&6玩家系统&8] &c双重认证代码错误或者已经过期,请重新执行 &a/2fa add'
|
||||
not_enabled_error: '&8[&6玩家系统&8] &c双重认证码未在您的账号上启用,请使用 &a/2fa add &c来启用'
|
||||
removed_success: '&8[&6玩家系统&8] &c双重认证码已从您的账号上删除'
|
||||
invalid_code: '&8[&6玩家系统&8] &c无效的验证码'
|
||||
code_created: '&7您正在激活双重验证, 请打开 &a%url &7扫描二维码'
|
||||
confirmation_required: '&7请输入“/totp confirm <验证码>”来确认激活双重验证'
|
||||
code_required: '&c请输入“/totp code <验证码>”来提交验证码'
|
||||
already_enabled: '&a双重验证已启用'
|
||||
enable_error_no_code: '&c验证码丢失'
|
||||
enable_success: '&a已成功启用双重验证'
|
||||
enable_error_wrong_code: '&c验证码错误或者已经过期,请重新执行“/totp add”'
|
||||
not_enabled_error: '&c双重验证未在您的账号上启用,请使用“/totp add”来启用'
|
||||
removed_success: '&c双重验证已从您的账号上禁用'
|
||||
invalid_code: '&c无效的验证码'
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
<div class="mail">
|
||||
<style>
|
||||
.mail td{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
color: #718096;
|
||||
}
|
||||
.mail th, div, p, a, h1, h2, h3, h4, h5, h6{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
color: #3d4852;
|
||||
}
|
||||
.mail .mail-content {
|
||||
max-width: 100vw;
|
||||
padding: 32px;
|
||||
box-shadow: 0 15px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.mail div{
|
||||
background-color: #ffffff;color: #718096;height: 100%;line-height: 1.4;width: 100%;
|
||||
}
|
||||
.mail .x_wrapper{
|
||||
background-color: #edf2f7;
|
||||
width:100%;
|
||||
}
|
||||
.mail .x_content{
|
||||
width: 100%;
|
||||
}
|
||||
.mail .x_inner-body{
|
||||
background-color: #ffffff;border-color: #e8e5ef;border-radius: 2px;border-width: 1px;margin: 0 auto;padding:0;width: 570px;
|
||||
}
|
||||
.mail .x_content-cell{
|
||||
margin: 0 auto;padding: 0;width: 570px;line-height: 1.5em;
|
||||
color: #b0adc5;font-size: 12px;
|
||||
}
|
||||
.mail .x_content-cell td{
|
||||
max-width: 100vw;padding: 32px;
|
||||
}
|
||||
</style>
|
||||
<div>
|
||||
<table class="x_wrapper">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="padding: 25px 0;">
|
||||
<h1 style="font-size: 20px;">账户激活邮件</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_inner-body">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="mail-content">
|
||||
<h1 style="font-size: 18px;margin-bottom: 25px;">Minecraft · <servername /><br/><playername /></h1>
|
||||
<hr>
|
||||
<table style="width: 100%;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
您的账户初始密码为
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="font-weight: bold;">
|
||||
<br/><generatedpass /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<br/>已将地址(<playerip />)进行记录.
|
||||
<br/>
|
||||
<br/>请妥善保存,在新地址上进行登录时,需提供该密码.
|
||||
<br/>若非必要,请勿更换密码,否则将对您的账户安全构成威胁.
|
||||
<br/>账户所绑定的邮箱地址已被永久存储,需要更换请联系管理员.
|
||||
<br/>
|
||||
<br/>更换密码: /changepassword <generatedpass /> [新密码]
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right;">
|
||||
<br/>
|
||||
<br/>账户将在激活后生效
|
||||
<br/>欢迎您的加入~!
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<small>
|
||||
<br/><time />
|
||||
<br/>请勿回复
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content-cell">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p style="color:#b0adc5;">© 2023 IrisCraft. All rights reserved.</p>
|
||||
<a href="https://www.mcbbs.net/thread-1263385-1-1.html" target="_blank" style="text-decoration: none; font-size: 16px">iriscraft.work</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,9 +1,119 @@
|
||||
<h1>Dear <playername />,</h1>
|
||||
|
||||
<p>
|
||||
You have requested to reset your password on <servername />. To reset it,
|
||||
please use the recovery code <recoverycode />: /email code <recoverycode />.
|
||||
</p>
|
||||
<p>
|
||||
The code expires in <hoursvalid /> hours.
|
||||
</p>
|
||||
<div class="mail">
|
||||
<style>
|
||||
.mail td{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
color: #718096;
|
||||
}
|
||||
.mail th, div, p, a, h1, h2, h3, h4, h5, h6{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
color: #3d4852;
|
||||
}
|
||||
.mail .mail-content {
|
||||
max-width: 100vw;
|
||||
padding: 32px;
|
||||
box-shadow: 0 15px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.mail div{
|
||||
background-color: #ffffff;color: #718096;height: 100%;line-height: 1.4;width: 100%;
|
||||
}
|
||||
.mail .x_wrapper{
|
||||
background-color: #edf2f7;
|
||||
width:100%;
|
||||
}
|
||||
.mail .x_content{
|
||||
width: 100%;
|
||||
}
|
||||
.mail .x_inner-body{
|
||||
background-color: #ffffff;border-color: #e8e5ef;border-radius: 2px;border-width: 1px;margin: 0 auto;padding:0;width: 570px;
|
||||
}
|
||||
.mail .x_content-cell{
|
||||
margin: 0 auto;padding: 0;width: 570px;line-height: 1.5em;
|
||||
color: #b0adc5;font-size: 12px;
|
||||
}
|
||||
.mail .x_content-cell td{
|
||||
max-width: 100vw;padding: 32px;
|
||||
}
|
||||
</style>
|
||||
<div>
|
||||
<table class="x_wrapper">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="padding: 25px 0;">
|
||||
<h1 style="font-size: 20px;">代码验证邮件</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_inner-body">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="mail-content">
|
||||
<h1 style="font-size: 18px;margin-bottom: 25px;">Minecraft · <servername /><br/><playername /></h1>
|
||||
<hr>
|
||||
<table style="width: 100%;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
您正在申请的验证码为
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="font-weight: bold;">
|
||||
<br/><recoverycode /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<br/>使用指令: /email code <recoverycode /> 来完成验证过程.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right;">
|
||||
<br/>
|
||||
<br/>验证码将在<hoursvalid />小时后失效
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<small>
|
||||
<br/><time />
|
||||
<br/>请勿回复
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content-cell">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p style="color:#b0adc5;">© 2023 IrisCraft. All rights reserved.</p>
|
||||
<a href="https://www.mcbbs.net/thread-1263385-1-1.html" target="_blank" style="text-decoration: none; font-size: 16px">iriscraft.work</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
<div class="mail">
|
||||
<style>
|
||||
.mail td{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
color: #718096;
|
||||
}
|
||||
.mail th, div, p, a, h1, h2, h3, h4, h5, h6{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
color: #3d4852;
|
||||
}
|
||||
.mail .mail-content {
|
||||
max-width: 100vw;
|
||||
padding: 32px;
|
||||
box-shadow: 0 15px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.mail div{
|
||||
background-color: #ffffff;color: #718096;height: 100%;line-height: 1.4;width: 100%;
|
||||
}
|
||||
.mail .x_wrapper{
|
||||
background-color: #edf2f7;
|
||||
width:100%;
|
||||
}
|
||||
.mail .x_content{
|
||||
width: 100%;
|
||||
}
|
||||
.mail .x_inner-body{
|
||||
background-color: #ffffff;border-color: #e8e5ef;border-radius: 2px;border-width: 1px;margin: 0 auto;padding:0;width: 570px;
|
||||
}
|
||||
.mail .x_content-cell{
|
||||
margin: 0 auto;padding: 0;width: 570px;line-height: 1.5em;
|
||||
color: #b0adc5;font-size: 12px;
|
||||
}
|
||||
.mail .x_content-cell td{
|
||||
max-width: 100vw;padding: 32px;
|
||||
}
|
||||
</style>
|
||||
<div>
|
||||
<table class="x_wrapper">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="padding: 25px 0;">
|
||||
<h1 style="font-size: 20px;">服务器关闭通知</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_inner-body">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="mail-content">
|
||||
<h1 style="font-size: 18px;margin-bottom: 25px;">Minecraft · <servername /></h1>
|
||||
<hr>
|
||||
<table style="width: 100%;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="font-weight: bold;color: #da1515;">
|
||||
<br/>紧急通知</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<br/>服务器当前已被关闭
|
||||
<br/>
|
||||
<br/>请及时检查服务器运行状态.
|
||||
<br/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right;">
|
||||
<br/>
|
||||
<br/>IrisCraft Team
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<small>
|
||||
<br/><time />
|
||||
<br/>请勿回复
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content-cell">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p style="color:#b0adc5;">© 2023 IrisCraft. All rights reserved.</p>
|
||||
<a href="https://www.mcbbs.net/thread-1263385-1-1.html" target="_blank" style="text-decoration: none; font-size: 16px">iriscraft.work</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,20 +1,119 @@
|
||||
<h1>
|
||||
Dear <playername />,
|
||||
</h1>
|
||||
|
||||
<p>
|
||||
This is your temporary verification code for the server <servername />:
|
||||
</p>
|
||||
<p>
|
||||
<generatedcode />
|
||||
</p>
|
||||
|
||||
<p>
|
||||
This code will be valid for the next <minutesvalid /> mins!<br />
|
||||
Use the command
|
||||
/verification <generatedcode />
|
||||
to complete the verification process.
|
||||
</p>
|
||||
<p>
|
||||
See you on <servername />!
|
||||
</p>
|
||||
<div class="mail">
|
||||
<style>
|
||||
.mail td{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
color: #718096;
|
||||
}
|
||||
.mail th, div, p, a, h1, h2, h3, h4, h5, h6{
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: center;
|
||||
color: #3d4852;
|
||||
}
|
||||
.mail .mail-content {
|
||||
max-width: 100vw;
|
||||
padding: 32px;
|
||||
box-shadow: 0 15px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.mail div{
|
||||
background-color: #ffffff;color: #718096;height: 100%;line-height: 1.4;width: 100%;
|
||||
}
|
||||
.mail .x_wrapper{
|
||||
background-color: #edf2f7;
|
||||
width:100%;
|
||||
}
|
||||
.mail .x_content{
|
||||
width: 100%;
|
||||
}
|
||||
.mail .x_inner-body{
|
||||
background-color: #ffffff;border-color: #e8e5ef;border-radius: 2px;border-width: 1px;margin: 0 auto;padding:0;width: 570px;
|
||||
}
|
||||
.mail .x_content-cell{
|
||||
margin: 0 auto;padding: 0;width: 570px;line-height: 1.5em;
|
||||
color: #b0adc5;font-size: 12px;
|
||||
}
|
||||
.mail .x_content-cell td{
|
||||
max-width: 100vw;padding: 32px;
|
||||
}
|
||||
</style>
|
||||
<div>
|
||||
<table class="x_wrapper">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="padding: 25px 0;">
|
||||
<h1 style="font-size: 20px;">代码验证邮件</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_inner-body">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="mail-content">
|
||||
<h1 style="font-size: 18px;margin-bottom: 25px;">Minecraft · <servername /><br/><playername /></h1>
|
||||
<hr>
|
||||
<table style="width: 100%;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
您正在申请的验证码为
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="font-weight: bold;">
|
||||
<br/><generatedcode /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<br/>使用指令: /verification <generatedcode /> 来完成验证过程.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right;">
|
||||
<br/>
|
||||
<br/>验证码将在30分钟后失效
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<small>
|
||||
<br/><time />
|
||||
<br/>请勿回复
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="x_content-cell">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p style="color:#b0adc5;">© 2023 IrisCraft. All rights reserved.</p>
|
||||
<a href="https://www.mcbbs.net/thread-1263385-1-1.html" target="_blank" style="text-decoration: none; font-size: 16px">iriscraft.work</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user