kibi-swipl-linux-x64-gnu 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/README.md +29 -0
  2. package/bin/swipl +0 -0
  3. package/bin/swipl-win +0 -0
  4. package/build-manifest.json +70 -0
  5. package/lib/cmake/swipl/SWIPLConfig.cmake +21 -0
  6. package/lib/cmake/swipl/SWIPLConfigVersion.cmake +65 -0
  7. package/lib/cmake/swipl/SWIPLTargets-release.cmake +28 -0
  8. package/lib/cmake/swipl/SWIPLTargets.cmake +109 -0
  9. package/lib/swipl/ABI +1 -0
  10. package/lib/swipl/LICENSE +41 -0
  11. package/lib/swipl/README.md +116 -0
  12. package/lib/swipl/app/README.md +25 -0
  13. package/lib/swipl/app/app.pl +87 -0
  14. package/lib/swipl/app/pack.pl +350 -0
  15. package/lib/swipl/app/qlf.pl +521 -0
  16. package/lib/swipl/app/splfr.pl +177 -0
  17. package/lib/swipl/app/sys.pl +310 -0
  18. package/lib/swipl/bin/swipl.home +1 -0
  19. package/lib/swipl/boot/apply.pl +73 -0
  20. package/lib/swipl/boot/attvar.pl +344 -0
  21. package/lib/swipl/boot/autoload.pl +1226 -0
  22. package/lib/swipl/boot/bags.pl +283 -0
  23. package/lib/swipl/boot/dcg.pl +388 -0
  24. package/lib/swipl/boot/dicts.pl +193 -0
  25. package/lib/swipl/boot/dwim.pl +485 -0
  26. package/lib/swipl/boot/engines.pl +152 -0
  27. package/lib/swipl/boot/expand.pl +1628 -0
  28. package/lib/swipl/boot/gc.pl +65 -0
  29. package/lib/swipl/boot/history.pl +304 -0
  30. package/lib/swipl/boot/init.pl +4682 -0
  31. package/lib/swipl/boot/iri.pl +64 -0
  32. package/lib/swipl/boot/license.pl +390 -0
  33. package/lib/swipl/boot/load.pl +81 -0
  34. package/lib/swipl/boot/messages.pl +2521 -0
  35. package/lib/swipl/boot/packs.pl +306 -0
  36. package/lib/swipl/boot/predopts.pl +154 -0
  37. package/lib/swipl/boot/qlf.pl +141 -0
  38. package/lib/swipl/boot/rc.pl +263 -0
  39. package/lib/swipl/boot/syspred.pl +1634 -0
  40. package/lib/swipl/boot/tabling.pl +2321 -0
  41. package/lib/swipl/boot/threads.pl +42 -0
  42. package/lib/swipl/boot/toplevel.pl +2248 -0
  43. package/lib/swipl/boot/topvars.pl +261 -0
  44. package/lib/swipl/boot.prc +0 -0
  45. package/lib/swipl/cmake/swipl.cmake +131 -0
  46. package/lib/swipl/customize/README.md +23 -0
  47. package/lib/swipl/customize/edit +101 -0
  48. package/lib/swipl/customize/init.pl +164 -0
  49. package/lib/swipl/demo/README.md +33 -0
  50. package/lib/swipl/demo/likes.pl +44 -0
  51. package/lib/swipl/doc/packages/examples/chr/bool.chr +281 -0
  52. package/lib/swipl/doc/packages/examples/chr/chrdif.chr +87 -0
  53. package/lib/swipl/doc/packages/examples/chr/chrfreeze.chr +6 -0
  54. package/lib/swipl/doc/packages/examples/chr/family.chr +116 -0
  55. package/lib/swipl/doc/packages/examples/chr/fib.chr +24 -0
  56. package/lib/swipl/doc/packages/examples/chr/fibonacci.chr +31 -0
  57. package/lib/swipl/doc/packages/examples/chr/gcd.chr +28 -0
  58. package/lib/swipl/doc/packages/examples/chr/leq.chr +34 -0
  59. package/lib/swipl/doc/packages/examples/chr/listdom.chr +138 -0
  60. package/lib/swipl/doc/packages/examples/chr/primes.chr +29 -0
  61. package/lib/swipl/doc/packages/examples/http/README.md +98 -0
  62. package/lib/swipl/doc/packages/examples/http/calc.pl +92 -0
  63. package/lib/swipl/doc/packages/examples/http/demo_body.pl +232 -0
  64. package/lib/swipl/doc/packages/examples/http/demo_client.pl +165 -0
  65. package/lib/swipl/doc/packages/examples/http/demo_daemon.pl +38 -0
  66. package/lib/swipl/doc/packages/examples/http/demo_files.pl +50 -0
  67. package/lib/swipl/doc/packages/examples/http/demo_hello.pl +15 -0
  68. package/lib/swipl/doc/packages/examples/http/demo_login.pl +280 -0
  69. package/lib/swipl/doc/packages/examples/http/demo_openid.pl +177 -0
  70. package/lib/swipl/doc/packages/examples/http/demo_pwp.pl +20 -0
  71. package/lib/swipl/doc/packages/examples/http/demo_rest.pl +56 -0
  72. package/lib/swipl/doc/packages/examples/http/demo_threads.pl +52 -0
  73. package/lib/swipl/doc/packages/examples/http/linux-init-script +126 -0
  74. package/lib/swipl/doc/packages/examples/http/pwp/context.pwp +23 -0
  75. package/lib/swipl/doc/packages/examples/http/pwp/index.pwp +25 -0
  76. package/lib/swipl/doc/packages/examples/http/pwp/pwp1.pwp +12 -0
  77. package/lib/swipl/doc/packages/examples/http/pwp/pwp2.pwp +10 -0
  78. package/lib/swipl/doc/packages/examples/http/pwp/pwp3.pwp +25 -0
  79. package/lib/swipl/doc/packages/examples/http/pwp/pwp4.pwp +23 -0
  80. package/lib/swipl/doc/packages/examples/http/pwp/pwp5.pwp +11 -0
  81. package/lib/swipl/doc/packages/examples/http/pwp/pwp6.pwp +3 -0
  82. package/lib/swipl/doc/packages/examples/http/pwp/pwp7.pwp +3 -0
  83. package/lib/swipl/doc/packages/examples/http/pwp/pwp8.pwp +3 -0
  84. package/lib/swipl/doc/packages/examples/http/pwp/pwpdb.pl +12 -0
  85. package/lib/swipl/doc/packages/examples/http/systemd-script.service +18 -0
  86. package/lib/swipl/doc/packages/examples/http/upstart-script.conf +20 -0
  87. package/lib/swipl/doc/packages/examples/plunit/read.pl +17 -0
  88. package/lib/swipl/doc/packages/examples/plunit/simple.pl +33 -0
  89. package/lib/swipl/doc/packages/examples/ssl/client.pl +83 -0
  90. package/lib/swipl/doc/packages/examples/ssl/etc/README +52 -0
  91. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.p12 +0 -0
  92. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.pem +85 -0
  93. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-key.pem +30 -0
  94. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/cacert.pem +82 -0
  95. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/careq.pem +18 -0
  96. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/crlnumber +1 -0
  97. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt +3 -0
  98. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt.attr +1 -0
  99. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7C.pem +85 -0
  100. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7D.pem +85 -0
  101. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/private/cakey.pem +30 -0
  102. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/serial +1 -0
  103. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-cert.pem +85 -0
  104. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-key.pem +30 -0
  105. package/lib/swipl/doc/packages/examples/ssl/https.pl +267 -0
  106. package/lib/swipl/doc/packages/examples/ssl/server.pl +106 -0
  107. package/lib/swipl/include/SWI-Prolog.h +1544 -0
  108. package/lib/swipl/include/SWI-Stream.h +537 -0
  109. package/lib/swipl/include/Yap/YapInterface.h +283 -0
  110. package/lib/swipl/include/sicstus/sicstus.h +452 -0
  111. package/lib/swipl/lib/x86_64-linux/cgi.so +0 -0
  112. package/lib/swipl/lib/x86_64-linux/crypt.so +0 -0
  113. package/lib/swipl/lib/x86_64-linux/crypto4pl.so +0 -0
  114. package/lib/swipl/lib/x86_64-linux/double_metaphone.so +0 -0
  115. package/lib/swipl/lib/x86_64-linux/files.so +0 -0
  116. package/lib/swipl/lib/x86_64-linux/hashstream.so +0 -0
  117. package/lib/swipl/lib/x86_64-linux/http_stream.so +0 -0
  118. package/lib/swipl/lib/x86_64-linux/isub.so +0 -0
  119. package/lib/swipl/lib/x86_64-linux/json.so +0 -0
  120. package/lib/swipl/lib/x86_64-linux/libswipl.so.10 +0 -0
  121. package/lib/swipl/lib/x86_64-linux/mallocinfo.so +0 -0
  122. package/lib/swipl/lib/x86_64-linux/md54pl.so +0 -0
  123. package/lib/swipl/lib/x86_64-linux/memfile.so +0 -0
  124. package/lib/swipl/lib/x86_64-linux/ntriples.so +0 -0
  125. package/lib/swipl/lib/x86_64-linux/pcre4pl.so +0 -0
  126. package/lib/swipl/lib/x86_64-linux/porter_stem.so +0 -0
  127. package/lib/swipl/lib/x86_64-linux/process.so +0 -0
  128. package/lib/swipl/lib/x86_64-linux/prolog_stream.so +0 -0
  129. package/lib/swipl/lib/x86_64-linux/rdf_db.so +0 -0
  130. package/lib/swipl/lib/x86_64-linux/readutil.so +0 -0
  131. package/lib/swipl/lib/x86_64-linux/rlimit.so +0 -0
  132. package/lib/swipl/lib/x86_64-linux/sched.so +0 -0
  133. package/lib/swipl/lib/x86_64-linux/sgml2pl.so +0 -0
  134. package/lib/swipl/lib/x86_64-linux/sha4pl.so +0 -0
  135. package/lib/swipl/lib/x86_64-linux/snowball.so +0 -0
  136. package/lib/swipl/lib/x86_64-linux/socket.so +0 -0
  137. package/lib/swipl/lib/x86_64-linux/ssl4pl.so +0 -0
  138. package/lib/swipl/lib/x86_64-linux/streaminfo.so +0 -0
  139. package/lib/swipl/lib/x86_64-linux/syslog.so +0 -0
  140. package/lib/swipl/lib/x86_64-linux/time.so +0 -0
  141. package/lib/swipl/lib/x86_64-linux/turtle.so +0 -0
  142. package/lib/swipl/lib/x86_64-linux/uid.so +0 -0
  143. package/lib/swipl/lib/x86_64-linux/unix.so +0 -0
  144. package/lib/swipl/lib/x86_64-linux/uri.so +0 -0
  145. package/lib/swipl/lib/x86_64-linux/websocket.so +0 -0
  146. package/lib/swipl/lib/x86_64-linux/zlib4pl.so +0 -0
  147. package/lib/swipl/library/INDEX.pl +1020 -0
  148. package/lib/swipl/library/aggregate.pl +755 -0
  149. package/lib/swipl/library/ansi_term.pl +653 -0
  150. package/lib/swipl/library/apply.pl +426 -0
  151. package/lib/swipl/library/apply_macros.pl +497 -0
  152. package/lib/swipl/library/arithmetic.pl +320 -0
  153. package/lib/swipl/library/assoc.pl +522 -0
  154. package/lib/swipl/library/atom.pl +169 -0
  155. package/lib/swipl/library/backcomp.pl +688 -0
  156. package/lib/swipl/library/base32.pl +291 -0
  157. package/lib/swipl/library/base64.pl +441 -0
  158. package/lib/swipl/library/broadcast.pl +161 -0
  159. package/lib/swipl/library/build/cmake.pl +137 -0
  160. package/lib/swipl/library/build/conan.pl +232 -0
  161. package/lib/swipl/library/build/make.pl +168 -0
  162. package/lib/swipl/library/build/tools.pl +825 -0
  163. package/lib/swipl/library/charsio.pl +195 -0
  164. package/lib/swipl/library/check.pl +1097 -0
  165. package/lib/swipl/library/check_installation.pl +912 -0
  166. package/lib/swipl/library/clp/INDEX.pl +157 -0
  167. package/lib/swipl/library/clp/bounds.pl +2036 -0
  168. package/lib/swipl/library/clp/clp_distinct.pl +263 -0
  169. package/lib/swipl/library/clp/clp_events.pl +92 -0
  170. package/lib/swipl/library/clp/clpb.pl +1896 -0
  171. package/lib/swipl/library/clp/clpfd.pl +7906 -0
  172. package/lib/swipl/library/clp/simplex.pl +1580 -0
  173. package/lib/swipl/library/codesio.pl +182 -0
  174. package/lib/swipl/library/coinduction.pl +183 -0
  175. package/lib/swipl/library/console_input.pl +289 -0
  176. package/lib/swipl/library/csv.pl +611 -0
  177. package/lib/swipl/library/ctypes.pl +161 -0
  178. package/lib/swipl/library/date.pl +370 -0
  179. package/lib/swipl/library/dcg/INDEX.pl +35 -0
  180. package/lib/swipl/library/dcg/basics.pl +514 -0
  181. package/lib/swipl/library/dcg/high_order.pl +227 -0
  182. package/lib/swipl/library/debug.pl +499 -0
  183. package/lib/swipl/library/dialect/bim.pl +186 -0
  184. package/lib/swipl/library/dialect/commons.pl +77 -0
  185. package/lib/swipl/library/dialect/eclipse/test_util_iso.pl +355 -0
  186. package/lib/swipl/library/dialect/hprolog/format.pl +44 -0
  187. package/lib/swipl/library/dialect/hprolog.pl +314 -0
  188. package/lib/swipl/library/dialect/ifprolog.pl +1317 -0
  189. package/lib/swipl/library/dialect/iso/iso_predicates.pl +277 -0
  190. package/lib/swipl/library/dialect/sicstus/README.TXT +1 -0
  191. package/lib/swipl/library/dialect/sicstus/arrays.pl +121 -0
  192. package/lib/swipl/library/dialect/sicstus/block.pl +278 -0
  193. package/lib/swipl/library/dialect/sicstus/lists.pl +167 -0
  194. package/lib/swipl/library/dialect/sicstus/ordsets.pl +52 -0
  195. package/lib/swipl/library/dialect/sicstus/sockets.pl +174 -0
  196. package/lib/swipl/library/dialect/sicstus/system.pl +262 -0
  197. package/lib/swipl/library/dialect/sicstus/terms.pl +57 -0
  198. package/lib/swipl/library/dialect/sicstus/timeout.pl +92 -0
  199. package/lib/swipl/library/dialect/sicstus.pl +582 -0
  200. package/lib/swipl/library/dialect/sicstus4/aggregate.pl +60 -0
  201. package/lib/swipl/library/dialect/sicstus4/between.pl +62 -0
  202. package/lib/swipl/library/dialect/sicstus4/clpfd.pl +75 -0
  203. package/lib/swipl/library/dialect/sicstus4/file_systems.pl +413 -0
  204. package/lib/swipl/library/dialect/sicstus4/lists.pl +274 -0
  205. package/lib/swipl/library/dialect/sicstus4/ordsets.pl +54 -0
  206. package/lib/swipl/library/dialect/sicstus4/samsort.pl +86 -0
  207. package/lib/swipl/library/dialect/sicstus4/sets.pl +124 -0
  208. package/lib/swipl/library/dialect/sicstus4/sockets.pl +164 -0
  209. package/lib/swipl/library/dialect/sicstus4/system.pl +80 -0
  210. package/lib/swipl/library/dialect/sicstus4/terms.pl +89 -0
  211. package/lib/swipl/library/dialect/sicstus4/timeout.pl +43 -0
  212. package/lib/swipl/library/dialect/sicstus4/types.pl +103 -0
  213. package/lib/swipl/library/dialect/sicstus4.pl +200 -0
  214. package/lib/swipl/library/dialect/swi/syspred_options.pl +250 -0
  215. package/lib/swipl/library/dialect/xsb/README.md +20 -0
  216. package/lib/swipl/library/dialect/xsb/basics.pl +318 -0
  217. package/lib/swipl/library/dialect/xsb/consult.pl +87 -0
  218. package/lib/swipl/library/dialect/xsb/curr_sym.pl +57 -0
  219. package/lib/swipl/library/dialect/xsb/error_handler.pl +111 -0
  220. package/lib/swipl/library/dialect/xsb/gensym.pl +53 -0
  221. package/lib/swipl/library/dialect/xsb/gpp.pl +138 -0
  222. package/lib/swipl/library/dialect/xsb/intern.pl +48 -0
  223. package/lib/swipl/library/dialect/xsb/lists.pl +47 -0
  224. package/lib/swipl/library/dialect/xsb/machine.pl +295 -0
  225. package/lib/swipl/library/dialect/xsb/ordsets.pl +53 -0
  226. package/lib/swipl/library/dialect/xsb/setof.pl +54 -0
  227. package/lib/swipl/library/dialect/xsb/source.pl +308 -0
  228. package/lib/swipl/library/dialect/xsb/standard.pl +169 -0
  229. package/lib/swipl/library/dialect/xsb/storage.pl +70 -0
  230. package/lib/swipl/library/dialect/xsb/string.pl +76 -0
  231. package/lib/swipl/library/dialect/xsb/thread.pl +62 -0
  232. package/lib/swipl/library/dialect/xsb/timed_call.pl +158 -0
  233. package/lib/swipl/library/dialect/xsb.pl +688 -0
  234. package/lib/swipl/library/dialect/yap/README.TXT +8 -0
  235. package/lib/swipl/library/dialect/yap.pl +283 -0
  236. package/lib/swipl/library/dialect.pl +123 -0
  237. package/lib/swipl/library/dicts.pl +399 -0
  238. package/lib/swipl/library/dif.pl +426 -0
  239. package/lib/swipl/library/edinburgh.pl +138 -0
  240. package/lib/swipl/library/edit.pl +783 -0
  241. package/lib/swipl/library/error.pl +495 -0
  242. package/lib/swipl/library/exceptions.pl +231 -0
  243. package/lib/swipl/library/explain.pl +543 -0
  244. package/lib/swipl/library/ext/RDF/INDEX.pl +25 -0
  245. package/lib/swipl/library/ext/RDF/rdf.pl +450 -0
  246. package/lib/swipl/library/ext/RDF/rdf_parser.pl +649 -0
  247. package/lib/swipl/library/ext/RDF/rdf_triple.pl +448 -0
  248. package/lib/swipl/library/ext/RDF/rdf_write.pl +701 -0
  249. package/lib/swipl/library/ext/RDF/rewrite_term.pl +177 -0
  250. package/lib/swipl/library/ext/chr/chr/a_star.pl +80 -0
  251. package/lib/swipl/library/ext/chr/chr/binomialheap.pl +142 -0
  252. package/lib/swipl/library/ext/chr/chr/builtins.pl +629 -0
  253. package/lib/swipl/library/ext/chr/chr/chr_compiler_errors.pl +179 -0
  254. package/lib/swipl/library/ext/chr/chr/chr_compiler_options.pl +382 -0
  255. package/lib/swipl/library/ext/chr/chr/chr_compiler_utility.pl +338 -0
  256. package/lib/swipl/library/ext/chr/chr/chr_debug.pl +59 -0
  257. package/lib/swipl/library/ext/chr/chr/chr_hashtable_store.pl +425 -0
  258. package/lib/swipl/library/ext/chr/chr/chr_integertable_store.pl +139 -0
  259. package/lib/swipl/library/ext/chr/chr/chr_messages.pl +176 -0
  260. package/lib/swipl/library/ext/chr/chr/chr_op.pl +53 -0
  261. package/lib/swipl/library/ext/chr/chr/chr_runtime.pl +1016 -0
  262. package/lib/swipl/library/ext/chr/chr/chr_translate.pl +25424 -0
  263. package/lib/swipl/library/ext/chr/chr/clean_code.pl +252 -0
  264. package/lib/swipl/library/ext/chr/chr/find.pl +78 -0
  265. package/lib/swipl/library/ext/chr/chr/guard_entailment.pl +19432 -0
  266. package/lib/swipl/library/ext/chr/chr/listmap.pl +108 -0
  267. package/lib/swipl/library/ext/chr/chr/pairlist.pl +78 -0
  268. package/lib/swipl/library/ext/chr/chr.pl +686 -0
  269. package/lib/swipl/library/ext/clib/INDEX.pl +158 -0
  270. package/lib/swipl/library/ext/clib/cgi.pl +86 -0
  271. package/lib/swipl/library/ext/clib/crypt.pl +44 -0
  272. package/lib/swipl/library/ext/clib/filesex.pl +644 -0
  273. package/lib/swipl/library/ext/clib/hash_stream.pl +119 -0
  274. package/lib/swipl/library/ext/clib/mallocinfo.pl +138 -0
  275. package/lib/swipl/library/ext/clib/md5.pl +68 -0
  276. package/lib/swipl/library/ext/clib/memfile.pl +61 -0
  277. package/lib/swipl/library/ext/clib/process.pl +573 -0
  278. package/lib/swipl/library/ext/clib/prolog_server.pl +157 -0
  279. package/lib/swipl/library/ext/clib/prolog_stream.pl +80 -0
  280. package/lib/swipl/library/ext/clib/rlimit.pl +54 -0
  281. package/lib/swipl/library/ext/clib/sched.pl +85 -0
  282. package/lib/swipl/library/ext/clib/sha.pl +162 -0
  283. package/lib/swipl/library/ext/clib/socket.pl +1102 -0
  284. package/lib/swipl/library/ext/clib/streaminfo.pl +103 -0
  285. package/lib/swipl/library/ext/clib/streampool.pl +136 -0
  286. package/lib/swipl/library/ext/clib/syslog.pl +180 -0
  287. package/lib/swipl/library/ext/clib/time.pl +194 -0
  288. package/lib/swipl/library/ext/clib/udp_broadcast.pl +975 -0
  289. package/lib/swipl/library/ext/clib/uid.pl +220 -0
  290. package/lib/swipl/library/ext/clib/unix.pl +317 -0
  291. package/lib/swipl/library/ext/clib/uri.pl +530 -0
  292. package/lib/swipl/library/ext/clib/uuid.pl +207 -0
  293. package/lib/swipl/library/ext/http/http/INDEX.pl +266 -0
  294. package/lib/swipl/library/ext/http/http/README.md +34 -0
  295. package/lib/swipl/library/ext/http/http/ax.pl +189 -0
  296. package/lib/swipl/library/ext/http/http/dcg_basics.pl +49 -0
  297. package/lib/swipl/library/ext/http/http/graphql.pl +1367 -0
  298. package/lib/swipl/library/ext/http/http/html_decl.pl +416 -0
  299. package/lib/swipl/library/ext/http/http/html_head.pl +654 -0
  300. package/lib/swipl/library/ext/http/http/html_quasiquotations.pl +120 -0
  301. package/lib/swipl/library/ext/http/http/html_write.pl +1425 -0
  302. package/lib/swipl/library/ext/http/http/htmx.pl +139 -0
  303. package/lib/swipl/library/ext/http/http/http_authenticate.pl +364 -0
  304. package/lib/swipl/library/ext/http/http/http_client.pl +412 -0
  305. package/lib/swipl/library/ext/http/http/http_cookie.pl +245 -0
  306. package/lib/swipl/library/ext/http/http/http_cors.pl +176 -0
  307. package/lib/swipl/library/ext/http/http/http_digest.pl +820 -0
  308. package/lib/swipl/library/ext/http/http/http_dirindex.pl +296 -0
  309. package/lib/swipl/library/ext/http/http/http_dispatch.pl +1552 -0
  310. package/lib/swipl/library/ext/http/http/http_dyn_workers.pl +214 -0
  311. package/lib/swipl/library/ext/http/http/http_error.pl +126 -0
  312. package/lib/swipl/library/ext/http/http/http_exception.pl +225 -0
  313. package/lib/swipl/library/ext/http/http/http_files.pl +163 -0
  314. package/lib/swipl/library/ext/http/http/http_header.pl +2820 -0
  315. package/lib/swipl/library/ext/http/http/http_hook.pl +106 -0
  316. package/lib/swipl/library/ext/http/http/http_host.pl +204 -0
  317. package/lib/swipl/library/ext/http/http/http_load.pl +113 -0
  318. package/lib/swipl/library/ext/http/http/http_log.pl +738 -0
  319. package/lib/swipl/library/ext/http/http/http_multipart_plugin.pl +232 -0
  320. package/lib/swipl/library/ext/http/http/http_open.pl +1821 -0
  321. package/lib/swipl/library/ext/http/http/http_openid.pl +1561 -0
  322. package/lib/swipl/library/ext/http/http/http_parameters.pl +504 -0
  323. package/lib/swipl/library/ext/http/http/http_path.pl +380 -0
  324. package/lib/swipl/library/ext/http/http/http_proxy.pl +80 -0
  325. package/lib/swipl/library/ext/http/http/http_pwp.pl +351 -0
  326. package/lib/swipl/library/ext/http/http/http_redis_plugin.pl +332 -0
  327. package/lib/swipl/library/ext/http/http/http_server.pl +105 -0
  328. package/lib/swipl/library/ext/http/http/http_server_files.pl +126 -0
  329. package/lib/swipl/library/ext/http/http/http_server_health.pl +186 -0
  330. package/lib/swipl/library/ext/http/http/http_session.pl +1040 -0
  331. package/lib/swipl/library/ext/http/http/http_sgml_plugin.pl +137 -0
  332. package/lib/swipl/library/ext/http/http/http_stream.pl +376 -0
  333. package/lib/swipl/library/ext/http/http/http_unix_daemon.pl +989 -0
  334. package/lib/swipl/library/ext/http/http/http_wrapper.pl +559 -0
  335. package/lib/swipl/library/ext/http/http/hub.pl +600 -0
  336. package/lib/swipl/library/ext/http/http/js_write.pl +461 -0
  337. package/lib/swipl/library/ext/http/http/mimepack.pl +224 -0
  338. package/lib/swipl/library/ext/http/http/mimetype.pl +276 -0
  339. package/lib/swipl/library/ext/http/http/term_html.pl +797 -0
  340. package/lib/swipl/library/ext/http/http/thread_httpd.pl +1181 -0
  341. package/lib/swipl/library/ext/http/http/web/css/dirindex.css +24 -0
  342. package/lib/swipl/library/ext/http/http/web/css/openid.css +57 -0
  343. package/lib/swipl/library/ext/http/http/web/icons/back.png +0 -0
  344. package/lib/swipl/library/ext/http/http/web/icons/c.png +0 -0
  345. package/lib/swipl/library/ext/http/http/web/icons/compressed.png +0 -0
  346. package/lib/swipl/library/ext/http/http/web/icons/folder.png +0 -0
  347. package/lib/swipl/library/ext/http/http/web/icons/generic.png +0 -0
  348. package/lib/swipl/library/ext/http/http/web/icons/layout.png +0 -0
  349. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-square.png +0 -0
  350. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-tiny.png +0 -0
  351. package/lib/swipl/library/ext/http/http/websocket.pl +729 -0
  352. package/lib/swipl/library/ext/http/http/yadis.pl +205 -0
  353. package/lib/swipl/library/ext/json/INDEX.pl +36 -0
  354. package/lib/swipl/library/ext/json/http/INDEX.pl +16 -0
  355. package/lib/swipl/library/ext/json/http/http_json.pl +490 -0
  356. package/lib/swipl/library/ext/json/http/js_grammar.pl +53 -0
  357. package/lib/swipl/library/ext/json/http/json.pl +48 -0
  358. package/lib/swipl/library/ext/json/http/json_convert.pl +48 -0
  359. package/lib/swipl/library/ext/json/json.pl +1215 -0
  360. package/lib/swipl/library/ext/json/json_convert.pl +681 -0
  361. package/lib/swipl/library/ext/json/json_grammar.pl +349 -0
  362. package/lib/swipl/library/ext/json/json_rpc_client.pl +423 -0
  363. package/lib/swipl/library/ext/json/json_rpc_common.pl +104 -0
  364. package/lib/swipl/library/ext/json/json_rpc_server.pl +489 -0
  365. package/lib/swipl/library/ext/json/json_schema.pl +2111 -0
  366. package/lib/swipl/library/ext/nlp/INDEX.pl +15 -0
  367. package/lib/swipl/library/ext/nlp/double_metaphone.pl +86 -0
  368. package/lib/swipl/library/ext/nlp/isub.pl +162 -0
  369. package/lib/swipl/library/ext/nlp/porter_stem.pl +50 -0
  370. package/lib/swipl/library/ext/nlp/snowball.pl +97 -0
  371. package/lib/swipl/library/ext/pcre/INDEX.pl +17 -0
  372. package/lib/swipl/library/ext/pcre/pcre.pl +974 -0
  373. package/lib/swipl/library/ext/plunit/INDEX.pl +20 -0
  374. package/lib/swipl/library/ext/plunit/plunit.pl +2631 -0
  375. package/lib/swipl/library/ext/plunit/test_wizard.pl +249 -0
  376. package/lib/swipl/library/ext/semweb/semweb/INDEX.pl +288 -0
  377. package/lib/swipl/library/ext/semweb/semweb/rdf11.pl +2106 -0
  378. package/lib/swipl/library/ext/semweb/semweb/rdf11_containers.pl +299 -0
  379. package/lib/swipl/library/ext/semweb/semweb/rdf_cache.pl +278 -0
  380. package/lib/swipl/library/ext/semweb/semweb/rdf_compare.pl +132 -0
  381. package/lib/swipl/library/ext/semweb/semweb/rdf_db.pl +3468 -0
  382. package/lib/swipl/library/ext/semweb/semweb/rdf_edit.pl +1145 -0
  383. package/lib/swipl/library/ext/semweb/semweb/rdf_http_plugin.pl +274 -0
  384. package/lib/swipl/library/ext/semweb/semweb/rdf_library.pl +1021 -0
  385. package/lib/swipl/library/ext/semweb/semweb/rdf_litindex.pl +1035 -0
  386. package/lib/swipl/library/ext/semweb/semweb/rdf_ntriples.pl +422 -0
  387. package/lib/swipl/library/ext/semweb/semweb/rdf_persistency.pl +1576 -0
  388. package/lib/swipl/library/ext/semweb/semweb/rdf_portray.pl +182 -0
  389. package/lib/swipl/library/ext/semweb/semweb/rdf_prefixes.pl +681 -0
  390. package/lib/swipl/library/ext/semweb/semweb/rdf_sandbox.pl +153 -0
  391. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle.pl +54 -0
  392. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle_write.pl +1587 -0
  393. package/lib/swipl/library/ext/semweb/semweb/rdf_zlib_plugin.pl +52 -0
  394. package/lib/swipl/library/ext/semweb/semweb/rdfa.pl +1510 -0
  395. package/lib/swipl/library/ext/semweb/semweb/rdfs.pl +475 -0
  396. package/lib/swipl/library/ext/semweb/semweb/sparql_client.pl +643 -0
  397. package/lib/swipl/library/ext/semweb/semweb/turtle.pl +455 -0
  398. package/lib/swipl/library/ext/sgml/DTD/HTML4.dcl +88 -0
  399. package/lib/swipl/library/ext/sgml/DTD/HTML4.dtd +1092 -0
  400. package/lib/swipl/library/ext/sgml/DTD/HTML4.soc +6 -0
  401. package/lib/swipl/library/ext/sgml/DTD/HTML5.dtd +906 -0
  402. package/lib/swipl/library/ext/sgml/DTD/HTMLlat1.ent +195 -0
  403. package/lib/swipl/library/ext/sgml/DTD/HTMLspec.ent +77 -0
  404. package/lib/swipl/library/ext/sgml/DTD/HTMLsym.ent +241 -0
  405. package/lib/swipl/library/ext/sgml/INDEX.pl +64 -0
  406. package/lib/swipl/library/ext/sgml/c14n2.pl +203 -0
  407. package/lib/swipl/library/ext/sgml/iso_639.pl +631 -0
  408. package/lib/swipl/library/ext/sgml/pwp.pl +705 -0
  409. package/lib/swipl/library/ext/sgml/sgml.pl +815 -0
  410. package/lib/swipl/library/ext/sgml/sgml_write.pl +1003 -0
  411. package/lib/swipl/library/ext/sgml/xpath.pl +620 -0
  412. package/lib/swipl/library/ext/sgml/xsdp_types.pl +232 -0
  413. package/lib/swipl/library/ext/ssl/INDEX.pl +60 -0
  414. package/lib/swipl/library/ext/ssl/crypto.pl +1015 -0
  415. package/lib/swipl/library/ext/ssl/http/INDEX.pl +5 -0
  416. package/lib/swipl/library/ext/ssl/http/http_ssl_plugin.pl +296 -0
  417. package/lib/swipl/library/ext/ssl/saml.pl +609 -0
  418. package/lib/swipl/library/ext/ssl/ssl.pl +647 -0
  419. package/lib/swipl/library/ext/ssl/xmldsig.pl +391 -0
  420. package/lib/swipl/library/ext/ssl/xmlenc.pl +354 -0
  421. package/lib/swipl/library/ext/zlib/INDEX.pl +8 -0
  422. package/lib/swipl/library/ext/zlib/zlib.pl +112 -0
  423. package/lib/swipl/library/fastrw.pl +105 -0
  424. package/lib/swipl/library/files.pl +80 -0
  425. package/lib/swipl/library/gensym.pl +111 -0
  426. package/lib/swipl/library/git.pl +1027 -0
  427. package/lib/swipl/library/hashtable.pl +365 -0
  428. package/lib/swipl/library/heaps.pl +252 -0
  429. package/lib/swipl/library/hotfix.pl +239 -0
  430. package/lib/swipl/library/http/jquery.pl +103 -0
  431. package/lib/swipl/library/http/web/js/jquery-3.6.0.min.js +2 -0
  432. package/lib/swipl/library/increval.pl +217 -0
  433. package/lib/swipl/library/intercept.pl +263 -0
  434. package/lib/swipl/library/iostream.pl +237 -0
  435. package/lib/swipl/library/iri_scheme/file.pl +70 -0
  436. package/lib/swipl/library/lazy_lists.pl +481 -0
  437. package/lib/swipl/library/listing.pl +1362 -0
  438. package/lib/swipl/library/lists.pl +860 -0
  439. package/lib/swipl/library/lynx/INDEX.pl +14 -0
  440. package/lib/swipl/library/lynx/format.pl +380 -0
  441. package/lib/swipl/library/lynx/html_style.pl +129 -0
  442. package/lib/swipl/library/lynx/html_text.pl +865 -0
  443. package/lib/swipl/library/lynx/pldoc_style.pl +87 -0
  444. package/lib/swipl/library/macros.pl +451 -0
  445. package/lib/swipl/library/main.pl +1200 -0
  446. package/lib/swipl/library/make.pl +197 -0
  447. package/lib/swipl/library/modules.pl +129 -0
  448. package/lib/swipl/library/nb_rbtrees.pl +267 -0
  449. package/lib/swipl/library/nb_set.pl +203 -0
  450. package/lib/swipl/library/obfuscate.pl +115 -0
  451. package/lib/swipl/library/occurs.pl +241 -0
  452. package/lib/swipl/library/operators.pl +182 -0
  453. package/lib/swipl/library/option.pl +388 -0
  454. package/lib/swipl/library/optparse.pl +966 -0
  455. package/lib/swipl/library/ordsets.pl +518 -0
  456. package/lib/swipl/library/oset.pl +160 -0
  457. package/lib/swipl/library/pairs.pl +187 -0
  458. package/lib/swipl/library/persistency.pl +713 -0
  459. package/lib/swipl/library/pio.pl +47 -0
  460. package/lib/swipl/library/portray_text.pl +277 -0
  461. package/lib/swipl/library/pprint.pl +940 -0
  462. package/lib/swipl/library/predicate_options.pl +975 -0
  463. package/lib/swipl/library/prolog_autoload.pl +233 -0
  464. package/lib/swipl/library/prolog_breakpoints.pl +396 -0
  465. package/lib/swipl/library/prolog_clause.pl +1104 -0
  466. package/lib/swipl/library/prolog_code.pl +416 -0
  467. package/lib/swipl/library/prolog_codewalk.pl +1248 -0
  468. package/lib/swipl/library/prolog_colour.pl +3301 -0
  469. package/lib/swipl/library/prolog_colour.qlf +0 -0
  470. package/lib/swipl/library/prolog_config.pl +154 -0
  471. package/lib/swipl/library/prolog_coverage.pl +1333 -0
  472. package/lib/swipl/library/prolog_debug.pl +404 -0
  473. package/lib/swipl/library/prolog_deps.pl +675 -0
  474. package/lib/swipl/library/prolog_evaluable.pl +234 -0
  475. package/lib/swipl/library/prolog_format.pl +219 -0
  476. package/lib/swipl/library/prolog_history.pl +161 -0
  477. package/lib/swipl/library/prolog_jiti.pl +333 -0
  478. package/lib/swipl/library/prolog_locale.pl +61 -0
  479. package/lib/swipl/library/prolog_metainference.pl +307 -0
  480. package/lib/swipl/library/prolog_pack.pl +3906 -0
  481. package/lib/swipl/library/prolog_profile.pl +346 -0
  482. package/lib/swipl/library/prolog_qlfmake.pl +533 -0
  483. package/lib/swipl/library/prolog_source.pl +1188 -0
  484. package/lib/swipl/library/prolog_stack.pl +794 -0
  485. package/lib/swipl/library/prolog_trace.pl +365 -0
  486. package/lib/swipl/library/prolog_versions.pl +347 -0
  487. package/lib/swipl/library/prolog_wrap.pl +164 -0
  488. package/lib/swipl/library/prolog_xref.pl +3090 -0
  489. package/lib/swipl/library/prolog_xref.qlf +0 -0
  490. package/lib/swipl/library/pure_input.pl +266 -0
  491. package/lib/swipl/library/qpforeign.pl +695 -0
  492. package/lib/swipl/library/qsave.pl +1516 -0
  493. package/lib/swipl/library/quasi_quotations.pl +300 -0
  494. package/lib/swipl/library/quintus.pl +437 -0
  495. package/lib/swipl/library/random.pl +459 -0
  496. package/lib/swipl/library/rbtrees.pl +1153 -0
  497. package/lib/swipl/library/readln.pl +256 -0
  498. package/lib/swipl/library/readutil.pl +304 -0
  499. package/lib/swipl/library/record.pl +544 -0
  500. package/lib/swipl/library/rwlocks.pl +172 -0
  501. package/lib/swipl/library/sandbox.pl +1384 -0
  502. package/lib/swipl/library/semweb/dc.rdfs +198 -0
  503. package/lib/swipl/library/semweb/eor.rdfs +95 -0
  504. package/lib/swipl/library/semweb/owl.owl +287 -0
  505. package/lib/swipl/library/semweb/rdf_library.ttl +90 -0
  506. package/lib/swipl/library/semweb/rdfs.rdfs +251 -0
  507. package/lib/swipl/library/settings.pl +755 -0
  508. package/lib/swipl/library/shell.pl +462 -0
  509. package/lib/swipl/library/shlib.pl +670 -0
  510. package/lib/swipl/library/solution_sequences.pl +439 -0
  511. package/lib/swipl/library/sort.pl +119 -0
  512. package/lib/swipl/library/statistics.pl +541 -0
  513. package/lib/swipl/library/streams.pl +118 -0
  514. package/lib/swipl/library/strings.pl +469 -0
  515. package/lib/swipl/library/system.pl +95 -0
  516. package/lib/swipl/library/tables.pl +381 -0
  517. package/lib/swipl/library/tableutil.pl +771 -0
  518. package/lib/swipl/library/tabling.pl +42 -0
  519. package/lib/swipl/library/terms.pl +457 -0
  520. package/lib/swipl/library/theme/auto.pl +61 -0
  521. package/lib/swipl/library/theme/dark.pl +455 -0
  522. package/lib/swipl/library/theme/light.pl +45 -0
  523. package/lib/swipl/library/thread.pl +810 -0
  524. package/lib/swipl/library/thread_pool.pl +508 -0
  525. package/lib/swipl/library/threadutil.pl +574 -0
  526. package/lib/swipl/library/tty.pl +316 -0
  527. package/lib/swipl/library/ugraphs.pl +644 -0
  528. package/lib/swipl/library/unicode/INDEX.pl +6 -0
  529. package/lib/swipl/library/unicode/blocks.pl +414 -0
  530. package/lib/swipl/library/url.pl +1129 -0
  531. package/lib/swipl/library/utf8.pl +145 -0
  532. package/lib/swipl/library/varnumbers.pl +221 -0
  533. package/lib/swipl/library/vm.pl +251 -0
  534. package/lib/swipl/library/wfs.pl +205 -0
  535. package/lib/swipl/library/when.pl +263 -0
  536. package/lib/swipl/library/writef.pl +278 -0
  537. package/lib/swipl/library/www_browser.pl +251 -0
  538. package/lib/swipl/library/yall.pl +574 -0
  539. package/lib/swipl/library/zip.pl +211 -0
  540. package/lib/swipl/swipl.home +1 -0
  541. package/lib/vendor/libcrypto.so.3 +0 -0
  542. package/lib/vendor/libpcre2-8.so.0 +0 -0
  543. package/lib/vendor/libssl.so.3 +0 -0
  544. package/lib/vendor/libz.so.1 +0 -0
  545. package/licenses/OpenSSL-LICENSE.txt +177 -0
  546. package/licenses/PCRE2-COPYING +5 -0
  547. package/licenses/README.md +12 -0
  548. package/licenses/SWI-Prolog-LICENSE +41 -0
  549. package/licenses/zlib-LICENSE +22 -0
  550. package/package.json +27 -0
