- Cleaned up project structure and removed various unused template stuff.
	- Added i18n lib and split moved all translations to seperate files.
        - Added very simple language selector.
This commit is contained in:
Rowan Goemans
2019-10-08 11:20:26 +02:00
parent 79cadfbbcd
commit 00b1ba1124
2448 changed files with 917 additions and 289774 deletions

View File

@@ -1,2 +1,3 @@
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_PATH: "vendor"
BUNDLE_NO_INSTALL: "true"

View File

@@ -17,7 +17,8 @@ gem "jekyll", "~> 3.6.0"
# If you have any plugins, put them here!
group :jekyll_plugins do
gem "jekyll-feed", "~> 0.6"
gem "jekyll-menus"
gem "jekyll-menus", "0.6"
gem 'jekyll-multiple-languages-plugin'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem

View File

@@ -1,10 +1,10 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0)
ffi (1.9.25)
ffi (1.11.1)
forwardable-extended (2.6.0)
jekyll (3.6.3)
addressable (~> 2.4)
@@ -17,31 +17,31 @@ GEM
pathutil (~> 0.9)
rouge (>= 1.7, < 3)
safe_yaml (~> 1.0)
jekyll-feed (0.9.2)
jekyll-feed (0.11.0)
jekyll (~> 3.3)
jekyll-menus (0.6.0)
jekyll (~> 3.1)
jekyll-multiple-languages-plugin (1.6.0)
jekyll (>= 2.0, < 4.0)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
jekyll-watch (1.5.1)
listen (~> 3.0)
kramdown (1.17.0)
liquid (4.0.1)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
liquid (4.0.3)
listen (3.2.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.3.6)
pathutil (0.16.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (3.0.3)
public_suffix (4.0.1)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rb-inotify (0.10.0)
ffi (~> 1.0)
rouge (2.2.1)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
sass (3.6.0)
safe_yaml (1.0.5)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
@@ -53,8 +53,9 @@ PLATFORMS
DEPENDENCIES
jekyll (~> 3.6.0)
jekyll-feed (~> 0.6)
jekyll-menus
jekyll-menus (= 0.6)
jekyll-multiple-languages-plugin
tzinfo-data
BUNDLED WITH
1.16.2
1.17.2

View File

@@ -3,14 +3,17 @@ title: IRMA
author: Privacy by Design Foundation
email: ''
description: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt.
baseurl: "/"
baseurl: ""
url: ''
languages: ["nl", "en", "de"]
exclude_from_localizations: ["uploads", css"]
defaults:
- scope:
path: ''
values:
layout: default
markdown: kramdown
gems:
plugins:
- jekyll-feed
- jekyll-menus
- jekyll-multiple-languages-plugin

232
_i18n/de.yml Normal file
View File

@@ -0,0 +1,232 @@
nav:
home_link: "/"
home_text: IRMA
usage_link: "#gebruik"
usage_text: Gebruik
explanation_link: "#uitleg"
explanation_text: Uitleg
faq_link: "#faqs"
faq_text: FAQs
links_link: "#links"
links_text: Links
banner:
headline: Kies IRMA. <br><strong>Zet een digitaal paspoort op je eigen mobiel.</strong>
ios: IRMA voor iOS
ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994
android: IRMA vor Android
android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu
product_shot_src: "/uploads/non-free/screenshot.png"
product_shot_alt: Product Shot
usage:
id: gebruik
login_headline: Inloggen
login_alt: Login
login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen
die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde
film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets.
sign_headline: Ondertekenen
sign_alt: Ondertekenen
sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen
relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met
IRMA ondertekenen als arts, als burger of vanuit een andere rol.
trust_headline: Vertrouwen
trust_alt: Vertrouwen
trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch
beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en
echt van jou.
slogan:
id: start
heading: Met IRMA heb je <strong>in de hand</strong> wat er met jouw gegevens gebeurt.
explanation:
id: uitleg
getstarted_headline: Zelf aan de slag met IRMA
getstarted_alt: Zelf aan de slag met IRMA
getstarted_content: Iedereen kan de IRMA app gratis downloaden (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen
en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw
emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen
zichzelf online bekend maken.
tool_headline: IRMA is een middel, geen doel op zich
tool_alt: IRMA is een middel, geen doel op zich
tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch
moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met
IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen.
Bijvoorbeeld een film kijken of iets (ver)kopen.
usecases_headline: Wat kan ik er al mee?
usecases_alt: Wat kan ik er al mee?
usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen,
bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website <a href="https://www.helder.health"
target="_blank">helder</a>. Vooral bij gemeenten en in de zorg wordt aan verder
gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun
je zelf een aantal IRMA <a href="https://privacybydesign.foundation/demo/" target="_blank">demo's</a>
uitproberen.
faq:
id: faqs
headline: <span class="light">Veel gestelde vragen en <strong>antwoorden</strong>
daarop<span>
item1:
question: Hoe moet ik met IRMA inloggen op een website?
answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar
bijvoorbeeld op staat <em>Log in met IRMA</em>. Als je de IRMA app nog niet
op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken
die je nodig hebt.<br><br> Als je de IRMA app al wel hebt, zijn er twee verschillende
situaties<span>:</span><ul class="indent"><li> Als je de website bekijkt op
je computer of laptop en je drukt op die login knop verschijnt er een QR code.
Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een
knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of
je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben
je ingelogd.</li><li> Als je de website op je telefoon bekijkt wordt na het
indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin
verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op
OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed
is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.</li></ul><br>Het
kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen
hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen.
item2:
question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten?
answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum,
BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent.
Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen.
Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie
toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties
toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens
laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.<br><br>Naar
verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens
aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale
(beroeps)groepen.
item3:
question: Kan ik IRMA op een tweede telefoon of tablet zetten?
answer: Jazeker, op ieder (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken.
Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat
kwijt bent, kun je nog met een ander inloggen.
item4:
question: Hoezo is IRMA privacy-vriendelijk en veilig?
answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd
met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde
situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je
soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of
studie te tonen.<br><br> Jouw kenmerken in de IRMA app zijn digitaal ondertekend
door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel,
waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt
zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen
je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt.
Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook,
bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats:
je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt
wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.'
item5:
question: Waar staan mijn IRMA gegevens opgeslagen?
answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in
de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet
ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn
ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken
vanuit de IRMA app aan een website doorgegeven worden.
item6:
question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen?
answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze
geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van
hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar
je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur.
De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een
waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen
door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet.
Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente
ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent.
item7:
question: Wat doe ik als ik een nieuwe telefoon koop?
answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw
account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid
om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon.
Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens
opnieuw op te halen. Het kost wel een klein beetje tijd.
item8:
question: Wat doe ik als ik mijn telefoon verlies?
answer: <span>De IRMA app op je telefoon is beschermd met een PIN, net als je
app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus
geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een
goede PIN gekozen hebt, hoef je je geen zorgen te maken. <br><br> Je kunt jezelf
echter nog beter beschermen<span>:</span> bij het openen van een IRMA account heb je de
optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun
je via de <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">MijnIRMA</a>
omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de
IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres
toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">daar</a>
met IRMA zelf in te loggen. Het is verstandig dat te doen.
item9:
question: Ik heb een vraag over IRMA; waar kan ik terecht?
answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip,
dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website
je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met
je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over
hoe je vragen kunt stellen en contact op kunt nemen. <br><br> Als je tenslotte
een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar
het adres <a href="mailto:irma@privacybydesign.foundation">irma@privacybydesign.foundation</a>.
item10:
question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog?
answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met
de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken
vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen.
De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon
staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft.
item11:
question: Wie zit er achter IRMA?
answer: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Deze stichting is in 2016 voortgekomen uit de <em>Digital Security</em>
onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk
en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting
Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie
Nederland (<a href="https://www.sidn.nl/" target="_blank">SIDN</a>). Mede door deze samenwerking wordt de stabiliteit
en continuiteit van IRMA gegarandeerd.
item12:
question: Hoezo kan IRMA gratis zijn?
answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die
gebruikers via IRMA laten inloggen<span>:</span> iedereen kan kenmerken uit een IRMA app
opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is <em>niet
gratis</em> om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in
IRMA apps zetten; dat zou snel een rommeltje worden.<br><br> Voor die uitgifte
moet betaald worden en moet een contract getekend worden, waarbij de uitgever
zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste
persoon te zetten. <br><br>Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen
op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de
organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien
geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem.
item13:
question: IRMA is <em>open source</em>; wat betekent dat?
answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden<span>:</span> de software
staat gewoon online, namelijk op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>. Natuurlijk moet je wel wat van
computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk<span>:</span> IRMA kent geen geheimen en werkt op een
transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van
leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat
alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn.
item14:
question: Ik wil meer informatie over IRMA; waar kan ik terecht?
answer: Het grotere verhaal achter IRMA staat beschreven in een
<a href="https://privacybydesign.foundation/pdf/IRMA-manifest-2019.pdf" target="_blank">IRMA Manifest</a>.
<br><br>Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de
stichting Privacy by Design op een eigen
<a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">pagina</a>.
Mensen die de software van IRMA willen bekijken kunnen terecht op een technische
<a href="https://irma.app/docs" target="_blank">documentatie</a> pagina en op
<a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.
footer:
id: links
irma_alt: IRMA logo
irma_headline: Privacy by Design Foundation
irma_content: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op
haar eigen <a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">website</a>.
doc_headline: Docs
doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische
<a href="https://irma.app/docs" target="_blank">documentatie</a>.
github_headline: GitHub
github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen
terecht op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.

232
_i18n/en.yml Normal file
View File

@@ -0,0 +1,232 @@
nav:
home_link: "/"
home_text: IRMA
usage_link: "#gebruik"
usage_text: Gebruik
explanation_link: "#uitleg"
explanation_text: Uitleg
faq_link: "#faqs"
faq_text: FAQs
links_link: "#links"
links_text: Links
banner:
headline: Kies IRMA. <br><strong>Zet een digitaal paspoort op je eigen mobiel.</strong>
ios: IRMA voor iOS
ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994
android: IRMA vor Android
android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu
product_shot_src: "/uploads/non-free/screenshot.png"
product_shot_alt: Product Shot
usage:
id: gebruik
login_headline: Inloggen
login_alt: Login
login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen
die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde
film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets.
sign_headline: Ondertekenen
sign_alt: Ondertekenen
sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen
relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met
IRMA ondertekenen als arts, als burger of vanuit een andere rol.
trust_headline: Vertrouwen
trust_alt: Vertrouwen
trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch
beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en
echt van jou.
slogan:
id: start
heading: Met IRMA heb je <strong>in de hand</strong> wat er met jouw gegevens gebeurt.
explanation:
id: uitleg
getstarted_headline: Zelf aan de slag met IRMA
getstarted_alt: Zelf aan de slag met IRMA
getstarted_content: Iedereen kan de IRMA app gratis downloaden (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen
en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw
emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen
zichzelf online bekend maken.
tool_headline: IRMA is een middel, geen doel op zich
tool_alt: IRMA is een middel, geen doel op zich
tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch
moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met
IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen.
Bijvoorbeeld een film kijken of iets (ver)kopen.
usecases_headline: Wat kan ik er al mee?
usecases_alt: Wat kan ik er al mee?
usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen,
bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website <a href="https://www.helder.health"
target="_blank">helder</a>. Vooral bij gemeenten en in de zorg wordt aan verder
gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun
je zelf een aantal IRMA <a href="https://privacybydesign.foundation/demo/" target="_blank">demo's</a>
uitproberen.
faq:
id: faqs
headline: <span class="light">Veel gestelde vragen en <strong>antwoorden</strong>
daarop<span>
item1:
question: Hoe moet ik met IRMA inloggen op een website?
answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar
bijvoorbeeld op staat <em>Log in met IRMA</em>. Als je de IRMA app nog niet
op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken
die je nodig hebt.<br><br> Als je de IRMA app al wel hebt, zijn er twee verschillende
situaties<span>:</span><ul class="indent"><li> Als je de website bekijkt op
je computer of laptop en je drukt op die login knop verschijnt er een QR code.
Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een
knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of
je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben
je ingelogd.</li><li> Als je de website op je telefoon bekijkt wordt na het
indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin
verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op
OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed
is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.</li></ul><br>Het
kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen
hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen.
item2:
question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten?
answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum,
BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent.
Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen.
Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie
toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties
toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens
laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.<br><br>Naar
verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens
aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale
(beroeps)groepen.
item3:
question: Kan ik IRMA op een tweede telefoon of tablet zetten?
answer: Jazeker, op ieder (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken.
Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat
kwijt bent, kun je nog met een ander inloggen.
item4:
question: Hoezo is IRMA privacy-vriendelijk en veilig?
answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd
met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde
situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je
soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of
studie te tonen.<br><br> Jouw kenmerken in de IRMA app zijn digitaal ondertekend
door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel,
waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt
zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen
je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt.
Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook,
bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats:
je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt
wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.'
item5:
question: Waar staan mijn IRMA gegevens opgeslagen?
answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in
de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet
ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn
ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken
vanuit de IRMA app aan een website doorgegeven worden.
item6:
question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen?
answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze
geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van
hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar
je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur.
De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een
waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen
door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet.
Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente
ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent.
item7:
question: Wat doe ik als ik een nieuwe telefoon koop?
answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw
account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid
om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon.
Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens
opnieuw op te halen. Het kost wel een klein beetje tijd.
item8:
question: Wat doe ik als ik mijn telefoon verlies?
answer: <span>De IRMA app op je telefoon is beschermd met een PIN, net als je
app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus
geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een
goede PIN gekozen hebt, hoef je je geen zorgen te maken. <br><br> Je kunt jezelf
echter nog beter beschermen<span>:</span> bij het openen van een IRMA account heb je de
optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun
je via de <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">MijnIRMA</a>
omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de
IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres
toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">daar</a>
met IRMA zelf in te loggen. Het is verstandig dat te doen.
item9:
question: Ik heb een vraag over IRMA; waar kan ik terecht?
answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip,
dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website
je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met
je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over
hoe je vragen kunt stellen en contact op kunt nemen. <br><br> Als je tenslotte
een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar
het adres <a href="mailto:irma@privacybydesign.foundation">irma@privacybydesign.foundation</a>.
item10:
question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog?
answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met
de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken
vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen.
De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon
staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft.
item11:
question: Wie zit er achter IRMA?
answer: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Deze stichting is in 2016 voortgekomen uit de <em>Digital Security</em>
onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk
en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting
Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie
Nederland (<a href="https://www.sidn.nl/" target="_blank">SIDN</a>). Mede door deze samenwerking wordt de stabiliteit
en continuiteit van IRMA gegarandeerd.
item12:
question: Hoezo kan IRMA gratis zijn?
answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die
gebruikers via IRMA laten inloggen<span>:</span> iedereen kan kenmerken uit een IRMA app
opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is <em>niet
gratis</em> om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in
IRMA apps zetten; dat zou snel een rommeltje worden.<br><br> Voor die uitgifte
moet betaald worden en moet een contract getekend worden, waarbij de uitgever
zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste
persoon te zetten. <br><br>Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen
op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de
organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien
geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem.
item13:
question: IRMA is <em>open source</em>; wat betekent dat?
answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden<span>:</span> de software
staat gewoon online, namelijk op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>. Natuurlijk moet je wel wat van
computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk<span>:</span> IRMA kent geen geheimen en werkt op een
transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van
leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat
alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn.
item14:
question: Ik wil meer informatie over IRMA; waar kan ik terecht?
answer: Het grotere verhaal achter IRMA staat beschreven in een
<a href="https://privacybydesign.foundation/pdf/IRMA-manifest-2019.pdf" target="_blank">IRMA Manifest</a>.
<br><br>Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de
stichting Privacy by Design op een eigen
<a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">pagina</a>.
Mensen die de software van IRMA willen bekijken kunnen terecht op een technische
<a href="https://irma.app/docs" target="_blank">documentatie</a> pagina en op
<a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.
footer:
id: links
irma_alt: IRMA logo
irma_headline: Privacy by Design Foundation
irma_content: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op
haar eigen <a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">website</a>.
doc_headline: Docs
doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische
<a href="https://irma.app/docs" target="_blank">documentatie</a>.
github_headline: GitHub
github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen
terecht op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.

232
_i18n/nl.yml Normal file
View File

@@ -0,0 +1,232 @@
nav:
home_link: "/"
home_text: IRMA
usage_link: "#gebruik"
usage_text: Gebruik
explanation_link: "#uitleg"
explanation_text: Uitleg
faq_link: "#faqs"
faq_text: FAQs
links_link: "#links"
links_text: Links
banner:
headline: Kies IRMA. <br><strong>Zet een digitaal paspoort op je eigen mobiel.</strong>
ios: IRMA voor iOS
ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994
android: IRMA vor Android
android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu
product_shot_src: "/uploads/non-free/screenshot.png"
product_shot_alt: Product Shot
usage:
id: gebruik
login_headline: Inloggen
login_alt: Login
login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen
die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde
film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets.
sign_headline: Ondertekenen
sign_alt: Ondertekenen
sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen
relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met
IRMA ondertekenen als arts, als burger of vanuit een andere rol.
trust_headline: Vertrouwen
trust_alt: Vertrouwen
trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch
beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en
echt van jou.
slogan:
id: start
heading: Met IRMA heb je <strong>in de hand</strong> wat er met jouw gegevens gebeurt.
explanation:
id: uitleg
getstarted_headline: Zelf aan de slag met IRMA
getstarted_alt: Zelf aan de slag met IRMA
getstarted_content: Iedereen kan de IRMA app gratis downloaden (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen
en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw
emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen
zichzelf online bekend maken.
tool_headline: IRMA is een middel, geen doel op zich
tool_alt: IRMA is een middel, geen doel op zich
tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch
moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met
IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen.
Bijvoorbeeld een film kijken of iets (ver)kopen.
usecases_headline: Wat kan ik er al mee?
usecases_alt: Wat kan ik er al mee?
usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen,
bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website <a href="https://www.helder.health"
target="_blank">helder</a>. Vooral bij gemeenten en in de zorg wordt aan verder
gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun
je zelf een aantal IRMA <a href="https://privacybydesign.foundation/demo/" target="_blank">demo's</a>
uitproberen.
faq:
id: faqs
headline: <span class="light">Veel gestelde vragen en <strong>antwoorden</strong>
daarop<span>
item1:
question: Hoe moet ik met IRMA inloggen op een website?
answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar
bijvoorbeeld op staat <em>Log in met IRMA</em>. Als je de IRMA app nog niet
op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken
die je nodig hebt.<br><br> Als je de IRMA app al wel hebt, zijn er twee verschillende
situaties<span>:</span><ul class="indent"><li> Als je de website bekijkt op
je computer of laptop en je drukt op die login knop verschijnt er een QR code.
Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een
knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of
je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben
je ingelogd.</li><li> Als je de website op je telefoon bekijkt wordt na het
indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin
verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op
OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed
is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.</li></ul><br>Het
kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen
hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen.
item2:
question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten?
answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum,
BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent.
Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen.
Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie
toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties
toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens
laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.<br><br>Naar
verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens
aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale
(beroeps)groepen.
item3:
question: Kan ik IRMA op een tweede telefoon of tablet zetten?
answer: Jazeker, op ieder (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken.
Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat
kwijt bent, kun je nog met een ander inloggen.
item4:
question: Hoezo is IRMA privacy-vriendelijk en veilig?
answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd
met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde
situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je
soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of
studie te tonen.<br><br> Jouw kenmerken in de IRMA app zijn digitaal ondertekend
door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel,
waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt
zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen
je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt.
Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook,
bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats:
je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt
wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.'
item5:
question: Waar staan mijn IRMA gegevens opgeslagen?
answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in
de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet
ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn
ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken
vanuit de IRMA app aan een website doorgegeven worden.
item6:
question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen?
answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze
geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van
hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar
je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur.
De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een
waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen
door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet.
Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente
ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent.
item7:
question: Wat doe ik als ik een nieuwe telefoon koop?
answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw
account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid
om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon.
Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens
opnieuw op te halen. Het kost wel een klein beetje tijd.
item8:
question: Wat doe ik als ik mijn telefoon verlies?
answer: <span>De IRMA app op je telefoon is beschermd met een PIN, net als je
app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus
geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een
goede PIN gekozen hebt, hoef je je geen zorgen te maken. <br><br> Je kunt jezelf
echter nog beter beschermen<span>:</span> bij het openen van een IRMA account heb je de
optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun
je via de <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">MijnIRMA</a>
omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de
IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres
toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">daar</a>
met IRMA zelf in te loggen. Het is verstandig dat te doen.
item9:
question: Ik heb een vraag over IRMA; waar kan ik terecht?
answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip,
dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website
je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met
je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over
hoe je vragen kunt stellen en contact op kunt nemen. <br><br> Als je tenslotte
een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar
het adres <a href="mailto:irma@privacybydesign.foundation">irma@privacybydesign.foundation</a>.
item10:
question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog?
answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met
de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken
vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen.
De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon
staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft.
item11:
question: Wie zit er achter IRMA?
answer: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Deze stichting is in 2016 voortgekomen uit de <em>Digital Security</em>
onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk
en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting
Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie
Nederland (<a href="https://www.sidn.nl/" target="_blank">SIDN</a>). Mede door deze samenwerking wordt de stabiliteit
en continuiteit van IRMA gegarandeerd.
item12:
question: Hoezo kan IRMA gratis zijn?
answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die
gebruikers via IRMA laten inloggen<span>:</span> iedereen kan kenmerken uit een IRMA app
opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is <em>niet
gratis</em> om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in
IRMA apps zetten; dat zou snel een rommeltje worden.<br><br> Voor die uitgifte
moet betaald worden en moet een contract getekend worden, waarbij de uitgever
zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste
persoon te zetten. <br><br>Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen
op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de
organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien
geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem.
item13:
question: IRMA is <em>open source</em>; wat betekent dat?
answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden<span>:</span> de software
staat gewoon online, namelijk op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>. Natuurlijk moet je wel wat van
computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk<span>:</span> IRMA kent geen geheimen en werkt op een
transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van
leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat
alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn.
item14:
question: Ik wil meer informatie over IRMA; waar kan ik terecht?
answer: Het grotere verhaal achter IRMA staat beschreven in een
<a href="https://privacybydesign.foundation/pdf/IRMA-manifest-2019.pdf" target="_blank">IRMA Manifest</a>.
<br><br>Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de
stichting Privacy by Design op een eigen
<a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">pagina</a>.
Mensen die de software van IRMA willen bekijken kunnen terecht op een technische
<a href="https://irma.app/docs" target="_blank">documentatie</a> pagina en op
<a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.
footer:
id: links
irma_alt: IRMA logo
irma_headline: Privacy by Design Foundation
irma_content: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op
haar eigen <a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">website</a>.
doc_headline: Docs
doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische
<a href="https://irma.app/docs" target="_blank">documentatie</a>.
github_headline: GitHub
github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen
terecht op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.

View File

@@ -1,15 +0,0 @@
<div class="block block-cta-bar">
<div class="container">
<div class="columns">
<div class="text">
<p>{{ section.content }}</p>
</div>
<div class="cta">
<form action="https://formspree.io/{{ section.email_recipient }}" method="POST">
<input type="email" placeholder="your@email.com" class="inverted">
<button type="submit" class="button primary inverted">Sign up</button>
</form>
</div>
</div>
</div>
</div>

View File

@@ -1,17 +0,0 @@
{% if section.media_alignment and section.media_alignment == "Left" %}
{% include block-feature-2.html %}
{% else %}
<section class="block block-feature-1">
<div class="container">
<div class="columns">
<div class="column text">
<h2><span class="light">{{ section.headline }}</span></h2>
<p>{{ section.content }}</p>
</div>
<div class="column media">
<img src="{{ section.media.image | relative_url }}" alt="{{ section.media.alt_text }}">
</div>
</div>
</div>
</section>
{% endif %}

View File

@@ -1,13 +0,0 @@
<section class="block block-feature-2">
<div class="container">
<div class="columns">
<div class="column media">
<img src="{{ section.media.image | relative_url }}" alt="{{ section.media.alt_text }}">
</div>
<div class="column text">
<h2><span class="light">{{ section.headline }}</span></h2>
<p>{{ section.content }}</p>
</div>
</div>
</div>
</section>

View File

@@ -1,5 +0,0 @@
<footer class="block block-footer-1">
<div class="container">
<p>{{ section.content }}</p>
</div>
</footer>

View File

@@ -1,23 +0,0 @@
<header class="block block-header-1">
<div class="block-header-1--logo">
<a href="{{ site.url | relative_url }}">
<img src="{{ section.logo | relative_url }}" alt="{{ site.title }}">
</a>
</div>
<nav class="block-header-1--nav" id="myTopnav">
<ul>
{% for nav_item in section.navigation %}
<li class="nav-item {% if page.url == nav_item.link %}active{% endif %}"><a
href="{{ nav_item.link }}">{{ nav_item.link_text }}</a></li>
{% endfor %}
</ul>
<select>
<option value="" selected="selected">Select</option>
{% for nav_item in section.navigation %}
<option value="{{ nav_item.link }}">{{ nav_item.link_text }}</option>
{% endfor %}
</select>
</nav>
</header>

View File

@@ -1,18 +0,0 @@
<header class="block block-header-2">
<div class="block-header-2--logo">
<a href="{{ site.url | relative_url }}">
<img src="{{ section.logo | relative_url }}" alt="{{ site.title }}">
</a>
</div>
<nav class="block-header-2--nav">
<ul>
{% for nav_item in section.navigation %}
<li class="nav-item {% if page.url == nav_item.link %}active{% endif %}"><a href="{{ nav_item.link }}">{{ nav_item.link_text }}</a></li>
{% endfor %}
</ul>
<a class="button primary small block-header-2--cta" href="{{ section.cta.url }}">{{ section.cta.button_text }}</a>
</nav>
</header>

View File

@@ -1,9 +0,0 @@
<header class="block block-header-3">
<div class="block-header-3--logo">
<a href="{{ site.url | relative_url }}">
<img src="{{ section.logo | relative_url }}" alt="{{ site.title }}">
</a>
</div>
</header>

View File

@@ -1,5 +0,0 @@
<section class="block block-hero-1">
<div class="container">
<h1><span class="light">{{ section.heading }}</span></h1>
</div>
</section>

View File

@@ -1,20 +0,0 @@
<section class="block block-hero-2"
{% if section.background_image %}
style="background-image: url('{{ section.background_image | relative_url }}')"
{% endif %}>
<div class="headspace"></div>
<div class="container">
<div class="columns">
<div class="column text">
<h1><span class="light">{{ section.headline }}</span></h1>
<p>{{ section.content }}</p>
{% if section.cta and section.cta.enabled == true %}
<a class="button primary inverted" href="{{ section.cta.url }}">{{ section.cta.button_text }}</a>
{% endif %}
</div>
<div class="column media">
<img src="{{ section.image.image | relative_url }}" alt="{{ section.image.alt_text }}">
</div>
</div>
</div>
</section>

View File

@@ -1,6 +0,0 @@
<section class="block block-hero-1">
<div class="container">
<div class="destination" id="{{ section.id }}"></div>
<h1><span class="black light">{{ section.heading }}</span></h1>
</div>
</section>

View File

@@ -1,13 +1,13 @@
<section class="block block-faq-1">
<div class="container">
<div class="destination" id="{{ section.id }}"></div>
<div class="destination" id="{% t section.id %}"></div>
<div class="columns">
<div class="column">
<h2><span class="light center">{{ section.headline }}</span></h2>
<h2><span class="light center">{% t section.headline %}</span></h2>
{% for faq_item in section.faq_items %}
<button class="collapsible">{{ faq_item.question }}</button>
<button class="collapsible">{% t faq_item.question %}</button>
<div class="content faq-item">
<p>{{ faq_item.answer }}</p>
<p>{% t faq_item.answer %}</p>
</div>
{% endfor %}
</div>

View File

@@ -1,25 +0,0 @@
<section class="block block-footer-2">
<div class="container">
<div class="destination" id="{{ section.id }}"></div>
<div class="columns">
<div class="column">
<img src="{{ section.image_1.image | relative_url }}" alt="{{ section.image_1.caption }}">
</div>
<div class="column">
<h3>{{ section.col_2.headline }}</h3>
<br>
<p>{{ section.col_2.content }}</p>
</div>
<div class="column">
<h3>{{ section.col_3.headline }}</h3>
<br>
<p>{{ section.col_3.content }}</p>
</div>
<div class="column">
<h3>{{ section.col_4.headline }}</h3>
<br>
<p>{{ section.col_4.content }}</p>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,40 @@
<section class="block block-footer-2">
<div class="container">
<div class="destination" id="{% t section.id %}"></div>
<div class="columns">
<div class="column">
<img src="{{ section.image_1.image | prepend: site.baseurl_root }}" alt="{% t section.image_1.alt %}">
</div>
<div class="column">
<h3>{% t section.col_2.headline %}</h3>
<br>
<p>{% t section.col_2.content %}</p>
</div>
<div class="column">
<h3>{% t section.col_3.headline %}</h3>
<br>
<p>{% t section.col_3.content %}</p>
</div>
<div class="column">
<h3>{% t section.col_4.headline %}</h3>
<br>
<p>{% t section.col_4.content %}</p>
</div>
</div>
<hr>
<div id="language">
<h4>Change language</h4>
<ol>
{% for lang in page.languages %}
<li>
<a {% if site.lang == lang %} id="selected-lang" {% endif %}
href="{{ site.baseurl_root }}{{ page.url}}?lang={{ lang }}"
>
{{ lang }}
</a>
</li>
{% endfor %}
</ol>
</div>
</div>
</section>

View File

@@ -1,16 +1,13 @@
<div class="topnav" id="myTopnav">
<div class="block-header-1--logo">
<a id="logo" href="{{ section.url | relative_url }}">
<img src="{{ section.logo | relative_url }}" alt="{{ site.title }}">
<a id="logo" href="{{ section.url | prepend: site.baseurl_root }}">
<img src="{{ section.logo | prepend: site.baseurl_root }}" alt="{{ site.title }}">
</a>
</div>
<div id="menu">
{% for nav_item in section.navigation %}
<a class="refs" href="{{ nav_item.link }}">{{ nav_item.link_text }}</a>
<a class="refs" href="{% t nav_item.link %}">{% t nav_item.link_text %}</a>
{% endfor %}
<a id="toggle" href="javascript:void(0);" class="icon" onclick="myFunction()">
<img id="hamburger" src="{{ section.menu | relative_url }}" alt="Menu">
</a>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<section class="block block-hero-1">
<div class="container">
<div class="destination" id="{% t section.id %}"></div>
<h1><span class="black light">{% t section.heading %}</span></h1>
</div>
</section>

View File

@@ -1,21 +1,21 @@
<section class="block block-hero-2"
{% if section.background_image %}
style="background-image: url('{{ section.background_image | relative_url }}')"
style="background-image: url('{{ section.background_image | prepend: site.baseurl_root }}')"
{% endif %}>
<div class="container">
<div class="columns">
<div class="column text">
<h1><span class="light">{{ section.headline }}</span></h1>
<h1><span class="light">{% t section.headline %}</span></h1>
<p>{{ section.content }}</p>
{% if section.ctaiOS and section.ctaiOS.enabled == true %}
<button class="button primary inverted" onclick="location.href='{{ section.ctaiOS.url }}'" type="button">{{ section.ctaiOS.button_text }}</button>
<button class="button primary inverted" onclick="location.href='{% t section.ctaiOS.url %}'" type="button">{% t section.ctaiOS.button_text %}</button>
{% endif %}
{% if section.ctaAndroid and section.ctaAndroid.enabled == true %}
<button class="button primary inverted" onclick="location.href='{{ section.ctaAndroid.url }}'" type="button">{{ section.ctaAndroid.button_text }}</button>
<button class="button primary inverted" onclick="location.href='{% t section.ctaAndroid.url %}'" type="button">{% t section.ctaAndroid.button_text %}</button>
{% endif %}
</div>
<div class="column media">
<img src="{{ section.image.image | relative_url }}" alt="{{ section.image.alt_text }}">
<img src="{{site.baseurl_root}}{% t section.image.image %}" alt="{% t section.image.alt_text %}">
</div>
</div>
</div>

View File

@@ -1,36 +0,0 @@
<section class="block block-three-column-1">
<div class="container">
<div class="columns">
<div class="column">
<figure>
<img src="{{ section.image_1.image | relative_url }}" alt="{{ section.image_1.caption }}">
{% if section.image_1.caption %}
<figcaption>{{ section.image_1.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_1.headline }}</h3>
<p>{{ section.col_1.content }}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_2.image | relative_url }}" alt="{{ section.image_2.caption }}">
{% if section.image_1.caption %}
<figcaption>{{ section.image_1.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_2.headline }}</h3>
<p>{{ section.col_2.content }}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_3.image | relative_url }}" alt="{{ section.image_3.caption }}">
{% if section.image_1.caption %}
<figcaption>{{ section.image_1.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_3.headline }}</h3>
<p>{{ section.col_3.content }}</p>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,28 @@
<section class="block block-three-column-1">
<div class="container">
<div class="destination" id="{% t section.id %}"></div>
<div class="columns">
<div class="column">
<figure>
<img src="{{ section.image_1.image | prepend: site.baseurl_root }}" alt="{% t section.image_1.alt %}" style="width: 50%;">
</figure>
<h3>{% t section.col_1.headline %}</h3>
<p>{% t section.col_1.content %}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_2.image | prepend: site.baseurl_root }}" alt="{% t section.image_2.alt %}" style="width: 50%;">
</figure>
<h3>{% t section.col_2.headline %}</h3>
<p>{% t section.col_2.content %}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_3.image | prepend: site.baseurl_root }}" alt="{% t section.image_3.alt %}" style="width: 50%;">
</figure>
<h3>{% t section.col_3.headline %}</h3>
<p>{% t section.col_3.content %}</p>
</div>
</div>
</div>
</section>

