<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Security on RawCull</title><link>https://techrawcull.netlify.app/tags/security/</link><description>Recent content in Security on RawCull</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 30 Jul 2026 07:59:27 +0200</lastBuildDate><atom:link href="https://techrawcull.netlify.app/tags/security/index.xml" rel="self" type="application/rss+xml"/><item><title>Security-Scoped URLs</title><link>https://techrawcull.netlify.app/docs/security/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/security/</guid><description>&lt;h1 id="security-scoped-urls"&gt;Security-Scoped URLs&lt;a class="td-heading-self-link" href="#security-scoped-urls" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;RawCull is a sandboxed macOS app. Any access outside the app container must come from user consent, usually a file/folder picker. RawCull uses two security-scope patterns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;active catalog access for browsing/culling,&lt;/li&gt;
&lt;li&gt;persistent bookmarks for the rsync copy source and destination.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="source-map"&gt;Source Map&lt;a class="td-heading-self-link" href="#source-map" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Area&lt;/th&gt;
					&lt;th&gt;Files&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Active catalog scope&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;RawCullViewModel.swift&lt;/code&gt;, &lt;code&gt;RawCullViewModel+Catalog.swift&lt;/code&gt;, &lt;code&gt;RawCullApp.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Catalog scan scope&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Actors/ScanFiles.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Copy-folder bookmarks&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Views/CopyFiles/OpencatalogView.swift&lt;/code&gt;, &lt;code&gt;SourceAndDestinationSection.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;rsync runtime scope&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Model/ParametersRsync/ExecuteCopyFiles.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;File writes needing scope&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ExtractAndSaveJPGs.swift&lt;/code&gt;, &lt;code&gt;SaveJPGImage.swift&lt;/code&gt;, rsync workflow&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="api-basics"&gt;API Basics&lt;a class="td-heading-self-link" href="#api-basics" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The core calls are:&lt;/p&gt;</description></item></channel></rss>