@@ -0,0 +1,609 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Matt Lilley
4
+ E-mail: thetrime@gmail.com
5
+ WWW: http://www.swi-prolog.org
6
+ Copyright (c) 2004-2016, SWI-Prolog Foundation
7
+ VU University Amsterdam
8
+ All rights reserved.
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+ modification, are permitted provided that the following conditions
12
+ are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright
15
+ notice, this list of conditions and the following disclaimer.
16
+
17
+ 2. Redistributions in binary form must reproduce the above copyright
18
+ notice, this list of conditions and the following disclaimer in
19
+ the documentation and/or other materials provided with the
20
+ distribution.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ POSSIBILITY OF SUCH DAMAGE.
34
+ */
35
+
36
+ :-module(saml,
37
+ [saml_authenticate/4]).
38
+
39
+ :- autoload(library(base64),[base64/2]).
40
+ :- autoload(library(crypto),[rsa_sign/4,hex_bytes/2]).
41
+ :- use_module(library(debug),[debug/3,debugging/1]).
42
+ :- autoload(library(error),
43
+ [domain_error/2,existence_error/2,permission_error/3]).
44
+ :- autoload(library(lists),[member/2,subtract/3,select/3]).
45
+ :- autoload(library(memfile),
46
+ [ new_memory_file/1,
47
+ open_memory_file/4,
48
+ memory_file_to_atom/2,
49
+ free_memory_file/1
50
+ ]).
51
+ :- autoload(library(quintus),[otherwise/0]).
52
+ :- autoload(library(sgml),[load_structure/3]).
53
+ :- autoload(library(sgml_write),[xml_write/3]).
54
+ :- autoload(library(sha),[sha_hash/3]).
55
+ :- autoload(library(ssl),
56
+ [load_private_key/3,load_certificate/2,same_certificate/2]).
57
+ :- autoload(library(url),[parse_url/2,parse_url_search/2]).
58
+ :- autoload(library(uuid),[uuid/1]).
59
+ :- autoload(library(xmldsig),[xmld_verify_signature/4]).
60
+ :- autoload(library(xmlenc),
61
+ [load_certificate_from_base64_string/2,decrypt_xml/4]).
62
+ :- autoload(library(zlib),[zopen/3]).
63
+ :- autoload(library(http/http_client),[http_read_data/3]).
64
+ :- autoload(library(http/http_dispatch),[http_redirect/3]).
65
+ :- autoload(library(http/http_path),[http_absolute_location/3]).
66
+ :- autoload(library(http/http_open),[http_open/3]).
67
+
68
+ /** <module> SAML Authentication
69
+
70
+ This library uses SAML to exchange messages with an Identity Provider to establish
71
+ assertions about the current user's session. It operates only as the service end, not
72
+ the identity provider end.
73
+
74
+ @see https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
75
+
76
+ There are four primary integration points for applications to use this code:
77
+ 1) You must declare at least one service provider (SP)
78
+ 2) You must declare at least one identity provider (IdP) per SP
79
+ 3) Finally, you can call saml_authenticate(+SP, +IdP, +Callback, +Request) to obtain assertions
80
+ The asynchronous nature of the SAML process means that a callback must be used. Assuming
81
+ that the IdP was able to provide at least some valid assertions about the user, after calling
82
+ Callback with 2 extra arguments (a list of the assertion terms and the URL being request by
83
+ the user), the user will be redirected back to their original URL. It is therefore up to the
84
+ callback to ensure that this does not simply trigger another round of SAML negotiations - for
85
+ example, by throwing http_reply(forbidden(RequestURL)) if the assertions are not strong enough
86
+ 4) Finally, your SP metadata will be available from the web server directly. This is required to
87
+ configure the IdP. This will be available at './metadata.xml', relative to the LocationSpec
88
+ provided when the SP was declared.
89
+
90
+ Configuring an SP:
91
+ To declare an SP, use the declaration
92
+ :-saml_sp(+ServiceProvider: atom,
93
+ +LocationSpec: term,
94
+ +PrivateKeySpec: term,
95
+ +Password: atom
96
+ +CertificateSpec: term,
97
+ +Options: list).
98
+
99
+ The ServiceProvider is the identifier of your service. Ideally, this should be a fully-qualified URI
100
+ The LocationSpec is a location that the HTTP dispatch layer will understand
101
+ for example '.' or root('saml').
102
+ The Private KeySpec is a 'file specifier' that resolves to a private key (see below for specifiers)
103
+ The Password is a password used for reading the private key. If the key is not encrypted, any atom
104
+ can be supplied as it will be ignored
105
+ The CertificateSpec is a file specifier that resolves to a certificate holding the public key
106
+ corresponding to PrivateKeySPec
107
+ There are currently no implemented options (the list is ignored).
108
+
109
+ Configuring an IdP:
110
+ To declare an IdP, use the declaration
111
+ :-saml_idp(+ServiceProvider: atom,
112
+ +MetadataSpec: term).
113
+ ServiceProvider is the identifier used when declaring your SP. You do not need to declare them in a
114
+ particular order, but both must be present in the system before running saml_authenticate/4.
115
+ MetadataSpec is a file specifier that resolves to the metadata for the IdP. Most IdPs will be able
116
+ to provide this on request
117
+
118
+
119
+ File Specifiers:
120
+ The following specifiers are supported for locating files:
121
+ * file(Filename): The local file Filename
122
+ * resource(Resource): The prolog resource Resource. See resource/3
123
+ * url(URL): The file identified by the HTTP (or HTTPS if you have the HTTPS plugin loaded) URL
124
+
125
+
126
+
127
+ */
128
+
129
+ user:term_expansion(:-saml_idp(ServiceProvider, MetadataFile), Clauses):-
130
+ saml_idp_clauses(ServiceProvider, MetadataFile, Clauses).
131
+
132
+ user:term_expansion(:-saml_sp(ServiceProvider, Spec, KeyFile, Password, CertFile, Options),
133
+ [saml:saml_acs_path(ServiceProvider, ACSPath),
134
+ saml:saml_sp_certificate(ServiceProvider, Certificate, PEMData, PrivateKey),
135
+ ( :-http_handler(MetadataPath, saml:saml_metadata(ServiceProvider, Options), [])),
136
+ ( :-http_handler(ACSPath, saml:saml_acs_handler(ServiceProvider, Options), []))]):-
137
+ http_absolute_location(Spec, Root, []),
138
+ atom_concat(Root, '/auth', ACSPath),
139
+ atom_concat(Root, '/metadata.xml', MetadataPath),
140
+ read_key(KeyFile, Password, PrivateKey),
141
+ read_certificate(CertFile, Certificate, PEMData).
142
+
143
+ read_key(Spec, Password, Key):-
144
+ setup_call_cleanup(open_spec(Spec, Stream),
145
+ load_private_key(Stream, Password, Key),
146
+ close(Stream)).
147
+
148
+ read_certificate(Spec, Certificate, PEMData):-
149
+ setup_call_cleanup(open_spec(Spec, Stream1),
150
+ read_string(Stream1, _, PEMData),
151
+ close(Stream1)),
152
+ setup_call_cleanup(open_string(PEMData, Stream2),
153
+ load_certificate(Stream2, Certificate),
154
+ close(Stream2)).
155
+
156
+ open_spec(Spec, Stream):-
157
+ ( Spec = file(Filename)
158
+ -> open(Filename, read, Stream)
159
+ ; Spec = resource(Name)
160
+ -> open_resource(Name, read, Stream)
161
+ ; Spec = url(URL)
162
+ -> http_open(URL, Stream, [])
163
+ ; domain_error(file_specification, Spec)
164
+ ).
165
+
166
+ :-multifile(saml:saml_sp_certificate/4).
167
+ :-multifile(saml:saml_idp/3).
168
+ :-multifile(saml:saml_idp_certificate/4).
169
+ :-multifile(saml:saml_idp_binding/4).
170
+ :-multifile(saml:saml_acs_path/2).
171
+
172
+ saml_idp_clauses(ServiceProvider, MetadataSpec, Clauses):-
173
+ setup_call_cleanup(open_spec(MetadataSpec, Stream),
174
+ load_structure(Stream, Metadata, [dialect(xmlns)]),
175
+ close(Stream)),
176
+ ( memberchk(element('urn:oasis:names:tc:SAML:2.0:metadata':'EntitiesDescriptor', _, EntitiesDescriptor), Metadata)
177
+ -> ( memberchk(element('urn:oasis:names:tc:SAML:2.0:metadata':'EntityDescriptor', EntityDescriptorAttributes, EntityDescriptor), EntitiesDescriptor),
178
+ memberchk(element('urn:oasis:names:tc:SAML:2.0:metadata':'IDPSSODescriptor', IDPSSODescriptorAttributes, IDPSSODescriptor), EntityDescriptor)
179
+ -> trust_saml_idp_descriptor(ServiceProvider, EntityDescriptorAttributes, IDPSSODescriptorAttributes, IDPSSODescriptor, Clauses)
180
+ ; existence_error(idp_descriptor, MetadataSpec)
181
+ )
182
+ ; memberchk(element('urn:oasis:names:tc:SAML:2.0:metadata':'EntityDescriptor', EntityDescriptorAttributes, EntityDescriptor), Metadata),
183
+ memberchk(element('urn:oasis:names:tc:SAML:2.0:metadata':'IDPSSODescriptor', IDPSSODescriptorAttributes, IDPSSODescriptor), EntityDescriptor)
184
+ -> trust_saml_idp_descriptor(ServiceProvider, EntityDescriptorAttributes, IDPSSODescriptorAttributes, IDPSSODescriptor, Clauses)
185
+ ; existence_error(idp_descriptor, MetadataSpec)
186
+ ).
187
+
188
+ trust_saml_idp_descriptor(ServiceProvider,
189
+ EntityDescriptorAttributes,
190
+ IDPSSODescriptorAttributes,
191
+ IDPSSODescriptor,
192
+ [saml:saml_idp(ServiceProvider, EntityID, MustSign)|Clauses]):-
193
+ memberchk(entityID=EntityID, EntityDescriptorAttributes),
194
+ findall(saml:saml_idp_binding(ServiceProvider, EntityID, Binding, BindingInfo),
195
+ ( member(element('urn:oasis:names:tc:SAML:2.0:metadata':'SingleSignOnService', SingleSignOnServiceAttributes, SingleSignOnService), IDPSSODescriptor),
196
+ process_saml_binding(SingleSignOnServiceAttributes, SingleSignOnService, Binding, BindingInfo)
197
+ ),
198
+ Clauses,
199
+ Tail),
200
+ ( Tail == Clauses
201
+ -> existence_error(supported_binding, IDPSSODescriptor)
202
+ ; true
203
+ ),
204
+ findall(saml:saml_idp_certificate(ServiceProvider, EntityID, CertificateUse, Certificate),
205
+ idp_certificate(IDPSSODescriptor, CertificateUse, Certificate),
206
+ Tail),
207
+ ( memberchk('WantAuthnRequestsSigned'=true, IDPSSODescriptorAttributes)
208
+ -> MustSign = true
209
+ ; MustSign = false
210
+ ).
211
+
212
+ idp_certificate(IDPSSODescriptor, CertificateUse, Certificate):-
213
+ member(element('urn:oasis:names:tc:SAML:2.0:metadata':'KeyDescriptor', KeyDescriptorAttributes, KeyDescriptor), IDPSSODescriptor),
214
+ memberchk(use=CertificateUse, KeyDescriptorAttributes),
215
+ memberchk(element('http://www.w3.org/2000/09/xmldsig#':'KeyInfo', _, KeyInfo), KeyDescriptor),
216
+ memberchk(element('http://www.w3.org/2000/09/xmldsig#':'X509Data', _, X509Data), KeyInfo),
217
+ memberchk(element('http://www.w3.org/2000/09/xmldsig#':'X509Certificate', _, [X509CertificateData]), X509Data),
218
+ load_certificate_from_base64_string(X509CertificateData, Certificate).
219
+
220
+
221
+ process_saml_binding(SingleSignOnServiceAttributes, _, 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', Location):-
222
+ memberchk('Binding'='urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', SingleSignOnServiceAttributes),
223
+ !,
224
+ memberchk('Location'=Location, SingleSignOnServiceAttributes).
225
+
226
+ process_saml_binding(SingleSignOnServiceAttributes, _, 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', Location):-
227
+ memberchk('Binding'='urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', SingleSignOnServiceAttributes),
228
+ !,
229
+ memberchk('Location'=Location, SingleSignOnServiceAttributes).
230
+
231
+
232
+
233
+ form_authn_request(Request, ID, Destination, Date, ServiceProvider, ExtraElements, XML):-
234
+ saml_acs_path(ServiceProvider, Path),
235
+ subtract(Request, [path(_), search(_)], Request1),
236
+ parse_url(ACSURL, [path(Path)|Request1]),
237
+ SAMLP = 'urn:oasis:names:tc:SAML:2.0:protocol',
238
+ SAML = 'urn:oasis:names:tc:SAML:2.0:assertion',
239
+ XML = element(SAMLP:'AuthnRequest', ['ID'=ID,
240
+ 'Version'='2.0',
241
+ 'IssueInstant'=Date,
242
+ 'Destination'=Destination,
243
+ 'IsPassive'=false,
244
+ 'ProtocolBinding'='urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
245
+ 'AssertionConsumerServiceURL'=ACSURL],
246
+ [element(SAML:'Issuer', [], [ServiceProvider]),
247
+ element(SAMLP:'NameIDPolicy', ['AllowCreate'=true,
248
+ 'Format'='urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified'], [])|ExtraElements]).
249
+
250
+
251
+ :-meta_predicate(saml_authenticate(+, +, 2, +)).
252
+ saml_authenticate(ServiceProvider, IdentityProvider, Callback, Request):-
253
+ memberchk(request_uri(RequestingURI), Request),
254
+ format(atom(RelayState), '~q', [saml(RequestingURI, Callback)]),
255
+ get_xml_timestamp(Date),
256
+ uuid(UUID),
257
+ % the ID must start with a letter but the UUID may start with a number. Resolve this by prepending an 'a'
258
+ atom_concat(a, UUID, ID),
259
+ saml_idp(ServiceProvider, IdentityProvider, _MustSign),
260
+ % Always sign the request
261
+ MustSign = true,
262
+ XMLOptions = [header(false), layout(false)],
263
+ ( saml_idp_binding(ServiceProvider, IdentityProvider, 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', BaseURL)
264
+ -> parse_url(BaseURL, Parts),
265
+ form_authn_request(Request, ID, BaseURL, Date, ServiceProvider, [], XML),
266
+ with_output_to(string(XMLString), xml_write(current_output, XML, XMLOptions)),
267
+ debug(saml, 'XML:~n~s~n', [XMLString]),
268
+ setup_call_cleanup(new_memory_file(MemFile),
269
+ (setup_call_cleanup(open_memory_file(MemFile, write, MemWrite, [encoding(octet)]),
270
+ (setup_call_cleanup(zopen(MemWrite, Write, [format(raw_deflate), level(9), close_parent(false)]),
271
+ format(Write, '~s', [XMLString]),
272
+ close(Write))
273
+ ),
274
+ close(MemWrite)),
275
+ memory_file_to_atom(MemFile, SAMLRequestRaw)
276
+ ),
277
+ free_memory_file(MemFile)),
278
+ base64(SAMLRequestRaw, SAMLRequest),
279
+ debug(saml, 'Encoded request: ~w~n', [SAMLRequest]),
280
+ ( MustSign == true
281
+ -> saml_sp_certificate(ServiceProvider, _, _, PrivateKey),
282
+ saml_sign(PrivateKey, XMLString, SAMLRequest, RelayState, ExtraParameters)
283
+ ; ExtraParameters = []
284
+ )
285
+ ; domain_error(supported_binding, IdentityProvider) % Other bindings could be implemented here, most obviously HTTP-POST and HTTP-POST-SimpleSign
286
+ ),
287
+ parse_url(IdPURL, [search(['SAMLRequest'=SAMLRequest, 'RelayState'=RelayState|ExtraParameters])|Parts]),
288
+ debug(saml, 'Redirecting user to~n~w~n', [IdPURL]),
289
+ http_redirect(moved_temporary, IdPURL, Request).
290
+
291
+ saml_simple_sign(PrivateKey, XMLString, _SAMLRequest, RelayState, ['SigAlg'=SigAlg,'Signature'=Signature]):-
292
+ SigAlg = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1',
293
+ format(string(DataToSign), 'SAMLRequest=~s&RelayState=~w&SigAlg=~w', [XMLString, RelayState, SigAlg]),
294
+ debug(saml, 'Data to sign with HTTP-Redirect-SimpleSign:~n~s~n', [DataToSign]),
295
+ sha_hash(DataToSign, Digest, [algorithm(sha1)]),
296
+ rsa_sign(PrivateKey, Digest, RawSignature,
297
+ [ type(sha1),
298
+ encoding(octet)
299
+ ]),
300
+ base64(RawSignature, Signature),
301
+ debug(saml, 'Signature:~n~w~n', [Signature]).
302
+
303
+ saml_sign(PrivateKey, _XMLString, SAMLRequest, RelayState, ['SigAlg'=SigAlg,'Signature'=Base64Signature]):-
304
+ SigAlg = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1',
305
+ parse_url_search(CodesToSign, ['SAMLRequest'=SAMLRequest, 'RelayState'=RelayState, 'SigAlg'=SigAlg]),
306
+ string_codes(DataToSign, CodesToSign),
307
+ debug(saml, 'Data to sign with HTTP-Redirect binding:~n~s~n', [DataToSign]),
308
+ sha_hash(DataToSign, Digest, [algorithm(sha1)]),
309
+ rsa_sign(PrivateKey, Digest, HexSignature,
310
+ [ type(sha1),
311
+ encoding(octet)
312
+ ]),
313
+ hex_bytes(HexSignature, SignatureBytes),
314
+ atom_codes(SignatureAtom, SignatureBytes),
315
+ base64(SignatureAtom, Base64Signature),
316
+ debug(saml, '~nSignature:~n~w~n', [Base64Signature]).
317
+
318
+ saml_acs_handler(ServiceProvider, Options, Request):-
319
+ debug(saml, 'Got a message back from IdP!~n', []),
320
+ http_read_data(Request, PostedData, []),
321
+ debug(saml, '~w~n', [PostedData]),
322
+ memberchk('SAMLResponse'=Atom, PostedData),
323
+ memberchk('RelayState'=Relay, PostedData),
324
+ ( atom_to_term(Relay, saml(OriginalURI, Callback), _)
325
+ -> true
326
+ ; throw(error(invalid_request, _))
327
+ ),
328
+ base64(RawData, Atom),
329
+ atom_string(RawData, RawString),
330
+ setup_call_cleanup(open_string(RawString, Stream),
331
+ load_structure(Stream, XML, [dialect(xmlns), keep_prefix(true)]),
332
+ close(Stream)),
333
+ ( debugging(saml)
334
+ -> xml_write(user_error, XML, [])
335
+ ; true
336
+ ),
337
+ process_saml_response(XML, ServiceProvider, Callback, OriginalURI, Options),
338
+ debug(saml, 'Redirecting successfully authenticated user to ~w~n', [OriginalURI]),
339
+ http_redirect(moved_temporary, OriginalURI, Request).
340
+
341
+
342
+ propagate_ns([], _, []):- !.
343
+ propagate_ns([element(Tag, Attributes, Children)|Siblings],
344
+ NS,
345
+ [element(Tag, NewAttributes, NewChildren)|NewSiblings]):-
346
+ !,
347
+ merge_ns(NS, Attributes, NewAttributes, NewNS),
348
+ propagate_ns(Children, NewNS, NewChildren),
349
+ propagate_ns(Siblings, NS, NewSiblings).
350
+ propagate_ns([X|Siblings], NS, [X|NewSiblings]):-
351
+ propagate_ns(Siblings, NS, NewSiblings).
352
+
353
+ merge_ns([xmlns:Prefix=Value|NS], Attributes, NewAttributes, NewNS):-
354
+ ( select(xmlns:Prefix=NewValue, Attributes, A1)
355
+ -> NewNS = [xmlns:Prefix=NewValue|T],
356
+ NewAttributes = [xmlns:Prefix=NewValue|N]
357
+ ; A1 = Attributes,
358
+ NewNS = [xmlns:Prefix=Value|T],
359
+ NewAttributes = [xmlns:Prefix=Value|N]
360
+ ),
361
+ merge_ns(NS, A1, N, T).
362
+
363
+ merge_ns([], A, A, NS):-
364
+ findall(xmlns:Prefix=Value, member(xmlns:Prefix=Value, A), NS).
365
+
366
+
367
+ :-meta_predicate(process_saml_response(+, +, 2, +, +)).
368
+ process_saml_response(XML0, ServiceProvider, Callback, RequestURL, Options):-
369
+ SAMLP = 'urn:oasis:names:tc:SAML:2.0:protocol',
370
+ SAML = 'urn:oasis:names:tc:SAML:2.0:assertion',
371
+ DS = 'http://www.w3.org/2000/09/xmldsig#',
372
+ propagate_ns(XML0, [], XML),
373
+ XML = [element(ns(_, SAMLP):'Response', _, Response)],
374
+ % Response MAY contain the following elements : Issuer, Signature, Extensions
375
+ % Response MAY contain the following attributes: InResponseTo, Destination, Consent
376
+ % Response MUST contain the following elements : Status
377
+ % Response MUST contain the following attributes: ID, IssueInstant, Version
378
+ ( memberchk(element(ns(_, SAMLP):'Status', _StatusAttributes, Status), Response)->
379
+ % Status MUST contain a StatusCode element, and MAY contain a StatusMessage and or StatusDetail element
380
+ ( memberchk(element(ns(_, SAMLP):'StatusCode', StatusCodeAttributes, _StatusCode), Status)->
381
+ % StatusCode MUST contain a Value attribute
382
+ ( memberchk('Value'=StatusCodeValue, StatusCodeAttributes)->
383
+ true
384
+ ; domain_error(legal_saml_response, XML0)
385
+ )
386
+ ; domain_error(legal_saml_response, XML0)
387
+ )
388
+ ; domain_error(legal_saml_response, XML0)
389
+ ),
390
+ ( memberchk(element(ns(_, SAML):'Issuer', _, [IssuerName]), Response)
391
+ -> true
392
+ ; IssuerName = {null}
393
+ ),
394
+
395
+ ( member(element(ns(_, DS):'Signature', _, Signature), Response)->
396
+ xmld_verify_signature(XML, Signature, Certificate, []),
397
+ % Check that the certificate used to sign was one in the metadata
398
+ ( saml_idp_certificate(ServiceProvider, IssuerName, signing, IDPCertificate),
399
+ same_certificate(Certificate, IDPCertificate)
400
+ -> true
401
+ ; domain_error(trusted_certificate, Certificate)
402
+ )
403
+ ; otherwise->
404
+ % Warning: Message is not signed. Assertions may be though
405
+ % FIXME: Determine a policy for handling this - if the SP wants them signed, we must make sure they are
406
+ true
407
+ ),
408
+
409
+ ( StatusCodeValue == 'urn:oasis:names:tc:SAML:2.0:status:Success'->
410
+ % The user has authenticated in some capacity.
411
+ % Note that we cannot say anything ABOUT the user yet. That will come once we process the assertions
412
+ true
413
+ ; StatusCodeValue == 'urn:oasis:names:tc:SAML:2.0:status:Requester'->
414
+ throw(saml_rejected(requester))
415
+ ; StatusCodeValue == 'urn:oasis:names:tc:SAML:2.0:status:Responder'->
416
+ throw(saml_rejected(responder))
417
+ ; StatusCodeValue == 'urn:oasis:names:tc:SAML:2.0:status:VersionMismatch'->
418
+ throw(saml_rejected(version_mismatch))
419
+ ; throw(saml_rejected(illegal_response))
420
+ ),
421
+
422
+ % Response MAY also contain 0..N of the following elements: Assertion, EncryptedAssertion.
423
+ findall(Attribute,
424
+ ( ( member(element(ns(SAMLPrefix, SAML):'Assertion', AssertionAttributes, Assertion), Response),
425
+ process_assertion(ServiceProvider, IssuerName, XML, AssertionAttributes, Assertion, Attribute))
426
+ ; member(element(ns(SAMLPrefix, SAML):'EncryptedAssertion', _, EncryptedAssertion), Response),
427
+ decrypt_xml(EncryptedAssertion, DecryptedAssertion, saml:saml_key_callback(ServiceProvider), Options),
428
+ member(element(ns(_, SAML):'Assertion', AssertionAttributes, Assertion), DecryptedAssertion),
429
+ process_assertion(ServiceProvider, IssuerName, XML, AssertionAttributes, Assertion, Attribute)
430
+ ),
431
+ AcceptedAttributes),
432
+ debug(saml, 'Calling SAML callback with these attributes: ~w', [AcceptedAttributes]),
433
+ call(Callback, RequestURL, AcceptedAttributes).
434
+
435
+ process_assertion(ServiceProvider, _EntityID, Document, Attributes, Assertion, AssertedAttribute):-
436
+ SAML = ns(_, 'urn:oasis:names:tc:SAML:2.0:assertion'),
437
+ DS = ns(_, 'http://www.w3.org/2000/09/xmldsig#'),
438
+ ( memberchk('ID'=_AssertionID, Attributes)->
439
+ true
440
+ ; throw(missing_assertion_id)
441
+ ),
442
+ % An Assertion MUST contain an Issuer, and MAY contain a Signature, Subject, Conditions, Advice, plus 0..N of the following:
443
+ % Statement
444
+ % AuthnStatement
445
+ % AuthzDecisionStatement
446
+ % AttributeStatement
447
+ % It must also have all the following attributes, Version, ID, IssueInstant
448
+ memberchk(element(SAML:'Issuer', _, [IssuerName]), Assertion),
449
+ debug(saml, 'Received assertion from IdP ~w', [IssuerName]),
450
+ ( member(element(DS:'Signature', _, Signature), Assertion)->
451
+ xmld_verify_signature(Document, Signature, Certificate, []),
452
+ % Check that the certificate used to sign was one in the metadata
453
+ ( saml_idp_certificate(ServiceProvider, IssuerName, signing, IDPCertificate),
454
+ same_certificate(Certificate, IDPCertificate)
455
+ -> true
456
+ ; domain_error(trusted_certificate, Certificate)
457
+ )
458
+ ; otherwise->
459
+ % Technically the standard allows this, but it seems like practically it would be useless?
460
+ % Which part of the response SHOULD be signed? The entire thing or the assertions?
461
+ true
462
+ %throw(unsigned_response)
463
+ ),
464
+ ( memberchk(element(SAML:'Conditions', ConditionsAttributes, Conditions), Assertion)->
465
+ % If conditions are present, we MUST check them. These can include arbitrary, user-defined conditions
466
+ % and things like ProxyRestriction and OneTimeUse
467
+ get_xml_timestamp(Date),
468
+ ( memberchk('NotOnOrAfter'=Expiry, ConditionsAttributes)->
469
+ Date @< Expiry
470
+ ; true
471
+ ),
472
+ ( memberchk('NotBefore'=Expiry, ConditionsAttributes)->
473
+ Date @> Expiry
474
+ ; true
475
+ ),
476
+ forall(member(element(SAML:'Condition', ConditionAttributes, Condition), Conditions),
477
+ condition_holds(ConditionAttributes, Condition)),
478
+ forall(member(element(SAML:'AudienceRestriction', _AudienceRestrictionAttributes, AudienceRestriction), Conditions),
479
+ ( member(element(SAML:'Audience', _, [Audience]), AudienceRestriction),
480
+ Audience == ServiceProvider
481
+ -> true
482
+ ; permission_error(accept, assertion, AudienceRestriction)
483
+ )),
484
+ ( memberchk(element(SAML:'OneTimeUse', _, _), Conditions)->
485
+ throw(one_time_use_not_supported)
486
+ ; true
487
+ ),
488
+ ( memberchk(element(SAML:'ProxyRestriction', _, _), Conditions)->
489
+ throw(proxy_restriction_not_supported)
490
+ ; true
491
+ )
492
+ ; true
493
+ ),
494
+ % The Subject element is not mandatory. In the introduction to section 2, the specification states
495
+ % "the <Subject> element is optional, and other specifications and profiles may utilize the SAML assertion
496
+ % structure to make similar statements without specifying a subject, or possibly specifying the subject in an
497
+ % alternate way"
498
+ % However, 2.3.3 goes on to say that
499
+ % "SAML itself defines no such statements, and an assertion without a subject has no defined meaning in this specification."
500
+ % Specifically, 2.7.2, 2.7.3, 2.7.4 enumerate all the SAML-defined statements, and all of them say that the assertion MUST
501
+ % contain a subject
502
+ ( memberchk(element(SAML:'Subject', _, Subject), Assertion)
503
+ -> memberchk(element(SAML:'NameID', _, [_0IdPName]), Subject),
504
+ debug(saml, 'Assertion is for subject ~w', [_0IdPName]),
505
+ % Note that it is not mandatory for there to be any SubjectConfirmation in the message, however, since we must verify at least one
506
+ % confirmation in order to trust that the subject has really associated with the IdP, a subject with no confirmations is useless anyway
507
+ ( member(element(SAML:'SubjectConfirmation', SubjectConfirmationAttributes, SubjectConfirmation), Subject),
508
+ subject_confirmation_is_valid(SubjectConfirmationAttributes, SubjectConfirmation)
509
+ -> debug(saml, 'Subject is confirmed', [])
510
+ ; debug(saml, 'No valid subject confirmation could be found', []),
511
+ throw(no_subject_confirmation)
512
+ )
513
+ ; throw(not_supported(assertion_without_subject))
514
+ ),
515
+ !,
516
+ memberchk(element(SAML:'AttributeStatement', _, AttributeStatement), Assertion),
517
+ member(element(SAML:'Attribute', AttributeAttributes, Attribute), AttributeStatement),
518
+ memberchk('Name'=AttributeName, AttributeAttributes),
519
+ ( memberchk('FriendlyName'=FriendlyName, AttributeAttributes)
520
+ -> true
521
+ ; FriendlyName = ''
522
+ ),
523
+ memberchk(element(SAML:'AttributeValue', _, [AttributeValue]), Attribute),
524
+ AssertedAttribute = attribute(AttributeName, FriendlyName, AttributeValue).
525
+
526
+ process_assertion(_Attributes, _Assertion, _, _, _, _):-
527
+ debug(saml, 'Warning: Assertion was not valid', []).
528
+
529
+ condition_holds(_ConditionAttributes, _Condition):-
530
+ throw(conditions_not_implemented).
531
+
532
+ get_xml_timestamp(Date):-
533
+ get_time(Time),
534
+ stamp_date_time(Time, date(Y, M, D, HH, MM, SSF, _, 'UTC', _), 'UTC'),
535
+ SS is floor(SSF),
536
+ format(atom(Date), '~w-~|~`0t~w~2+-~|~`0t~w~2+T~|~`0t~w~2+:~|~`0t~w~2+:~|~`0t~w~2+Z', [Y,M,D,HH,MM,SS]).
537
+
538
+
539
+ subject_confirmation_is_valid(SubjectConfirmationAttributes, SubjectConfirmation):-
540
+ SAML = ns(_, 'urn:oasis:names:tc:SAML:2.0:assertion'),
541
+ memberchk('Method'='urn:oasis:names:tc:SAML:2.0:cm:bearer', SubjectConfirmationAttributes), % this is the only method we support
542
+ memberchk(element(SAML:'SubjectConfirmationData', Attributes, _SubjectConfirmationData), SubjectConfirmation),
543
+ get_xml_timestamp(Date),
544
+ ( memberchk('NotOnOrAfter'=Expiry, Attributes)->
545
+ Date @< Expiry
546
+ ; true
547
+ ),
548
+ ( memberchk('NotBefore'=Expiry, Attributes)->
549
+ Date @> Expiry
550
+ ; true
551
+ ),
552
+ ( memberchk('InResponseTo'=_InResponseTo, Attributes)->
553
+ % FIXME: Check that we sent the message, somehow?
554
+ true
555
+ ; true
556
+ ),
557
+ ( memberchk('Recipient'=_Recipient, Attributes)->
558
+ % FIXME: Check that this is us, somehow?
559
+ true
560
+ ; true
561
+ ),
562
+ % FIXME: We can also have other arbitrary elements and attributes in here for user-defined extensions. These are ignored.
563
+ true.
564
+
565
+ saml_key_callback(ServiceProvider, certificate, KeyHint, Key):-
566
+ saml_sp_certificate(ServiceProvider, KeyHint, _, Key),
567
+ !.
568
+
569
+
570
+ saml_metadata(ServiceProvider, _Options, Request):-
571
+ MD = 'urn:oasis:names:tc:SAML:2.0:metadata',
572
+ DS = 'http://www.w3.org/2000/09/xmldsig#',
573
+ saml_sp_certificate(ServiceProvider, _X509Certificate, X509Certificate, _PrivateKey),
574
+
575
+ % All of this should be configurable, eventually?
576
+ EncryptionMethod = 'http://www.w3.org/2009/xmlenc11#rsa-oaep',
577
+ NameIDFormat = 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
578
+ ACSBinding = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
579
+
580
+ parse_url(RequestURL, Request),
581
+ http_absolute_location('./auth', ACSLocation, [relative_to(RequestURL)]),
582
+
583
+ % Extract the part of the certificate between the BEGIN and END delimiters
584
+ ( sub_string(X509Certificate, CertMarkerStart, CertMarkerLength, _, "-----BEGIN CERTIFICATE-----\n"),
585
+ sub_string(X509Certificate, CertEnd, _, _, "\n-----END CERTIFICATE-----"),
586
+ CertStart is CertMarkerStart + CertMarkerLength,
587
+ CertEnd > CertStart->
588
+ CertLength is CertEnd - CertStart,
589
+ sub_string(X509Certificate, CertStart, CertLength, _, PresentableCertificate)
590
+ ; existence_error(certificate_data, X509Certificate)
591
+ ),
592
+ format(current_output, 'Content-type: text/xml~n~n', []),
593
+ XML = [element(MD:'EntitiesDescriptor', [], [EntityDescriptor])],
594
+ EntityDescriptor = element(MD:'EntityDescriptor', [entityID=ServiceProvider], [SPSSODescriptor]),
595
+ SPSSODescriptor = element(MD:'SPSSODescriptor', ['AuthnRequestsSigned'=true,
596
+ protocolSupportEnumeration='urn:oasis:names:tc:SAML:2.0:protocol'], [EncryptionKeyDescriptor,
597
+ SigningKeyDescriptor,
598
+ element(MD:'NameIDFormat', [], [NameIDFormat]),
599
+ AssertionConsumerService]),
600
+ EncryptionKeyDescriptor = element(MD:'KeyDescriptor', [use=encryption], [KeyInfo,
601
+ element(MD:'EncryptionMethod', ['Algorithm'=EncryptionMethod], [])]),
602
+ SigningKeyDescriptor = element(MD:'KeyDescriptor', [use=signing], [KeyInfo,
603
+ element(MD:'EncryptionMethod', ['Algorithm'=EncryptionMethod], [])]),
604
+
605
+ KeyInfo = element(DS:'KeyInfo', [], [X509Data]),
606
+ X509Data = element(DS:'X509Data', [], [element(DS:'X509Certificate', [], [PresentableCertificate])]),
607
+ AssertionConsumerService = element(MD:'AssertionConsumerService', [index='0', isDefault=true, 'Binding'=ACSBinding, 'Location'=ACSLocation], []),
608
+ xml_write(current_output, XML, []).
609
+