Compare commits

...

20 commits
v4.5 ... master

Author SHA1 Message Date
Telesphoreo f8ef36ae6a Update just to be safe 2022-04-01 01:41:31 -05:00
Telesphoreo 97ebc4bdb9
Update maven.yml 2022-03-31 00:42:00 -05:00
Telesphoreo 0aa07d46fc Don't shade Spigot maybe 2022-03-31 00:39:32 -05:00
Telesphoreo a76fc5a5b2 bruh 2021-12-17 01:03:45 -06:00
Telesphoreo 67d0383cad Update for Log4J exploit 2021-12-12 00:48:34 -06:00
Telesphoreo 13125dbeb8 Update to 1.18
Because IntelliJ was throwing a fit of the version of 1.17.1 BukkitTelnet was using
2021-12-07 17:35:42 -06:00
Telesphoreo 1a8b6c7394 BukkitTelnet 4.6.1
Consistent versioning, add api-version to plugin.yml
2021-10-01 01:59:54 -05:00
Nathan Curran 63eab7c0d9
Update GitHub workflow to Java 11 2021-06-24 21:50:53 +10:00
Nathan Curran 1ae73cbfea
Bump up the version 2021-06-24 21:28:07 +10:00
Nathan Curran 2c4ad8df02
Optimising BukkitTelnet 2021-06-24 21:25:56 +10:00
Ivan 3436800815 updated legacy version to support 1.16.5 2021-02-04 20:12:08 -05:00
speed 09346eaab6
Merge pull request #1 from AtlasMediaGroup/dependabot/maven/org.apache.logging.log4j-log4j-core-2.13.2
Bump log4j-core from 2.5 to 2.13.2
2020-12-29 12:42:57 -05:00
Ryan e35273ca76
Create codacy-analysis.yml 2020-12-29 14:46:16 +00:00
Ryan 932f5dcf37
Create codeql-analysis.yml 2020-12-29 14:45:10 +00:00
Ryan 3e367eecca
Create maven.yml 2020-12-29 14:44:41 +00:00
dependabot[bot] f9ebc49c12
Bump log4j-core from 2.5 to 2.13.2
Bumps log4j-core from 2.5 to 2.13.2.

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-28 14:43:34 +00:00
ZeroEpoch1969 541e9fdb84
ZTC stuff 2020-03-29 23:05:25 -07:00
Robinson Gallego 66124908d9 mmmmm 2020-02-10 15:50:45 -05:00
ZeroEpoch1969 3e57ef87bf
1.14 2019-09-09 22:18:46 -07:00
Jerom van der Sar da383026e5 Version 4.5
Update to Spigot 1.12-pre5
Improved API
2017-05-26 16:37:34 +02:00
22 changed files with 431 additions and 94 deletions

46
.github/workflows/codacy-analysis.yml vendored Normal file
View file

@ -0,0 +1,46 @@
# This workflow checks out code, performs a Codacy security scan
# and integrates the results with the
# GitHub Advanced Security code scanning feature. For more information on
# the Codacy security scan action usage and parameters, see
# https://github.com/codacy/codacy-analysis-cli-action.
# For more information on Codacy Analysis CLI in general, see
# https://github.com/codacy/codacy-analysis-cli.
name: Codacy Security Scan
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
codacy-security-scan:
name: Codacy Security Scan
runs-on: ubuntu-latest
steps:
# Checkout the repository to the GitHub Actions runner
- name: Checkout code
uses: actions/checkout@v2
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
- name: Run Codacy Analysis CLI
uses: codacy/codacy-analysis-cli-action@1.1.0
with:
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
# You can also omit the token and run the tools that support default configurations
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
verbose: true
output: results.sarif
format: sarif
# Adjust severity of non-security issues
gh-code-scanning-compat: true
# Force 0 exit code to allow SARIF file generation
# This will handover control about PR rejection to the GitHub side
max-allowed-issues: 2147483647
# Upload the SARIF file generated in the previous step
- name: Upload SARIF results file
uses: github/codeql-action/upload-sarif@v1
with:
sarif_file: results.sarif

