<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Solid-cURL</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Daniel</forename><surname>Schraudner</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">Friedrich-Alexander-Universität Erlangen-Nürnberg</orgName>
								<address>
									<settlement>Nuremberg</settlement>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Solid-cURL</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">DBF9D90342ADFF6EDC764E8616CFD295</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2025-04-23T16:34+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Solid</term>
					<term>Tool</term>
					<term>Open ID Connect</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>We implemented Solid-cURL, a tool that extends cURL be adding Solid-OIDC authentication. Solid-cURL can be used by Solid developers and researchers that aim to use a tool of the simple elegance as cURL but do not want to handle the Solid authentication manually for every request. We described the different components of Solid-cURL and how they interact with each other.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">Introduction</head><p>In their daily work, Solid developers and researchers often have to manually send specific HTTP request to Solid servers. Doing this with a web browser is often not very practical as one first has to login with Solid-Open ID Connect (Solid-OIDC) <ref type="bibr" target="#b0">[1]</ref> using a Solid app. The requests that can be send afterwards are only those that are allowed by the app.</p><p>Web developer and researchers in this situation used the widespread tool cURL 1 . cURL is a command line program that allows to specify the parameters of an HTTP request (method, headers, etc.) in every detail. cURL executes this request and displays the result to the user.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Example 1.</head><p>Creating a new RDF resource in a container on a Solid Pod that is publicly writeable: curl -X POST https://dschraudner.solidcommunity.net/public/ -d "&lt;&gt; a &lt;http://ex.org/A\&gt; ." -H "Content-Type: text/turtle" As cURL allows to specify arbitrary headers for a request it could theoretically be used to send authenticated requests to Solid servers by copying the Solid-OIDC specific headers (access token <ref type="bibr" target="#b1">[2]</ref> and Demonstrating Proof of Possession (DPoP) token <ref type="bibr" target="#b2">[3]</ref>) to the cURL command line parameters. This approach, however is very impractical, as the DPoP header changes every time the request method or URI changes; the access token automatically expires after some time.  In this paper we present Solid-cURL. Solid-cURL is a program that tries to mimic the command line interface and behaviour of cURL. Additionally it allows users to log in via Solid-OIDC. The credentials can be stored and used for future HTTP request by specifying a command line parameter.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Example 3.</head><p>Creating a new RDF resource in a container on a Solid Pod using authentication with solid-curl solid-curl -X POST https://dschraudner.solidcommunity.net/public/ -d "&lt;&gt; a &lt;http://ex.org/A\&gt; ." -H "Content-Type: text/turtle" -u daniel</p><p>In the remainder of this paper, we will give first go through related work, then give an overview of the different components of Solid-cURL, introduce our implementation of Solid-cURL and give a short outlook.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Related Work</head><p>Penny<ref type="foot" target="#foot_0">2</ref> , Solid Filemanager<ref type="foot" target="#foot_1">3</ref> , Solid IDE <ref type="foot" target="#foot_2">4</ref> , and SolidOS<ref type="foot" target="#foot_3">5</ref> are examples of Solid apps that work like file managers. They allow to create new resources and containers on the Pod and allow to alter and delete existing ones. They, however, do not let the user exercise such a fine-grained control that is possible by manually sending HTTP request using cURL (e.g. setting specific headers). Solid-shell<ref type="foot" target="#foot_4">6</ref> is a command line tool for managing data on a Solid Pod. It allows the user to log in and use different file system-specific operations like copy, move, recursiveDelete, etc. Also the names of the different HTTP methods are available as commands, they, however, only allow to specify the URI and the body; headers and other additional settings that cURL is capable of controlling are hidden for the user.</p><p>Bashlib<ref type="foot" target="#foot_5">7</ref> is another command line tool whose main focus is to be used together with the Community Solid Server <ref type="bibr" target="#b3">[4]</ref>. It has a lot of capabilities like the usual file system operations but it can also query a resource with SPARQL <ref type="bibr" target="#b4">[5]</ref> or manipulate ACL permissions. Here, too, the user has no fine-grained control over the exact HTTP request that is sent to the Solid Pod.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Components</head><p>In Figure <ref type="figure" target="#fig_1">1</ref> a UML interaction diagram showing the principal components can be seen and their interaction.</p><p>The Command Line Parser is responsible for parsing and interpreting the command line input of the user and giving it to the Main component of Solid-cURL. Based on the parameters (more specifically, the Solid user specified as parameter) the Main component uses the Credential Storage component to retrieved previously saved credentials. The credentials are then given to the Authenticator component which carries out the login process (i.e. it retrieves and access token and creates a DPoP). Access token and DPoP are given to the Request component who carries out the actual request according to the command line parameters and with the correct Solid-OIDC headers set. The response is then printed to the user on the command line.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Implementation</head><p>We implemented Solid-cURL in Javascript. The source code is available via GitHub 8 and an executable script can be installed using the Node Package Manager 9 .</p><p>For the Command Line Parser component we used the Commander.js library 10 . For the Credential Storage component we used the operating system's keychain accessed using the keytar library 11 . For the authenticator component we used the solid-client-authn-node library 12 from Inrupt. For the request component we also used the solid-client-authn-node library or the fetch provided by it, respectively.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">Outlook</head><p>For the future we want to extend the capabilities (regarding the possible options and parameters) of Solid-cURL to match those of the original cURL. For this we started to rewrite Solid-cURL in C++ 13 to be able to use the libcurl library. cURL is also directly based on this library which makes it easier to mimic cURL capabilities using this libraries. Implementing Solid-cURL in C++ could also positively impact its performance, as JavaScript is usually compiled just-in-time which leads to a warm-up delay when starting the program <ref type="bibr" target="#b5">[6]</ref>.</p><p>For C++, however, there exists to our knowledge no library for Solid-OIDC which means we will have to handle all the different tokens used in the process manually.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Example 2 .</head><label>2</label><figDesc>Creating a new RDF resource in a container on a Solid Pod with authentication: curl -X POST https://dschraudner.solidcommunity.net/public/</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: UML interaction diagram showing the different components of Solid-cURL and their interaction</figDesc><graphic coords="3,89.29,84.19,416.68,212.50" type="bitmap" /></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_0">https://penny.vincenttunru.com/</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_1">https://otto-aa.github.io/solid-filemanager/</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_2">https://jeff-zucker.github.io/solid-content-manager/</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="5" xml:id="foot_3">https://github.com/SolidOS/solidos</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="6" xml:id="foot_4">https://github.com/jeff-zucker/solid-shell/</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="7" xml:id="foot_5">https://github.com/SolidLabResearch/Bashlib</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Acknowledgments</head><p>This work is partially funded by the German Federal Ministry of Education and Research via the MANDAT project (FKZ 16DTM107A).</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<author>
			<persName><forename type="first">A</forename><surname>Coburn</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Zagidulin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Migus</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>White</surname></persName>
		</author>
		<title level="m">Solid-oidc, Specification</title>
				<imprint>
			<publisher>Solid</publisher>
			<date type="published" when="2022">2022</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<author>
			<persName><forename type="first">D</forename><surname>Hardt</surname></persName>
		</author>
		<title level="m">The OAuth 2.0 authorization framework</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
	<note type="report_type">Technical Report</note>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<author>
			<persName><forename type="first">D</forename><surname>Fett</surname></persName>
		</author>
		<author>
			<persName><surname>Authlete</surname></persName>
		</author>
		<author>
			<persName><surname>Campbell</surname></persName>
		</author>
		<title level="m">OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
	<note type="report_type">Technical Report</note>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">The community solid server: Supporting research &amp; development in an evolving ecosystem</title>
		<author>
			<persName><forename type="first">J</forename><surname>Van Herwegen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Verborgh</surname></persName>
		</author>
		<idno type="DOI">10.5281/zenodo7595116(????</idno>
		<ptr target="https://doi.org/10.5281/zenodo7595116(????" />
	</analytic>
	<monogr>
		<title level="j">Semantic Web Journal</title>
		<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Semantics and complexity of sparql</title>
		<author>
			<persName><forename type="first">J</forename><surname>Pérez</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Arenas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Gutierrez</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM Transactions on Database Systems (TODS)</title>
		<imprint>
			<biblScope unit="volume">34</biblScope>
			<biblScope unit="page" from="1" to="45" />
			<date type="published" when="2009">2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Performance issues and optimizations in javascript: an empirical study</title>
		<author>
			<persName><forename type="first">M</forename><surname>Selakovic</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Pradel</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 38th International Conference on Software Engineering</title>
				<meeting>the 38th International Conference on Software Engineering</meeting>
		<imprint>
			<date type="published" when="2016">2016</date>
			<biblScope unit="page" from="61" to="72" />
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