View File

@@ -1,10 +0,0 @@
<section class="block block-media-1">
<div class="container">
<figure>
<img src="{{ section.image | relative_url }}" alt="{{ section.caption }}">
{% if section.caption %}
<figcaption>{{ section.caption }}</figcaption>
{% endif %}
</figure>
</div>
</section>

View File

@@ -1,22 +0,0 @@
<section class="block block-media-2">
<div class="container">
<div class="columns">
<div class="column">
<figure>
<img src="{{ section.image_1.image | relative_url }}" alt="{{ section.image_1.caption }}">
{% if section.image_1.caption %}
<figcaption>{{ section.image_1.caption }}</figcaption>
{% endif %}
</figure>
</div>
<div class="column">
<figure>
<img src="{{ section.image_2.image | relative_url }}" alt="{{ section.image_2.caption }}">
{% if section.image_2.caption %}
<figcaption>{{ section.image_2.caption }}</figcaption>
{% endif %}
</figure>
</div>
</div>
</div>
</section>

View File

@@ -1,10 +0,0 @@
<section class="block block-one-column-1">
<div class="container">
<div class="columns">
<div class="column">
<h3>{{ section.headline }}</h3>
<p>{{ section.content }}</p>
</div>
</div>
</div>
</section>

View File

@@ -1,12 +0,0 @@
<section class="block block-text-1">
<div class="container">
<div class="columns">
<div class="column headline">
<h3>{{ section.headline }}</h3>
</div>
<div class="column text">
{{ section.content }}
</div>
</div>
</div>
</section>