67
.github/workflows/codeql-analysis.yml vendored Normal file
View file

@ -0,0 +1,67 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '39 23 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

24
.github/workflows/maven.yml vendored Normal file
View file

@ -0,0 +1,24 @@
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
- name: Build with Maven
run: mvn -B package --file pom.xml

1
.gitignore vendored
View file

@ -29,3 +29,4 @@ manifest.mf
.Trashes
ehthumbs.db
Thumbs.db
dependency-reduced-pom.xml

70
pom.xml
View file

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.totalfreedom</groupId>
<artifactId>bukkittelnet</artifactId>
<version>4.4</version>
<artifactId>BukkitTelnet</artifactId>
<version>4.7</version>
<packaging>jar</packaging>
<properties>
@ -29,53 +30,90 @@
</organization>
<scm>
<connection>scm:git:git@github.com:TotalFreedom/BukkitTelnet.git</connection>
<developerConnection>scm:git:git@github.com:TotalFreedom/BukkitTelnet.git</developerConnection>
<url>git@github.com:TotalFreedom/BukkitTelnet.git</url>
<connection>scm:git:git@github.com:TotalFreedomMC/BukkitTelnet.git</connection>
<developerConnection>scm:git:git@github.com:TotalFreedomMC/BukkitTelnet.git</developerConnection>
<url>git@github.com:TotalFreedomMC/BukkitTelnet.git</url>
</scm>
<repositories>
<repository>
<id>spigot</id>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
</repository>
<repository>
<id>essentialsx-repo</id>
<url>https://repo.essentialsx.net/releases/</url>
</repository>
<repository>
<id>CodeMC</id>
<url>https://repo.codemc.org/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.9-R0.1-SNAPSHOT</version>
<scope>compile</scope>
<version>1.18.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
<version>2.17.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.essentialsx</groupId>
<artifactId>EssentialsX</artifactId>
<version>2.19.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20220320</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Compiler -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<version>3.8.1</version>
<configuration>
<compilerVersion>1.7</compilerVersion>
<source>1.7</source>
<target>1.7</target>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
@ -107,7 +145,7 @@
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
</plugin>

View file

@ -1,7 +1,9 @@
package me.totalfreedom.bukkittelnet;
import me.totalfreedom.bukkittelnet.api.Server;
import org.bukkit.Bukkit;
import org.bukkit.event.HandlerList;
import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin;
public class BukkitTelnet extends JavaPlugin
@ -24,6 +26,7 @@ public class BukkitTelnet extends JavaPlugin
TelnetLogger.setPluginLogger(plugin.getLogger());
TelnetLogger.setServerLogger(Bukkit.getLogger());
System.setProperty("log4j2.formatMsgNoLookups", "true");
}
@Override
@ -37,6 +40,8 @@ public class BukkitTelnet extends JavaPlugin
getServer().getPluginManager().registerEvents(listener, plugin);
getServer().getServicesManager().register(Server.class, telnet, this, ServicePriority.Normal);
TelnetLogger.info(plugin.getName() + " v" + plugin.getDescription().getVersion() + " enabled");
}

View file

