home *** CD-ROM | disk | FTP | other *** search
- package java.net;
-
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- import java.security.AccessController;
- import java.security.Permission;
- import java.security.PermissionCollection;
- import java.util.StringTokenizer;
- import sun.net.util.IPAddressUtil;
- import sun.security.action.GetBooleanAction;
-
- public final class SocketPermission extends Permission implements Serializable {
- private static final long serialVersionUID = -7204263841984476862L;
- private static final int CONNECT = 1;
- private static final int LISTEN = 2;
- private static final int ACCEPT = 4;
- private static final int RESOLVE = 8;
- private static final int NONE = 0;
- private static final int ALL = 15;
- private static final int PORT_MIN = 0;
- private static final int PORT_MAX = 65535;
- private static final int PRIV_PORT_MAX = 1023;
- private transient int mask;
- private String actions;
- private transient String hostname;
- private transient String cname;
- private transient InetAddress[] addresses;
- private transient boolean wildcard;
- private transient boolean init_with_ip;
- private transient boolean invalid;
- private transient int[] portrange;
- private static boolean trustProxy;
-
- public SocketPermission(String var1, String var2) {
- super(getHost(var1));
- this.init(this.getName(), getMask(var2));
- }
-
- SocketPermission(String var1, int var2) {
- super(getHost(var1));
- this.init(this.getName(), var2);
- }
-
- private static String getHost(String var0) {
- if (var0.equals("")) {
- return "localhost";
- } else {
- if (var0.charAt(0) != '[' && var0.indexOf(58) != var0.lastIndexOf(58)) {
- StringTokenizer var2 = new StringTokenizer(var0, ":");
- int var3 = var2.countTokens();
- if (var3 == 9) {
- int var1 = var0.lastIndexOf(58);
- var0 = "[" + var0.substring(0, var1) + "]" + var0.substring(var1);
- } else {
- if (var3 != 8 || var0.indexOf("::") != -1) {
- throw new IllegalArgumentException("Ambiguous hostport part");
- }
-
- var0 = "[" + var0 + "]";
- }
- }
-
- return var0;
- }
- }
-
- private int[] parsePort(String var1) throws Exception {
- if (var1 != null && !var1.equals("") && !var1.equals("*")) {
- int var2 = var1.indexOf(45);
- if (var2 == -1) {
- int var7 = Integer.parseInt(var1);
- return new int[]{var7, var7};
- } else {
- String var3 = var1.substring(0, var2);
- String var4 = var1.substring(var2 + 1);
- int var5;
- if (var3.equals("")) {
- var5 = 0;
- } else {
- var5 = Integer.parseInt(var3);
- }
-
- int var6;
- if (var4.equals("")) {
- var6 = 65535;
- } else {
- var6 = Integer.parseInt(var4);
- }
-
- if (var5 >= 0 && var6 >= 0 && var6 >= var5) {
- return new int[]{var5, var6};
- } else {
- throw new IllegalArgumentException("invalid port range");
- }
- }
- } else {
- return new int[]{0, 65535};
- }
- }
-
- private void init(String var1, int var2) {
- if ((var2 & 15) != var2) {
- throw new IllegalArgumentException("invalid actions mask");
- } else {
- this.mask = var2 | 8;
- int var3 = 0;
- byte var4 = 0;
- boolean var5 = false;
- int var6 = -1;
- String var7 = var1;
- if (var1.charAt(0) == '[') {
- var4 = 1;
- var3 = var1.indexOf(93);
- if (var3 == -1) {
- throw new IllegalArgumentException("invalid host/port: " + var1);
- }
-
- var1 = var1.substring(var4, var3);
- var6 = var7.indexOf(58, var3 + 1);
- } else {
- var4 = 0;
- var6 = var1.indexOf(58, var3);
- if (var6 != -1) {
- var1 = var1.substring(var4, var6);
- }
- }
-
- if (var6 != -1) {
- String var8 = var7.substring(var6 + 1);
-
- try {
- this.portrange = this.parsePort(var8);
- } catch (Exception var12) {
- throw new IllegalArgumentException("invalid port range: " + var8);
- }
- } else {
- this.portrange = new int[]{0, 65535};
- }
-
- this.hostname = var1;
- if (var1.lastIndexOf(42) > 0) {
- throw new IllegalArgumentException("invalid host wildcard specification");
- } else if (var1.startsWith("*")) {
- this.wildcard = true;
- if (var1.equals("*")) {
- this.cname = "";
- } else {
- if (!var1.startsWith("*.")) {
- throw new IllegalArgumentException("invalid host wildcard specification");
- }
-
- this.cname = var1.substring(1).toLowerCase();
- }
-
- } else {
- if (var1.length() > 0) {
- char var17 = var1.charAt(0);
- if (var17 == ':' || Character.digit(var17, 16) != -1) {
- byte[] var9 = IPAddressUtil.textToNumericFormatV4(var1);
- if (var9 == null) {
- var9 = IPAddressUtil.textToNumericFormatV6(var1);
- }
-
- if (var9 != null) {
- try {
- this.addresses = new InetAddress[]{InetAddress.getByAddress(var9)};
- this.init_with_ip = true;
- } catch (UnknownHostException var11) {
- this.invalid = true;
- }
- }
- }
- }
-
- }
- }
- }
-
- private static int getMask(String param0) {
- // $FF: Couldn't be decompiled
- }
-
- void getCanonName() throws UnknownHostException {
- if (this.cname == null && !this.invalid) {
- try {
- if (this.addresses == null) {
- this.getIP();
- }
-
- if (this.init_with_ip) {
- this.cname = this.addresses[0].getHostName(false).toLowerCase();
- } else {
- this.cname = InetAddress.getByName(this.addresses[0].getHostAddress()).getHostName(false).toLowerCase();
- }
-
- } catch (UnknownHostException var2) {
- this.invalid = true;
- throw var2;
- }
- }
- }
-
- void getIP() throws UnknownHostException {
- if (this.addresses == null && !this.wildcard && !this.invalid) {
- try {
- String var1;
- if (this.getName().charAt(0) == '[') {
- var1 = this.getName().substring(1, this.getName().indexOf(93));
- } else {
- int var2 = this.getName().indexOf(":");
- if (var2 == -1) {
- var1 = this.getName();
- } else {
- var1 = this.getName().substring(0, var2);
- }
- }
-
- this.addresses = new InetAddress[]{InetAddress.getAllByName0(var1, false)[0]};
- } catch (UnknownHostException var3) {
- this.invalid = true;
- throw var3;
- } catch (IndexOutOfBoundsException var4) {
- this.invalid = true;
- throw new UnknownHostException(this.getName());
- }
- }
- }
-
- public boolean implies(Permission var1) {
- if (!(var1 instanceof SocketPermission)) {
- return false;
- } else {
- SocketPermission var4 = (SocketPermission)var1;
- return (this.mask & var4.mask) == var4.mask && this.impliesIgnoreMask(var4);
- }
- }
-
- boolean impliesIgnoreMask(SocketPermission var1) {
- if ((var1.mask & 8) == var1.mask || var1.portrange[0] >= this.portrange[0] && var1.portrange[1] <= this.portrange[1]) {
- if (this.wildcard && "".equals(this.cname)) {
- return true;
- } else if (!this.invalid && !var1.invalid) {
- try {
- if (this.init_with_ip) {
- if (var1.wildcard) {
- return false;
- } else if (var1.init_with_ip) {
- return this.addresses[0].equals(var1.addresses[0]);
- } else {
- if (var1.addresses == null) {
- var1.getIP();
- }
-
- for(int var6 = 0; var6 < var1.addresses.length; ++var6) {
- if (this.addresses[0].equals(var1.addresses[var6])) {
- return true;
- }
- }
-
- return false;
- }
- } else if (!this.wildcard && !var1.wildcard) {
- if (this.addresses == null) {
- this.getIP();
- }
-
- if (var1.addresses == null) {
- var1.getIP();
- }
-
- for(int var3 = 0; var3 < this.addresses.length; ++var3) {
- for(int var2 = 0; var2 < var1.addresses.length; ++var2) {
- if (this.addresses[var3].equals(var1.addresses[var2])) {
- return true;
- }
- }
- }
-
- if (this.cname == null) {
- this.getCanonName();
- }
-
- if (var1.cname == null) {
- var1.getCanonName();
- }
-
- return this.cname.equalsIgnoreCase(var1.cname);
- } else if (this.wildcard && var1.wildcard) {
- return var1.cname.endsWith(this.cname);
- } else if (var1.wildcard) {
- return false;
- } else {
- if (var1.cname == null) {
- var1.getCanonName();
- }
-
- return var1.cname.endsWith(this.cname);
- }
- } catch (UnknownHostException var5) {
- return trustProxy ? this.inProxyWeTrust(var1) : false;
- }
- } else {
- return trustProxy ? this.inProxyWeTrust(var1) : false;
- }
- } else {
- return false;
- }
- }
-
- private boolean inProxyWeTrust(SocketPermission var1) {
- String var2 = this.hostname;
- String var3 = var1.hostname;
- return var2 == null ? false : var2.equalsIgnoreCase(var3);
- }
-
- public boolean equals(Object var1) {
- if (var1 == this) {
- return true;
- } else if (!(var1 instanceof SocketPermission)) {
- return false;
- } else {
- SocketPermission var2 = (SocketPermission)var1;
- if (this.mask != var2.mask) {
- return false;
- } else if ((var2.mask & 8) == var2.mask || this.portrange[0] == var2.portrange[0] && this.portrange[1] == var2.portrange[1]) {
- if (this.getName().equalsIgnoreCase(var2.getName())) {
- return true;
- } else {
- try {
- this.getCanonName();
- var2.getCanonName();
- } catch (UnknownHostException var4) {
- return false;
- }
-
- if (!this.invalid && !var2.invalid) {
- return this.cname != null ? this.cname.equalsIgnoreCase(var2.cname) : false;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
- }
-
- public int hashCode() {
- if (!this.init_with_ip && !this.wildcard) {
- try {
- this.getCanonName();
- } catch (UnknownHostException var2) {
- }
-
- return !this.invalid && this.cname != null ? this.cname.hashCode() : this.getName().hashCode();
- } else {
- return this.getName().hashCode();
- }
- }
-
- int getMask() {
- return this.mask;
- }
-
- private static String getActions(int var0) {
- StringBuilder var1 = new StringBuilder();
- boolean var2 = false;
- if ((var0 & 1) == 1) {
- var2 = true;
- var1.append("connect");
- }
-
- if ((var0 & 2) == 2) {
- if (var2) {
- var1.append(',');
- } else {
- var2 = true;
- }
-
- var1.append("listen");
- }
-
- if ((var0 & 4) == 4) {
- if (var2) {
- var1.append(',');
- } else {
- var2 = true;
- }
-
- var1.append("accept");
- }
-
- if ((var0 & 8) == 8) {
- if (var2) {
- var1.append(',');
- } else {
- var2 = true;
- }
-
- var1.append("resolve");
- }
-
- return var1.toString();
- }
-
- public String getActions() {
- if (this.actions == null) {
- this.actions = getActions(this.mask);
- }
-
- return this.actions;
- }
-
- public PermissionCollection newPermissionCollection() {
- return new SocketPermissionCollection();
- }
-
- private synchronized void writeObject(ObjectOutputStream var1) throws IOException {
- if (this.actions == null) {
- this.getActions();
- }
-
- var1.defaultWriteObject();
- }
-
- private synchronized void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- var1.defaultReadObject();
- this.init(this.getName(), getMask(this.actions));
- }
-
- static {
- Boolean var0 = (Boolean)AccessController.doPrivileged(new GetBooleanAction("trustProxy"));
- trustProxy = var0;
- }
- }
-