qwikdoc 0.0.1

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 (335) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/CHANGES +3 -0
  4. data/COPYING +340 -0
  5. data/Gemfile +3 -0
  6. data/README.md +10 -0
  7. data/Rakefile +10 -0
  8. data/TextFormattingRules +137 -0
  9. data/TextFormattingRules.ja +143 -0
  10. data/bin/qwikdoc +34 -0
  11. data/lib/qwik_doc.rb +15 -0
  12. data/lib/qwik_doc/hack.rb +184 -0
  13. data/qwikdoc.gemspec +26 -0
  14. data/spec/qwik_doc_spec.rb +305 -0
  15. data/spec/spec_helper.rb +12 -0
  16. data/vendor/qwik/Makefile +63 -0
  17. data/vendor/qwik/Rakefile +17 -0
  18. data/vendor/qwik/act-aa.rb +83 -0
  19. data/vendor/qwik/act-archive.rb +386 -0
  20. data/vendor/qwik/act-attach.rb +304 -0
  21. data/vendor/qwik/act-backup.rb +236 -0
  22. data/vendor/qwik/act-basic.rb +325 -0
  23. data/vendor/qwik/act-book.rb +161 -0
  24. data/vendor/qwik/act-calc.rb +371 -0
  25. data/vendor/qwik/act-charset.rb +251 -0
  26. data/vendor/qwik/act-christel.rb +112 -0
  27. data/vendor/qwik/act-chronology.rb +149 -0
  28. data/vendor/qwik/act-code.rb +155 -0
  29. data/vendor/qwik/act-comment.rb +554 -0
  30. data/vendor/qwik/act-config.rb +49 -0
  31. data/vendor/qwik/act-counter.rb +125 -0
  32. data/vendor/qwik/act-day.rb +96 -0
  33. data/vendor/qwik/act-describe.rb +135 -0
  34. data/vendor/qwik/act-diary.rb +109 -0
  35. data/vendor/qwik/act-edit.rb +317 -0
  36. data/vendor/qwik/act-embed-html.rb +296 -0
  37. data/vendor/qwik/act-emode.rb +150 -0
  38. data/vendor/qwik/act-event.rb +187 -0
  39. data/vendor/qwik/act-file.rb +303 -0
  40. data/vendor/qwik/act-files.rb +771 -0
  41. data/vendor/qwik/act-getpass.rb +295 -0
  42. data/vendor/qwik/act-history.rb +136 -0
  43. data/vendor/qwik/act-html.rb +204 -0
  44. data/vendor/qwik/act-httpauth.rb +147 -0
  45. data/vendor/qwik/act-include.rb +142 -0
  46. data/vendor/qwik/act-interwiki.rb +189 -0
  47. data/vendor/qwik/act-isearch.rb +109 -0
  48. data/vendor/qwik/act-keywords.rb +137 -0
  49. data/vendor/qwik/act-lang.rb +81 -0
  50. data/vendor/qwik/act-license.rb +63 -0
  51. data/vendor/qwik/act-list.rb +287 -0
  52. data/vendor/qwik/act-login.rb +410 -0
  53. data/vendor/qwik/act-logout.rb +60 -0
  54. data/vendor/qwik/act-mail.rb +159 -0
  55. data/vendor/qwik/act-map.rb +292 -0
  56. data/vendor/qwik/act-md5.rb +42 -0
  57. data/vendor/qwik/act-mdlb.rb +741 -0
  58. data/vendor/qwik/act-media.rb +416 -0
  59. data/vendor/qwik/act-member.rb +157 -0
  60. data/vendor/qwik/act-menu.rb +142 -0
  61. data/vendor/qwik/act-metadata.rb +323 -0
  62. data/vendor/qwik/act-mlsubmitform.rb +49 -0
  63. data/vendor/qwik/act-monitor.rb +167 -0
  64. data/vendor/qwik/act-new.rb +418 -0
  65. data/vendor/qwik/act-pagelist.rb +248 -0
  66. data/vendor/qwik/act-password.rb +145 -0
  67. data/vendor/qwik/act-plan.rb +210 -0
  68. data/vendor/qwik/act-povray.rb +230 -0
  69. data/vendor/qwik/act-presen.rb +380 -0
  70. data/vendor/qwik/act-redirect.rb +133 -0
  71. data/vendor/qwik/act-ring.rb +1071 -0
  72. data/vendor/qwik/act-rrefs.rb +255 -0
  73. data/vendor/qwik/act-ruby.rb +116 -0
  74. data/vendor/qwik/act-sample.rb +170 -0
  75. data/vendor/qwik/act-save.rb +295 -0
  76. data/vendor/qwik/act-schedule.rb +374 -0
  77. data/vendor/qwik/act-search.rb +180 -0
  78. data/vendor/qwik/act-searchwords.rb +51 -0
  79. data/vendor/qwik/act-sendpass.rb +83 -0
  80. data/vendor/qwik/act-site.rb +89 -0
  81. data/vendor/qwik/act-sitebackup.rb +419 -0
  82. data/vendor/qwik/act-sitelog.rb +118 -0
  83. data/vendor/qwik/act-smil.rb +299 -0
  84. data/vendor/qwik/act-status.rb +220 -0
  85. data/vendor/qwik/act-style.rb +608 -0
  86. data/vendor/qwik/act-table.rb +263 -0
  87. data/vendor/qwik/act-tableform.rb +241 -0
  88. data/vendor/qwik/act-tag.rb +103 -0
  89. data/vendor/qwik/act-text.rb +70 -0
  90. data/vendor/qwik/act-textarea.rb +164 -0
  91. data/vendor/qwik/act-theme.rb +346 -0
  92. data/vendor/qwik/act-toc.rb +112 -0
  93. data/vendor/qwik/act-typekey.rb +198 -0
  94. data/vendor/qwik/act-under-const.rb +94 -0
  95. data/vendor/qwik/act-webservice.rb +321 -0
  96. data/vendor/qwik/act-wema.rb +558 -0
  97. data/vendor/qwik/act-wysiwyg.rb +238 -0
  98. data/vendor/qwik/action.rb +325 -0
  99. data/vendor/qwik/autoreload.rb +98 -0
  100. data/vendor/qwik/bench-bench.rb +28 -0
  101. data/vendor/qwik/bench-emode.rb +47 -0
  102. data/vendor/qwik/bench-format-xml.rb +70 -0
  103. data/vendor/qwik/bench-large-table.rb +62 -0
  104. data/vendor/qwik/bench-md5.rb +14 -0
  105. data/vendor/qwik/bench-module-session.rb +19 -0
  106. data/vendor/qwik/bench-page.rb +50 -0
  107. data/vendor/qwik/bench-s-md5.rb +28 -0
  108. data/vendor/qwik/bench-session.rb +25 -0
  109. data/vendor/qwik/bench-textformat.rb +31 -0
  110. data/vendor/qwik/catalog-factory.rb +91 -0
  111. data/vendor/qwik/catalog-ja.rb +479 -0
  112. data/vendor/qwik/catalog-ml-ja.rb +145 -0
  113. data/vendor/qwik/check-act-monitor.rb +112 -0
  114. data/vendor/qwik/check-act-monitor2.rb +46 -0
  115. data/vendor/qwik/check-act-theme.rb +27 -0
  116. data/vendor/qwik/check-event.rb +112 -0
  117. data/vendor/qwik/check-event2.rb +55 -0
  118. data/vendor/qwik/check-htree-rexml.rb +77 -0
  119. data/vendor/qwik/check-htree.rb +51 -0
  120. data/vendor/qwik/check-libxml.rb +135 -0
  121. data/vendor/qwik/check-many-pages.rb +47 -0
  122. data/vendor/qwik/check-monitor.rb +33 -0
  123. data/vendor/qwik/check-observer.rb +67 -0
  124. data/vendor/qwik/check-server.rb +61 -0
  125. data/vendor/qwik/check-uuencode.rb +33 -0
  126. data/vendor/qwik/check-webdav.rb +65 -0
  127. data/vendor/qwik/check-xml-xpath.rb +27 -0
  128. data/vendor/qwik/common-backtrace.rb +94 -0
  129. data/vendor/qwik/common-basic.rb +111 -0
  130. data/vendor/qwik/common-condition.rb +142 -0
  131. data/vendor/qwik/common-error.rb +48 -0
  132. data/vendor/qwik/common-gettext.rb +50 -0
  133. data/vendor/qwik/common-javascript.rb +45 -0
  134. data/vendor/qwik/common-notice.rb +132 -0
  135. data/vendor/qwik/common-plain.rb +105 -0
  136. data/vendor/qwik/common-plugin.rb +111 -0
  137. data/vendor/qwik/common-res.rb +76 -0
  138. data/vendor/qwik/common-resolve.rb +92 -0
  139. data/vendor/qwik/common-send.rb +171 -0
  140. data/vendor/qwik/common-session.rb +139 -0
  141. data/vendor/qwik/common-surface.rb +261 -0
  142. data/vendor/qwik/common-url.rb +90 -0
  143. data/vendor/qwik/compat/Makefile +12 -0
  144. data/vendor/qwik/compat/add_load_path.rb +1 -0
  145. data/vendor/qwik/config.rb +299 -0
  146. data/vendor/qwik/db-b-backup.rb +142 -0
  147. data/vendor/qwik/db-backup.rb +184 -0
  148. data/vendor/qwik/db-berkeley.rb +306 -0
  149. data/vendor/qwik/db-filesystem.rb +305 -0
  150. data/vendor/qwik/db-indexer.rb +154 -0
  151. data/vendor/qwik/db-searchwords.rb +238 -0
  152. data/vendor/qwik/description-ja.rb +267 -0
  153. data/vendor/qwik/description.rb +256 -0
  154. data/vendor/qwik/dev-add-copyright.rb +23 -0
  155. data/vendor/qwik/dev-backup.rb +24 -0
  156. data/vendor/qwik/dev-bench.rb +175 -0
  157. data/vendor/qwik/dev-calctime.rb +52 -0
  158. data/vendor/qwik/dev-css-compressor.rb +60 -0
  159. data/vendor/qwik/dev-extract-catalog.rb +102 -0
  160. data/vendor/qwik/dev-js-compressor.rb +73 -0
  161. data/vendor/qwik/dev-release.rb +235 -0
  162. data/vendor/qwik/dev-replace.rb +353 -0
  163. data/vendor/qwik/dev-sendmail.rb +25 -0
  164. data/vendor/qwik/farm.rb +283 -0
  165. data/vendor/qwik/gettext.rb +56 -0
  166. data/vendor/qwik/group-cond.rb +157 -0
  167. data/vendor/qwik/group-config.rb +247 -0
  168. data/vendor/qwik/group-confirm.rb +147 -0
  169. data/vendor/qwik/group-db.rb +326 -0
  170. data/vendor/qwik/group-mail.rb +195 -0
  171. data/vendor/qwik/group-member.rb +307 -0
  172. data/vendor/qwik/group-sendmail.rb +231 -0
  173. data/vendor/qwik/group-site.rb +374 -0
  174. data/vendor/qwik/group-sweep.rb +63 -0
  175. data/vendor/qwik/group.rb +157 -0
  176. data/vendor/qwik/helper.rb +6 -0
  177. data/vendor/qwik/html-generator.rb +104 -0
  178. data/vendor/qwik/html-to-wabisabi.rb +149 -0
  179. data/vendor/qwik/htree-diff.rb +87 -0
  180. data/vendor/qwik/htree-format-xml.rb +57 -0
  181. data/vendor/qwik/htree-generator.rb +144 -0
  182. data/vendor/qwik/htree-get.rb +251 -0
  183. data/vendor/qwik/htree-html-generator.rb +179 -0
  184. data/vendor/qwik/htree-template.rb +263 -0
  185. data/vendor/qwik/htree-to-wabisabi.rb +171 -0
  186. data/vendor/qwik/loadlib.rb +79 -0
  187. data/vendor/qwik/logger.rb +115 -0
  188. data/vendor/qwik/mail-body.rb +171 -0
  189. data/vendor/qwik/mail-header.rb +474 -0
  190. data/vendor/qwik/mail-multipart.rb +193 -0
  191. data/vendor/qwik/mail-parse.rb +147 -0
  192. data/vendor/qwik/mail.rb +341 -0
  193. data/vendor/qwik/mailaddress.rb +83 -0
  194. data/vendor/qwik/mdlb-model.rb +81 -0
  195. data/vendor/qwik/mdlb-sample.rb +324 -0
  196. data/vendor/qwik/ml-catalog-factory.rb +27 -0
  197. data/vendor/qwik/ml-exception.rb +15 -0
  198. data/vendor/qwik/ml-generator.rb +28 -0
  199. data/vendor/qwik/ml-gettext.rb +137 -0
  200. data/vendor/qwik/ml-logger.rb +82 -0
  201. data/vendor/qwik/ml-memory.rb +65 -0
  202. data/vendor/qwik/ml-msg-validator.rb +86 -0
  203. data/vendor/qwik/ml-processor.rb +609 -0
  204. data/vendor/qwik/ml-quickml-server.rb +122 -0
  205. data/vendor/qwik/ml-sendmail.rb +0 -0
  206. data/vendor/qwik/ml-server.rb +107 -0
  207. data/vendor/qwik/ml-session.rb +348 -0
  208. data/vendor/qwik/ml-sweeper.rb +101 -0
  209. data/vendor/qwik/mock-logger.rb +65 -0
  210. data/vendor/qwik/mock-sendmail.rb +78 -0
  211. data/vendor/qwik/mock-socket.rb +82 -0
  212. data/vendor/qwik/modulobe.rb +406 -0
  213. data/vendor/qwik/mongrel-server.rb +72 -0
  214. data/vendor/qwik/page-files.rb +249 -0
  215. data/vendor/qwik/page-generate.rb +82 -0
  216. data/vendor/qwik/page-get.rb +262 -0
  217. data/vendor/qwik/page-images.rb +168 -0
  218. data/vendor/qwik/page-put.rb +128 -0
  219. data/vendor/qwik/page-rrefs.rb +154 -0
  220. data/vendor/qwik/page-title.rb +0 -0
  221. data/vendor/qwik/page-wikidb.rb +234 -0
  222. data/vendor/qwik/page.rb +67 -0
  223. data/vendor/qwik/pages.rb +444 -0
  224. data/vendor/qwik/parse-plugin.rb +249 -0
  225. data/vendor/qwik/parser-emode.rb +116 -0
  226. data/vendor/qwik/parser-inline.rb +273 -0
  227. data/vendor/qwik/parser.rb +350 -0
  228. data/vendor/qwik/password.rb +183 -0
  229. data/vendor/qwik/periodic.rb +79 -0
  230. data/vendor/qwik/qp.rb +56 -0
  231. data/vendor/qwik/qwik-service.rb +341 -0
  232. data/vendor/qwik/qwik.rb +5 -0
  233. data/vendor/qwik/qwikweb-adduser.rb +34 -0
  234. data/vendor/qwik/qwikweb-catalog-validator.rb +110 -0
  235. data/vendor/qwik/qwikweb-incgen.rb +28 -0
  236. data/vendor/qwik/qwikweb-makesite.rb +41 -0
  237. data/vendor/qwik/qwikweb-server.rb +44 -0
  238. data/vendor/qwik/qwikweb-showpassword.rb +26 -0
  239. data/vendor/qwik/qwikweb-watchlog.rb +67 -0
  240. data/vendor/qwik/request-path.rb +304 -0
  241. data/vendor/qwik/request-ua.rb +76 -0
  242. data/vendor/qwik/request-webrick.rb +81 -0
  243. data/vendor/qwik/request.rb +91 -0
  244. data/vendor/qwik/resolve-tdiary.rb +292 -0
  245. data/vendor/qwik/resolve.rb +121 -0
  246. data/vendor/qwik/response.rb +228 -0
  247. data/vendor/qwik/server-memory.rb +57 -0
  248. data/vendor/qwik/server-webrick.rb +102 -0
  249. data/vendor/qwik/server.rb +252 -0
  250. data/vendor/qwik/site-config.rb +149 -0
  251. data/vendor/qwik/site-db.rb +136 -0
  252. data/vendor/qwik/site-event.rb +162 -0
  253. data/vendor/qwik/site-files.rb +86 -0
  254. data/vendor/qwik/site-group.rb +103 -0
  255. data/vendor/qwik/site-index.rb +47 -0
  256. data/vendor/qwik/site-log.rb +64 -0
  257. data/vendor/qwik/site-member.rb +230 -0
  258. data/vendor/qwik/site-monitor.rb +97 -0
  259. data/vendor/qwik/site-pages.rb +62 -0
  260. data/vendor/qwik/site-plan.rb +139 -0
  261. data/vendor/qwik/site-report.rb +282 -0
  262. data/vendor/qwik/site-resolve.rb +230 -0
  263. data/vendor/qwik/site-rrefs.rb +18 -0
  264. data/vendor/qwik/site-search.rb +180 -0
  265. data/vendor/qwik/site-timeline.rb +153 -0
  266. data/vendor/qwik/site-url.rb +189 -0
  267. data/vendor/qwik/site.rb +76 -0
  268. data/vendor/qwik/smil-time.rb +105 -0
  269. data/vendor/qwik/smtp-session.rb +331 -0
  270. data/vendor/qwik/template-generator.rb +149 -0
  271. data/vendor/qwik/template.rb +85 -0
  272. data/vendor/qwik/test-common.rb +10 -0
  273. data/vendor/qwik/test-ml-info.rb +225 -0
  274. data/vendor/qwik/test-module-ml.rb +142 -0
  275. data/vendor/qwik/test-module-path.rb +110 -0
  276. data/vendor/qwik/test-module-public.rb +70 -0
  277. data/vendor/qwik/test-module-server.rb +98 -0
  278. data/vendor/qwik/test-module-session.rb +264 -0
  279. data/vendor/qwik/test-module-suite.rb +91 -0
  280. data/vendor/qwik/test-ms-applemail.rb +59 -0
  281. data/vendor/qwik/test-ms-attach.rb +174 -0
  282. data/vendor/qwik/test-ms-basic.rb +40 -0
  283. data/vendor/qwik/test-ms-close.rb +35 -0
  284. data/vendor/qwik/test-ms-confirm.rb +75 -0
  285. data/vendor/qwik/test-ms-ignore-spam.rb +57 -0
  286. data/vendor/qwik/test-ms-japanese.rb +97 -0
  287. data/vendor/qwik/test-ms-jfilename.rb +82 -0
  288. data/vendor/qwik/test-ms-large.rb +58 -0
  289. data/vendor/qwik/test-ms-member.rb +103 -0
  290. data/vendor/qwik/test-ms-multipart.rb +84 -0
  291. data/vendor/qwik/test-ms-org.rb +129 -0
  292. data/vendor/qwik/test-ms-plan.rb +130 -0
  293. data/vendor/qwik/test-ms-post.rb +53 -0
  294. data/vendor/qwik/test-ms-quopri.rb +76 -0
  295. data/vendor/qwik/test-sub-quopri.rb +45 -0
  296. data/vendor/qwik/test-submit-base64.rb +59 -0
  297. data/vendor/qwik/test-submit-forward.rb +61 -0
  298. data/vendor/qwik/test-submit-html-mail.rb +52 -0
  299. data/vendor/qwik/test-submit-japanese.rb +135 -0
  300. data/vendor/qwik/test-submit-jfilename.rb +144 -0
  301. data/vendor/qwik/test-submit-uuencode.rb +71 -0
  302. data/vendor/qwik/test-suite-all.rb +8 -0
  303. data/vendor/qwik/test-suite-basic.rb +9 -0
  304. data/vendor/qwik/test-suite-ml.rb +9 -0
  305. data/vendor/qwik/test-typekey.rb +64 -0
  306. data/vendor/qwik/testunit.rb +45 -0
  307. data/vendor/qwik/tokenizer-inline.rb +294 -0
  308. data/vendor/qwik/tokenizer.rb +332 -0
  309. data/vendor/qwik/typekey.rb +160 -0
  310. data/vendor/qwik/util-basic.rb +135 -0
  311. data/vendor/qwik/util-charset.rb +332 -0
  312. data/vendor/qwik/util-css.rb +56 -0
  313. data/vendor/qwik/util-csv-tokenizer.rb +113 -0
  314. data/vendor/qwik/util-filename.rb +112 -0
  315. data/vendor/qwik/util-pathname.rb +202 -0
  316. data/vendor/qwik/util-pid.rb +58 -0
  317. data/vendor/qwik/util-safe.rb +67 -0
  318. data/vendor/qwik/util-sendmail.rb +273 -0
  319. data/vendor/qwik/util-string.rb +203 -0
  320. data/vendor/qwik/util-time.rb +125 -0
  321. data/vendor/qwik/util-webrick.rb +176 -0
  322. data/vendor/qwik/version.rb +11 -0
  323. data/vendor/qwik/wabisabi-basic.rb +163 -0
  324. data/vendor/qwik/wabisabi-diff.rb +130 -0
  325. data/vendor/qwik/wabisabi-format-xml.rb +310 -0
  326. data/vendor/qwik/wabisabi-generator.rb +262 -0
  327. data/vendor/qwik/wabisabi-index.rb +174 -0
  328. data/vendor/qwik/wabisabi-table.rb +212 -0
  329. data/vendor/qwik/wabisabi-template.rb +295 -0
  330. data/vendor/qwik/wabisabi-to-htree.rb +111 -0
  331. data/vendor/qwik/wabisabi-to-wiki.rb +690 -0
  332. data/vendor/qwik/wabisabi-traverse.rb +207 -0
  333. data/vendor/qwik/wabisabi-validator.rb +116 -0
  334. data/vendor/qwik/wabisabi.rb +5 -0
  335. metadata +416 -0