View File

@@ -1,37 +0,0 @@
<section class="block block-three-column-1">
<div class="container">
<div class="destination" id="{{ section.id }}"></div>
<div class="columns">
<div class="column">
<figure>
<img src="{{ section.image_1.image | relative_url }}" alt="{{ section.image_1.caption }}" style="width: 50%;">
{% if section.image_1.caption %}
<figcaption>{{ section.image_1.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_1.headline }}</h3>
<p>{{ section.col_1.content }}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_2.image | relative_url }}" alt="{{ section.image_2.caption }}" style="width: 50%;">
{% if section.image_2.caption %}
<figcaption>{{ section.image_2.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_2.headline }}</h3>
<p>{{ section.col_2.content }}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_3.image | relative_url }}" alt="{{ section.image_3.caption }}" style="width: 50%;">
{% if section.image_3.caption %}
<figcaption>{{ section.image_3.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_3.headline }}</h3>
<p>{{ section.col_3.content }}</p>
</div>
</div>
</div>
</section>

View File

@@ -1,37 +0,0 @@
<section class="block block-three-column-irma-1">
<div class="container">
<h1><span class="light">{{ section.heading }}</span></h1>
<div class="columns">
<div class="column">
<figure>
<img src="{{ section.image_1.image | relative_url }}" alt="{{ section.image_1.caption }}">
{% if section.image_1.caption %}
<figcaption>{{ section.image_1.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_1.headline }}</h3>
<p>{{ section.col_1.content }}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_2.image | relative_url }}" alt="{{ section.image_2.caption }}">
{% if section.image_2.caption %}
<figcaption>{{ section.image_2.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_2.headline }}</h3>
<p>{{ section.col_2.content }}</p>
</div>
<div class="column">
<figure>
<img src="{{ section.image_3.image | relative_url }}" alt="{{ section.image_3.caption }}">
{% if section.image_3.caption %}
<figcaption>{{ section.image_3.caption }}</figcaption>
{% endif %}
</figure>
<h3>{{ section.col_3.headline }}</h3>
<p>{{ section.col_3.content }}</p>
</div>
</div>
</div>
</section>

View File

@@ -1,14 +0,0 @@
<section class="block block-two-column-1">
<div class="container">
<div class="columns">
<div class="column">
<h3>{{ section.col_1.headline }}</h3>
<p>{{ section.col_1.content }}</p>
</div>
<div class="column">
<h3>{{ section.col_2.headline }}</h3>
<p>{{ section.col_2.content }}</p>
</div>
</div>
</div>
</section>

View File

@@ -5,13 +5,12 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<base href="{{ site.baseurl }}">
<title>{% if page.title %}{{ page.title }}{% endif %}</title>
<meta name="author" content="{{ site.author }}">
<meta name="description" content="{{ site.description }}">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/ubuild.css" />
<link rel="stylesheet" href="/css/irma.css" />
<link rel="stylesheet" href="{{ "/css/ubuild.css" | prepend: site.baseurl_root }}"/>
<link rel="stylesheet" href="{{ "/css/irma.css" | prepend: site.baseurl_root }}"/>
</head>
<body>

View File

@@ -1,5 +1,5 @@
{% if include.id %}
<svg{% if include.class %} class="{{ include.class }}"{% endif %}{% if include.width %} width="{{ include.width }}"{% endif %}{% if include.height %} height="{{ include.height }}"{% endif %}>
<use xlink:href="{{ "svg/sprite.symbol.svg" | relative_url }}#{{ include.id }}" />
<use xlink:href="{{ "/svg/sprite.symbol.svg" | prepend: site.baseurl_root }}#{{ include.id }}" />
</svg>
{% endif %}

View File