@ -1,9 +1,8 @@
package me.totalfreedom.bukkittelnet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import com.earth2me.essentials.Essentials;
import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent;
import me.totalfreedom.bukkittelnet.api.TelnetRequestUsageEvent;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -11,16 +10,23 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.JSONArray;
import org.json.JSONObject;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
public class PlayerEventListener implements Listener
{
private static Essentials essentials = null;
private final BukkitTelnet plugin;
public PlayerEventListener(BukkitTelnet plugin)
@ -40,6 +46,18 @@ public class PlayerEventListener implements Listener
triggerPlayerListUpdates();
}
public static Essentials getEssentials()
{
Plugin ess = Bukkit.getPluginManager().getPlugin("Essentials");
if (ess instanceof Essentials)
{
essentials = (Essentials) ess;
return essentials;
}
return null;
}
private static BukkitTask updateTask = null;
public void triggerPlayerListUpdates()
@ -70,34 +88,79 @@ public class PlayerEventListener implements Listener
{
final JSONArray players = new JSONArray();
final Iterator<Map.Entry<Player, Map<String, Object>>> dataTagsIt = dataTags.entrySet().iterator();
while (dataTagsIt.hasNext())
for (Map.Entry<Player, Map<String, Object>> playerMapEntry : dataTags.entrySet())
{
final HashMap<String, String> info = new HashMap<>();
final Map.Entry<Player, Map<String, Object>> dataTagsEntry = dataTagsIt.next();
final Player player = dataTagsEntry.getKey();
final Map<String, Object> playerTags = dataTagsEntry.getValue();
final Player player = playerMapEntry.getKey();
final Map<String, Object> playerTags = playerMapEntry.getValue();
info.put("name", player.getName());
info.put("ip", player.getAddress().getAddress().getHostAddress());
info.put("displayName", StringUtils.trimToEmpty(player.getDisplayName()));
info.put("uuid", player.getUniqueId().toString());
final Iterator<Map.Entry<String, Object>> playerTagsIt = playerTags.entrySet().iterator();
while (playerTagsIt.hasNext())
for (Map.Entry<String, Object> playerTagsEntry : playerTags.entrySet())
{
final Map.Entry<String, Object> playerTagsEntry = playerTagsIt.next();
final Object value = playerTagsEntry.getValue();
info.put(playerTagsEntry.getKey(), value != null ? value.toString() : "null");
}
players.add(info);
players.put(info);
}
final JSONObject response = new JSONObject();
response.put("players", players);
return response.toString();
}
return response.toJSONString();
private static BukkitTask usageUpdateTask = null;
// Just putting this stuff here
public void triggerUsageUpdates()
{
if (usageUpdateTask != null)
{
return;
}
usageUpdateTask = new BukkitRunnable()
{
@Override
public void run()
{
final SocketListener socketListener = plugin.telnet.getSocketListener();
if (socketListener != null)
{
final TelnetRequestUsageEvent event = new TelnetRequestUsageEvent();
Bukkit.getServer().getPluginManager().callEvent(event);
socketListener.triggerDataUsageUpdates(generateUsageStats());
}
}
}.runTaskTimer(plugin, 100L, 100L); // every 5 seconds
}
@SuppressWarnings("unchecked")
private static String generateUsageStats()
{
if (essentials == null)
{
essentials = getEssentials();
}
final JSONObject info = new JSONObject();
String cpuUsage = null;
String ramUsage = null;
String tps = null;
if (essentials != null)
{
tps = String.valueOf(String.valueOf(BigDecimal.valueOf(essentials.getTimer().getAverageTPS()).setScale(1, RoundingMode.CEILING)));
}
info.put("tps", tps);
return info.toString();
}
}

View file

@ -7,6 +7,7 @@ import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@ -47,14 +48,7 @@ public class SocketListener extends Thread
}
// Remove old entries
final Iterator<Entry<InetAddress, Long>> it = recentIPs.entrySet().iterator();
while (it.hasNext())
{
if (it.next().getValue() + LISTEN_THRESHOLD_MILLIS < System.currentTimeMillis())
{
it.remove();
}
}
recentIPs.entrySet().removeIf(inetAddressLongEntry -> inetAddressLongEntry.getValue() + LISTEN_THRESHOLD_MILLIS < System.currentTimeMillis());
final InetAddress addr = clientSocket.getInetAddress();
if (addr == null)
@ -93,7 +87,6 @@ public class SocketListener extends Thread
final ClientSession clientSession = new ClientSession(telnet, clientSocket);
clientSessions.add(clientSession);
clientSession.start();
removeDisconnected();
}
@ -118,16 +111,14 @@ public class SocketListener extends Thread
public void triggerPlayerListUpdates(final String playerListData)
{
final Iterator<ClientSession> it = clientSessions.iterator();
clientSessions.forEach(session ->
session.syncTriggerPlayerListUpdate(playerListData));
}
while (it.hasNext())
{
final ClientSession session = it.next();
if (session != null)
{
session.syncTriggerPlayerListUpdate(playerListData);
}
}
public void triggerDataUsageUpdates(final String usageData)
{
clientSessions.forEach(session ->
session.syncUsageUpdate(usageData));
}
public void stopServer()
@ -149,4 +140,9 @@ public class SocketListener extends Thread
clientSessions.clear();
}
public List<ClientSession> getSessions()
{
return Collections.unmodifiableList(clientSessions);
}
}

