internal EndpointPermission Intersect(EndpointPermission E) {
String commonName=null;
TransportType commonTransport;
int commonPort;
//
// Look at the transport
//
if (transport == E.transport) { // same transport
commonTransport = transport;
}
// NO: check if one of the permissions authorize all transports
else if (transport == TransportType.All) {
commonTransport = E.transport;
}
else if (E.transport == TransportType.All) {
commonTransport = transport;
}
else { // transport dont match-- intersection is empty
return null;
}
//
// Determine common port
//
if (port == E.port) {
commonPort = port;
}
else if (port == SocketPermission.AllPorts) {
commonPort = E.port;
}
else if (E.port == SocketPermission.AllPorts) {
commonPort = port;
}
else {
return null;
}
//Work out common hostname part
//
// This is a fix for INADDR_ANY in Bind()
// if this.Hostname == "0.0.0.0" then it matches only to e.Hostname="*.*.*.*"
//
// The reason is to not pass "0.0.0.0" into Resolve()
if(this.Hostname.Equals("0.0.0.0"))
{
if(E.Hostname.Equals("*.*.*.*") || E.Hostname.Equals("0.0.0.0"))
commonName = this.Hostname;//i.e. 0.0.0.0
else
return null;
}
else if(E.Hostname.Equals("0.0.0.0"))
{
if(this.Hostname.Equals("*.*.*.*") || this.Hostname.Equals("0.0.0.0"))
commonName = E.Hostname; //i.e. 0.0.0.0
else
return null;
}
else if (IsDns && E.IsDns) {
//
// If both are DNS names we compare names as strings
//
if(String.Compare(hostname, E.hostname, StringComparison.OrdinalIgnoreCase ) != 0) {
return null;
}
else {
commonName = hostname;
}
}
else
{
Resolve();
E.Resolve();
//
if (((address == null) && !wildcard) || ((E.address == null) && !E.wildcard)) {
return null;
}
//
// Find intersection of address lists
if(wildcard && E.wildcard) {
string [] wcPieces = hostname.Split(DotSeparator);
string [] strPieces = E.hostname.Split(DotSeparator);
string result="";
if ((strPieces.Length != 4) || (wcPieces.Length != 4)) {
return null;
}
for (int i = 0; i < 4; i++) {
if(i != 0) {
result+=".";
}
if (strPieces[i] == wcPieces[i]) {
result+=strPieces[i];
}
else
if (strPieces[i] == "*") {
result+=wcPieces[i];
}
else
if (wcPieces[i] == "*") {
result+=strPieces[i];
}
else
return null;
}
commonName = result;
}else
if (wildcard) { //if ME is a wildcard
//
//
// Check for wildcard IP matching
//
for (int i = 0; i < E.address.Length; ++i) {
if (MatchWildcard(E.address[i].ToString())) {
commonName = E.hostname; //SHE fits into my wildcard
break;
}
}
}
else if (E.wildcard) { //if SHE is a wildcard
for (int i = 0; i < address.Length; ++i) {
if (E.MatchWildcard(address[i].ToString())) {
commonName = hostname; //ME fit into her wildcard
break;
}
}
}
else
{
//
// Not wildcard: check aginst IP addresses list
//
if (address == E.address) { // they both are NOT null (already checked)
commonName = hostname;
}
//
// Search the IP addresses for match
//
for (int i = 0; commonName == null && i < address.Length; i++) {
for (int k = 0; k < E.address.Length; k++) {
if (address[i].Equals(E.address[k])) {
commonName = hostname;
break;
}
}
}
}
if(commonName == null) {
return null;
}
}
return new EndpointPermission(commonName, commonPort, commonTransport);
}
/*