Ejemplo n.º 1
0
        void HandlePlayRequest()
        {
            LogHelper.Debug(Tag, "handlePlayRequest: mState=" + playback.State);

            delayedStopHandler.RemoveCallbacksAndMessages(null);
            if (!serviceStarted)
            {
                LogHelper.Verbose(Tag, "Starting service");
                // The MusicService needs to keep running even after the calling MediaBrowser
                // is disconnected. Call startService(Intent) and then stopSelf(..) when we no longer
                // need to play media.
                StartService(new Intent(ApplicationContext, typeof(MusicService)));
                serviceStarted = true;
            }

            if (!session.Active)
            {
                session.Active = true;
            }

            if (QueueHelper.isIndexPlayable(currentIndexOnQueue, playingQueue))
            {
                UpdateMetadata();
                playback.Play(playingQueue [currentIndexOnQueue]);
            }
        }
        public bool IsCallerAllowed(Context context, string callingPackage, int callingUid)
        {
            if (Process.SystemUid == callingUid || Process.MyUid() == callingUid)
            {
                return(true);
            }
            var         packageManager = context.PackageManager;
            PackageInfo packageInfo;

            try {
                packageInfo = packageManager.GetPackageInfo(
                    callingPackage, PackageInfoFlags.Signatures);
            } catch (PackageManager.NameNotFoundException e) {
                LogHelper.Warn(Tag, e, "Package manager can't find package: ", callingPackage);
                return(false);
            }
            if (packageInfo.Signatures.Count != 1)
            {
                LogHelper.Warn(Tag, "Caller has more than one signature certificate!");
                return(false);
            }
            var signature = Base64.EncodeToString(
                packageInfo.Signatures[0].ToByteArray(), Base64Flags.NoWrap);

            var validCallers = mValidCertificates[signature];

            if (validCallers == null)
            {
                LogHelper.Verbose(Tag, "Signature for caller ", callingPackage, " is not valid: \n"
                                  , signature);
                if (mValidCertificates.Count == 0)
                {
                    LogHelper.Warn(Tag, "The list of valid certificates is empty. Either your file ",
                                   "res/xml/allowed_media_browser_callers.xml is empty or there was an error ",
                                   "while reading it. Check previous log messages.");
                }
                return(false);
            }

            // Check if the package name is valid for the certificate:
            var expectedPackages = new StringBuilder();

            foreach (var info in validCallers)
            {
                if (callingPackage == info.PackageName)
                {
                    LogHelper.Verbose(Tag, "Valid caller: ", info.Name, "  package=", info.PackageName,
                                      " release=", info.Release);
                    return(true);
                }
                expectedPackages.Append(info.PackageName).Append(' ');
            }

            LogHelper.Info(Tag, "Caller has a valid certificate, but its package doesn't match any ",
                           "expected package for the given certificate. Caller's package is ", callingPackage,
                           ". Expected packages as defined in res/xml/allowed_media_browser_callers.xml are (",
                           expectedPackages, "). This caller's certificate is: \n", signature);
            return(false);
        }
        Dictionary <string, List <CallerInfo> > ReadValidCertificates(XmlReader parser)
        {
            var validCertificates = new Dictionary <string, List <CallerInfo> >();

            try {
                while (parser.Read())
                {
                    if (parser.IsStartElement() && parser.Name == "signing_certificate")
                    {
                        var name        = parser[0];
                        var packageName = parser[2];
                        var isRelease   = Convert.ToBoolean(parser[1]);
                        var certificate = parser.ReadString();
                        if (certificate != null)
                        {
                            certificate = certificate.Replace("\\s|\\n", "");
                        }

                        var info = new CallerInfo(name, packageName, isRelease, certificate);

                        List <CallerInfo> infos;
                        validCertificates.TryGetValue(certificate, out infos);
                        if (infos == null)
                        {
                            infos = new List <CallerInfo>();
                            validCertificates.Add(certificate, infos);
                        }
                        LogHelper.Verbose(Tag, "Adding allowed caller: ", info.Name,
                                          " package=", info.PackageName, " release=", info.Release,
                                          " certificate=", certificate);
                        infos.Add(info);
                    }
                }
            } catch (XmlException e) {
                LogHelper.Error(Tag, e, "Could not read allowed callers from XML.");
            } catch (IOException e) {
                LogHelper.Error(Tag, e, "Could not read allowed callers from XML.");
            }
            return(validCertificates);
        }