Skip to content

Commit 2ec403f

Browse files
committed
JLine3 should not allow building a system terminal if input *or* output is not a tty
1 parent a6e31a1 commit 2ec403f

File tree

9 files changed

+239
-111
lines changed

9 files changed

+239
-111
lines changed

terminal-jansi/src/main/java/org/jline/terminal/impl/jansi/JansiNativePty.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,7 @@ public static boolean isConsoleOutput() {
176176
return CLibrary.isatty(1) == 1;
177177
}
178178

179+
public static boolean isConsoleInput() {
180+
return CLibrary.isatty(0) == 1;
181+
}
179182
}

terminal-jansi/src/main/java/org/jline/terminal/impl/jansi/JansiSupportImpl.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.jline.terminal.impl.jansi.win.JansiWinSysTerminal;
1919
import org.jline.terminal.spi.JansiSupport;
2020
import org.jline.terminal.spi.Pty;
21+
import org.jline.utils.OSUtils;
2122

2223
import java.io.IOException;
2324
import java.io.InputStream;
@@ -137,7 +138,31 @@ public boolean isWindowsConsole() {
137138
}
138139

139140
@Override
140-
public boolean isConsoleOutput(boolean pty) {
141-
return pty ? JansiNativePty.isConsoleOutput() : JansiWinSysTerminal.isConsoleOutput();
141+
public boolean isConsoleOutput() {
142+
if (OSUtils.IS_CYGWIN || OSUtils.IS_MSYSTEM) {
143+
if (isAtLeast(2,1)) {
144+
return JansiNativePty.isConsoleOutput();
145+
} else {
146+
throw new UnsupportedOperationException();
147+
}
148+
} else if (OSUtils.IS_WINDOWS) {
149+
return JansiWinSysTerminal.isConsoleOutput();
150+
}
151+
return JansiNativePty.isConsoleOutput();
152+
}
153+
154+
@Override
155+
public boolean isConsoleInput() {
156+
if (OSUtils.IS_CYGWIN || OSUtils.IS_MSYSTEM) {
157+
if (isAtLeast(2,1)) {
158+
return JansiNativePty.isConsoleInput();
159+
} else {
160+
throw new UnsupportedOperationException();
161+
}
162+
} else if (OSUtils.IS_WINDOWS) {
163+
return JansiWinSysTerminal.isConsoleInput();
164+
}
165+
return JansiNativePty.isConsoleInput();
142166
}
167+
143168
}

terminal-jansi/src/main/java/org/jline/terminal/impl/jansi/win/JansiWinSysTerminal.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ public static boolean isConsoleOutput() {
9191
return Kernel32.GetConsoleMode(consoleOut, mode) != 0;
9292
}
9393

94+
public static boolean isConsoleInput() {
95+
int[] mode = new int[1];
96+
return Kernel32.GetConsoleMode(consoleIn, mode) != 0;
97+
}
98+
9499
JansiWinSysTerminal(Writer writer, String name, String type, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
95100
super(writer, name, type, encoding, codepage, nativeSignals, signalHandler);
96101
}

terminal-jna/src/main/java/org/jline/terminal/impl/jna/JnaNativePty.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,22 @@ public String toString() {
148148
}
149149

150150
public static boolean isConsoleOutput() {
151+
return isatty(1);
152+
}
153+
154+
public static boolean isConsoleInput() {
155+
return isatty(0);
156+
}
157+
158+
private static boolean isatty(int fd) {
151159
if (Platform.isMac()) {
152-
return OsXNativePty.isatty(1) == 1;
160+
return OsXNativePty.isatty(fd) == 1;
153161
} else if (Platform.isLinux()) {
154-
return LinuxNativePty.isatty(1) == 1;
162+
return LinuxNativePty.isatty(fd) == 1;
155163
} else if (Platform.isSolaris()) {
156-
return SolarisNativePty.isatty(1) == 1;
164+
return SolarisNativePty.isatty(fd) == 1;
157165
} else if (Platform.isFreeBSD()) {
158-
return FreeBsdNativePty.isatty(1) == 1;
166+
return FreeBsdNativePty.isatty(fd) == 1;
159167
} else {
160168
return false;
161169
}

terminal-jna/src/main/java/org/jline/terminal/impl/jna/JnaSupportImpl.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.jline.terminal.impl.jna.win.JnaWinSysTerminal;
1515
import org.jline.terminal.spi.JnaSupport;
1616
import org.jline.terminal.spi.Pty;
17+
import org.jline.utils.OSUtils;
1718

1819
import java.io.IOException;
1920
import java.nio.charset.Charset;
@@ -45,8 +46,22 @@ public boolean isWindowsConsole() {
4546
}
4647

4748
@Override
48-
public boolean isConsoleOutput(boolean pty) {
49-
return pty ? JnaNativePty.isConsoleOutput() : JnaWinSysTerminal.isConsoleOutput();
49+
public boolean isConsoleOutput() {
50+
if (OSUtils.IS_CYGWIN || OSUtils.IS_MSYSTEM) {
51+
throw new UnsupportedOperationException();
52+
} else if (OSUtils.IS_WINDOWS) {
53+
return JnaWinSysTerminal.isConsoleOutput();
54+
}
55+
return JnaNativePty.isConsoleOutput();
5056
}
5157

58+
@Override
59+
public boolean isConsoleInput() {
60+
if (OSUtils.IS_CYGWIN || OSUtils.IS_MSYSTEM) {
61+
throw new UnsupportedOperationException();
62+
} else if (OSUtils.IS_WINDOWS) {
63+
return JnaWinSysTerminal.isConsoleInput();
64+
}
65+
return JnaNativePty.isConsoleInput();
66+
}
5267
}

terminal-jna/src/main/java/org/jline/terminal/impl/jna/win/JnaWinSysTerminal.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ public static boolean isConsoleOutput() {
8787
}
8888
}
8989

90+
public static boolean isConsoleInput() {
91+
try {
92+
IntByReference mode = new IntByReference();
93+
Kernel32.INSTANCE.GetConsoleMode(consoleIn, mode);
94+
return true;
95+
} catch (LastErrorException e) {
96+
return false;
97+
}
98+
}
99+
90100
JnaWinSysTerminal(Writer writer, String name, String type, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
91101
super(writer, name, type, encoding, codepage, nativeSignals, signalHandler);
92102
strings.put(InfoCmp.Capability.key_mouse, "\\E[M");

0 commit comments

Comments
 (0)