@@ -1,3 +1,18 @@
/* Language elements */
#language {
font-size: 2em;
}
#language ol {
display: flex;
}
#language li {
margin-right: 0.5em;
list-style-type: none;
}
/* Scrolling to elements*/
html {

290
index.md
View File

@@ -1,249 +1,137 @@
---
languages:
- nl
- en
- de
layout: blocks
title: IRMA
lang: en
lang-ref: index
date: 2017-11-22T23:00:00.000+00:00
page_sections:
- template: navigation-header
block: irma-header-1
block: irma-header
logo: "/uploads/non-free/irma_logo@1x.png"
menu: "/uploads/non-free/navigation-menu.png"
url: "/"
navigation:
- link: "/"
link_text: IRMA
- link: "#gebruik"
link_text: Gebruik
- link: "#uitleg"
link_text: Uitleg
- link: "#faqs"
link_text: FAQs
- link: "#links"
link_text: Links
- link: nav.home_link
link_text: nav.home_text
- link: nav.usage_link
link_text: nav.usage_text
- link: nav.explanation_link
link_text: nav.explanation_text
- link: nav.faq_link
link_text: nav.faq_text
- link: nav.links_link
link_text: nav.links_text
- template: irma-banner
block: irma-2
headline: Kies IRMA. <br><strong>Zet een digitaal paspoort op je eigen mobiel.</strong>
block: irma-hero-2
headline: banner.headline
ctaiOS:
enabled: true
url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994
button_text: IRMA voor iOS
url: banner.ios_url
button_text: banner.ios
ctaAndroid:
enabled: true
url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu
button_text: IRMA voor Android
url: banner.android_url
button_text: banner.android
image:
image: "/uploads/non-free/screenshot.png"
alt_text: Product Shot
image: banner.product_shot_src
alt_text: banner.product_shot_alt
background_image: "/uploads/non-free/irma-2-bg.png"
- template: 3-column-text
block: three-column-1
id: gebruik
block: irma-three-column
id: usage.id
image_1:
image: "/uploads/non-free/login.png"
alt: usage.login_alt
image_2:
image: "/uploads/non-free/signature.png"
alt: usage.sign_alt
image_3:
image: "/uploads/non-free/secure.png"
alt: usage.trust_alt
col_1:
headline: Inloggen
content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen
die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde
film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets.
headline: usage.login_headline
content: usage.login_content
col_2:
headline: Ondertekenen
content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen
relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met
IRMA ondertekenen als arts, als burger of vanuit een andere rol.
headline: usage.sign_headline
content: usage.sign_content
col_3:
headline: Vertrouwen
content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch
beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en
echt van jou.
headline: usage.trust_headline
content: usage.trust_content
- template: slogan
block: irma-1
id: start
heading: Met IRMA heb je <strong>in de hand</strong> wat er met jouw gegevens gebeurt.
block: irma-hero-1
id: slogan.id
heading: slogan.heading
- template: 3-column-text
block: three-column-1
id: uitleg
block: irma-three-column
id: explanation.id
image_1:
image: "/uploads/non-free/getstarted.png"
alt: explanation.getstarted_alt
image_2:
image: "/uploads/non-free/tool.png"
alt: explanation.tool_alt
image_3:
image: "/uploads/non-free/usecases.png"
alt: explanation.usecases_alt
col_1:
headline: Zelf aan de slag met IRMA
content: Iedereen kan de IRMA app gratis downloaden (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen
en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw
emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen
zichzelf online bekend maken.
headline: explanation.getstarted_headline
content: explanation.getstarted_content
col_2:
headline: IRMA is een middel, geen doel op zich
content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch
moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met
IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen.
Bijvoorbeeld een film kijken of iets (ver)kopen.
headline: explanation.tool_headline
content: explanation.tool_content
col_3:
headline: Wat kan ik er al mee?
content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen,
bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website <a href="https://www.helder.health"
target="_blank">helder</a>. Vooral bij gemeenten en in de zorg wordt aan verder
gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun
je zelf een aantal IRMA <a href="https://privacybydesign.foundation/demo/" target="_blank">demo's</a>
uitproberen.
headline: explanation.usecases_headline
content: explanation.usecases_content
- template: faq
block: faq-1
id: faqs
headline: <span class="light">Veel gestelde vragen en <strong>antwoorden</strong>
daarop<span>
block: irma-faq
id: faq.id
headline: faq.headline
faq_items:
- question: Hoe moet ik met IRMA inloggen op een website?
answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar
bijvoorbeeld op staat <em>Log in met IRMA</em>. Als je de IRMA app nog niet
op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken
die je nodig hebt.<br><br> Als je de IRMA app al wel hebt, zijn er twee verschillende
situaties<span>:</span><ul class="indent"><li> Als je de website bekijkt op
je computer of laptop en je drukt op die login knop verschijnt er een QR code.
Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een
knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of
je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben
je ingelogd.</li><li> Als je de website op je telefoon bekijkt wordt na het
indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin
verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op
OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed
is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.</li></ul><br>Het
kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen
hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen.
- question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten?
answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum,
BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent.
Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen.
Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie
toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties
toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens
laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.<br><br>Naar
verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens
aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale
(beroeps)groepen.
- question: Kan ik IRMA op een tweede telefoon of tablet zetten?
answer: Jazeker, op ieder (<a href="https://play.google.com/store/apps/details?id=org.irmacard.cardemu">Android</a>
en <a href="https://itunes.apple.com/us/app/irma-authentication/id1294092994">iOS</a>)
apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken.
Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat
kwijt bent, kun je nog met een ander inloggen.
- question: Hoezo is IRMA privacy-vriendelijk en veilig?
answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd
met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde
situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je
soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of
studie te tonen.<br><br> Jouw kenmerken in de IRMA app zijn digitaal ondertekend
door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel,
waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt
zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen
je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt.
Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook,
bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats:
je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt
wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.'
- question: Waar staan mijn IRMA gegevens opgeslagen?
answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in
de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet
ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn
ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken
vanuit de IRMA app aan een website doorgegeven worden.
- question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen?
answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze
geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van
hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar
je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur.
De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een
waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen
door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet.
Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente
ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent.
- question: Wat doe ik als ik een nieuwe telefoon koop?
answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw
account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid
om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon.
Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens
opnieuw op te halen. Het kost wel een klein beetje tijd.
- question: Wat doe ik als ik mijn telefoon verlies?
answer: <span>De IRMA app op je telefoon is beschermd met een PIN, net als je
app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus
geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een
goede PIN gekozen hebt, hoef je je geen zorgen te maken. <br><br> Je kunt jezelf
echter nog beter beschermen<span>:</span> bij het openen van een IRMA account heb je de
optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun
je via de <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">MijnIRMA</a>
omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de
IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres
toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door <a href="https://privacybydesign.foundation/mijnirma/" target="_blank">daar</a>
met IRMA zelf in te loggen. Het is verstandig dat te doen.
- question: Ik heb een vraag over IRMA; waar kan ik terecht?
answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip,
dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website
je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met
je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over
hoe je vragen kunt stellen en contact op kunt nemen. <br><br> Als je tenslotte
een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar
het adres <a href="mailto:irma@privacybydesign.foundation">irma@privacybydesign.foundation</a>.
- question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog?
answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met
de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken
vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen.
De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon
staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft.
- question: Wie zit er achter IRMA?
answer: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Deze stichting is in 2016 voortgekomen uit de <em>Digital Security</em>
onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk
en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting
Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie
Nederland (<a href="https://www.sidn.nl/" target="_blank">SIDN</a>). Mede door deze samenwerking wordt de stabiliteit
en continuiteit van IRMA gegarandeerd.
- question: Hoezo kan IRMA gratis zijn?
answer: IRMA is gratis voor gebruikers. IRMA is ook gratis voor websites die
gebruikers via IRMA laten inloggen<span>:</span> iedereen kan kenmerken uit een IRMA app
opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is <em>niet
gratis</em> om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in
IRMA apps zetten; dat zou snel een rommeltje worden.<br><br> Voor die uitgifte
moet betaald worden en moet een contract getekend worden, waarbij de uitgever
zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste
persoon te zetten. <br><br>Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen
op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de
organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien
geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem.
- question: faq.item1.question
answer: faq.item1.answer
- question: faq.item2.question
answer: faq.item2.answer
- question: faq.item3.question
answer: faq.item3.answer
- question: faq.item4.question
answer: faq.item4.answer
- question: faq.item5.question
answer: faq.item5.answer
- question: faq.item6.question
answer: faq.item6.answer
- question: faq.item7.question
answer: faq.item7.answer
- question: faq.item8.question
answer: faq.item8.answer
- question: faq.item9.question
answer: faq.item9.answer
- question: faq.item10.question
answer: faq.item10.answer
- question: faq.item11.question
answer: faq.item11.answer
- question: faq.item12.question
answer: faq.item12.answer
- question: faq.item13.question
answer: faq.item13.answer
- question: faq.item14.question
answer: faq.item14.answer
- question: IRMA is <em>open source</em>; wat betekent dat?
answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden<span>:</span> de software
staat gewoon online, namelijk op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>. Natuurlijk moet je wel wat van
computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk<span>:</span> IRMA kent geen geheimen en werkt op een
transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van
leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat
alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn.
- question: Ik wil meer informatie over IRMA; waar kan ik terecht?
answer: Het grotere verhaal achter IRMA staat beschreven in een <a href="https://privacybydesign.foundation/pdf/IRMA-manifest-2019.pdf" target="_blank">IRMA Manifest</a>. <br><br> Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op een eigen <a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">pagina</a>. Mensen die de software van IRMA willen bekijken kunnen terecht op een technische <a href="https://irma.app/docs" target="_blank">documentatie</a> pagina en op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.
- template: irma-footer-2
block: irma-footer-2
id: links
- template: irma-footer
block: irma-footer
id: footer.id
image_1:
image: "/uploads/non-free/irma_logo@1x.png"
alt: footer.irma_alt
col_2:
headline: Privacy by Design Foundation
content: IRMA wordt gemaakt door de stichting <a href="https://privacybydesign.foundation/" target="_blank">Privacy
by Design</a>. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op haar eigen <a href="https://privacybydesign.foundation/irma-uitleg/" target="_blank">website</a>.
headline: footer.irma_headline
content: footer.irma_content
col_3:
headline: Docs
content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische <a href="https://irma.app/docs" target="_blank">documentatie</a>.
headline: footer.doc_headline
content: footer.doc_content
col_4:
headline: GitHub
content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen terecht op <a href="https://github.com/privacybydesign" target="_blank">GitHub</a>.
headline: footer.github_headline
content: footer.github_content
---

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'jekyll' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('jekyll', 'jekyll', version)

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'kramdown' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('kramdown', 'kramdown', version)

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'listen' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('listen', 'listen', version)

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rouge' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('rouge', 'rougify', version)

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'safe_yaml' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('safe_yaml', 'safe_yaml', version)

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'sass' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('sass', 'sass', version)

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'sass' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('sass', 'sass-convert', version)

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'sass' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
load Gem.bin_path('sass', 'scss', version)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,140 +0,0 @@
current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20190924-36740-x47nfw.rb extconf.rb
checking for ffi.h... no
checking for ffi.h in /usr/local/include,/usr/include/ffi... no
checking for shlwapi.h... no
checking for ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_thread_call_with_gvl()... yes
checking for rb_thread_call_without_gvl()... yes
creating extconf.h
creating Makefile
To see why this extension failed to compile, please check the mkmf.log which can be found here:
/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log
current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c
make "DESTDIR=" clean
current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c
make "DESTDIR="
Configuring libffi
clang: error: unsupported option '-print-multi-os-directory'
clang: error: no input files
cd "/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18" && /Applications/Xcode.app/Contents/Developer/usr/bin/make
/Applications/Xcode.app/Contents/Developer/usr/bin/make 'AR_FLAGS=' 'CC_FOR_BUILD=' 'CFLAGS=-Wall -fexceptions' 'CXXFLAGS=-g -O2' 'CFLAGS_FOR_BUILD=' 'CFLAGS_FOR_TARGET=' 'INSTALL=/usr/bin/install -c' 'INSTALL_DATA=/usr/bin/install -c -m 644' 'INSTALL_PROGRAM=/usr/bin/install -c' 'INSTALL_SCRIPT=/usr/bin/install -c' 'JC1FLAGS=' 'LDFLAGS=' 'LIBCFLAGS=' 'LIBCFLAGS_FOR_TARGET=' 'MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make' 'MAKEINFO=/bin/sh /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo ' 'PICFLAG=' 'PICFLAG_FOR_TARGET=' 'RUNTESTFLAGS=' 'SHELL=/bin/sh' 'exec_prefix=/usr/local' 'infodir=/usr/local/share/info' 'libdir=/usr/local/lib' 'mandir=/usr/local/share/man' 'prefix=/usr/local' 'AR=ar' 'AS=as' 'CC=xcrun clang' 'CXX=g++' 'LD=ld' 'NM=/usr/bin/nm -B' 'RANLIB=ranlib' 'DESTDIR=' all-recursive
Making all in include
make[3]: Nothing to be done for `all'.
Making all in testsuite
make[3]: Nothing to be done for `all'.
Making all in man
make[3]: Nothing to be done for `all'.
/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/prep_cif.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c -fno-common -DPIC -o src/.libs/prep_cif.o
/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/types.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c -fno-common -DPIC -o src/.libs/types.o
/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/raw_api.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c -fno-common -DPIC -o src/.libs/raw_api.o
/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/java_raw_api.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c -fno-common -DPIC -o src/.libs/java_raw_api.o
/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/closures.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c -fno-common -DPIC -o src/.libs/closures.o
/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffi64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c -fno-common -DPIC -o src/x86/.libs/ffi64.o
/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c -o src/x86/unix64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S -fno-common -DPIC -o src/x86/.libs/unix64.o
/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffiw64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c -fno-common -DPIC -o src/x86/.libs/ffiw64.o
/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c -o src/x86/win64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S
libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S -fno-common -DPIC -o src/x86/.libs/win64.o
/bin/sh ./libtool --tag=CC --mode=link xcrun clang -Wall -fexceptions -o libffi_convenience.la src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo
libtool: link: ar cru .libs/libffi_convenience.a src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o
libtool: link: ranlib .libs/libffi_convenience.a
libtool: link: ( cd ".libs" && rm -f "libffi_convenience.la" && ln -s "../libffi_convenience.la" "libffi_convenience.la" )
/bin/sh ./libtool --tag=CC --mode=link xcrun clang -Wall -fexceptions -no-undefined -version-info `grep -v '^#' /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libtool-version` -o libffi.la -rpath /usr/local/lib src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo
libtool: link: xcrun clang -dynamiclib -o .libs/libffi.7.dylib src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o -install_name /usr/local/lib/libffi.7.dylib -compatibility_version 9 -current_version 9.0 -Wl,-single_module
ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame
libtool: link: (cd ".libs" && rm -f "libffi.dylib" && ln -s "libffi.7.dylib" "libffi.dylib")
libtool: link: ( cd ".libs" && rm -f "libffi.la" && ln -s "../libffi.la" "libffi.la" )
compiling AbstractMemory.c
compiling ArrayType.c
compiling Buffer.c
compiling Call.c
compiling ClosurePool.c
compiling DataConverter.c
compiling DynamicLibrary.c
compiling Function.c
Function.c:951:17: warning: 'ffi_prep_closure' is deprecated [-Wdeprecated-declarations]
ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure);
^
/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h:339:18: note: 'ffi_prep_closure' has been explicitly marked deprecated here
__attribute__((deprecated))
^
1 warning generated.
compiling FunctionInfo.c
compiling LastError.c
compiling LongDouble.c
compiling MappedType.c
compiling MemoryPointer.c
compiling MethodHandle.c
compiling Platform.c
compiling Pointer.c
compiling Struct.c
compiling StructByReference.c
compiling StructByValue.c
compiling StructLayout.c
compiling Thread.c
compiling Type.c
compiling Types.c
compiling Variadic.c
compiling ffi.c
linking shared-object ffi_c.bundle
ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame
current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c
make "DESTDIR=" install
cd "/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18" && /Applications/Xcode.app/Contents/Developer/usr/bin/make
/Applications/Xcode.app/Contents/Developer/usr/bin/make 'AR_FLAGS=' 'CC_FOR_BUILD=' 'CFLAGS=-Wall -fexceptions' 'CXXFLAGS=-g -O2' 'CFLAGS_FOR_BUILD=' 'CFLAGS_FOR_TARGET=' 'INSTALL=/usr/bin/install -c' 'INSTALL_DATA=/usr/bin/install -c -m 644' 'INSTALL_PROGRAM=/usr/bin/install -c' 'INSTALL_SCRIPT=/usr/bin/install -c' 'JC1FLAGS=' 'LDFLAGS=' 'LIBCFLAGS=' 'LIBCFLAGS_FOR_TARGET=' 'MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make' 'MAKEINFO=/bin/sh /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo ' 'PICFLAG=' 'PICFLAG_FOR_TARGET=' 'RUNTESTFLAGS=' 'SHELL=/bin/sh' 'exec_prefix=/usr/local' 'infodir=/usr/local/share/info' 'libdir=/usr/local/lib' 'mandir=/usr/local/share/man' 'prefix=/usr/local' 'AR=ar' 'AS=as' 'CC=xcrun clang' 'CXX=g++' 'LD=ld' 'NM=/usr/bin/nm -B' 'RANLIB=ranlib' 'DESTDIR=' all-recursive
Making all in include
make[3]: Nothing to be done for `all'.
Making all in testsuite
make[3]: Nothing to be done for `all'.
Making all in man
make[3]: Nothing to be done for `all'.
make[3]: Nothing to be done for `all-am'.
compiling AbstractMemory.c
compiling ArrayType.c
compiling Buffer.c
compiling Call.c
compiling ClosurePool.c
compiling DataConverter.c
compiling DynamicLibrary.c
compiling Function.c
Function.c:951:17: warning: 'ffi_prep_closure' is deprecated [-Wdeprecated-declarations]
ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure);
^
/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h:339:18: note: 'ffi_prep_closure' has been explicitly marked deprecated here
__attribute__((deprecated))
^
1 warning generated.
compiling FunctionInfo.c
compiling LastError.c
compiling LongDouble.c
compiling MappedType.c
compiling MemoryPointer.c
compiling MethodHandle.c
compiling Platform.c
compiling Pointer.c
compiling Struct.c
compiling StructByReference.c
compiling StructByValue.c
compiling StructLayout.c
compiling Thread.c
compiling Type.c
compiling Types.c
compiling Variadic.c
compiling ffi.c
linking shared-object ffi_c.bundle
ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame
/usr/bin/install -c -m 0755 ffi_c.bundle ./.gem.20190924-36740-x1wmd8

View File

@@ -1,250 +0,0 @@
"pkg-config --exists libffi"
package configuration for libffi is not found
have_header: checking for ffi.h... -------------------- no
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc "
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5: return 0;
6: }
/* end */
"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c"
conftest.c:3:10: fatal error: 'ffi.h' file not found
#include <ffi.h>
^~~~~~~
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <ffi.h>
/* end */
--------------------
find_header: checking for ffi.h in /usr/local/include,/usr/include/ffi... -------------------- no
"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c"
conftest.c:3:10: fatal error: 'ffi.h' file not found
#include <ffi.h>
^~~~~~~
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <ffi.h>
/* end */
"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -I/usr/local/include -c conftest.c"
conftest.c:3:10: fatal error: 'ffi.h' file not found
#include <ffi.h>
^~~~~~~
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <ffi.h>
/* end */
"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -I/usr/include/ffi -c conftest.c"
conftest.c:3:10: fatal error: 'ffi.h' file not found
#include <ffi.h>
^~~~~~~
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <ffi.h>
/* end */
--------------------
have_header: checking for shlwapi.h... -------------------- no
"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c"
conftest.c:3:10: fatal error: 'shlwapi.h' file not found
#include <shlwapi.h>
^~~~~~~~~~~
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <shlwapi.h>
/* end */
--------------------
have_header: checking for ruby/thread.h... -------------------- yes
"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -c conftest.c"
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <ruby/thread.h>
/* end */
--------------------
have_func: checking for rb_thread_blocking_region()... -------------------- no
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc "
conftest.c:13:57: error: use of undeclared identifier 'rb_thread_blocking_region'
int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; }
^
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: /*top*/
4: extern int t(void);
5: int main(int argc, char **argv)
6: {
7: if (argc > 1000000) {
8: printf("%p", &t);
9: }
10:
11: return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; }
/* end */
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc "
Undefined symbols for architecture x86_64:
"_rb_thread_blocking_region", referenced from:
_t in conftest-4e6b3e.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: /*top*/
4: extern int t(void);
5: int main(int argc, char **argv)
6: {
7: if (argc > 1000000) {
8: printf("%p", &t);
9: }
10:
11: return 0;
12: }
13: extern void rb_thread_blocking_region();
14: int t(void) { rb_thread_blocking_region(); return 0; }
/* end */
--------------------
have_func: checking for rb_thread_call_with_gvl()... -------------------- yes
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc "
conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_with_gvl'
int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; }
^
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: /*top*/
4: extern int t(void);
5: int main(int argc, char **argv)
6: {
7: if (argc > 1000000) {
8: printf("%p", &t);
9: }
10:
11: return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; }
/* end */
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc "
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: /*top*/
4: extern int t(void);
5: int main(int argc, char **argv)
6: {
7: if (argc > 1000000) {
8: printf("%p", &t);
9: }
10:
11: return 0;
12: }
13: extern void rb_thread_call_with_gvl();
14: int t(void) { rb_thread_call_with_gvl(); return 0; }
/* end */
--------------------
have_func: checking for rb_thread_call_without_gvl()... -------------------- yes
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc "
conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_without_gvl'
int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; }
^
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: /*top*/
4: extern int t(void);
5: int main(int argc, char **argv)
6: {
7: if (argc > 1000000) {
8: printf("%p", &t);
9: }
10:
11: return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; }
/* end */
"xcrun clang -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/backward -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc "
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: /*top*/
4: extern int t(void);
5: int main(int argc, char **argv)
6: {
7: if (argc > 1000000) {
8: printf("%p", &t);
9: }
10:
11: return 0;
12: }
13: extern void rb_thread_call_without_gvl();
14: int t(void) { rb_thread_call_without_gvl(); return 0; }
/* end */
--------------------
extconf.h is:
/* begin */
1: #ifndef EXTCONF_H
2: #define EXTCONF_H
3: #define HAVE_RUBY_THREAD_H 1
4: #define HAVE_RB_THREAD_CALL_WITH_GVL 1
5: #define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1
6: #define HAVE_FFI_PREP_CIF_VAR 1
7: #define USE_INTERNAL_LIBFFI 1
8: #define RUBY_1_9 1
9: #endif
/* end */

View File

@@ -1,216 +0,0 @@
# Addressable 2.5.2
- better support for frozen string literals
- fixed bug w/ uppercase characters in scheme
- IDNA errors w/ emoji URLs
- compatibility w/ public_suffix 3.x
# Addressable 2.5.1
- allow unicode normalization to be disabled for URI Template expansion
- removed duplicate test
# Addressable 2.5.0
- dropping support for Ruby 1.9
- adding support for Ruby 2.4 preview
- add support for public suffixes and tld; first runtime dependency
- hostname escaping should match RFC; underscores in hostnames no longer escaped
- paths beginning with // and missing an authority are now considered invalid
- validation now also takes place after setting a path
- handle backslashes in authority more like a browser for `heuristic_parse`
- unescaped backslashes in host now raise an `InvalidURIError`
- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation
- `heuristic_parse` now trims whitespace before parsing
- host parts longer than 63 bytes will be ignored and not passed to libidn
- normalized values always encoded as UTF-8
# Addressable 2.4.0
- support for 1.8.x dropped
- double quotes in a host now raises an error
- newlines in host will no longer get unescaped during normalization
- stricter handling of bogus scheme values
- stricter handling of encoded port values
- calling `require 'addressable'` will now load both the URI and Template files
- assigning to the `hostname` component with an `IPAddr` object is now supported
- assigning to the `origin` component is now supported
- fixed minor bug where an exception would be thrown for a missing ACE suffix
- better partial expansion of URI templates
# Addressable 2.3.8
- fix warnings
- update dependency gems
- support for 1.8.x officially deprecated
# Addressable 2.3.7
- fix scenario in which invalid URIs don't get an exception until inspected
- handle hostnames with two adjacent periods correctly
- upgrade of RSpec
# Addressable 2.3.6
- normalization drops empty query string
- better handling in template extract for missing values
- template modifier for `'?'` now treated as optional
- fixed issue where character class parameters were modified
- templates can now be tested for equality
- added `:sorted` option to normalization of query strings
- fixed issue with normalization of hosts given in `'example.com.'` form
# Addressable 2.3.5
- added Addressable::URI#empty? method
- Addressable::URI#hostname methods now strip square brackets from IPv6 hosts
- compatibility with Net::HTTP in Ruby 2.0.0
- Addressable::URI#route_from should always give relative URIs
# Addressable 2.3.4
- fixed issue with encoding altering its inputs
- query string normalization now leaves ';' characters alone
- FakeFS is detected before attempting to load unicode tables
- additional testing to ensure frozen objects don't cause problems
# Addressable 2.3.3
- fixed issue with converting common primitives during template expansion
- fixed port encoding issue
- removed a few warnings
- normalize should now ignore %2B in query strings
- the IDNA logic should now be handled by libidn in Ruby 1.9
- no template match should now result in nil instead of an empty MatchData
- added license information to gemspec
# Addressable 2.3.2
- added Addressable::URI#default_port method
- fixed issue with Marshalling Unicode data on Windows
- improved heuristic parsing to better handle IPv4 addresses
# Addressable 2.3.1
- fixed missing unicode data file
# Addressable 2.3.0
- updated Addressable::Template to use RFC 6570, level 4
- fixed compatibility problems with some versions of Ruby
- moved unicode tables into a data file for performance reasons
- removing support for multiple query value notations
# Addressable 2.2.8
- fixed issues with dot segment removal code
- form encoding can now handle multiple values per key
- updated development environment
# Addressable 2.2.7
- fixed issues related to Addressable::URI#query_values=
- the Addressable::URI.parse method is now polymorphic
# Addressable 2.2.6
- changed the way ambiguous paths are handled
- fixed bug with frozen URIs
- https supported in heuristic parsing
# Addressable 2.2.5
- 'parsing' a pre-parsed URI object is now a dup operation
- introduced conditional support for libidn
- fixed normalization issue on ampersands in query strings
- added additional tests around handling of query strings
# Addressable 2.2.4
- added origin support from draft-ietf-websec-origin-00
- resolved issue with attempting to navigate below root
- fixed bug with string splitting in query strings
# Addressable 2.2.3
- added :flat_array notation for query strings
# Addressable 2.2.2
- fixed issue with percent escaping of '+' character in query strings
# Addressable 2.2.1
- added support for application/x-www-form-urlencoded.
# Addressable 2.2.0
- added site methods
- improved documentation
# Addressable 2.1.2
- added HTTP request URI methods
- better handling of Windows file paths
- validation_deferred boolean replaced with defer_validation block
- normalization of percent-encoded paths should now be correct
- fixed issue with constructing URIs with relative paths
- fixed warnings
# Addressable 2.1.1
- more type checking changes
- fixed issue with unicode normalization
- added method to find template defaults
- symbolic keys are now allowed in template mappings
- numeric values and symbolic values are now allowed in template mappings
# Addressable 2.1.0
- refactored URI template support out into its own class
- removed extract method due to being useless and unreliable
- removed Addressable::URI.expand_template
- removed Addressable::URI#extract_mapping
- added partial template expansion
- fixed minor bugs in the parse and heuristic_parse methods
- fixed incompatibility with Ruby 1.9.1
- fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s
- fixed unicode normalization exception
- updated query_values methods to better handle subscript notation
- worked around issue with freezing URIs
- improved specs
# Addressable 2.0.2
- fixed issue with URI template expansion
- fixed issue with percent escaping characters 0-15
# Addressable 2.0.1
- fixed issue with query string assignment
- fixed issue with improperly encoded components
# Addressable 2.0.0
- the initialize method now takes an options hash as its only parameter
- added query_values method to URI class
- completely replaced IDNA implementation with pure Ruby
- renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION
- completely reworked the Rakefile
- changed the behavior of the port method significantly
- Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed
- documentation is now in YARD format
- more rigorous type checking
- to_str method implemented, implicit conversion to Strings now allowed
- Addressable::URI#omit method added, Addressable::URI#merge method replaced
- updated URI Template code to match v 03 of the draft spec
- added a bunch of new specifications
# Addressable 1.0.4
- switched to using RSpec's pending system for specs that rely on IDN
- fixed issue with creating URIs with paths that are not prefixed with '/'
# Addressable 1.0.3
- implemented a hash method
# Addressable 1.0.2
- fixed minor bug with the extract_mapping method
# Addressable 1.0.1
- fixed minor bug with the extract_mapping method
# Addressable 1.0.0
- heuristic parse method added
- parsing is slightly more strict
- replaced to_h with to_hash
- fixed routing methods
- improved specifications
- improved heckle rake task
- no surviving heckle mutations
# Addressable 0.1.2
- improved normalization
- fixed bug in joining algorithm
- updated specifications
# Addressable 0.1.1
- updated documentation
- added URI Template variable extraction
# Addressable 0.1.0
- initial release
- implementation based on RFC 3986, 3987
- support for IRIs via libidn
- support for the URI Template draft spec

View File

@@ -1,32 +0,0 @@
source 'https://rubygems.org'
gemspec
group :test do
gem 'rspec', '~> 3.0'
gem 'rspec-its', '~> 1.1'
end
group :development do
gem 'launchy', '~> 2.4', '>= 2.4.3'
gem 'redcarpet', :platform => :mri_19
gem 'yard'
end
group :test, :development do
gem 'rake', '> 10.0', '< 12'
gem 'simplecov', :require => false
gem 'coveralls', :require => false, :platforms => [
:ruby_20, :ruby_21, :ruby_22, :ruby_23
]
# Used to test compatibility.
gem 'rack-mount', git: 'https://github.com/sporkmonger/rack-mount.git', require: 'rack/mount'
if RUBY_VERSION.start_with?('2.0', '2.1')
gem 'rack', '< 2', :require => false
else
gem 'rack', :require => false
end
end
gem 'idn-ruby', :platform => [:mri_20, :mri_21, :mri_22, :mri_23, :mri_24]

View File

@@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,121 +0,0 @@
# Addressable
<dl>
<dt>Homepage</dt><dd><a href="https://github.com/sporkmonger/addressable">github.com/sporkmonger/addressable</a></dd>
<dt>Author</dt><dd><a href="mailto:bob@sporkmonger.com">Bob Aman</a></dd>
<dt>Copyright</dt><dd>Copyright © Bob Aman</dd>
<dt>License</dt><dd>Apache 2.0</dd>
</dl>
[![Gem Version](http://img.shields.io/gem/dt/addressable.svg)][gem]
[![Build Status](https://secure.travis-ci.org/sporkmonger/addressable.svg?branch=master)][travis]
[![Dependency Status](https://gemnasium.com/sporkmonger/addressable.svg?travis)][gemnasium]
[![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls]
[![Documentation Coverage Status](http://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch]
[gem]: https://rubygems.org/gems/addressable
[travis]: http://travis-ci.org/sporkmonger/addressable
[gemnasium]: https://gemnasium.com/sporkmonger/addressable
[coveralls]: https://coveralls.io/r/sporkmonger/addressable
[inch]: http://inch-ci.org/github/sporkmonger/addressable
# Description
Addressable is a replacement for the URI implementation that is part of
Ruby's standard library. It more closely conforms to RFC 3986, RFC 3987, and
RFC 6570 (level 4), providing support for IRIs and URI templates.
# Reference
- {Addressable::URI}
- {Addressable::Template}
# Example usage
```ruby
require "addressable/uri"
uri = Addressable::URI.parse("http://example.com/path/to/resource/")
uri.scheme
#=> "http"
uri.host
#=> "example.com"
uri.path
#=> "/path/to/resource/"
uri = Addressable::URI.parse("http://www.詹姆斯.com/")
uri.normalize
#=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>
```
# URI Templates
For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt).
```ruby
require "addressable/template"
template = Addressable::Template.new("http://example.com/{?query*}/")
template.expand({
"query" => {
'foo' => 'bar',
'color' => 'red'
}
})
#=> #<Addressable::URI:0xc9d95c URI:http://example.com/?foo=bar&color=red>
template = Addressable::Template.new("http://example.com/{?one,two,three}")
template.partial_expand({"one" => "1", "three" => 3}).pattern
#=> "http://example.com/?one=1{&two}&three=3"
template = Addressable::Template.new(
"http://{host}{/segments*}/{?one,two,bogus}{#fragment}"
)
uri = Addressable::URI.parse(
"http://example.com/a/b/c/?one=1&two=2#foo"
)
template.extract(uri)
#=>
# {
# "host" => "example.com",
# "segments" => ["a", "b", "c"],
# "one" => "1",
# "two" => "2",
# "fragment" => "foo"
# }
```
# Install
```console
$ gem install addressable
```
You may optionally turn on native IDN support by installing libidn and the
idn gem:
```console
$ sudo apt-get install idn # Debian/Ubuntu
$ brew install libidn # OS X
$ gem install idn-ruby
```
# Semantic Versioning
This project uses sementic versioning. You can (and should) specify your
dependency using a pessimistic version constraint covering the major and minor
values:
```ruby
spec.add_dependency 'addressable', '~> 2.5'
```
If you need a specific bug fix, you can also specify minimum tiny versions
without preventing updates to the latest minor release:
```ruby
spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7'
```

View File

@@ -1,32 +0,0 @@
require 'rubygems'
require 'rake'
require File.join(File.dirname(__FILE__), 'lib', 'addressable', 'version')
PKG_DISPLAY_NAME = 'Addressable'
PKG_NAME = PKG_DISPLAY_NAME.downcase
PKG_VERSION = Addressable::VERSION::STRING
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
RELEASE_NAME = "REL #{PKG_VERSION}"
PKG_SUMMARY = "URI Implementation"
PKG_DESCRIPTION = <<-TEXT
Addressable is a replacement for the URI implementation that is part of
Ruby's standard library. It more closely conforms to the relevant RFCs and
adds support for IRIs and URI templates.
TEXT
PKG_FILES = FileList[
"lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*",
"tasks/**/*",
"[A-Z]*", "Rakefile"
].exclude(/pkg/).exclude(/database\.yml/).
exclude(/Gemfile\.lock/).exclude(/[_\.]git$/)
task :default => "spec"
WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false
SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
Dir['tasks/**/*.rake'].each { |rake| load rake }

View File

@@ -1,2 +0,0 @@
require 'addressable/uri'
require 'addressable/template'

View File

@@ -1,25 +0,0 @@
# encoding:utf-8
#--
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#++
begin
require "addressable/idna/native"
rescue LoadError
# libidn or the idn gem was not available, fall back on a pure-Ruby
# implementation...
require "addressable/idna/pure"
end

View File

@@ -1,59 +0,0 @@
# encoding:utf-8
#--
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#++
require "idn"
module Addressable
module IDNA
def self.punycode_encode(value)
IDN::Punycode.encode(value.to_s)
end
def self.punycode_decode(value)
IDN::Punycode.decode(value.to_s)
end
def self.unicode_normalize_kc(value)
IDN::Stringprep.nfkc_normalize(value.to_s)
end
def self.to_ascii(value)
value.to_s.split('.', -1).map do |segment|
if segment.size > 0 && segment.size < 64
IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED)
elsif segment.size >= 64
segment
else
''
end
end.join('.')
end
def self.to_unicode(value)
value.to_s.split('.', -1).map do |segment|
if segment.size > 0 && segment.size < 64
IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED)
elsif segment.size >= 64
segment
else
''
end
end.join('.')
end
end
end

View File

@@ -1,677 +0,0 @@
# encoding:utf-8
#--
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#++
module Addressable
module IDNA
# This module is loosely based on idn_actionmailer by Mick Staugaard,
# the unicode library by Yoshida Masato, and the punycode implementation
# by Kazuhiro Nishiyama. Most of the code was copied verbatim, but
# some reformatting was done, and some translation from C was done.
#
# Without their code to work from as a base, we'd all still be relying
# on the presence of libidn. Which nobody ever seems to have installed.
#
# Original sources:
# http://github.com/staugaard/idn_actionmailer
# http://www.yoshidam.net/Ruby.html#unicode
# http://rubyforge.org/frs/?group_id=2550
UNICODE_TABLE = File.expand_path(
File.join(File.dirname(__FILE__), '../../..', 'data/unicode.data')
)
ACE_PREFIX = "xn--"
UTF8_REGEX = /\A(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*\z/mnx
UTF8_REGEX_MULTIBYTE = /(?:
[\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)/mnx
# :startdoc:
# Converts from a Unicode internationalized domain name to an ASCII
# domain name as described in RFC 3490.
def self.to_ascii(input)
input = input.to_s unless input.is_a?(String)
input = input.dup
if input.respond_to?(:force_encoding)
input.force_encoding(Encoding::ASCII_8BIT)
end
if input =~ UTF8_REGEX && input =~ UTF8_REGEX_MULTIBYTE
parts = unicode_downcase(input).split('.')
parts.map! do |part|
if part.respond_to?(:force_encoding)
part.force_encoding(Encoding::ASCII_8BIT)
end
if part =~ UTF8_REGEX && part =~ UTF8_REGEX_MULTIBYTE
ACE_PREFIX + punycode_encode(unicode_normalize_kc(part))
else
part
end
end
parts.join('.')
else
input
end
end
# Converts from an ASCII domain name to a Unicode internationalized
# domain name as described in RFC 3490.
def self.to_unicode(input)
input = input.to_s unless input.is_a?(String)
parts = input.split('.')
parts.map! do |part|
if part =~ /^#{ACE_PREFIX}(.+)/
begin
punycode_decode(part[/^#{ACE_PREFIX}(.+)/, 1])
rescue Addressable::IDNA::PunycodeBadInput
# toUnicode is explicitly defined as never-fails by the spec
part
end
else
part
end
end
output = parts.join('.')
if output.respond_to?(:force_encoding)
output.force_encoding(Encoding::UTF_8)
end
output
end
# Unicode normalization form KC.
def self.unicode_normalize_kc(input)
input = input.to_s unless input.is_a?(String)
unpacked = input.unpack("U*")
unpacked =
unicode_compose(unicode_sort_canonical(unicode_decompose(unpacked)))
return unpacked.pack("U*")
end
##
# Unicode aware downcase method.
#
# @api private
# @param [String] input
# The input string.
# @return [String] The downcased result.
def self.unicode_downcase(input)
input = input.to_s unless input.is_a?(String)
unpacked = input.unpack("U*")
unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) }
return unpacked.pack("U*")
end
(class <<self; private :unicode_downcase; end)
def self.unicode_compose(unpacked)
unpacked_result = []
length = unpacked.length
return unpacked if length == 0
starter = unpacked[0]
starter_cc = lookup_unicode_combining_class(starter)
starter_cc = 256 if starter_cc != 0
for i in 1...length
ch = unpacked[i]
cc = lookup_unicode_combining_class(ch)
if (starter_cc == 0 &&
(composite = unicode_compose_pair(starter, ch)) != nil)
starter = composite
startercc = lookup_unicode_combining_class(composite)
else
unpacked_result << starter
starter = ch
startercc = cc
end
end
unpacked_result << starter
return unpacked_result
end
(class <<self; private :unicode_compose; end)
def self.unicode_compose_pair(ch_one, ch_two)
if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT &&
ch_two >= HANGUL_VBASE && ch_two < HANGUL_VBASE + HANGUL_VCOUNT
# Hangul L + V
return HANGUL_SBASE + (
(ch_one - HANGUL_LBASE) * HANGUL_VCOUNT + (ch_two - HANGUL_VBASE)
) * HANGUL_TCOUNT
elsif ch_one >= HANGUL_SBASE &&
ch_one < HANGUL_SBASE + HANGUL_SCOUNT &&
(ch_one - HANGUL_SBASE) % HANGUL_TCOUNT == 0 &&
ch_two >= HANGUL_TBASE && ch_two < HANGUL_TBASE + HANGUL_TCOUNT
# Hangul LV + T
return ch_one + (ch_two - HANGUL_TBASE)
end
p = []
ucs4_to_utf8 = lambda do |ch|
if ch < 128
p << ch
elsif ch < 2048
p << (ch >> 6 | 192)
p << (ch & 63 | 128)
elsif ch < 0x10000
p << (ch >> 12 | 224)
p << (ch >> 6 & 63 | 128)
p << (ch & 63 | 128)
elsif ch < 0x200000
p << (ch >> 18 | 240)
p << (ch >> 12 & 63 | 128)
p << (ch >> 6 & 63 | 128)
p << (ch & 63 | 128)
elsif ch < 0x4000000
p << (ch >> 24 | 248)
p << (ch >> 18 & 63 | 128)
p << (ch >> 12 & 63 | 128)
p << (ch >> 6 & 63 | 128)
p << (ch & 63 | 128)
elsif ch < 0x80000000
p << (ch >> 30 | 252)
p << (ch >> 24 & 63 | 128)
p << (ch >> 18 & 63 | 128)
p << (ch >> 12 & 63 | 128)
p << (ch >> 6 & 63 | 128)
p << (ch & 63 | 128)
end
end
ucs4_to_utf8.call(ch_one)
ucs4_to_utf8.call(ch_two)
return lookup_unicode_composition(p)
end
(class <<self; private :unicode_compose_pair; end)
def self.unicode_sort_canonical(unpacked)
unpacked = unpacked.dup
i = 1
length = unpacked.length
return unpacked if length < 2
while i < length
last = unpacked[i-1]
ch = unpacked[i]
last_cc = lookup_unicode_combining_class(last)
cc = lookup_unicode_combining_class(ch)
if cc != 0 && last_cc != 0 && last_cc > cc
unpacked[i] = last
unpacked[i-1] = ch
i -= 1 if i > 1
else
i += 1
end
end
return unpacked
end
(class <<self; private :unicode_sort_canonical; end)
def self.unicode_decompose(unpacked)
unpacked_result = []
for cp in unpacked
if cp >= HANGUL_SBASE && cp < HANGUL_SBASE + HANGUL_SCOUNT
l, v, t = unicode_decompose_hangul(cp)
unpacked_result << l
unpacked_result << v if v
unpacked_result << t if t
else
dc = lookup_unicode_compatibility(cp)
unless dc
unpacked_result << cp
else
unpacked_result.concat(unicode_decompose(dc.unpack("U*")))
end
end
end
return unpacked_result
end
(class <<self; private :unicode_decompose; end)
def self.unicode_decompose_hangul(codepoint)
sindex = codepoint - HANGUL_SBASE;
if sindex < 0 || sindex >= HANGUL_SCOUNT
l = codepoint
v = t = nil
return l, v, t
end
l = HANGUL_LBASE + sindex / HANGUL_NCOUNT
v = HANGUL_VBASE + (sindex % HANGUL_NCOUNT) / HANGUL_TCOUNT
t = HANGUL_TBASE + sindex % HANGUL_TCOUNT
if t == HANGUL_TBASE
t = nil
end
return l, v, t
end
(class <<self; private :unicode_decompose_hangul; end)
def self.lookup_unicode_combining_class(codepoint)
codepoint_data = UNICODE_DATA[codepoint]
(codepoint_data ?
(codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) :
0)
end
(class <<self; private :lookup_unicode_combining_class; end)
def self.lookup_unicode_compatibility(codepoint)
codepoint_data = UNICODE_DATA[codepoint]
(codepoint_data ?
codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil)
end
(class <<self; private :lookup_unicode_compatibility; end)
def self.lookup_unicode_lowercase(codepoint)
codepoint_data = UNICODE_DATA[codepoint]
(codepoint_data ?
(codepoint_data[UNICODE_DATA_LOWERCASE] || codepoint) :
codepoint)
end
(class <<self; private :lookup_unicode_lowercase; end)
def self.lookup_unicode_composition(unpacked)
return COMPOSITION_TABLE[unpacked]
end
(class <<self; private :lookup_unicode_composition; end)
HANGUL_SBASE = 0xac00
HANGUL_LBASE = 0x1100
HANGUL_LCOUNT = 19
HANGUL_VBASE = 0x1161
HANGUL_VCOUNT = 21
HANGUL_TBASE = 0x11a7
HANGUL_TCOUNT = 28
HANGUL_NCOUNT = HANGUL_VCOUNT * HANGUL_TCOUNT # 588
HANGUL_SCOUNT = HANGUL_LCOUNT * HANGUL_NCOUNT # 11172
UNICODE_DATA_COMBINING_CLASS = 0
UNICODE_DATA_EXCLUSION = 1
UNICODE_DATA_CANONICAL = 2
UNICODE_DATA_COMPATIBILITY = 3
UNICODE_DATA_UPPERCASE = 4
UNICODE_DATA_LOWERCASE = 5
UNICODE_DATA_TITLECASE = 6
begin
if defined?(FakeFS)
fakefs_state = FakeFS.activated?
FakeFS.deactivate!
end
# This is a sparse Unicode table. Codepoints without entries are
# assumed to have the value: [0, 0, nil, nil, nil, nil, nil]
UNICODE_DATA = File.open(UNICODE_TABLE, "rb") do |file|
Marshal.load(file.read)
end
ensure
if defined?(FakeFS)
FakeFS.activate! if fakefs_state
end
end
COMPOSITION_TABLE = {}
for codepoint, data in UNICODE_DATA
canonical = data[UNICODE_DATA_CANONICAL]
exclusion = data[UNICODE_DATA_EXCLUSION]
if canonical && exclusion == 0
COMPOSITION_TABLE[canonical.unpack("C*")] = codepoint
end
end
UNICODE_MAX_LENGTH = 256
ACE_MAX_LENGTH = 256
PUNYCODE_BASE = 36
PUNYCODE_TMIN = 1
PUNYCODE_TMAX = 26
PUNYCODE_SKEW = 38
PUNYCODE_DAMP = 700
PUNYCODE_INITIAL_BIAS = 72
PUNYCODE_INITIAL_N = 0x80
PUNYCODE_DELIMITER = 0x2D
PUNYCODE_MAXINT = 1 << 64
PUNYCODE_PRINT_ASCII =
"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" +
"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" +
" !\"\#$%&'()*+,-./" +
"0123456789:;<=>?" +
"@ABCDEFGHIJKLMNO" +
"PQRSTUVWXYZ[\\]^_" +
"`abcdefghijklmno" +
"pqrstuvwxyz{|}~\n"
# Input is invalid.
class PunycodeBadInput < StandardError; end
# Output would exceed the space provided.
class PunycodeBigOutput < StandardError; end
# Input needs wider integers to process.
class PunycodeOverflow < StandardError; end
def self.punycode_encode(unicode)
unicode = unicode.to_s unless unicode.is_a?(String)
input = unicode.unpack("U*")
output = [0] * (ACE_MAX_LENGTH + 1)
input_length = input.size
output_length = [ACE_MAX_LENGTH]
# Initialize the state
n = PUNYCODE_INITIAL_N
delta = out = 0
max_out = output_length[0]
bias = PUNYCODE_INITIAL_BIAS
# Handle the basic code points:
input_length.times do |j|
if punycode_basic?(input[j])
if max_out - out < 2
raise PunycodeBigOutput,
"Output would exceed the space provided."
end
output[out] = input[j]
out += 1
end
end
h = b = out
# h is the number of code points that have been handled, b is the
# number of basic code points, and out is the number of characters
# that have been output.
if b > 0
output[out] = PUNYCODE_DELIMITER
out += 1
end
# Main encoding loop:
while h < input_length
# All non-basic code points < n have been
# handled already. Find the next larger one:
m = PUNYCODE_MAXINT
input_length.times do |j|
m = input[j] if (n...m) === input[j]
end
# Increase delta enough to advance the decoder's
# <n,i> state to <m,0>, but guard against overflow:
if m - n > (PUNYCODE_MAXINT - delta) / (h + 1)
raise PunycodeOverflow, "Input needs wider integers to process."
end
delta += (m - n) * (h + 1)
n = m
input_length.times do |j|
# Punycode does not need to check whether input[j] is basic:
if input[j] < n
delta += 1
if delta == 0
raise PunycodeOverflow,
"Input needs wider integers to process."
end
end
if input[j] == n
# Represent delta as a generalized variable-length integer:
q = delta; k = PUNYCODE_BASE
while true
if out >= max_out
raise PunycodeBigOutput,
"Output would exceed the space provided."
end
t = (
if k <= bias
PUNYCODE_TMIN
elsif k >= bias + PUNYCODE_TMAX
PUNYCODE_TMAX
else
k - bias
end
)
break if q < t
output[out] =
punycode_encode_digit(t + (q - t) % (PUNYCODE_BASE - t))
out += 1
q = (q - t) / (PUNYCODE_BASE - t)
k += PUNYCODE_BASE
end
output[out] = punycode_encode_digit(q)
out += 1
bias = punycode_adapt(delta, h + 1, h == b)
delta = 0
h += 1
end
end
delta += 1
n += 1
end
output_length[0] = out
outlen = out
outlen.times do |j|
c = output[j]
unless c >= 0 && c <= 127
raise StandardError, "Invalid output char."
end
unless PUNYCODE_PRINT_ASCII[c]
raise PunycodeBadInput, "Input is invalid."
end
end
output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "")
end
(class <<self; private :punycode_encode; end)
def self.punycode_decode(punycode)
input = []
output = []
if ACE_MAX_LENGTH * 2 < punycode.size
raise PunycodeBigOutput, "Output would exceed the space provided."
end
punycode.each_byte do |c|
unless c >= 0 && c <= 127
raise PunycodeBadInput, "Input is invalid."
end
input.push(c)
end
input_length = input.length
output_length = [UNICODE_MAX_LENGTH]
# Initialize the state
n = PUNYCODE_INITIAL_N
out = i = 0
max_out = output_length[0]
bias = PUNYCODE_INITIAL_BIAS
# Handle the basic code points: Let b be the number of input code
# points before the last delimiter, or 0 if there is none, then
# copy the first b code points to the output.
b = 0
input_length.times do |j|
b = j if punycode_delimiter?(input[j])
end
if b > max_out
raise PunycodeBigOutput, "Output would exceed the space provided."
end
b.times do |j|
unless punycode_basic?(input[j])
raise PunycodeBadInput, "Input is invalid."
end
output[out] = input[j]
out+=1
end
# Main decoding loop: Start just after the last delimiter if any
# basic code points were copied; start at the beginning otherwise.
in_ = b > 0 ? b + 1 : 0
while in_ < input_length
# in_ is the index of the next character to be consumed, and
# out is the number of code points in the output array.
# Decode a generalized variable-length integer into delta,
# which gets added to i. The overflow checking is easier
# if we increase i as we go, then subtract off its starting
# value at the end to obtain delta.
oldi = i; w = 1; k = PUNYCODE_BASE
while true
if in_ >= input_length
raise PunycodeBadInput, "Input is invalid."
end
digit = punycode_decode_digit(input[in_])
in_+=1
if digit >= PUNYCODE_BASE
raise PunycodeBadInput, "Input is invalid."
end
if digit > (PUNYCODE_MAXINT - i) / w
raise PunycodeOverflow, "Input needs wider integers to process."
end
i += digit * w
t = (
if k <= bias
PUNYCODE_TMIN
elsif k >= bias + PUNYCODE_TMAX
PUNYCODE_TMAX
else
k - bias
end
)
break if digit < t
if w > PUNYCODE_MAXINT / (PUNYCODE_BASE - t)
raise PunycodeOverflow, "Input needs wider integers to process."
end
w *= PUNYCODE_BASE - t
k += PUNYCODE_BASE
end
bias = punycode_adapt(i - oldi, out + 1, oldi == 0)
# I was supposed to wrap around from out + 1 to 0,
# incrementing n each time, so we'll fix that now:
if i / (out + 1) > PUNYCODE_MAXINT - n
raise PunycodeOverflow, "Input needs wider integers to process."
end
n += i / (out + 1)
i %= out + 1
# Insert n at position i of the output:
# not needed for Punycode:
# raise PUNYCODE_INVALID_INPUT if decode_digit(n) <= base
if out >= max_out
raise PunycodeBigOutput, "Output would exceed the space provided."
end
#memmove(output + i + 1, output + i, (out - i) * sizeof *output)
output[i + 1, out - i] = output[i, out - i]
output[i] = n
i += 1
out += 1
end
output_length[0] = out
output.pack("U*")
end
(class <<self; private :punycode_decode; end)
def self.punycode_basic?(codepoint)
codepoint < 0x80
end
(class <<self; private :punycode_basic?; end)
def self.punycode_delimiter?(codepoint)
codepoint == PUNYCODE_DELIMITER
end
(class <<self; private :punycode_delimiter?; end)
def self.punycode_encode_digit(d)
d + 22 + 75 * ((d < 26) ? 1 : 0)
end
(class <<self; private :punycode_encode_digit; end)
# Returns the numeric value of a basic codepoint
# (for use in representing integers) in the range 0 to
# base - 1, or PUNYCODE_BASE if codepoint does not represent a value.
def self.punycode_decode_digit(codepoint)
if codepoint - 48 < 10
codepoint - 22
elsif codepoint - 65 < 26
codepoint - 65
elsif codepoint - 97 < 26
codepoint - 97
else
PUNYCODE_BASE
end
end
(class <<self; private :punycode_decode_digit; end)
# Bias adaptation method
def self.punycode_adapt(delta, numpoints, firsttime)
delta = firsttime ? delta / PUNYCODE_DAMP : delta >> 1
# delta >> 1 is a faster way of doing delta / 2
delta += delta / numpoints
difference = PUNYCODE_BASE - PUNYCODE_TMIN
k = 0
while delta > (difference * PUNYCODE_TMAX) / 2
delta /= difference
k += PUNYCODE_BASE
end
k + (difference + 1) * delta / (delta + PUNYCODE_SKEW)
end
(class <<self; private :punycode_adapt; end)
end
# :startdoc:
end

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,30 +0,0 @@
# encoding:utf-8
#--
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#++
# Used to prevent the class/module from being loaded more than once
if !defined?(Addressable::VERSION)
module Addressable
module VERSION
MAJOR = 2
MINOR = 5
TINY = 2
STRING = [MAJOR, MINOR, TINY].join('.')
end
end
end

View File

@@ -1,298 +0,0 @@
# coding: utf-8
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "spec_helper"
# Have to use RubyGems to load the idn gem.
require "rubygems"
require "addressable/idna"
shared_examples_for "converting from unicode to ASCII" do
it "should convert 'www.google.com' correctly" do
expect(Addressable::IDNA.to_ascii("www.google.com")).to eq("www.google.com")
end
LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com'
it "should convert '#{LONG}' correctly" do
expect(Addressable::IDNA.to_ascii(LONG)).to eq(LONG)
end
it "should convert 'www.詹姆斯.com' correctly" do
expect(Addressable::IDNA.to_ascii(
"www.詹姆斯.com"
)).to eq("www.xn--8ws00zhy3a.com")
end
it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do
"www.Iñtërnâtiônàlizætiøn.com"
expect(Addressable::IDNA.to_ascii(
"www.I\xC3\xB1t\xC3\xABrn\xC3\xA2ti\xC3\xB4" +
"n\xC3\xA0liz\xC3\xA6ti\xC3\xB8n.com"
)).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com")
end
it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do
expect(Addressable::IDNA.to_ascii(
"www.In\xCC\x83te\xCC\x88rna\xCC\x82tio\xCC\x82n" +
"a\xCC\x80liz\xC3\xA6ti\xC3\xB8n.com"
)).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com")
end
it "should convert " +
"'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " +
"correctly" do
expect(Addressable::IDNA.to_ascii(
"www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" +
"\201\252\343\201\214\343\201\204\343\202\217\343\201\221\343\201\256" +
"\343\202\217\343\201\213\343\202\211\343\201\252\343\201\204\343\201" +
"\251\343\202\201\343\201\204\343\202\223\343\202\201\343\201\204\343" +
"\201\256\343\202\211\343\201\271\343\202\213\343\201\276\343\201\240" +
"\343\201\252\343\201\214\343\201\217\343\201\227\343\201\252\343\201" +
"\204\343\201\250\343\201\237\343\202\212\343\201\252\343\201\204." +
"w3.mag.keio.ac.jp"
)).to eq(
"www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" +
"fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp"
)
end
it "should convert " +
"'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " +
"correctly" do
expect(Addressable::IDNA.to_ascii(
"www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" +
"\201\252\343\201\213\343\202\231\343\201\204\343\202\217\343\201\221" +
"\343\201\256\343\202\217\343\201\213\343\202\211\343\201\252\343\201" +
"\204\343\201\250\343\202\231\343\202\201\343\201\204\343\202\223\343" +
"\202\201\343\201\204\343\201\256\343\202\211\343\201\270\343\202\231" +
"\343\202\213\343\201\276\343\201\237\343\202\231\343\201\252\343\201" +
"\213\343\202\231\343\201\217\343\201\227\343\201\252\343\201\204\343" +
"\201\250\343\201\237\343\202\212\343\201\252\343\201\204." +
"w3.mag.keio.ac.jp"
)).to eq(
"www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" +
"fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp"
)
end
it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do
expect(Addressable::IDNA.to_ascii(
"点心和烤鸭.w3.mag.keio.ac.jp"
)).to eq("xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp")
end
it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do
expect(Addressable::IDNA.to_ascii(
"가각갂갃간갅갆갇갈갉힢힣.com"
)).to eq("xn--o39acdefghijk5883jma.com")
end
it "should convert " +
"'\347\242\274\346\250\231\346\272\226\350" +
"\220\254\345\234\213\347\242\274.com' correctly" do
expect(Addressable::IDNA.to_ascii(
"\347\242\274\346\250\231\346\272\226\350" +
"\220\254\345\234\213\347\242\274.com"
)).to eq("xn--9cs565brid46mda086o.com")
end
it "should convert 'リ宠퐱〹.com' correctly" do
expect(Addressable::IDNA.to_ascii(
"\357\276\230\345\256\240\355\220\261\343\200\271.com"
)).to eq("xn--eek174hoxfpr4k.com")
end
it "should convert 'リ宠퐱卄.com' correctly" do
expect(Addressable::IDNA.to_ascii(
"\343\203\252\345\256\240\355\220\261\345\215\204.com"
)).to eq("xn--eek174hoxfpr4k.com")
end
it "should convert 'ᆵ' correctly" do
expect(Addressable::IDNA.to_ascii(
"\341\206\265"
)).to eq("xn--4ud")
end
it "should convert 'ᆵ' correctly" do
expect(Addressable::IDNA.to_ascii(
"\357\276\257"
)).to eq("xn--4ud")
end
it "should convert '🌹🌹🌹.ws' correctly" do
expect(Addressable::IDNA.to_ascii(
"\360\237\214\271\360\237\214\271\360\237\214\271.ws"
)).to eq("xn--2h8haa.ws")
end
it "should handle two adjacent '.'s correctly" do
expect(Addressable::IDNA.to_ascii(
"example..host"
)).to eq("example..host")
end
end
shared_examples_for "converting from ASCII to unicode" do
LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com'
it "should convert '#{LONG}' correctly" do
expect(Addressable::IDNA.to_unicode(LONG)).to eq(LONG)
end
it "should return the identity conversion when punycode decode fails" do
expect(Addressable::IDNA.to_unicode("xn--zckp1cyg1.sblo.jp")).to eq(
"xn--zckp1cyg1.sblo.jp")
end
it "should return the identity conversion when the ACE prefix has no suffix" do
expect(Addressable::IDNA.to_unicode("xn--...-")).to eq("xn--...-")
end
it "should convert 'www.google.com' correctly" do
expect(Addressable::IDNA.to_unicode("www.google.com")).to eq(
"www.google.com")
end
it "should convert 'www.詹姆斯.com' correctly" do
expect(Addressable::IDNA.to_unicode(
"www.xn--8ws00zhy3a.com"
)).to eq("www.詹姆斯.com")
end
it "should convert '詹姆斯.com' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--8ws00zhy3a.com"
)).to eq("詹姆斯.com")
end
it "should convert 'www.iñtërnâtiônàlizætiøn.com' correctly" do
expect(Addressable::IDNA.to_unicode(
"www.xn--itrntinliztin-vdb0a5exd8ewcye.com"
)).to eq("www.iñtërnâtiônàlizætiøn.com")
end
it "should convert 'iñtërnâtiônàlizætiøn.com' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--itrntinliztin-vdb0a5exd8ewcye.com"
)).to eq("iñtërnâtiônàlizætiøn.com")
end
it "should convert " +
"'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " +
"correctly" do
expect(Addressable::IDNA.to_unicode(
"www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" +
"fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp"
)).to eq(
"www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp"
)
end
it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp"
)).to eq("点心和烤鸭.w3.mag.keio.ac.jp")
end
it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--o39acdefghijk5883jma.com"
)).to eq("가각갂갃간갅갆갇갈갉힢힣.com")
end
it "should convert " +
"'\347\242\274\346\250\231\346\272\226\350" +
"\220\254\345\234\213\347\242\274.com' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--9cs565brid46mda086o.com"
)).to eq(
"\347\242\274\346\250\231\346\272\226\350" +
"\220\254\345\234\213\347\242\274.com"
)
end
it "should convert 'リ宠퐱卄.com' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--eek174hoxfpr4k.com"
)).to eq("\343\203\252\345\256\240\355\220\261\345\215\204.com")
end
it "should convert 'ᆵ' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--4ud"
)).to eq("\341\206\265")
end
it "should convert '🌹🌹🌹.ws' correctly" do
expect(Addressable::IDNA.to_unicode(
"xn--2h8haa.ws"
)).to eq("\360\237\214\271\360\237\214\271\360\237\214\271.ws")
end
it "should handle two adjacent '.'s correctly" do
expect(Addressable::IDNA.to_unicode(
"example..host"
)).to eq("example..host")
end
it "should normalize 'string' correctly" do
expect(Addressable::IDNA.unicode_normalize_kc(:'string')).to eq("string")
expect(Addressable::IDNA.unicode_normalize_kc("string")).to eq("string")
end
end
describe Addressable::IDNA, "when using the pure-Ruby implementation" do
before do
Addressable.send(:remove_const, :IDNA)
load "addressable/idna/pure.rb"
end
it_should_behave_like "converting from unicode to ASCII"
it_should_behave_like "converting from ASCII to unicode"
begin
require "fiber"
it "should not blow up inside fibers" do
f = Fiber.new do
Addressable.send(:remove_const, :IDNA)
load "addressable/idna/pure.rb"
end
f.resume
end
rescue LoadError
# Fibers aren't supported in this version of Ruby, skip this test.
warn('Fibers unsupported.')
end
end
begin
require "idn"
describe Addressable::IDNA, "when using the native-code implementation" do
before do
Addressable.send(:remove_const, :IDNA)
load "addressable/idna/native.rb"
end
it_should_behave_like "converting from unicode to ASCII"
it_should_behave_like "converting from ASCII to unicode"
end
rescue LoadError
# Cannot test the native implementation without libidn support.
warn('Could not load native IDN implementation.')
end

