<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div apple-content-edited="true"><br></div><div><div>On Jul 12, 2013, at 12:19 PM, Jacobsen, Jasen W. &lt;<a href="mailto:jasenj1@mitre.org">jasenj1@mitre.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; font-size: 14px; font-family: Calibri, sans-serif;">What about non application things like libraries, printer drivers or browser plug-ins?</div></blockquote><div dir="auto"><br></div><div dir="auto">Off the top of my head you could use simple scripting tools like 'lpinfo -mí to list all the printer drivers on the system.&nbsp;</div><div dir="auto"><br></div><div dir="auto">I think in most cases things like library versions come when you are looking for a specific version though to validate you are beyond a vulnerable level.</div><br><blockquote type="cite"><div style="font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; font-size: 14px; font-family: Calibri, sans-serif;"><div><br></div><div>And can you elaborate a little on "use a metadata query and launch services to locate the apps"? Perhaps there are other OS X capabilities that OVAL should make available to system auditors.</div></div></blockquote><br></div><div>Sure. If you are scripting things then you can use the mdfind command to find apps. For example,&nbsp;</div><div><br></div><div></div><div dir="auto">mdfind "kMDItemContentTypeTree == 'com.apple.applicationí"</div><div dir="auto"><br></div><div dir="auto">Is going to instantly find every app on your disks, regardless of where it is stored. You can then loop through them and read the info.plists.</div><div dir="auto"><br></div><div dir="auto">To my mind though itís easier to do in Objective-C or some other object oriented language than it is to mash all that data around in a bash script. This is some really rough sample stuff code. Note that in the results processing you could also use&nbsp;</div><div dir="auto"><span style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);"><br></span></div><div dir="auto"><span style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">NSString</span><span style="font-family: Menlo; font-size: 11px;">&nbsp;</span><span style="font-family: Menlo; font-size: 11px;">*appVersion = [theResult</span><span style="font-family: Menlo; font-size: 11px;">&nbsp;</span><span style="font-family: Menlo; font-size: 11px; color: rgb(61, 29, 129);">valueForAttribute</span><span style="font-family: Menlo; font-size: 11px;">:(</span><span style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">NSString</span><span style="font-family: Menlo; font-size: 11px;">&nbsp;</span><span style="font-family: Menlo; font-size: 11px;">*)</span><span style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">kMDItemVersion</span><span style="font-family: Menlo; font-size: 11px;">];</span></div><div><span style="font-family: Menlo; font-size: 11px;"><br></span></div><div dir="auto">in an effort to not rely on needing to read each plist, but reading the plist lets us cover a use case for if developers donít fill in both the short version string and the bundle version string.</div><div dir="auto"><br></div><div dir="auto"><div style="margin: 0px; font-size: 11px; font-family: Menlo;">Starting the search:</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">- (<span style="color: #bb2ca2">void</span>)findApps&nbsp;{</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; </span>//Start our timer</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #bb2ca2">self</span><span style="color: #000000">.</span><span style="color: #4f8187">startDate</span><span style="color: #000000"> = [</span><span style="color: #703daa">NSDate</span><span style="color: #000000"> </span>timeIntervalSinceReferenceDate<span style="color: #000000">];</span></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Create the metadata query instance. The metadataSearch @property is</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// declared as retain</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span>=[[<span style="color: #703daa">NSMetadataQuery</span> <span style="color: #3d1d81">alloc</span>] <span style="color: #3d1d81">init</span>];</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Register the notifications for the completion updates</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; [[</span><span style="color: #703daa">NSNotificationCenter</span><span style="color: #000000"> </span>defaultCenter<span style="color: #000000">] </span>addObserver<span style="color: #000000">:</span><span style="color: #bb2ca2">self</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">selector</span>:<span style="color: #bb2ca2">@selector</span>(queryDidUpdate:)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">name</span>:<span style="color: #703daa">NSMetadataQueryDidUpdateNotification</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">object</span>:<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span>];</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp;&nbsp; &nbsp; &nbsp; [[</span><span style="color: #703daa">NSNotificationCenter</span><span style="color: #000000"> </span>defaultCenter<span style="color: #000000">] </span>addObserver<span style="color: #000000">:</span><span style="color: #bb2ca2">self</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">selector</span>:<span style="color: #bb2ca2">@selector</span>(initalGatherComplete:)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">name</span>:<span style="color: #703daa">NSMetadataQueryDidFinishGatheringNotification</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">object</span>:<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span>];</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Configure the search predicate to find all apps using the com.apple.application UTI</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSPredicate</span> *searchPredicate;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(209, 47, 27);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; searchPredicate=[</span><span style="color: #703daa">NSPredicate</span><span style="color: #000000"> </span><span style="color: #3d1d81">predicateWithFormat</span><span style="color: #000000">:</span>@"kMDItemContentTypeTree == 'com.apple.application'"<span style="color: #000000">];</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; [<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span> <span style="color: #3d1d81">setPredicate</span>:searchPredicate];</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Set the search scope to local disks</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSArray</span> *searchScopes;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(112, 61, 170);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">searchScopes=</span><span style="color: rgb(39, 42, 216);">@[</span>NSMetadataQueryLocalComputerScope<span style="color: rgb(39, 42, 216);">]</span><span style="color: rgb(0, 0, 0);">;</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; [<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span> <span style="color: #3d1d81">setSearchScopes</span>:searchScopes];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;"><br></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Begin the asynchronous query</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(79, 129, 135);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; [</span><span style="color: #bb2ca2">self</span><span style="color: #000000">.</span>metadataSearch<span style="color: #000000"> </span><span style="color: #3d1d81">startQuery</span><span style="color: #000000">];</span></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; }</div><div><br></div><div>Then processing the results:</div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);">// Method invoked when the initial query gathering is completed</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">- (<span style="color: #bb2ca2">void</span>)initalGatherComplete:sender;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Stop the query, the single pass is completed.</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(79, 129, 135);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; [</span><span style="color: #bb2ca2">self</span><span style="color: #000000">.</span>metadataSearch<span style="color: #000000"> </span><span style="color: #3d1d81">stopQuery</span><span style="color: #000000">];</span></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Iterate the results and find our info.</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSUInteger</span> i=<span style="color: #272ad8">0</span>;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #bb2ca2">for</span> (i=<span style="color: #272ad8">0</span>; i &lt; [<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span> <span style="color: #3d1d81">resultCount</span>]; i++) {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSMetadataItem</span> *theResult = [<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span> <span style="color: #3d1d81">resultAtIndex</span>:i];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSString</span> *appPath = [theResult <span style="color: #3d1d81">valueForAttribute</span>:(<span style="color: #703daa">NSString</span> *)<span style="color: #703daa">kMDItemPath</span>];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Use launch services to retrieve info and filter out invisibles and aliases</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Launch Services is CF so we need to bridge to a CFURLRef</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #703daa">CFURLRef</span><span style="color: #000000"> appURL = </span>CFURLCreateWithFileSystemPath<span style="color: #000000">(</span><span style="color: #703daa">kCFAllocatorDefault</span><span style="color: #000000">, (</span><span style="color: #bb2ca2">__bridge</span><span style="color: #000000"> </span><span style="color: #703daa">CFStringRef</span><span style="color: #000000">)appPath, </span>kCFURLPOSIXPathStyle<span style="color: #000000">, </span><span style="color: #bb2ca2">YES</span><span style="color: #000000">);</span></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Create our LSItemInfoRecord</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">LSItemInfoRecord</span> itemInfoRecord;</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Pass in our CFURLRef and filter out invisibles and aliases</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>LSCopyItemInfoForURL<span style="color: #000000">(appURL, </span>kLSRequestBasicFlagsOnly<span style="color: #000000"> | </span>kLSRequestAppTypeFlags<span style="color: #000000">, &amp;itemInfoRecord);</span></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>//We don't need the appURL anymore so set it free</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">CFRelease</span>(appURL);</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #bb2ca2">if</span> ((itemInfoRecord.<span style="color: #703daa">flags</span> &amp; <span style="color: #3d1d81">kLSItemInfoIsApplication</span>) &amp;&amp;&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !(itemInfoRecord.<span style="color: #703daa">flags</span> &amp; <span style="color: #3d1d81">kLSItemInfoIsInvisible</span>) &amp;&amp;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !(itemInfoRecord.<span style="color: #703daa">flags</span> &amp; <span style="color: #3d1d81">kLSItemInfoIsAliasFile</span>))</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Make some strings to hold our data</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSString</span> *nameString = <span style="color: #bb2ca2">nil</span>, *versionString = <span style="color: #bb2ca2">nil</span>;</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Make sure it really is an app bundle</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #bb2ca2">if</span> (itemInfoRecord.<span style="color: #703daa">flags</span> &amp; <span style="color: #3d1d81">kLSItemInfoIsContainer</span>)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Get info for app bundles</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>// Load in the Info.plist and read the keys</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: rgb(112, 61, 170);">NSDictionary</span><span style="color: rgb(0, 0, 0);"> *infoDictionary = [</span><span style="color: rgb(112, 61, 170);">NSDictionary</span><span style="color: rgb(0, 0, 0);"> </span>dictionaryWithContentsOfFile<span style="color: rgb(0, 0, 0);">: [appPath </span>stringByAppendingPathComponent<span style="color: rgb(0, 0, 0);">: </span><span style="color: rgb(209, 47, 27);">@"/Contents/Info.plist"</span><span style="color: rgb(0, 0, 0);">]];</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nameString = infoDictionary[<span style="color: #d12f1b">@"CFBundleName"</span>];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; versionString = infoDictionary[<span style="color: #d12f1b">@"CFBundleShortVersionString"</span>];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #bb2ca2">if</span> (!versionString)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; versionString = infoDictionary[<span style="color: #d12f1b">@"CFBundleVersion"</span>];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;"><br></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span>//Add our info to a mutable dict.</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSDictionary</span> *dict = <span style="color: #272ad8">@{</span><span style="color: #d12f1b">@"appName"</span>: nameString,</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #d12f1b">@"appVersion"</span>: versionString<span style="color: #272ad8">}</span>;</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp;&nbsp;</span></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; }</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; }</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Remove the notifications to clean up after ourselves.</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// Also release the metadataQuery.</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>// When the Query is removed the query results are also lost.</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; [[</span><span style="color: #703daa">NSNotificationCenter</span><span style="color: #000000"> </span>defaultCenter<span style="color: #000000">] </span>removeObserver<span style="color: #000000">:</span><span style="color: #bb2ca2">self</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">name</span>:<span style="color: #703daa">NSMetadataQueryDidUpdateNotification</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">object</span>:<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span>];</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; [[</span><span style="color: #703daa">NSNotificationCenter</span><span style="color: #000000"> </span>defaultCenter<span style="color: #000000">] </span>removeObserver<span style="color: #000000">:</span><span style="color: #bb2ca2">self</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">name</span>:<span style="color: #703daa">NSMetadataQueryDidFinishGatheringNotification</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3d1d81">object</span>:<span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">metadataSearch</span>];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(79, 129, 135);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #bb2ca2">self</span><span style="color: #000000">.</span>metadataSearch<span style="color: #000000">=</span><span style="color: #bb2ca2">nil</span><span style="color: #000000">;</span></div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(0, 132, 0);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span>//Stop our timer and figure how long that took</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #703daa">NSTimeInterval</span> totalTime;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; color: rgb(61, 29, 129);"><span style="color: #000000">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #bb2ca2">self</span><span style="color: #000000">.</span><span style="color: #4f8187">stopDate</span><span style="color: #000000"> = [</span><span style="color: #703daa">NSDate</span><span style="color: #000000"> </span>timeIntervalSinceReferenceDate<span style="color: #000000">];</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">theText</span> = [<span style="color: #703daa">NSString</span> <span style="color: #3d1d81">stringWithFormat</span>:<span style="color: #d12f1b">@"App search took: %.4f seconds"</span>, (totalTime = <span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">stopDate</span> - <span style="color: #bb2ca2">self</span>.<span style="color: #4f8187">startDate</span>)];</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">&nbsp; &nbsp; }</div></div><div><br></div></div><div dir="auto"></div></body></html>