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 sun.security.action.GetBooleanAction;
-
- public final class SocketPermission extends Permission implements Serializable {
- 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 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(var1, getMask(var2));
- }
-
- SocketPermission(String var1, int var2) {
- super(getHost(var1));
- this.init(var1, var2);
- }
-
- private static String getHost(String var0) {
- return var0.equals("") ? "localhost" : var0;
- }
-
- private boolean isDottedIP(String var1) {
- char[] var2 = var1.toCharArray();
- int var3 = var2.length - 1;
- int var4 = 0;
- if (var3 > -1 && var2[0] == '.') {
- return false;
- } else {
- while(var3 != -1) {
- char var5 = var2[var3];
- char var6;
- char var7;
- if (var3 < 2) {
- var7 = '.';
- if (var3 == 1) {
- var6 = var2[0];
- } else {
- var6 = '.';
- }
-
- var3 = -1;
- } else {
- var6 = var2[var3 - 1];
- if (var6 == '.') {
- var7 = '.';
- var3 -= 2;
- } else {
- var7 = var2[var3 - 2];
- if (var7 == '.') {
- var3 -= 3;
- } else if (var3 - 3 != -1) {
- if (var2[var3 - 3] != '.') {
- return false;
- }
-
- var3 -= 4;
- } else {
- var3 -= 3;
- }
- }
- }
-
- if (var5 < '0' || var5 > '9' || var6 < '0' && var6 != '.' || var6 > '9' || var7 < '0' && var7 != '.' || var7 > '2' || var7 == '2' && (var6 > '5' || var6 == '5' && var5 > '5')) {
- return false;
- }
-
- ++var4;
- }
-
- return var4 == 4;
- }
- }
-
- 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 (var6 < var5) {
- throw new IllegalArgumentException("invalid port range");
- } else {
- return new int[]{var5, var6};
- }
- }
- } else {
- return new int[]{0, 65535};
- }
- }
-
- private void init(String var1, int var2) {
- if (var1 == null) {
- throw new NullPointerException("host can't be null");
- } else {
- var1 = getHost(var1);
- if ((var2 & 15) != var2) {
- throw new IllegalArgumentException("invalid actions mask");
- } else {
- this.mask = var2 | 8;
- int var3 = var1.indexOf(58);
- if (var3 != -1) {
- String var4 = var1.substring(var3 + 1);
- var1 = var1.substring(0, var3);
-
- try {
- this.portrange = this.parsePort(var4);
- } catch (Exception var7) {
- throw new IllegalArgumentException("invalid port range: " + var4);
- }
- } else {
- this.portrange = new int[]{0, 65535};
- }
-
- 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 (this.isDottedIP(var1)) {
- try {
- this.addresses = new InetAddress[]{InetAddress.getByName(var1)};
- this.init_with_ip = true;
- } catch (UnknownHostException var6) {
- 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 {
- int var2 = ((Permission)this).getName().indexOf(":");
- String var1;
- if (var2 == -1) {
- var1 = ((Permission)this).getName();
- } else {
- var1 = ((Permission)this).getName().substring(0, var2);
- }
-
- this.addresses = new InetAddress[]{InetAddress.getAllByName0(var1, false)[0]};
- } catch (UnknownHostException var3) {
- this.invalid = true;
- throw var3;
- }
- }
- }
-
- 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 && ((Permission)this).getName().equals("*")) {
- 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 = ((Permission)this).getName();
- String var3 = ((Permission)var1).getName();
- int var4 = var2.indexOf(58);
- if (var4 != -1) {
- var2 = var2.substring(0, var4);
- }
-
- var4 = var3.indexOf(58);
- if (var4 != -1) {
- var3 = var3.substring(0, var4);
- }
-
- 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 (this.portrange[0] == var2.portrange[0] && this.portrange[1] == var2.portrange[1]) {
- if (((Permission)this).getName().equalsIgnoreCase(((Permission)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() : ((Permission)this).getName().hashCode();
- } else {
- return ((Permission)this).getName().hashCode();
- }
- }
-
- int getMask() {
- return this.mask;
- }
-
- private static String getActions(int var0) {
- StringBuffer var1 = new StringBuffer();
- 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(((Permission)this).getName(), getMask(this.actions));
- }
-
- static {
- Boolean var0 = (Boolean)AccessController.doPrivileged(new GetBooleanAction("trustProxy"));
- trustProxy = var0;
- }
- }
-