View File

@@ -1,28 +0,0 @@
# coding: utf-8
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "spec_helper"
require "addressable/uri"
require "net/http"
describe Net::HTTP do
it "should be compatible with Addressable" do
response_body =
Net::HTTP.get(Addressable::URI.parse('http://www.google.com/'))
expect(response_body).not_to be_nil
end
end

View File

@@ -1,104 +0,0 @@
# coding: utf-8
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "spec_helper"
require "addressable/uri"
require "addressable/template"
require "rack/mount"
describe Rack::Mount do
let(:app_one) do
proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 1'] }
end
let(:app_two) do
proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 2'] }
end
let(:app_three) do
proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 3'] }
end
let(:routes) do
s = Rack::Mount::RouteSet.new do |set|
set.add_route(app_one, {
:request_method => 'GET',
:path_info => Addressable::Template.new('/one/{id}/')
}, {:id => 'unidentified'}, :one)
set.add_route(app_two, {
:request_method => 'GET',
:path_info => Addressable::Template.new('/two/')
}, {:id => 'unidentified'}, :two)
set.add_route(app_three, {
:request_method => 'GET',
:path_info => Addressable::Template.new('/three/{id}/').to_regexp
}, {:id => 'unidentified'}, :three)
end
s.rehash
s
end
it "should generate from routes with Addressable::Template" do
path, _ = routes.generate(:path_info, :one, {:id => '123'})
expect(path).to eq '/one/123/'
end
it "should generate from routes with Addressable::Template using defaults" do
path, _ = routes.generate(:path_info, :one, {})
expect(path).to eq '/one/unidentified/'
end
it "should recognize routes with Addressable::Template" do
request = Rack::Request.new(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/one/123/'
)
route, _, params = routes.recognize(request)
expect(route).not_to be_nil
expect(route.app).to eq app_one
expect(params).to eq({id: '123'})
end
it "should generate from routes with Addressable::Template" do
path, _ = routes.generate(:path_info, :two, {:id => '654'})
expect(path).to eq '/two/'
end
it "should generate from routes with Addressable::Template using defaults" do
path, _ = routes.generate(:path_info, :two, {})
expect(path).to eq '/two/'
end
it "should recognize routes with Addressable::Template" do
request = Rack::Request.new(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/two/'
)
route, _, params = routes.recognize(request)
expect(route).not_to be_nil
expect(route.app).to eq app_two
expect(params).to eq({id: 'unidentified'})
end
it "should recognize routes with derived Regexp" do
request = Rack::Request.new(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/three/789/'
)
route, _, params = routes.recognize(request)
expect(route).not_to be_nil
expect(route.app).to eq app_three
expect(params).to eq({id: '789'})
end
end