View file

@ -13,6 +13,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
public class TelnetLogAppender extends AbstractAppender
{
@ -23,7 +24,7 @@ public class TelnetLogAppender extends AbstractAppender
public TelnetLogAppender()
{
super("BukkitTelnet", null, null);
super("BukkitTelnet", null, null, true, Property.EMPTY_ARRAY);
this.sessions = new HashSet<>();
this.dateFormat = new SimpleDateFormat("HH:mm:ss");
@ -74,7 +75,7 @@ public class TelnetLogAppender extends AbstractAppender
continue;
}
if (session.getFilterMode() == FilterMode.NONCHAT_ONLY && chat)
if (session.getFilterMode() == FilterMode.NON_CHAT_ONLY && chat)
{
continue;
}

View file

@ -4,9 +4,11 @@ import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.UnknownHostException;
import java.util.List;
import lombok.Getter;
import me.totalfreedom.bukkittelnet.TelnetConfigLoader.TelnetConfig;
import me.totalfreedom.bukkittelnet.api.Server;
import me.totalfreedom.bukkittelnet.session.ClientSession;
public class TelnetServer implements Server
{
@ -15,7 +17,7 @@ public class TelnetServer implements Server
private final BukkitTelnet plugin;
@Getter
private final TelnetConfig config;
//
@Getter
private SocketListener socketListener;
public TelnetServer(BukkitTelnet plugin, TelnetConfig config)
@ -92,9 +94,9 @@ public class TelnetServer implements Server
}
@Override
public SocketListener getSocketListener()
public List<ClientSession> getSessions()
{
return socketListener;
return socketListener.getSessions();
}
}

View file

@ -1,19 +1,23 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package me.totalfreedom.bukkittelnet.api;
import me.totalfreedom.bukkittelnet.SocketListener;
import me.totalfreedom.bukkittelnet.TelnetConfigLoader.TelnetConfig;
import me.totalfreedom.bukkittelnet.session.ClientSession;
import java.util.List;
public interface Server
{
public void startServer();
void startServer();
public void stopServer();
void stopServer();
public SocketListener getSocketListener();
@Deprecated
SocketListener getSocketListener();
TelnetConfig getConfig();
List<ClientSession> getSessions();
}

View file