@@ -0,0 +1,160 @@
1
+ #
2
+ # Copyright (C) 2005 jouno <jouno2002@yahoo.co.jp>
3
+ # License under GPL-2
4
+ #
5
+ # original is Adam Bregenzer(<adam@bregenzer.net>)'s python version
6
+ # http://adam.bregenzer.net/python/typekey/TypeKey.py
7
+ #
8
+ # modified by Kouichirou Eto
9
+ #
10
+ # note:
11
+ # nick name field must be sent as utf-8 url_encoded string.
12
+
13
+ # sample code:
14
+
15
+ =begin
16
+ token = 'your_site_token'
17
+ tk = TypeKey.new(token, '1.1')
18
+
19
+ if cgi.params['tk'][0] == '1'
20
+ ts = cgi.params['ts'][0]
21
+ email = cgi.params['email'][0]
22
+ name = cgi.params['name'][0]
23
+ nick = cgi.params['nick'][0]
24
+ sig = cgi.params['sig'][0]
25
+ if tk.verify(email, name, nick, ts, sig)
26
+ puts 'verify!'
27
+ else
28
+ puts 'not!'
29
+ end
30
+ end
31
+
32
+ return_url = 'http://localhost/cgi-bin/tk_test.cgi'
33
+
34
+ url_sign_in = tk.get_login_url(return_url + '?tk=1')
35
+ url_sign_out = tk.get_logout_url(return_url)
36
+
37
+ puts "<a href=\"#{url_sign_in}\">sign in</a><br />"
38
+ puts "<a href=\"#{url_sign_out}\">sign out</a><br />"
39
+ =end
40
+
41
+ require 'uri'
42
+ require 'open-uri'
43
+ require 'base64'
44
+ require 'openssl'
45
+
46
+ class TypeKeyError < StandardError; end
47
+ class TimeOutError < TypeKeyError; end
48
+ class VerifyFailed < TypeKeyError; end
49
+
50
+ # This class handles TypeKey logins.
51
+ class TypeKey
52
+ def initialize(token, version = '1.1')
53
+ @token = token
54
+ @version = version
55
+
56
+ # Base url for generating login and logout urls.
57
+ @base_url = 'https://www.typekey.com/t/typekey/'
58
+
59
+ # Url used to download the public key.
60
+ @key_url = 'http://www.typekey.com/extras/regkeys.txt'
61
+
62
+ # Location for caching the public key.
63
+ @key_cache_path = '/tmp/tk_key_cache'
64
+
65
+ # Length of time to wait before refreshing the public key cache, in seconds.
66
+ # Defaults to two days.
67
+ @key_cache_timeout = 60 * 60 * 24 * 2
68
+
69
+ # Length of time logins remain valid, in seconds.
70
+ # Defaults to five minutes.
71
+ @login_timeout = 60 * 5
72
+ end
73
+ attr_accessor :base_url, :login_timeout
74
+ attr_accessor :key_url, :key_cache_path, :key_cache_timeout
75
+
76
+ # Verify a typekey login
77
+ def verify(email, name, nick, ts, sig, key = nil)
78
+ sig.gsub!(/ /, '+') # sig isn't urlencoded.
79
+
80
+ key = get_key if key.nil?
81
+
82
+ message_ar = [email, name, nick, ts.to_s]
83
+ message_ar << @token if @version == '1.1'
84
+ message = message_ar.join('::')
85
+
86
+ raise VerifyFailed if ! dsa_verify(message, sig, key)
87
+ raise TimeOutError if (Time.now.to_i - ts.to_i) > @login_timeout
88
+ return true
89
+ end
90
+
91
+ # Return a URL to login to TypeKey
92
+ def get_login_url(return_url, email = false)
93
+ url = @base_url
94
+ url += "login?t=#{@token}"
95
+ url += (email ? '&need_email=1' : '')
96
+ url += "&_return=#{URI.escape(return_url)}"
97
+ url += "&v=#{@version}"
98
+ return url
99
+ end
100
+
101
+ # Return a URL to logout of TypeKey
102
+ def get_logout_url(return_url)
103
+ return @base_url + 'logout?_return=' + URI.escape(return_url)
104
+ end
105
+
106
+ # Return the TypeKey public keys, cache results unless a url is passed
107
+ def get_key(url = nil)
108
+ if url.nil?
109
+ begin
110
+ mod_time = File.mtime(@key_cache_path).to_i
111
+ rescue SystemCallError
112
+ mod_time = 0
113
+ end
114
+
115
+ if @key_cache_timeout < (Time.now.to_i - mod_time) ||
116
+ ! File.exist?(@key_cache_path)
117
+ open(@key_url) {|fh| # using open-uri
118
+ @key_string = fh.read
119
+ }
120
+ File.open(@key_cache_path, 'w') {|fh|
121
+ fh.puts(@key_string)
122
+ }
123
+ else
124
+ File.open(@key_cache_path, 'r') {|fh|
125
+ @key_string = fh.read
126
+ }
127
+ end
128
+ else
129
+ open(url) {|fh|
130
+ @key_string = fh.read
131
+ }
132
+ end
133
+
134
+ tk_key = Hash.new
135
+
136
+ for pair in @key_string.strip.split(' ')
137
+ key, value = pair.split('=')
138
+ tk_key[key] = value.to_i
139
+ end
140
+
141
+ return tk_key
142
+ end
143
+
144
+ # Verify a DSA signature
145
+ def dsa_verify(message, sig, key)
146
+ r_sig, s_sig = sig.split(':')
147
+ r_sig = Base64.decode64(r_sig).unpack('H*')[0].hex
148
+ s_sig = Base64.decode64(s_sig).unpack('H*')[0].hex
149
+ sign = OpenSSL::ASN1::Sequence.new([OpenSSL::ASN1::Integer.new(r_sig),
150
+ OpenSSL::ASN1::Integer.new(s_sig)]
151
+ ).to_der
152
+ dsa = OpenSSL::PKey::DSA.new
153
+ dsa.p = key['p']
154
+ dsa.q = key['q']
155
+ dsa.g = key['g']
156
+ dsa.pub_key = key['pub_key']
157
+ dss1 = OpenSSL::Digest::DSS1.new
158
+ return dsa.verify(dss1, sign, message)
159
+ end
160
+ end
@@ -0,0 +1,135 @@
1
+ #
2
+ # Copyright (C) 2002-2004 Satoru Takabayashi <satoru@namazu.org>
3
+ # Copyright (C) 2003-2006 Kouichirou Eto
4
+ # All rights reserved.
5
+ # This is free software with ABSOLUTELY NO WARRANTY.
6
+ #
7
+ # You can redistribute it and/or modify it under the terms of
8
+ # the GNU General Public License version 2.
9
+ #
10
+
11
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
12
+ require 'qwik/util-string'
13
+
14
+ class NilClass
15
+ def empty?
16
+ return true
17
+ end
18
+ end
19
+
20
+ class Integer
21
+ # 12345.commify => '12,345'
22
+ def commify
23
+ numstr = self.to_s
24
+ true while numstr.sub!(/^([-+]?\d+)(\d{3})/, '\1,\2')
25
+ return numstr
26
+ end
27
+
28
+ UNITS = ['Bytes','KB','MB','GB','TB','PB']
29
+ # 1024 => 1KB
30
+ def byte_format
31
+ n = self
32
+ UNITS.each {|unit|
33
+ t = n/1024
34
+ if t > 0
35
+ n = t
36
+ else
37
+ return n.to_s + unit
38
+ end
39
+ }
40
+ return n.to_s + _(unit)
41
+ end
42
+ end
43
+
44
+ # It preserves case information. but it accepts an
45
+ # address case-insensitively for member management.
46
+ class IcaseArray < Array
47
+ def include? (item)
48
+ if self.find {|x| x.downcase == item.downcase }
49
+ return true
50
+ else
51
+ return false
52
+ end
53
+ end
54
+
55
+ def delete (item)
56
+ self.replace(self.find_all {|x| x.downcase != item.downcase })
57
+ end
58
+ end
59
+
60
+ class IcaseHash < Hash
61
+ def include? (key)
62
+ super(key.downcase)
63
+ end
64
+
65
+ def delete (key)
66
+ super(key.downcase)
67
+ end
68
+
69
+ def [] (key)
70
+ super(key.downcase)
71
+ end
72
+
73
+ def []= (key, value)
74
+ super(key.downcase, value)
75
+ end
76
+ end
77
+
78
+ class Hash
79
+ def to_query_string
80
+ ar = []
81
+ self.each {|k, v|
82
+ if k && v
83
+ ar << "#{k.to_s.escape}=#{v.to_s.escape}"
84
+ end
85
+ }
86
+ return ar.sort.join('&')
87
+ end
88
+ end
89
+
90
+ if $0 == __FILE__
91
+ require 'test/unit'
92
+ $test = true
93
+ end
94
+
95
+ if defined?($test) && $test
96
+ class TestUtilBasic < Test::Unit::TestCase
97
+ def test_nil
98
+ assert_equal true, nil.empty?
99
+ end
100
+
101
+ def test_integer
102
+ assert_equal '12,345', 12345.commify
103
+ assert_equal '123,456,789', 123456789.commify
104
+
105
+ assert_equal '1KB', (1024+1).byte_format
106
+ assert_equal '2MB', (2*1024*1024+2).byte_format
107
+ assert_equal '3GB', (3*1024*1024*1024+3).byte_format
108
+ assert_equal '4TB', (4*1024*1024*1024*1024+4).byte_format
109
+ end
110
+
111
+ def test_iscase_array
112
+ iar = IcaseArray.new
113
+ iar << 'T'
114
+ assert_equal true, iar.include?('T')
115
+ assert_equal true, iar.include?('t')
116
+ iar.delete('t')
117
+ assert_equal false, iar.include?('t')
118
+ end
119
+
120
+ def test_icase_hash
121
+ ih = IcaseHash.new
122
+ ih['T'] = 1
123
+ assert_equal true, ih.include?('t')
124
+ assert_equal 1, ih['t']
125
+ ih.delete('t')
126
+ assert_equal false, ih.include?('t')
127
+ end
128
+
129
+ def test_hash
130
+ # test_hash_to_query_string
131
+ assert_equal 'k=v', {:k=>'v'}.to_query_string
132
+ assert_equal 'k1=v1&k2=v2', {:k1=>'v1', :k2=>'v2'}.to_query_string
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,332 @@
1
+ #encoding: sjis
2
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
3
+ # This is free software with ABSOLUTELY NO WARRANTY.
4
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
5
+
6
+ require 'kconv'
7
+ require 'iconv'
8
+
9
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
10
+
11
+ class String
12
+ # ============================== kconv
13
+ def sjistoeuc
14
+ self.kconv(Kconv::EUC, Kconv::SJIS).set_euc
15
+ end
16
+
17
+ def euctosjis
18
+ self.kconv(Kconv::SJIS, Kconv::EUC).set_sjis
19
+ end
20
+
21
+ def sjistojis
22
+ self.kconv(Kconv::JIS, Kconv::SJIS).set_jis
23
+ end
24
+
25
+ def jistosjis
26
+ self.kconv(Kconv::SJIS, Kconv::JIS).set_sjis
27
+ end
28
+
29
+ def euctojis
30
+ self.kconv(Kconv::JIS, Kconv::EUC).set_jis
31
+ end
32
+
33
+ def jistoeuc
34
+ self.kconv(Kconv::EUC, Kconv::JIS).set_euc
35
+ end
36
+
37
+ # ============================== iconv
38
+ def sjistou8; Iconv.iconv_to_from('UTF-8', 'Shift_JIS', self) end
39
+ def u8tosjis; Iconv.iconv_to_from('Shift_JIS', 'UTF-8', self) end
40
+ def euctou8; Iconv.iconv_to_from('UTF-8', 'EUC-JP', self) end
41
+ def u8toeuc; Iconv.iconv_to_from('EUC-JP', 'UTF-8', self) end
42
+ def jistou8; Iconv.iconv_to_from('UTF-8', 'ISO-2022-JP', self) end
43
+ def u8tojis
44
+ iconv = Iconv.new('ISO-2022-JP', 'UTF-8')
45
+ out = iconv.iconv(self)+iconv.close
46
+ out.set_charset('ISO-2022-JP')
47
+ out
48
+ end
49
+
50
+ # ============================== charset
51
+ def set_charset(charset)
52
+ @charset = charset
53
+ return self
54
+ end
55
+
56
+ def charset
57
+ return @charset if defined?(@charset)
58
+ return nil
59
+ end
60
+
61
+ def set_utf8; set_charset('UTF-8') end
62
+ def set_sjis; set_charset('Shift_JIS') end
63
+ def set_euc; set_charset('EUC-JP') end
64
+ def set_jis; set_charset('ISO-2022-JP') end
65
+
66
+ KCONV_TO_CHARSET = {
67
+ #Kconv::AUTO => '?',
68
+ Kconv::JIS => 'ISO-2022-JP',
69
+ Kconv::EUC => 'EUC-JP',
70
+ Kconv::SJIS => 'Shift_JIS',
71
+ #Kconv::BINARY => '?BINARY',
72
+ #Kconv::NOCONV => '?NOCONV',
73
+ Kconv::ASCII => 'ASCII',
74
+ Kconv::UTF8 => 'UTF-8',
75
+ Kconv::UTF16 => 'UTF-16',
76
+ Kconv::UTF32 => 'UTF-32',
77
+ #Kconv::UNKNOWN => '?',
78
+ }
79
+
80
+ def guess_charset
81
+ kconv_charset = Kconv::guess(self)
82
+ charset = KCONV_TO_CHARSET[kconv_charset]
83
+ if /\A\?/ =~ charset
84
+ #p kconv_charset, charset
85
+ end
86
+ return charset
87
+ end
88
+
89
+ def guess_charset!
90
+ set_charset(self.guess_charset)
91
+ return self
92
+ end
93
+
94
+ # tosjis is used in kconv.rb
95
+ def to_sjis
96
+ raise 'Undefined charset.' if self.charset.nil?
97
+ case self.charset
98
+ when 'ASCII'; return self
99
+ when 'UTF-8'; return self.u8tosjis
100
+ when 'Shift_JIS'; return self
101
+ when 'EUC-JP'; return self.euctosjis
102
+ when 'ISO-2022-JP'; return self.jistosjis
103
+ end
104
+ raise 'Unknown charset.'
105
+ end
106
+
107
+ # toeuc is used in kconv.rb
108
+ def to_euc
109
+ raise 'Undefined charset.' if self.charset.nil?
110
+ case self.charset
111
+ when 'ASCII'; return self
112
+ when 'UTF-8'; return self.u8toeuc
113
+ when 'Shift_JIS'; return self.sjistoeuc
114
+ when 'EUC-JP'; return self
115
+ when 'ISO-2022-JP'; return self.jistoeuc
116
+ end
117
+ raise 'Unknown charset.'
118
+ end
119
+
120
+ # tojis is used in kconv.rb
121
+ def to_jis
122
+ raise 'Undefined charset.' if self.charset.nil?
123
+ case self.charset
124
+ when 'ASCII'; return self
125
+ when 'UTF-8'; return self.u8tojis
126
+ when 'Shift_JIS'; return self.sjistojis
127
+ when 'EUC-JP'; return self.euctojis
128
+ when 'ISO-2022-JP'; return self
129
+ end
130
+ raise 'Unknown charset.'
131
+ end
132
+
133
+ def to_utf8
134
+ #raise 'Undefined charset.' if self.charset.nil?
135
+ self.guess_charset! if self.charset.nil?
136
+ case self.charset
137
+ when 'ASCII'; return self
138
+ when 'UTF-8'; return self
139
+ when 'Shift_JIS'; return self.sjistou8
140
+ when 'EUC-JP'; return self.euctou8
141
+ when 'ISO-2022-JP'; return self.jistou8
142
+ end
143
+ raise 'Unknown charset.'
144
+ end
145
+
146
+ # Some use case.
147
+ alias set_mail_charset set_jis
148
+ alias set_page_charset set_sjis # This can be changed.
149
+ alias set_sourcecode_charset set_sjis # This can be changed.
150
+ alias set_xml_charset set_utf8
151
+ alias set_url_charset set_utf8
152
+ alias set_filename_charset set_utf8
153
+
154
+ alias to_mail_charset to_jis
155
+ alias to_page_charset to_sjis
156
+ alias to_xml_charset to_utf8
157
+ alias to_url_charset to_utf8
158
+ alias to_filename_charset to_utf8
159
+
160
+ def page_to_xml
161
+ self.set_page_charset.to_xml_charset
162
+ end
163
+ end
164
+
165
+ class Iconv
166
+ UNKNOWN_CHARACTER = '?'
167
+
168
+ def self.iconv_to_from(to, from, str)
169
+ iconv = Iconv.new(to, from)
170
+ out = ''
171
+ begin
172
+ out << iconv.iconv(str)
173
+ rescue Iconv::IllegalSequence => e # FIXME: Merge with InvalidCharacter
174
+ out << e.success
175
+ ch, str = e.failed.split(//u, 2)
176
+ out << UNKNOWN_CHARACTER
177
+ retry
178
+ rescue Iconv::InvalidCharacter => e
179
+ out << e.success
180
+ ch, str = e.failed.split(//u, 2)
181
+ out << UNKNOWN_CHARACTER
182
+ retry
183
+ end
184
+ out.set_charset(to)
185
+ return out
186
+ end
187
+
188
+ def self.iconv_to_utf8(from, str)
189
+ to = 'UTF-8'
190
+ iconv = Iconv.new(from, to)
191
+ out = ''
192
+ begin
193
+ out << iconv.iconv(str)
194
+ rescue Iconv::IllegalSequence => e
195
+ out << e.success
196
+ ch, str = e.failed.split(//u, 2)
197
+ if respond_to?(:unknown_unicode_handler)
198
+ u = ch.unpack('U').first
199
+ out << unknown_unicode_handler(u)
200
+ else
201
+ out << UNKNOWN_CHARACTER
202
+ end
203
+ retry
204
+ end
205
+ out.set_charset(to)
206
+ return out
207
+ end
208
+
209
+ def self.unknown_unicode_handler (u)
210
+ return sprintf("&#x%04x;", u)
211
+ end
212
+ end
213
+
214
+ module Charset
215
+ UTF8 = 'utf-8'
216
+ end
217
+
218
+ if $0 == __FILE__
219
+ require 'test/unit'
220
+ $test = true
221
+ end
222
+
223
+ if defined?($test) && $test
224
+ class TestUtilCharset < Test::Unit::TestCase
225
+ def test_kconv
226
+ # test_sjistoeuc
227
+ assert_equal "\244\242", '��'.sjistoeuc
228
+ assert_equal 'EUC-JP', '��'.sjistoeuc.charset
229
+
230
+ # test_euctosjis
231
+ assert_equal '��', "\244\242".euctosjis
232
+ assert_equal 'Shift_JIS', "\244\242".euctosjis.charset
233
+
234
+ # test_sjistojis
235
+ assert_equal "\e$B$\"\e(B", '��'.sjistojis
236
+ assert_equal 'ISO-2022-JP', '��'.sjistojis.charset
237
+
238
+ # test_jistosjis
239
+ assert_equal '��', "\e$B$\"\e(B".jistosjis
240
+ assert_equal 'Shift_JIS', "\e$B$\"\e(B".jistosjis.charset
241
+
242
+ # test_euctojis
243
+ assert_equal "\e$B$\"\e(B", "\244\242".euctojis
244
+ assert_equal 'ISO-2022-JP', "\244\242".euctojis.charset
245
+
246
+ # test_jistoeuc
247
+ assert_equal "\244\242", "\e$B$\"\e(B".jistoeuc
248
+ assert_equal 'EUC-JP', "\e$B$\"\e(B".jistoeuc.charset
249
+
250
+ # test_some_characters
251
+ assert_equal "\e$B4A;z\e(B", '����'.sjistojis
252
+ end
253
+
254
+ def test_iconv
255
+ assert_equal '��', '��'.sjistou8.u8tosjis
256
+ assert_equal '��', '��'.sjistoeuc.euctou8.u8toeuc.euctosjis
257
+ assert_equal '��', '��'.sjistojis.jistou8.u8tojis.jistosjis
258
+
259
+ # test_sjistou8
260
+ assert_equal "\343\201\202", '��'.sjistou8
261
+ assert_equal 'UTF-8', '��'.sjistou8.charset
262
+
263
+ assert_equal "\342\200\276", '~'.sjistou8
264
+
265
+ # test_u8tosjis
266
+ assert_equal "\202\240", "\343\201\202".u8tosjis
267
+ assert_equal 'Shift_JIS', "\343\201\202".u8tosjis.charset
268
+
269
+ # test_sjistoeuc
270
+ assert_equal "\244\242", '��'.sjistoeuc
271
+ assert_equal 'EUC-JP', '��'.sjistoeuc.charset
272
+
273
+ # test_euctou8
274
+ assert_equal "\343\201\202", "\244\242".euctou8
275
+ assert_equal 'UTF-8', "\244\242".euctou8.charset
276
+
277
+ # test_u8toeuc
278
+ assert_equal "\244\242", "\343\201\202".u8toeuc
279
+ assert_equal 'EUC-JP', "\343\201\202".u8toeuc.charset
280
+
281
+ # test_sjistojis
282
+ assert_equal "\e$B$\"\e(B", "��".sjistojis
283
+ assert_equal 'ISO-2022-JP', "��".sjistojis.charset
284
+
285
+ # test_jistou8
286
+ assert_equal "\343\201\202", "\e$B$\"\e(B".jistou8
287
+ assert_equal 'UTF-8', "\e$B$\"\e(B".jistou8.charset
288
+
289
+ # test_u8tojis
290
+ assert_equal "\e$B$\"\e(B", "\343\201\202".u8tojis
291
+ assert_equal 'ISO-2022-JP', "\343\201\202".u8tojis.charset
292
+
293
+ # test_illegal_sequence
294
+ # last \202 is illegal
295
+ assert_equal "\202\240?", "\343\201\202\202".u8tosjis
296
+ # first \202 is illegal
297
+ assert_equal "?\202\240", "\202\343\201\202".u8tosjis
298
+
299
+ # test_annoying_character
300
+ assert_equal "\343\200\234", '�`'.sjistou8
301
+ assert_equal '�`', "\343\200\234".u8tosjis
302
+ end
303
+
304
+ def test_charset
305
+ s = "\202\240"
306
+ assert_equal nil, s.charset
307
+ assert_equal "\202\240", s.set_charset('Shift_JIS')
308
+ assert_equal 'Shift_JIS', s.charset
309
+
310
+ # test_guess
311
+ assert_equal 'UTF-8', "\343\201\202".guess_charset
312
+ assert_equal 'Shift_JIS', "\202\240".guess_charset # ��
313
+ # assert_equal 'EUC-JP', "\244\242".guess_charset
314
+ assert_equal 'ISO-2022-JP', "\e$B$\"\e(B".guess_charset
315
+
316
+ # test_to
317
+ s = "\202\240".set_sjis
318
+ assert_equal "\343\201\202", s.to_utf8
319
+ assert_equal "\202\240", s.to_sjis
320
+ assert_equal "\244\242", s.to_euc
321
+ assert_equal "\e$B$\"\e(B", s.to_jis
322
+ end
323
+
324
+ def test_bug
325
+ # $KCODE = 'u'
326
+ assert_equal "~", "~".to_utf8
327
+ assert_equal "\342\200\276", "~".set_sjis.to_utf8 # annoying...
328
+ #assert_equal "\343\200\234", "�`".to_utf8
329
+ #assert_equal "\343\200\234", "�`".set_sjis.to_utf8
330
+ end
331
+ end
332
+ end