net.sf.robocode.host.security.SecureInputStream Maven / Gradle / Ivy
/*
* Copyright (c) 2001-2023 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* https://robocode.sourceforge.io/license/epl-v10.html
*/
package net.sf.robocode.host.security;
import java.io.IOException;
import java.io.InputStream;
import java.security.AccessController;
/**
* @author Mathew A. Nelson (original)
*/
public class SecureInputStream extends java.io.InputStream {
private RobocodePermission inputPermission = null;
private InputStream in = null;
/**
* SecureInputStream constructor comment.
*
* @param in original
*/
public SecureInputStream(InputStream in) {
super();
this.in = in;
this.inputPermission = new RobocodePermission("System.in");
}
@Override
public final int available() throws IOException {
checkAccess();
return in.available();
}
private void checkAccess() {
AccessController.checkPermission(inputPermission);
}
@Override
public final void close() throws IOException {
checkAccess();
in.close();
}
@Override
public final synchronized void mark(int readlimit) {
checkAccess();
in.mark(readlimit);
}
@Override
public final boolean markSupported() {
checkAccess();
return in.markSupported();
}
/**
* Reads the next byte of data from the input stream. The value byte is
* returned as an {@code int} in the range 0 to 255. If no byte is available
* because the end of the stream has been reached, the value -1 is returned.
* This method blocks until input data is available, the end of the stream
* is detected, or an exception is thrown.
*
*
A subclass must provide an implementation of this method.
*
* @return the next byte of data, or -1 if the end of the stream is reached.
* @throws IOException if an I/O error occurs.
*/
@Override
public final int read() throws java.io.IOException {
checkAccess();
return in.read();
}
@Override
public final int read(byte[] b) throws IOException {
checkAccess();
return in.read(b);
}
@Override
public final int read(byte[] b, int off, int len) throws IOException {
checkAccess();
return in.read(b, off, len);
}
@Override
public final synchronized void reset() throws IOException {
checkAccess();
in.reset();
}
@Override
public final long skip(long n) throws IOException {
checkAccess();
return in.skip(n);
}
}