@ -1,10 +1,12 @@
package me.totalfreedom.bukkittelnet.api;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class TelnetCommandEvent extends TelnetEvent implements Cancellable
public class TelnetCommandEvent extends Event implements Cancellable
{
private static final HandlerList handlers = new HandlerList();
@ -15,6 +17,7 @@ public class TelnetCommandEvent extends TelnetEvent implements Cancellable
public TelnetCommandEvent(CommandSender sender, String command)
{
super(!Bukkit.getServer().isPrimaryThread());
this.cancelled = false;
this.sender = sender;
this.command = command;

View file

@ -1,8 +0,0 @@
package me.totalfreedom.bukkittelnet.api;
import org.bukkit.event.server.ServerEvent;
public abstract class TelnetEvent extends ServerEvent
{
}

View file

@ -2,8 +2,10 @@ package me.totalfreedom.bukkittelnet.api;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
public class TelnetPreLoginEvent extends TelnetEvent implements Cancellable
public class TelnetPreLoginEvent extends Event implements Cancellable
{
private static final HandlerList handlers = new HandlerList();
@ -15,6 +17,7 @@ public class TelnetPreLoginEvent extends TelnetEvent implements Cancellable
public TelnetPreLoginEvent(String ip, String name, boolean bypassPassword)
{
super(!Bukkit.getServer().isPrimaryThread());
this.ip = ip;
this.name = name;
this.bypassPassword = bypassPassword;
@ -26,6 +29,7 @@ public class TelnetPreLoginEvent extends TelnetEvent implements Cancellable
return cancelled;
}
@Override
public void setCancelled(boolean cancel)
{

View file

@ -4,9 +4,10 @@ import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class TelnetRequestDataTagsEvent extends TelnetEvent
public class TelnetRequestDataTagsEvent extends Event
{
private static final HandlerList handlers = new HandlerList();
@ -14,9 +15,10 @@ public class TelnetRequestDataTagsEvent extends TelnetEvent
public TelnetRequestDataTagsEvent()
{
super(!Bukkit.getServer().isPrimaryThread());
for (final Player player : Bukkit.getServer().getOnlinePlayers())
{
dataTags.put(player, new HashMap<String, Object>());
dataTags.put(player, new HashMap<>());
}
}

View file

@ -0,0 +1,22 @@
package me.totalfreedom.bukkittelnet.api;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class TelnetRequestUsageEvent extends Event
{
private static final HandlerList handlers = new HandlerList();
public TelnetRequestUsageEvent()
{
super(!Bukkit.getServer().isPrimaryThread());
}
@Override
public HandlerList getHandlers()
{
return handlers;
}
}

View file

@ -23,9 +23,9 @@ import org.bukkit.scheduler.BukkitRunnable;
public final class ClientSession extends Thread
{
public static final Pattern NONASCII_FILTER = Pattern.compile("[^\\x20-\\x7E]");
public static final Pattern NON_ASCII_FILTER = Pattern.compile("[^\\x20-\\x7E]");
public static final Pattern AUTH_INPUT_FILTER = Pattern.compile("[^_a-zA-Z0-9]");
public static final Pattern COMMAND_INPUT_FILTER = Pattern.compile("^[^_a-zA-Z0-9/\\?!\\.]+");
public static final Pattern COMMAND_INPUT_FILTER = Pattern.compile("^[^_a-zA-Z0-9/?!.]+");
//
private final TelnetServer telnet;
private final Socket clientSocket;
@ -39,7 +39,8 @@ public final class ClientSession extends Thread
private String username = "";
private volatile boolean terminated = false;
private volatile boolean authenticated = false;
private volatile boolean enhancedMode = false;
private boolean enhancedMode = false;
private boolean enhancedPlusMode = false;
public ClientSession(TelnetServer telnet, Socket clientSocket)
{
@ -84,6 +85,8 @@ public final class ClientSession extends Thread
mainLoop();
syncTerminateSession();
telnet.getPlugin().listener.triggerUsageUpdates();
}
public boolean syncIsAuthenticated()
@ -118,17 +121,12 @@ public final class ClientSession extends Thread
synchronized (clientSocket)
{
if (clientSocket == null)
{
return;
}
writeLine("Closing connection...");
try
{
clientSocket.close();
}
catch (IOException ex)
catch (IOException ignored)
{
}
}
@ -171,7 +169,7 @@ public final class ClientSession extends Thread
writer.write(":" + ChatColor.stripColor(message) + "\r\n");
writer.flush();
}
catch (IOException ex)
catch (IOException ignored)
{
}
}
@ -187,7 +185,7 @@ public final class ClientSession extends Thread
{
writer.flush();
}
catch (IOException ex)
catch (IOException ignored)
{
}
}
@ -358,7 +356,7 @@ public final class ClientSession extends Thread
{
Thread.sleep(2000);
}
catch (InterruptedException ex)
catch (InterruptedException ignored)
{
}
}
@ -401,7 +399,7 @@ public final class ClientSession extends Thread
continue;
}
command = COMMAND_INPUT_FILTER.matcher(NONASCII_FILTER.matcher(command).replaceAll("")).replaceFirst("").trim();
command = COMMAND_INPUT_FILTER.matcher(NON_ASCII_FILTER.matcher(command).replaceAll("")).replaceFirst("").trim();
if (command.isEmpty())
{
continue;
@ -446,11 +444,11 @@ public final class ClientSession extends Thread
}
case CHAT_ONLY:
{
filterMode = FilterMode.NONCHAT_ONLY;
filterMode = FilterMode.NON_CHAT_ONLY;
writeLine("Showing only non-chat logs.");
break;
}
case NONCHAT_ONLY:
case NON_CHAT_ONLY:
{
filterMode = FilterMode.NONE;
writeLine("Showing all logs.");
@ -472,6 +470,11 @@ public final class ClientSession extends Thread
telnet.getPlugin().listener.triggerPlayerListUpdates();
}
}
else if ("telnet.enhancedplus".equalsIgnoreCase(command))
{
enhancedPlusMode = !enhancedPlusMode;
writeLine((enhancedPlusMode ? "A" : "Dea") + "ctivated enhanced+ mode.");
}
else
{
writeLine("Invalid telnet command, use \"telnet.help\" to view help.");
@ -495,4 +498,22 @@ public final class ClientSession extends Thread
writeLine("playerList~" + playerListData);
}
}
public void syncUsageUpdate(String usageData)
{
if (!enhancedPlusMode)
{
return;
}
synchronized (clientSocket)
{
if (clientSocket.isClosed())
{
return;
}
writeLine("usage~" + usageData);
}
}
}

