1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.river.reggie.proxy;
19
20 import java.io.IOException;
21 import java.io.InvalidObjectException;
22 import java.io.ObjectInputStream;
23 import java.io.ObjectOutputStream;
24 import java.io.Serializable;
25 import java.rmi.RemoteException;
26 import net.jini.core.constraint.RemoteMethodControl;
27 import net.jini.core.lookup.ServiceID;
28 import net.jini.security.TrustVerifier;
29 import net.jini.security.proxytrust.TrustEquivalence;
30
31
32
33
34
35
36
37 public final class ProxyVerifier implements TrustVerifier, Serializable {
38
39 private static final long serialVersionUID = 2L;
40
41
42
43
44
45
46
47 private final RemoteMethodControl server;
48
49
50
51
52 private transient ServiceID registrarID;
53
54
55
56
57
58
59
60
61 public ProxyVerifier(Registrar server, ServiceID registrarID) {
62 if (!(server instanceof RemoteMethodControl)) {
63 throw new UnsupportedOperationException(
64 "server does not implement RemoteMethodControl");
65 } else if (!(server instanceof TrustEquivalence)) {
66 throw new UnsupportedOperationException(
67 "server does not implement TrustEquivalence");
68 }
69 this.server = (RemoteMethodControl) server;
70 this.registrarID = registrarID;
71 }
72
73
74
75
76
77
78
79
80
81
82
83 public boolean isTrustedObject(Object obj, TrustVerifier.Context ctx)
84 throws RemoteException
85 {
86 if (obj == null || ctx == null) {
87 throw new NullPointerException();
88 }
89 RemoteMethodControl inputServer;
90 ServiceID inputRegistrarID;
91 if (obj instanceof ConstrainableRegistrarProxy) {
92 RegistrarProxy proxy = (RegistrarProxy) obj;
93 inputServer = (RemoteMethodControl) proxy.server;
94 inputRegistrarID = proxy.registrarID;
95 } else if (obj instanceof ConstrainableAdminProxy) {
96 AdminProxy proxy = (AdminProxy) obj;
97 inputServer = (RemoteMethodControl) proxy.server;
98 inputRegistrarID = proxy.registrarID;
99 } else if (obj instanceof ConstrainableRegistration) {
100 Registration reg = (Registration) obj;
101 if (!isTrustedObject(reg.lease, ctx)) {
102 return false;
103 }
104 inputServer = (RemoteMethodControl) reg.server;
105 inputRegistrarID = registrarID;
106 } else if (obj instanceof ConstrainableEventLease ||
107 obj instanceof ConstrainableServiceLease)
108 {
109 RegistrarLease lease = (RegistrarLease) obj;
110 inputServer = (RemoteMethodControl) lease.server;
111 inputRegistrarID = lease.registrarID;
112 } else if (obj instanceof RemoteMethodControl) {
113 inputServer = (RemoteMethodControl) obj;
114 inputRegistrarID = registrarID;
115 } else {
116 return false;
117 }
118
119 TrustEquivalence trustEquiv = (TrustEquivalence)
120 server.setConstraints(inputServer.getConstraints());
121 return trustEquiv.checkTrustEquivalence(inputServer) &&
122 registrarID.equals(inputRegistrarID);
123 }
124
125
126
127
128
129
130 private void writeObject(ObjectOutputStream out) throws IOException {
131 out.defaultWriteObject();
132 registrarID.writeBytes(out);
133 }
134
135
136
137
138
139
140
141 private void readObject(ObjectInputStream in)
142 throws IOException, ClassNotFoundException
143 {
144 in.defaultReadObject();
145 registrarID = new ServiceID(in);
146 if (!(server instanceof RemoteMethodControl)) {
147 throw new InvalidObjectException(
148 "server does not implement RemoteMethodControl");
149 } else if (!(server instanceof TrustEquivalence)) {
150 throw new InvalidObjectException(
151 "server does not implement TrustEquivalence");
152 }
153 }
154 }