diff options
author | Hung-ying Tyan <tyanh@google.com> | 2010-09-13 18:44:33 +0800 |
---|---|---|
committer | Hung-ying Tyan <tyanh@google.com> | 2010-09-30 12:40:11 +0800 |
commit | 6a53489ae594d7cc373a00687d6ea2f23d0634df (patch) | |
tree | da05b671bc7fb81fc818ceef5d93992d723e7d79 /voip | |
parent | bc87ada10de34c2d7b1301af86d94ed7c4801120 (diff) | |
download | frameworks_base-6a53489ae594d7cc373a00687d6ea2f23d0634df.zip frameworks_base-6a53489ae594d7cc373a00687d6ea2f23d0634df.tar.gz frameworks_base-6a53489ae594d7cc373a00687d6ea2f23d0634df.tar.bz2 |
SipService: add UID check.
Only allow creator or radio user to access profiles.
Change-Id: I548938f117926bcc878419142d1b5d818a4e70df
Diffstat (limited to 'voip')
-rw-r--r-- | voip/java/com/android/server/sip/SipService.java | 80 |
1 files changed, 65 insertions, 15 deletions
diff --git a/voip/java/com/android/server/sip/SipService.java b/voip/java/com/android/server/sip/SipService.java index 130fe9f..aff1439 100644 --- a/voip/java/com/android/server/sip/SipService.java +++ b/voip/java/com/android/server/sip/SipService.java @@ -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); |