View File

@@ -1,57 +0,0 @@
# coding: utf-8
# Copyright (C) Bob Aman
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "spec_helper"
require "addressable/uri"
describe Addressable::URI, "when created with a URI known to cause crashes " +
"in certain browsers" do
it "should parse correctly" do
uri = Addressable::URI.parse('%%30%30')
expect(uri.path).to eq('%%30%30')
expect(uri.normalize.path).to eq('%2500')
end
it "should parse correctly as a full URI" do
uri = Addressable::URI.parse('http://www.example.com/%%30%30')
expect(uri.path).to eq('/%%30%30')
expect(uri.normalize.path).to eq('/%2500')
end
end
describe Addressable::URI, "when created with a URI known to cause crashes " +
"in certain browsers" do
it "should parse correctly" do
uri = Addressable::URI.parse('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
expect(uri.path).to eq('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
expect(uri.normalize.path).to eq(
'%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' +
'%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' +
'%A3%20%E0%A5%A3%20%E5%86%97'
)
end
it "should parse correctly as a full URI" do
uri = Addressable::URI.parse('http://www.example.com/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
expect(uri.path).to eq('/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
expect(uri.normalize.path).to eq(
'/%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' +
'%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' +
'%A3%20%E0%A5%A3%20%E5%86%97'
)
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +0,0 @@
require 'bundler/setup'
require 'rspec/its'
begin
require 'coveralls'
Coveralls.wear! do
add_filter "spec/"
add_filter "vendor/"
end
rescue LoadError
warn "warning: coveralls gem not found; skipping Coveralls"
require 'simplecov'
SimpleCov.start do
add_filter "spec/"
add_filter "vendor/"
end
end
RSpec.configure do |config|
config.warnings = true
end

View File

@@ -1,2 +0,0 @@
desc "Remove all build products"
task "clobber"

View File

@@ -1,91 +0,0 @@
require "rubygems/package_task"
namespace :gem do
GEM_SPEC = Gem::Specification.new do |s|
s.name = PKG_NAME
s.version = PKG_VERSION
s.summary = PKG_SUMMARY
s.description = PKG_DESCRIPTION
s.files = PKG_FILES.to_a
s.has_rdoc = true
s.extra_rdoc_files = %w( README.md )
s.rdoc_options.concat ["--main", "README.md"]
if !s.respond_to?(:add_development_dependency)
puts "Cannot build Gem with this version of RubyGems."
exit(1)
end
s.required_ruby_version = '>= 2.0'
s.add_runtime_dependency 'public_suffix', '>= 2.0.2', '< 4.0'
s.add_development_dependency 'bundler', '~> 1.0'
s.require_path = "lib"
s.author = "Bob Aman"
s.email = "bob@sporkmonger.com"
s.homepage = "https://github.com/sporkmonger/addressable"
s.license = "Apache-2.0"
end
Gem::PackageTask.new(GEM_SPEC) do |p|
p.gem_spec = GEM_SPEC
p.need_tar = true
p.need_zip = true
end
desc "Generates .gemspec file"
task :gemspec do
spec_string = GEM_SPEC.to_ruby
File.open("#{GEM_SPEC.name}.gemspec", 'w') do |file|
file.write spec_string
end
end
desc "Show information about the gem"
task :debug do
puts GEM_SPEC.to_ruby
end
desc "Install the gem"
task :install => ["clobber", "gem:package"] do
sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}"
end
desc "Uninstall the gem"
task :uninstall do
installed_list = Gem.source_index.find_name(PKG_NAME)
if installed_list &&
(installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION))
sh(
"#{SUDO} gem uninstall --version '#{PKG_VERSION}' " +
"--ignore-dependencies --executables #{PKG_NAME}"
)
end
end
desc "Reinstall the gem"
task :reinstall => [:uninstall, :install]
desc 'Package for release'
task :release => ["gem:package", "gem:gemspec"] do |t|
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION
pkg = "pkg/#{GEM_SPEC.full_name}"
changelog = File.open("CHANGELOG.md") { |file| file.read }
puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}"
Rake::Task["git:tag:create"].invoke
end
end
desc "Alias to gem:package"
task "gem" => "gem:package"
task "gem:release" => "gem:gemspec"
task "clobber" => ["gem:clobber_package"]

View File

@@ -1,45 +0,0 @@
namespace :git do
namespace :tag do
desc "List tags from the Git repository"
task :list do
tags = `git tag -l`
tags.gsub!("\r", "")
tags = tags.split("\n").sort {|a, b| b <=> a }
puts tags.join("\n")
end
desc "Create a new tag in the Git repository"
task :create do
changelog = File.open("CHANGELOG.md", "r") { |file| file.read }
puts "-" * 80
puts changelog
puts "-" * 80
puts
v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION
git_status = `git status`
if git_status !~ /^nothing to commit/
abort "Working directory isn't clean."
end
tag = "#{PKG_NAME}-#{PKG_VERSION}"
msg = "Release #{PKG_NAME}-#{PKG_VERSION}"
existing_tags = `git tag -l #{PKG_NAME}-*`.split('\n')
if existing_tags.include?(tag)
warn("Tag already exists, deleting...")
unless system "git tag -d #{tag}"
abort "Tag deletion failed."
end
end
puts "Creating git tag '#{tag}'..."
unless system "git tag -a -m \"#{msg}\" #{tag}"
abort "Tag creation failed."
end
end
end
end
task "gem:release" => "git:tag:create"

View File

@@ -1,22 +0,0 @@
namespace :metrics do
task :lines do
lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
for file_name in FileList["lib/**/*.rb"]
f = File.open(file_name)
while line = f.gets
lines += 1
next if line =~ /^\s*$/
next if line =~ /^\s*#/
codelines += 1
end
puts "L: #{sprintf("%4d", lines)}, " +
"LOC #{sprintf("%4d", codelines)} | #{file_name}"
total_lines += lines
total_codelines += codelines
lines, codelines = 0, 0
end
puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
end
end

View File

@@ -1,21 +0,0 @@
require "rspec/core/rake_task"
namespace :spec do
RSpec::Core::RakeTask.new(:simplecov) do |t|
t.pattern = FileList['spec/**/*_spec.rb']
t.rspec_opts = ['--color', '--format', 'documentation']
end
namespace :simplecov do
desc "Browse the code coverage report."
task :browse => "spec:simplecov" do
require "launchy"
Launchy.open("coverage/index.html")
end
end
end
desc "Alias to spec:simplecov"
task "spec" => "spec:simplecov"
task "clobber" => ["spec:clobber_simplecov"]

View File

@@ -1,27 +0,0 @@
require "rake"
begin
require "yard"
require "yard/rake/yardoc_task"
namespace :doc do
desc "Generate Yardoc documentation"
YARD::Rake::YardocTask.new do |yardoc|
yardoc.name = "yard"
yardoc.options = ["--verbose", "--markup", "markdown"]
yardoc.files = FileList[
"lib/**/*.rb", "ext/**/*.c",
"README.md", "CHANGELOG.md", "LICENSE.txt"
].exclude(/idna/)
end
end
task "clobber" => ["doc:clobber_yard"]
desc "Alias to doc:yard"
task "doc" => "doc:yard"
rescue LoadError
# If yard isn't available, it's not the end of the world
desc "Alias to doc:rdoc"
task "doc" => "doc:rdoc"
end

View File

@@ -1,11 +0,0 @@
source "https://rubygems.org"
gemspec
gem "rake"
group :development do
gem "rspec-helpers", :require => false
gem "luna-rspec-formatters", :require => false
gem "pry", :require => false unless ENV[
"CI"
]
end

View File

@@ -1,25 +0,0 @@
## 1.1.0 / 2016-06-28
### Minor Enhancements
* Support jruby (#8)
## 1.0.0 / 2016-04-28
### Major enhancements
- Merge Simple::ANSI and Colorator. (#7)
### Minor Enhancements
- Delete unnecessary `Symbol#to_sym` (#2)
- Change argument name of `Enumerator#each` for better code legibility (#3)
### Development Fixes
- Convert to new RSpec expectation syntax (#1)
- Fix `String#blue` result in README (#4)
## 0.1 / 2013-04-13
Birthday!

View File

@@ -1,21 +0,0 @@
The MIT License
Copyright (c) Parker Moore
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -1,47 +0,0 @@
# colorator
Colorize your text for the terminal
[![Build Status](https://travis-ci.org/octopress/colorator.png?branch=master)](https://travis-ci.org/octopress/colorator)
## Example
```ruby
"this string".red
# => \e[31mthis string\e[0m
"my string".blue
# => \e[34mmy string\e[0m
# etc...
```
## Supported Colors
- `red`
- `black`
- `green`
- `yellow`
- `magenta`
- `white`
- `blue`
- `cyan`
- `bold`
## Other supported Ansi methods
- `clear_line`
- `has_ansi?`, `has_color?`
- `strip_ansi`, `strip_color`
- `reset_ansi`, `reset_color`
- `clear_screen`
- `ansi_jump`
## Why
There are a bunch of gems that provide functionality like this, but none have
as simple an API as this. Just call `"string".color` and your text will be
colorized.
## License
MIT. Written as a single Ruby file by Brandon Mathis, converted into a gem by
Parker Moore.

Some files were not shown because too many files have changed in this diff Show More