View file

@ -4,6 +4,6 @@ public enum FilterMode
{
NONE,
NONCHAT_ONLY,
NON_CHAT_ONLY,
CHAT_ONLY;
}

View file

@ -1,6 +1,8 @@
package me.totalfreedom.bukkittelnet.session;
import java.util.Set;
import java.util.UUID;
import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.command.ConsoleCommandSender;
@ -156,4 +158,43 @@ public class SessionCommandSender implements ConsoleCommandSender
session.writeRawLine(string);
}
@Override
public Spigot spigot()
{
return new Spigot()
{
@Override
public void sendMessage(BaseComponent component)
{
SessionCommandSender.this.sendMessage(component.toPlainText());
}
@Override
public void sendMessage(BaseComponent... components)
{
for (BaseComponent bc : components)
{
sendMessage(bc);
}
}
};
}
@Override
public void sendMessage(UUID uuid, String string) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void sendMessage(UUID uuid, String[] strings) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void sendRawMessage(UUID uuid, String string) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

View file

@ -2,7 +2,10 @@ package me.totalfreedom.bukkittelnet.thirdparty;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.logging.log4j.core.util.IOUtils;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
@ -138,7 +141,8 @@ public class YamlConfig extends YamlConfiguration
final YamlConfiguration DEFAULT_CONFIG = new YamlConfiguration();
try
{
DEFAULT_CONFIG.load(PLUGIN.getResource(CONFIG_FILE.getName()));
final String configString = IOUtils.toString(new InputStreamReader(PLUGIN.getResource(CONFIG_FILE.getName())));
DEFAULT_CONFIG.loadFromString(configString);
}
catch (Throwable ex)
{

View file

@ -1,4 +1,4 @@
# BukkitTelnet v4.2 Configuration File
# BukkitTelnet v4.6.1 Configuration File
# Address to listen on, leave blank for all
address: ''

View file

@ -1,5 +1,6 @@
name: BukkitTelnet
main: me.totalfreedom.bukkittelnet.BukkitTelnet
version: 4.4
version: 4.7
api-version: "1.18"
description: Telnet console access plugin.
authors: [bekvon, Madgeek1450, Prozza]