SipService: add UID check.

Only allow creator or radio user to access profiles.

Change-Id: I548938f117926bcc878419142d1b5d818a4e70df
This commit is contained in:
Hung-ying Tyan
2010-09-13 18:44:33 +08:00
parent bc87ada10d
commit 6a53489ae5

View File

@ -39,6 +39,7 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@ -49,6 +50,7 @@ import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
@ -119,17 +121,19 @@ public final class SipService extends ISipService.Stub {
}
public synchronized SipProfile[] getListOfProfiles() {
SipProfile[] profiles = new SipProfile[mSipGroups.size()];
int i = 0;
boolean isCallerRadio = isCallerRadio();
ArrayList<SipProfile> profiles = new ArrayList<SipProfile>();
for (SipSessionGroupExt group : mSipGroups.values()) {
profiles[i++] = group.getLocalProfile();
if (isCallerRadio || isCallerCreator(group)) {
profiles.add(group.getLocalProfile());
}
}
return profiles;
return profiles.toArray(new SipProfile[profiles.size()]);
}
public void open(SipProfile localProfile) {
localProfile.setCallingUid(Binder.getCallingUid());
if (localProfile.getAutoRegistration()) {
if (localProfile.getAutoRegistration() && isCallerRadio()) {
openToReceiveCalls(localProfile);
} else {
openToMakeCalls(localProfile);
@ -153,8 +157,14 @@ public final class SipService extends ISipService.Stub {
String incomingCallBroadcastAction, ISipSessionListener listener) {
localProfile.setCallingUid(Binder.getCallingUid());
if (TextUtils.isEmpty(incomingCallBroadcastAction)) {
throw new RuntimeException(
"empty broadcast action for incoming call");
Log.w(TAG, "empty broadcast action for incoming call");
return;
}
if (incomingCallBroadcastAction.equals(
SipManager.ACTION_SIP_INCOMING_CALL) && !isCallerRadio()) {
Log.w(TAG, "failed to open the profile; "
+ "the action string is reserved");
return;
}
if (DEBUG) Log.d(TAG, "open3: " + localProfile.getUriString() + ": "
+ incomingCallBroadcastAction + ": " + listener);
@ -171,29 +181,64 @@ public final class SipService extends ISipService.Stub {
}
}
private boolean isCallerCreator(SipSessionGroupExt group) {
SipProfile profile = group.getLocalProfile();
return (profile.getCallingUid() == Binder.getCallingUid());
}
private boolean isCallerCreatorOrRadio(SipSessionGroupExt group) {
return (isCallerRadio() || isCallerCreator(group));
}
private boolean isCallerRadio() {
return (Binder.getCallingUid() == Process.PHONE_UID);
}
public synchronized void close(String localProfileUri) {
SipSessionGroupExt group = mSipGroups.remove(localProfileUri);
if (group != null) {
notifyProfileRemoved(group.getLocalProfile());
group.close();
if (isWifiOn() && !anyOpened()) releaseWifiLock();
SipSessionGroupExt group = mSipGroups.get(localProfileUri);
if (group == null) return;
if (!isCallerCreatorOrRadio(group)) {
Log.d(TAG, "only creator or radio can close this profile");
return;
}
group = mSipGroups.remove(localProfileUri);
notifyProfileRemoved(group.getLocalProfile());
group.close();
if (isWifiOn() && !anyOpened()) releaseWifiLock();
}
public synchronized boolean isOpened(String localProfileUri) {
SipSessionGroupExt group = mSipGroups.get(localProfileUri);
return ((group != null) ? group.isOpened() : false);
if (group == null) return false;
if (isCallerCreatorOrRadio(group)) {
return group.isOpened();
} else {
Log.i(TAG, "only creator or radio can query on the profile");
return false;
}
}
public synchronized boolean isRegistered(String localProfileUri) {
SipSessionGroupExt group = mSipGroups.get(localProfileUri);
return ((group != null) ? group.isRegistered() : false);
if (group == null) return false;
if (isCallerCreatorOrRadio(group)) {
return group.isRegistered();
} else {
Log.i(TAG, "only creator or radio can query on the profile");
return false;
}
}
public synchronized void setRegistrationListener(String localProfileUri,
ISipSessionListener listener) {
SipSessionGroupExt group = mSipGroups.get(localProfileUri);
if (group != null) group.setListener(listener);
if (group == null) return;
if (isCallerCreator(group)) {
group.setListener(listener);
} else {
Log.i(TAG, "only creator can set listener on the profile");
}
}
public synchronized ISipSession createSession(SipProfile localProfile,
@ -234,6 +279,8 @@ public final class SipService extends ISipService.Stub {
group = new SipSessionGroupExt(localProfile, null, null);
mSipGroups.put(key, group);
notifyProfileAdded(localProfile);
} else if (!isCallerCreator(group)) {
throw new SipException("only creator can access the profile");
}
return group;
}
@ -244,6 +291,9 @@ public final class SipService extends ISipService.Stub {
String key = localProfile.getUriString();
SipSessionGroupExt group = mSipGroups.get(key);
if (group != null) {
if (!isCallerCreator(group)) {
throw new SipException("only creator can access the profile");
}
group.setIncomingCallBroadcastAction(
incomingCallBroadcastAction);
group.setListener(listener);