knjrbfw 0.0.3

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 (208) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +14 -0
  4. data/Gemfile.lock +32 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +49 -0
  8. data/VERSION +1 -0
  9. data/lib/knj/.gitignore +1 -0
  10. data/lib/knj/arrayext.rb +157 -0
  11. data/lib/knj/autoload/activesupport.rb +2 -0
  12. data/lib/knj/autoload/backups/facets_dictionary.rb +430 -0
  13. data/lib/knj/autoload/backups/parsedate.rb +53 -0
  14. data/lib/knj/autoload/backups/ping.rb +64 -0
  15. data/lib/knj/autoload/cinch.rb +2 -0
  16. data/lib/knj/autoload/erubis.rb +6 -0
  17. data/lib/knj/autoload/facebooker.rb +3 -0
  18. data/lib/knj/autoload/facets_dictionary.rb +7 -0
  19. data/lib/knj/autoload/gd2.rb +2 -0
  20. data/lib/knj/autoload/gettext.rb +9 -0
  21. data/lib/knj/autoload/gtk2.rb +5 -0
  22. data/lib/knj/autoload/json_autoload.rb +7 -0
  23. data/lib/knj/autoload/magick.rb +6 -0
  24. data/lib/knj/autoload/mysql.rb +6 -0
  25. data/lib/knj/autoload/parsedate.rb +1 -0
  26. data/lib/knj/autoload/ping.rb +64 -0
  27. data/lib/knj/autoload/rexml.rb +12 -0
  28. data/lib/knj/autoload/soap.rb +3 -0
  29. data/lib/knj/autoload/sqlite3.rb +6 -0
  30. data/lib/knj/autoload/tmail.rb +6 -0
  31. data/lib/knj/autoload/twitter.rb +2 -0
  32. data/lib/knj/autoload/xmlsimple.rb +6 -0
  33. data/lib/knj/autoload/zip.rb +6 -0
  34. data/lib/knj/autoload.rb +136 -0
  35. data/lib/knj/compiler.rb +53 -0
  36. data/lib/knj/cpufreq.rb +40 -0
  37. data/lib/knj/datarow.rb +256 -0
  38. data/lib/knj/datestamp.rb +91 -0
  39. data/lib/knj/datet.rb +448 -0
  40. data/lib/knj/degulesider.rb +46 -0
  41. data/lib/knj/erb/apache_knjerb.conf +8 -0
  42. data/lib/knj/erb/cache/README +1 -0
  43. data/lib/knj/erb/erb.rb +21 -0
  44. data/lib/knj/erb/erb_1.9.rb +13 -0
  45. data/lib/knj/erb/erb_cache_clean.rb +20 -0
  46. data/lib/knj/erb/erb_fcgi.rb +44 -0
  47. data/lib/knj/erb/erb_fcgi_1.9.rb +44 -0
  48. data/lib/knj/erb/erb_fcgi_jruby.rb +7 -0
  49. data/lib/knj/erb/erb_jruby.rb +22 -0
  50. data/lib/knj/erb/include.rb +248 -0
  51. data/lib/knj/errors.rb +19 -0
  52. data/lib/knj/eruby.rb +224 -0
  53. data/lib/knj/event_filemod.rb +53 -0
  54. data/lib/knj/event_handler.rb +69 -0
  55. data/lib/knj/exchangerates.rb +39 -0
  56. data/lib/knj/ext/webrick.rb +31 -0
  57. data/lib/knj/filesystem.rb +8 -0
  58. data/lib/knj/fs/drivers/filesystem.rb +14 -0
  59. data/lib/knj/fs/drivers/ftp.rb +33 -0
  60. data/lib/knj/fs/drivers/ssh.rb +28 -0
  61. data/lib/knj/fs/fs.rb +36 -0
  62. data/lib/knj/gettext_fallback.rb +17 -0
  63. data/lib/knj/gettext_threadded.rb +77 -0
  64. data/lib/knj/google_sitemap.rb +59 -0
  65. data/lib/knj/gtk2.rb +277 -0
  66. data/lib/knj/gtk2_cb.rb +85 -0
  67. data/lib/knj/gtk2_menu.rb +57 -0
  68. data/lib/knj/gtk2_statuswindow.rb +64 -0
  69. data/lib/knj/gtk2_tv.rb +63 -0
  70. data/lib/knj/hash_methods.rb +37 -0
  71. data/lib/knj/http.rb +190 -0
  72. data/lib/knj/includes/appserver_cli.rb +39 -0
  73. data/lib/knj/ip2location.rb +22 -0
  74. data/lib/knj/ironruby-gtk2/button.rb +19 -0
  75. data/lib/knj/ironruby-gtk2/dialog.rb +44 -0
  76. data/lib/knj/ironruby-gtk2/entry.rb +9 -0
  77. data/lib/knj/ironruby-gtk2/gdk_event.rb +3 -0
  78. data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +13 -0
  79. data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +11 -0
  80. data/lib/knj/ironruby-gtk2/gladexml.rb +104 -0
  81. data/lib/knj/ironruby-gtk2/glib.rb +15 -0
  82. data/lib/knj/ironruby-gtk2/gtk2.rb +148 -0
  83. data/lib/knj/ironruby-gtk2/gtk_builder.rb +31 -0
  84. data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +5 -0
  85. data/lib/knj/ironruby-gtk2/gtk_combobox.rb +19 -0
  86. data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +5 -0
  87. data/lib/knj/ironruby-gtk2/gtk_liststore.rb +18 -0
  88. data/lib/knj/ironruby-gtk2/gtk_menu.rb +5 -0
  89. data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +7 -0
  90. data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +8 -0
  91. data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +24 -0
  92. data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +16 -0
  93. data/lib/knj/ironruby-gtk2/gtk_treeview.rb +19 -0
  94. data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +32 -0
  95. data/lib/knj/ironruby-gtk2/iconsize.rb +3 -0
  96. data/lib/knj/ironruby-gtk2/image.rb +15 -0
  97. data/lib/knj/ironruby-gtk2/label.rb +19 -0
  98. data/lib/knj/ironruby-gtk2/stock.rb +4 -0
  99. data/lib/knj/ironruby-gtk2/tests/test.glade +15 -0
  100. data/lib/knj/ironruby-gtk2/tests/test_2.rb +22 -0
  101. data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +47 -0
  102. data/lib/knj/ironruby-gtk2/vbox.rb +5 -0
  103. data/lib/knj/ironruby-gtk2/window.rb +23 -0
  104. data/lib/knj/jruby-gtk2/builder/test_builder.glade +43 -0
  105. data/lib/knj/jruby-gtk2/builder/test_builder.rb +19 -0
  106. data/lib/knj/jruby-gtk2/builder/test_builder.ui +43 -0
  107. data/lib/knj/jruby-gtk2/builder.rb +27 -0
  108. data/lib/knj/jruby-gtk2/cellrenderertext.rb +12 -0
  109. data/lib/knj/jruby-gtk2/checkbutton.rb +3 -0
  110. data/lib/knj/jruby-gtk2/combobox.rb +29 -0
  111. data/lib/knj/jruby-gtk2/dialog.rb +44 -0
  112. data/lib/knj/jruby-gtk2/eventbutton.rb +21 -0
  113. data/lib/knj/jruby-gtk2/gladexml.rb +99 -0
  114. data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
  115. data/lib/knj/jruby-gtk2/gtk2.rb +246 -0
  116. data/lib/knj/jruby-gtk2/hbox.rb +10 -0
  117. data/lib/knj/jruby-gtk2/iconsize.rb +5 -0
  118. data/lib/knj/jruby-gtk2/image.rb +10 -0
  119. data/lib/knj/jruby-gtk2/liststore.rb +56 -0
  120. data/lib/knj/jruby-gtk2/menu.rb +40 -0
  121. data/lib/knj/jruby-gtk2/progressbar.rb +12 -0
  122. data/lib/knj/jruby-gtk2/statusicon.rb +8 -0
  123. data/lib/knj/jruby-gtk2/stock.rb +8 -0
  124. data/lib/knj/jruby-gtk2/tests/test_glade_window.glade +163 -0
  125. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +47 -0
  126. data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +17 -0
  127. data/lib/knj/jruby-gtk2/tests/test_trayicon.png +0 -0
  128. data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +18 -0
  129. data/lib/knj/jruby-gtk2/treeview.rb +105 -0
  130. data/lib/knj/jruby-gtk2/vbox.rb +12 -0
  131. data/lib/knj/jruby-gtk2/window.rb +11 -0
  132. data/lib/knj/jruby_compiler.rb +14 -0
  133. data/lib/knj/knj.rb +19 -0
  134. data/lib/knj/knj_controller.rb +13 -0
  135. data/lib/knj/knjdb/dbtime.rb +30 -0
  136. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +327 -0
  137. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +130 -0
  138. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +30 -0
  139. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +255 -0
  140. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +93 -0
  141. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +151 -0
  142. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +29 -0
  143. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +300 -0
  144. data/lib/knj/knjdb/libknjdb.rb +438 -0
  145. data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +83 -0
  146. data/lib/knj/knjdb/libknjdb_row.rb +149 -0
  147. data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +69 -0
  148. data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
  149. data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
  150. data/lib/knj/libqt.rb +75 -0
  151. data/lib/knj/libqt_window.rb +10 -0
  152. data/lib/knj/locale_strings.rb +3 -0
  153. data/lib/knj/locales.rb +54 -0
  154. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +56 -0
  155. data/lib/knj/mail.rb +75 -0
  156. data/lib/knj/mailobj.rb +82 -0
  157. data/lib/knj/mount.rb +115 -0
  158. data/lib/knj/notify.rb +13 -0
  159. data/lib/knj/nvidia_settings.rb +45 -0
  160. data/lib/knj/objects.rb +731 -0
  161. data/lib/knj/opts.rb +38 -0
  162. data/lib/knj/os.rb +158 -0
  163. data/lib/knj/php.rb +717 -0
  164. data/lib/knj/php_parser/arguments.rb +5 -0
  165. data/lib/knj/php_parser/functions.rb +97 -0
  166. data/lib/knj/php_parser/php_parser.rb +99 -0
  167. data/lib/knj/php_parser/tests/test.rb +12 -0
  168. data/lib/knj/php_parser/tests/test_function.php +8 -0
  169. data/lib/knj/php_parser/tests/test_function_run.rb +19 -0
  170. data/lib/knj/power_manager.rb +31 -0
  171. data/lib/knj/rand.rb +10 -0
  172. data/lib/knj/retry.rb +71 -0
  173. data/lib/knj/rhodes/mutex.rb +11 -0
  174. data/lib/knj/rhodes/rhodes.js +3 -0
  175. data/lib/knj/rhodes/rhodes.rb +11 -0
  176. data/lib/knj/rsvgbin.rb +20 -0
  177. data/lib/knj/scripts/degulesider.rb +12 -0
  178. data/lib/knj/scripts/filesearch.rb +51 -0
  179. data/lib/knj/scripts/ip2location.rb +12 -0
  180. data/lib/knj/scripts/keepalive.rb +6 -0
  181. data/lib/knj/scripts/svn_merge.rb +29 -0
  182. data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +41 -0
  183. data/lib/knj/sms.rb +54 -0
  184. data/lib/knj/sshrobot/sshrobot.rb +93 -0
  185. data/lib/knj/strings.rb +65 -0
  186. data/lib/knj/sysuser.rb +27 -0
  187. data/lib/knj/tests/compiler/compiler_test.rb +13 -0
  188. data/lib/knj/tests/compiler/compiler_test_file.rb +62 -0
  189. data/lib/knj/tests/test_degulesider.rb +11 -0
  190. data/lib/knj/tests/test_mount.rb +30 -0
  191. data/lib/knj/tests/test_retry.rb +30 -0
  192. data/lib/knj/thread.rb +32 -0
  193. data/lib/knj/thread2.rb +47 -0
  194. data/lib/knj/threadhandler.rb +130 -0
  195. data/lib/knj/threadpool.rb +177 -0
  196. data/lib/knj/translations.rb +139 -0
  197. data/lib/knj/unix_proc.rb +82 -0
  198. data/lib/knj/web.rb +932 -0
  199. data/lib/knj/webscripts/image.rhtml +82 -0
  200. data/lib/knj/win.rb +4 -0
  201. data/lib/knj/win_registry.rb +60 -0
  202. data/lib/knj/win_tightvnc.rb +127 -0
  203. data/lib/knj/x11vnc.rb +48 -0
  204. data/lib/knj/youtube.rb +38 -0
  205. data/lib/knjrbfw.rb +4 -0
  206. data/spec/knjrbfw_spec.rb +269 -0
  207. data/spec/spec_helper.rb +12 -0
  208. metadata +336 -0
data/lib/knj/web.rb ADDED
@@ -0,0 +1,932 @@
1
+ class Knj::Web
2
+ attr_reader :session, :cgi, :data
3
+
4
+ def initialize(args = {})
5
+ @args = Knj::ArrayExt.hash_sym(args)
6
+ @db = @args[:db] if @args[:db]
7
+ @args[:tmp] = "/tmp" if !@args[:tmp]
8
+
9
+ raise "No ID was given." if !@args[:id]
10
+ raise "No DB was given." if !@args[:db]
11
+
12
+ if @args[:cgi]
13
+ @cgi = @args[:cgi]
14
+ elsif $_CGI
15
+ @cgi = $_CGI
16
+ else
17
+ if ENV["HTTP_HOST"] or $knj_eruby or Knj::Php.class_exists("Apache")
18
+ @cgi = CGI.new
19
+ end
20
+ end
21
+
22
+ $_CGI = @cgi if !$_CGI
23
+ self.read_cgi
24
+
25
+ if $_FCGI
26
+ KnjEruby.connect("exit") do
27
+ @session.close
28
+
29
+ @post = nil
30
+ @get = nil
31
+ @server = nil
32
+ @cookie = nil
33
+
34
+ $_POST = nil
35
+ $_GET = nil
36
+ $_SERVER = nil
37
+ $_COOKIE = nil
38
+ end
39
+ else
40
+ Kernel.at_exit do
41
+ @session.close
42
+
43
+ @post = nil
44
+ @get = nil
45
+ @server = nil
46
+ @cookie = nil
47
+
48
+ $_POST = nil
49
+ $_GET = nil
50
+ $_SERVER = nil
51
+ $_COOKIE = nil
52
+ end
53
+ end
54
+ end
55
+
56
+ def read_cgi(args = {})
57
+ args.each do |key, value|
58
+ if key == :cgi
59
+ @cgi = value
60
+ else
61
+ raise "No such key: #{key.to_s}"
62
+ end
63
+ end
64
+
65
+ if $_FCGI_COUNT and $_FCGI and $_CGI
66
+ @server = {}
67
+ $_CGI.env_table.each do |key, value|
68
+ @server[key] = value
69
+ end
70
+ elsif $_CGI and ENV["HTTP_HOST"] and ENV["REMOTE_ADDR"]
71
+ @server = {}
72
+ ENV.each do |key, value|
73
+ @server[key] = value
74
+ end
75
+ elsif Knj::Php.class_exists("Apache")
76
+ @server = {
77
+ "HTTP_HOST" => Apache.request.hostname,
78
+ "HTTP_USER_AGENT" => Apache.request.headers_in["User-Agent"],
79
+ "REMOTE_ADDR" => Apache.request.remote_host(1),
80
+ "REQUEST_URI" => Apache.request.unparsed_uri
81
+ }
82
+ else
83
+ @server = {}
84
+ end
85
+
86
+ @files = {}
87
+ @post = {}
88
+ if @cgi and @cgi.request_method == "POST"
89
+ @cgi.params.each do |pair|
90
+ do_files = false
91
+ isstring = true
92
+ varname = pair[0]
93
+ stringparse = nil
94
+
95
+ if pair[1][0].class.name == "Tempfile"
96
+ if varname[0..3] == "file"
97
+ isstring = false
98
+ do_files = true
99
+
100
+ if pair[1][0].size > 0
101
+ stringparse = {
102
+ "name" => pair[1][0].original_filename,
103
+ "tmp_name" => pair[1][0].path,
104
+ "size" => pair[1][0].size,
105
+ "error" => 0
106
+ }
107
+
108
+ stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
109
+ end
110
+ else
111
+ stringparse = File.read(pair[1][0].path)
112
+ end
113
+ elsif pair[1][0].is_a?(StringIO)
114
+ if varname[0..3] == "file"
115
+ tmpname = @args[:tmp] + "/knj_web_upload_#{Time.now.to_f.to_s}_#{rand(1000).to_s.untaint}"
116
+ isstring = false
117
+ do_files = true
118
+ cont = pair[1][0].string
119
+ Knj::Php.file_put_contents(tmpname, cont.to_s)
120
+
121
+ if cont.length > 0
122
+ stringparse = {
123
+ "tmp_name" => tmpname,
124
+ "size" => cont.length,
125
+ "error" => 0
126
+ }
127
+
128
+ stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
129
+ end
130
+ else
131
+ stringparse = pair[1][0].string
132
+ end
133
+ else
134
+ stringparse = pair[1][0]
135
+ end
136
+
137
+ if stringparse
138
+ if !do_files
139
+ if isstring
140
+ Knj::Web.parse_name(@post, varname, stringparse)
141
+ else
142
+ @post[varname] = stringparse
143
+ end
144
+ else
145
+ if isstring
146
+ Knj::Web.parse_name(@files, varname, stringparse)
147
+ else
148
+ @files[varname] = stringparse
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+
156
+ if @cgi and @cgi.query_string
157
+ @get = Knj::Web.parse_urlquery(@cgi.query_string)
158
+ else
159
+ @get = {}
160
+ end
161
+
162
+ @cookie = {}
163
+ if @cgi
164
+ @cgi.cookies.each do |key, value|
165
+ @cookie[key] = value[0]
166
+ end
167
+ end
168
+
169
+ self.global_params if @args[:globals]
170
+
171
+ if @cookie[@args[:id]] and (sdata = @args[:db].single(:sessions, :id => @cookie[@args[:id]]))
172
+ @data = Knj::ArrayExt.hash_sym(sdata)
173
+
174
+ if @data
175
+ if @data[:user_agent] != @server["HTTP_USER_AGENT"] or @data[:ip] != @server["REMOTE_ADDR"]
176
+ @data = nil
177
+ else
178
+ @db.update(:sessions, {"last_url" => @server["REQUEST_URI"].to_s, "date_active" => Datestamp.dbstr}, {"id" => @data[:id]})
179
+ session_id = @args[:id] + "_" + @data[:id]
180
+ end
181
+ end
182
+ end
183
+
184
+ if !@data or !session_id
185
+ @db.insert(:sessions,
186
+ :date_start => Knj::Datet.new.dbstr,
187
+ :date_active => Knj::Datet.new.dbstr,
188
+ :user_agent => @server["HTTP_USER_AGENT"],
189
+ :ip => @server["REMOTE_ADDR"],
190
+ :last_url => @server["REQUEST_URI"].to_s
191
+ )
192
+
193
+ @data = Knj::ArrayExt.hash_sym(@db.single(:sessions, :id => @db.last_id))
194
+ session_id = @args[:id] + "_" + @data[:id]
195
+ Knj::Php.setcookie(@args[:id], @data[:id])
196
+ end
197
+
198
+ require "cgi/session"
199
+ require "cgi/session/pstore"
200
+ @session = CGI::Session.new(@session, "database_manager" => CGI::Session::PStore, "session_id" => session_id, "session_path" => @args[:tmp])
201
+ end
202
+
203
+ def [](key)
204
+ return @session[key.to_sym]
205
+ end
206
+
207
+ def []=(key, value)
208
+ return @session[key.to_sym] = value
209
+ end
210
+
211
+ def self.parse_cookies(str)
212
+ ret = {}
213
+
214
+ str.split("; ").each do |cookie_str|
215
+ splitted = cookie_str.split("=")
216
+ ret[Knj::Php.urldecode(splitted[0])] = Knj::Php.urldecode(splitted[1])
217
+ end
218
+
219
+ return ret
220
+ end
221
+
222
+ def self.parse_urlquery(querystr, args = {})
223
+ get = {}
224
+ querystr.to_s.split("&").each do |value|
225
+ pos = value.index("=")
226
+
227
+ if pos != nil
228
+ name = value[0..pos-1]
229
+ name = name.to_sym if args[:syms]
230
+ valuestr = value.slice(pos+1..-1)
231
+ Knj::Web.parse_name(get, Knj::Php.urldecode(name), valuestr, args)
232
+ end
233
+ end
234
+
235
+ return get
236
+ end
237
+
238
+ def self.parse_secname(seton, secname, args)
239
+ secname_empty = false
240
+ if secname.length <= 0
241
+ secname_empty = true
242
+ try = 0
243
+
244
+ loop do
245
+ if !seton.has_key?(try)
246
+ break
247
+ else
248
+ try += 1
249
+ end
250
+ end
251
+
252
+ secname = try
253
+ else
254
+ secname = secname.to_i if Knj::Php.is_numeric(secname)
255
+ end
256
+
257
+ secname = secname.to_sym if args[:syms] and secname.is_a?(String)
258
+
259
+ return [secname, secname_empty]
260
+ end
261
+
262
+ def self.parse_name(seton, varname, value, args = {})
263
+ if value.respond_to?(:filename) and value.filename
264
+ realvalue = value
265
+ else
266
+ realvalue = value.to_s
267
+ end
268
+
269
+ realvalue = Knj::Php.urldecode(realvalue) if args[:urldecode] and !value.respond_to?(:filename)
270
+
271
+ if varname and varname.index("[") != nil
272
+ if match = varname.match(/\[(.*?)\]/)
273
+ namepos = varname.index(match[0])
274
+ name = varname.slice(0..namepos - 1)
275
+ name = name.to_sym if args[:syms]
276
+ seton[name] = {} if !seton.has_key?(name)
277
+
278
+ secname, secname_empty = Knj::Web.parse_secname(seton[name], match[1], args)
279
+
280
+ valuefrom = namepos + secname.to_s.length + 2
281
+ restname = varname.slice(valuefrom..-1)
282
+
283
+ if restname and restname.index("[") != nil
284
+ seton[name][secname] = {} if !seton[name].has_key?(secname)
285
+ Knj::Web.parse_name_second(seton[name][secname], restname, value, args)
286
+ else
287
+ seton[name][secname] = realvalue
288
+ end
289
+ else
290
+ seton[varname][match[1]] = realvalue
291
+ end
292
+ else
293
+ seton[varname] = realvalue
294
+ end
295
+ end
296
+
297
+ def self.parse_name_second(seton, varname, value, args = {})
298
+ if value.respond_to?(:filename) and value.filename
299
+ realvalue = value
300
+ else
301
+ realvalue = value.to_s
302
+ end
303
+
304
+ match = varname.match(/^\[(.*?)\]/)
305
+ if match
306
+ namepos = varname.index(match[0])
307
+ name = match[1]
308
+ secname, secname_empty = Knj::Web.parse_secname(seton, match[1], args)
309
+
310
+ valuefrom = namepos + match[1].length + 2
311
+ restname = varname.slice(valuefrom..-1)
312
+
313
+ if restname and restname.index("[") != nil
314
+ seton[secname] = {} if !seton.has_key?(secname)
315
+ Knj::Web.parse_name_second(seton[secname], restname, value, args)
316
+ else
317
+ seton[secname] = realvalue
318
+ end
319
+ else
320
+ seton[varname] = realvalue
321
+ end
322
+ end
323
+
324
+ def global_params
325
+ $_POST = @post
326
+ $_GET = @get
327
+ $_COOKIE = @cookie
328
+ $_FILES = @files
329
+ $_SERVER = @server
330
+ end
331
+
332
+ def destroy
333
+ @cgi = nil
334
+ @post = nil
335
+ @get = nil
336
+ @session = nil
337
+ @args = nil
338
+ end
339
+
340
+ def self.require_eruby(filepath)
341
+ cont = File.read(filepath).untaint
342
+ parse = Erubis.Eruby.new(cont)
343
+ eval(parse.src.to_s)
344
+ end
345
+
346
+ def self.alert(string)
347
+ @alert_sent = true
348
+ html = "<script type=\"text/javascript\">alert(\"#{Knj::Strings.js_safe(string.to_s)}\");</script>"
349
+ print html
350
+ end
351
+
352
+ def self.redirect(string, args = {})
353
+ do_js = true
354
+
355
+ #Header way
356
+ if !@alert_sent
357
+ if args[:perm]
358
+ Knj::Php.header("Status: 301 Moved Permanently")
359
+ else
360
+ Knj::Php.header("Status: 303 See Other")
361
+ end
362
+
363
+ Knj::Php.header("Location: #{string}")
364
+ end
365
+
366
+ print "<script type=\"text/javascript\">location.href=\"#{string}\";</script>" if do_js
367
+ exit
368
+ end
369
+
370
+ def self.back
371
+ print "<script type=\"text/javascript\">history.go(-1);</script>"
372
+ exit
373
+ end
374
+
375
+ def self.checkval(value, val1, val2 = nil)
376
+ if val2 != nil
377
+ if !value or value == "" or value == "false"
378
+ return val2
379
+ else
380
+ return val1
381
+ end
382
+ else
383
+ if !value or value == "" or value == "false"
384
+ return val1
385
+ else
386
+ return value
387
+ end
388
+ end
389
+ end
390
+
391
+ def self.inputs(arr)
392
+ html = ""
393
+ arr.each do |args|
394
+ html += self.input(args)
395
+ end
396
+
397
+ return html
398
+ end
399
+
400
+ def self.input(args)
401
+ Knj::ArrayExt.hash_sym(args)
402
+
403
+ if args.has_key?(:value)
404
+ if args[:value].is_a?(Array) and args[:value][0].is_a?(NilClass)
405
+ value = nil
406
+ elsif args[:value].is_a?(Array)
407
+ if !args[:value][2] or args[:value][2] == :key
408
+ value = args[:value][0][args[:value][1]]
409
+ elsif args[:value][2] == :callb
410
+ value = args[:value][0].send(args[:value][1])
411
+ end
412
+ elsif args[:value].is_a?(String) or args[:value].is_a?(Integer)
413
+ value = args[:value].to_s
414
+ else
415
+ value = args[:value]
416
+ end
417
+ end
418
+
419
+ args[:value_default] = args[:default] if args[:default]
420
+
421
+ if value.is_a?(NilClass) and args[:value_default]
422
+ value = args[:value_default]
423
+ elsif value.is_a?(NilClass)
424
+ value = ""
425
+ end
426
+
427
+ if value and args.has_key?(:value_func) and args[:value_func]
428
+ cback = args[:value_func]
429
+
430
+ if cback.is_a?(Method)
431
+ value = cback.call(value)
432
+ elsif cback.is_a?(Array)
433
+ value = Knj::Php.call_user_func(args[:value_func], value)
434
+ elsif cback.is_a?(Proc)
435
+ value = cback.call(value)
436
+ else
437
+ raise "Unknown class: #{cback.class.name}."
438
+ end
439
+ end
440
+
441
+ value = args[:values] if args[:values]
442
+ args[:id] = args[:name] if !args[:id]
443
+
444
+ if !args[:type]
445
+ if args[:opts]
446
+ args[:type] = :select
447
+ elsif args[:name] and args[:name].to_s[0..2] == "che"
448
+ args[:type] = :checkbox
449
+ elsif args[:name] and args[:name].to_s[0..3] == "file"
450
+ args[:type] = :file
451
+ else
452
+ args[:type] = :text
453
+ end
454
+ else
455
+ args[:type] = args[:type].to_sym
456
+ end
457
+
458
+ if args.has_key?(:disabled) and args[:disabled]
459
+ disabled = "disabled "
460
+ else
461
+ disabled = ""
462
+ end
463
+
464
+ raise "No name given to the Web::input()-method." if !args[:name] and args[:type] != :info and args[:type] != :textshow
465
+
466
+ checked = ""
467
+ checked += " value=\"#{args[:value_active]}\"" if args.has_key?(:value_active)
468
+ checked += " checked" if value.is_a?(String) and value == "1" or value.to_s == "1"
469
+ checked += " checked" if value.is_a?(TrueClass)
470
+
471
+ html = ""
472
+
473
+ if args[:type] == :checkbox
474
+ html += "<tr>"
475
+ html += "<td colspan=\"2\" class=\"tdcheck\">"
476
+ html += "<input type=\"checkbox\" class=\"input_checkbox\" id=\"#{args[:id].html}\" name=\"#{args[:name].html}\"#{checked} />"
477
+ html += "<label for=\"#{args[:id].html}\">#{args[:title].html}</label>"
478
+ html += "</td>"
479
+ html += "</tr>"
480
+ else
481
+ html += "<tr>"
482
+ html += "<td class=\"tdt\">"
483
+ html += args[:title].to_s.html
484
+ html += "</td>"
485
+ html += "<td class=\"tdc\">"
486
+
487
+ if args[:type] == :textarea
488
+ if args.has_key?(:height)
489
+ styleadd = " style=\"height: #{args[:height].html}px;\""
490
+ else
491
+ styleadd = ""
492
+ end
493
+
494
+ html += "<textarea#{styleadd} class=\"input_textarea\" name=\"#{args[:name].html}\" id=\"#{args[:id].html}\">#{value}</textarea>"
495
+ html += "</td>"
496
+ elsif args[:type] == :fckeditor
497
+ args[:height] = 400 if !args[:height]
498
+
499
+ require "/usr/share/fckeditor/fckeditor.rb"
500
+ fck = FCKeditor.new(args[:name])
501
+ fck.Height = args[:height].to_i
502
+ fck.Value = value
503
+ html += fck.CreateHtml
504
+
505
+ html += "</td>"
506
+ elsif args[:type] == :select
507
+ html += "<select name=\"#{args[:name].html}\" id=\"#{args[:id].html}\" class=\"input_select\""
508
+ html += " onchange=\"#{args[:onchange]}\"" if args[:onchange]
509
+ html += " multiple" if args[:multiple]
510
+ html += " size=\"#{args[:size].to_s}\"" if args[:size]
511
+ html += ">"
512
+ html += Knj::Web.opts(args[:opts], value, args[:opts_args])
513
+ html += "</select>"
514
+ html += "</td>"
515
+ elsif args[:type] == :imageupload
516
+ html += "<table class=\"designtable\"><tr><td style=\"width: 100%;\">"
517
+ html += "<input type=\"file\" name=\"#{args[:name].html}\" class=\"input_file\" />"
518
+ html += "</td><td style=\"padding-left: 5px;\">"
519
+
520
+ raise "No path given for imageupload-input." if !args.has_key?(:path)
521
+ raise "No value given in arguments for imageupload-input." if !args.has_key?(:value)
522
+
523
+ path = args[:path].gsub("%value%", value.to_s).untaint
524
+ if File.exists?(path)
525
+ html += "<img src=\"image.php?picture=#{Knj::Php.urlencode(path).html}&smartsize=100&edgesize=25&force=true&ts=#{Time.new.to_f}\" alt=\"Image\" />"
526
+
527
+ if args[:dellink]
528
+ dellink = args[:dellink].gsub("%value%", value.to_s)
529
+ html += "<div style=\"text-align: center;\">(<a href=\"javascript: if (confirm('#{_("Do you want to delete the image?")}')){location.href='#{dellink}';}\">#{_("delete")}</a>)</div>"
530
+ end
531
+ end
532
+
533
+ html += "</td></tr></table>"
534
+ html += "</td>"
535
+ elsif args[:type] == :file
536
+ html += "<input type=\"#{args[:type].to_s}\" class=\"input_#{args[:type].to_s}\" name=\"#{args[:name].html}\" /></td>"
537
+ elsif args[:type] == :textshow or args[:type] == :info
538
+ html += "#{value}</td>"
539
+ elsif args[:type] == :editarea
540
+ css = {
541
+ "width" => "100%"
542
+ }
543
+ css["height"] = args[:height] if args.has_key?(:height)
544
+
545
+ styleadd = " style=\""
546
+ css.each do |key, val|
547
+ styleadd += "#{key}: #{val};"
548
+ end
549
+ styleadd += "\""
550
+
551
+ styleadd += "width=\"100%\""
552
+ styleadd += "height=\"#{args[:height]}\"" if args[:height]
553
+ html += "<textarea#{styleadd} id=\"#{args[:id]}\" name=\"#{args[:name]}\">#{value}</textarea>"
554
+
555
+ jshash = {
556
+ "id" => args[:id],
557
+ "start_highlight" => true
558
+ }
559
+
560
+ pos_keys = [:skip_init, :allow_toggle, :replace_tab_by_spaces, :toolbar, :syntax]
561
+ pos_keys.each do |key|
562
+ jshash[key.to_s] = args[key] if args.has_key?(key)
563
+ end
564
+
565
+ html += "<script type=\"text/javascript\">"
566
+ html += "function knj_web_init_#{args[:name]}(){"
567
+ html += "editAreaLoader.init(#{Knj::Php.json_encode(jshash)});"
568
+ html += "}"
569
+ html += "</script>"
570
+ else
571
+ html += "<input #{disabled}type=\"#{args[:type].to_s.html}\" class=\"input_#{args[:type].html}\" id=\"#{args[:id].html}\" name=\"#{args[:name].html}\" value=\"#{value.html}\" /></td>"
572
+ html += "</td>"
573
+ end
574
+
575
+ html += "</tr>"
576
+ end
577
+
578
+ html += "<tr><td colspan=\"2\" class=\"tdd\">#{args[:descr]}</td></tr>" if args[:descr]
579
+ return html
580
+ end
581
+
582
+ def self.opts(opthash, curvalue = nil, opts_args = {})
583
+ opts_args = {} if !opts_args
584
+ opts_args.each do |key, value|
585
+ if !key.is_a?(Symbol)
586
+ opts_args[key.to_sym] = value
587
+ opts_args.delete(key)
588
+ end
589
+ end
590
+
591
+ return "" if !opthash
592
+ cname = curvalue.class.name
593
+ curvalue = curvalue.id if (cname == "Knj::Db_row" or cname == "Knj::Datarow")
594
+
595
+ html = ""
596
+ addsel = " selected=\"selected\"" if !curvalue
597
+
598
+ html += "<option#{addsel} value=\"\">#{_("Add new")}</option>" if opts_args and (opts_args[:add] or opts_args[:addnew])
599
+ html += "<option#{addsel} value=\"\">#{_("Choose")}</option>" if opts_args and opts_args[:choose]
600
+ html += "<option#{addsel} value=\"\">#{_("None")}</option>" if opts_args and opts_args[:none]
601
+
602
+ if opthash.is_a?(Hash) or opthash.class.to_s == "Dictionary"
603
+ opthash.each do |key, value|
604
+ html += "<option"
605
+
606
+ if curvalue.is_a?(Array) and curvalue.index(key) != nil
607
+ html += " selected=\"selected\""
608
+ elsif curvalue.to_s == key.to_s
609
+ html += " selected=\"selected\""
610
+ end
611
+
612
+ html += " value=\"#{key.html}\">#{value.html}</option>"
613
+ end
614
+ elsif opthash.is_a?(Array)
615
+ opthash.each do |key|
616
+ if opthash[key.to_i] != nil
617
+ html += "<option"
618
+ html += " selected=\"selected\"" if curvalue.to_i == key.to_i
619
+ html += " value=\"#{key.to_s}\">#{opthash[key.to_i].to_s}</option>"
620
+ end
621
+ end
622
+ end
623
+
624
+ return html
625
+ end
626
+
627
+ def self.rendering_engine
628
+ begin
629
+ servervar = _server
630
+ rescue Exception
631
+ servervar = $_SERVER
632
+ end
633
+
634
+ if !servervar
635
+ raise "Could not figure out meta data."
636
+ end
637
+
638
+ agent = servervar["HTTP_USER_AGENT"].to_s.downcase
639
+
640
+ if agent.index("webkit") != nil
641
+ return "webkit"
642
+ elsif agent.index("gecko") != nil
643
+ return "gecko"
644
+ elsif agent.index("msie") != nil
645
+ return "msie"
646
+ elsif agent.index("w3c") != nil or agent.index("baiduspider") != nil or agent.index("googlebot") != nil
647
+ return "bot"
648
+ else
649
+ #print "Unknown agent: #{agent}"
650
+ return false
651
+ end
652
+ end
653
+
654
+ def self.os
655
+ begin
656
+ servervar = _server
657
+ rescue Exception
658
+ servervar = $_SERVER
659
+ end
660
+
661
+ if !servervar
662
+ raise "Could not figure out meta data."
663
+ end
664
+
665
+ agent = servervar["HTTP_USER_AGENT"].to_s.downcase
666
+
667
+ if agent.index("(windows;") != nil or agent.index("windows nt") != nil
668
+ return {
669
+ "os" => "win",
670
+ "title" => "Windows"
671
+ }
672
+ elsif agent.index("linux") != nil
673
+ return {
674
+ "os" => "linux",
675
+ "title" => "Linux"
676
+ }
677
+ end
678
+
679
+ raise "Unknown OS: #{agent}"
680
+ end
681
+
682
+ def self.browser(servervar = nil)
683
+ if !servervar
684
+ begin
685
+ servervar = _server
686
+ rescue Exception => e
687
+ servervar = $_SERVER
688
+ end
689
+ end
690
+
691
+ raise "Could not figure out meta data." if !servervar
692
+ agent = servervar["HTTP_USER_AGENT"].to_s.downcase
693
+
694
+ if match = agent.index("knj:true") != nil
695
+ browser = "bot"
696
+ title = "Bot"
697
+ version = "KnjHttp"
698
+ elsif match = agent.match(/chrome\/(\d+\.\d+)/)
699
+ browser = "chrome"
700
+ title = "Google Chrome"
701
+ version = match[1]
702
+ elsif match = agent.match(/firefox\/(\d+\.\d+)/)
703
+ browser = "firefox"
704
+ title = "Mozilla Firefox"
705
+ version = match[1]
706
+ elsif match = agent.match(/msie\s*(\d+\.\d+)/)
707
+ browser = "ie"
708
+ title = "Microsoft Internet Explorer"
709
+ version = match[1]
710
+ elsif match = agent.match(/opera\/([\d+\.]+)/)
711
+ browser = "opera"
712
+ title = "Opera"
713
+ version = match[1]
714
+ elsif match = agent.match(/wget\/([\d+\.]+)/)
715
+ browser = "bot"
716
+ title = "Bot"
717
+ version = "Wget #{match[1]}"
718
+ elsif agent.index("baiduspider") != nil
719
+ browser = "bot"
720
+ title = "Bot"
721
+ version = "Baiduspider"
722
+ elsif agent.index("googlebot") != nil
723
+ browser = "bot"
724
+ title = "Bot"
725
+ version = "Googlebot"
726
+ elsif agent.index("gidbot") != nil
727
+ browser = "bot"
728
+ title = "Bot"
729
+ version = "GIDBot"
730
+ elsif match = agent.match(/safari\/(\d+)/)
731
+ browser = "safari"
732
+ title = "Safari"
733
+ version = match[1]
734
+ elsif agent.index("iPad") != nil
735
+ browser = "safari"
736
+ title = "Safari (iPad)"
737
+ version = "ipad"
738
+ elsif agent.index("bingbot") != nil
739
+ browser = "bot"
740
+ title = "Bot"
741
+ version = "Bingbot"
742
+ elsif agent.index("yahoo! slurp") != nil
743
+ browser = "bot"
744
+ title = "Bot"
745
+ version = "Yahoo! Slurp"
746
+ elsif agent.index("hostharvest") != nil
747
+ browser = "bot"
748
+ title = "Bot"
749
+ version = "HostHarvest"
750
+ elsif agent.index("exabot") != nil
751
+ browser = "bot"
752
+ title = "Bot"
753
+ version = "Exabot"
754
+ elsif agent.index("dotbot") != nil
755
+ browser = "bot"
756
+ title = "Bot"
757
+ version = "DotBot"
758
+ elsif agent.index("msnbot") != nil
759
+ browser = "bot"
760
+ title = "Bot"
761
+ version = "MSN bot"
762
+ elsif agent.index("yandexbot") != nil
763
+ browser = "bot"
764
+ title = "Bot"
765
+ version = "Yandex Bot"
766
+ elsif agent.index("mj12bot") != nil
767
+ browser = "bot"
768
+ title = "Bot"
769
+ version = "Majestic12 Bot"
770
+ elsif agent.index("facebookexternalhit") != nil
771
+ browser = "bot"
772
+ title = "Bot"
773
+ version = "Facebook Externalhit"
774
+ elsif agent.index("sitebot") != nil
775
+ browser = "bot"
776
+ title = "Bot"
777
+ version = "SiteBot"
778
+ elsif match = agent.match(/java\/([\d\.]+)/)
779
+ browser = "bot"
780
+ title = "Java"
781
+ version = match[1]
782
+ elsif match = agent.match(/ezooms\/([\d\.]+)/)
783
+ browser = "bot"
784
+ title = "Ezooms"
785
+ version = match[1]
786
+ else
787
+ browser = "unknown"
788
+ title = "(unknown browser)"
789
+ version = "(unknown version)"
790
+ end
791
+
792
+ return {
793
+ "browser" => browser,
794
+ "title" => title,
795
+ "version" => version
796
+ }
797
+ end
798
+
799
+ def self.locale(args = {})
800
+ begin
801
+ servervar = _server
802
+ rescue Exception
803
+ servervar = $_SERVER
804
+ end
805
+
806
+ if !servervar
807
+ raise "Could not figure out meta data."
808
+ end
809
+
810
+ ret = {
811
+ :recommended => [],
812
+ :browser => []
813
+ }
814
+
815
+ alangs = servervar["HTTP_ACCEPT_LANGUAGE"].to_s
816
+ if alangs.length > 0
817
+ alangs.split(/\s*,\s*/).each do |alang|
818
+ if qmatch = alang.match(/;\s*q=([\d\.]+)/)
819
+ alang.gsub!(/;\s*q=([\d\.]+)/, "")
820
+ q = qmatch[1].to_f
821
+ else
822
+ q = 1.0
823
+ end
824
+
825
+ if match = alang.match(/^([A-z]+)-([A-z]+)$/)
826
+ locale = match[1]
827
+ sublocale = match[2]
828
+ else
829
+ locale = alang
830
+ sublocale = false
831
+ end
832
+
833
+ ret[:browser] << {
834
+ :locale => locale,
835
+ :sublocale => sublocale,
836
+ :q => q
837
+ }
838
+ end
839
+ end
840
+
841
+ if args[:supported] and ret[:browser]
842
+ ret[:browser].each do |locale|
843
+ args[:supported].each do |supported_locale|
844
+ if match = supported_locale.match(/^([A-z]+)_([A-z]+)$/)
845
+ if match[1] == locale[:locale]
846
+ if !locale[:sublocale]
847
+ ret[:recommended] << supported_locale if ret[:recommended].index(supported_locale) == nil
848
+ elsif locale[:sublocale] == match[1]
849
+ ret[:recommended] << supported_locale if ret[:recommended].index(supported_locale) == nil
850
+ end
851
+ end
852
+ end
853
+ end
854
+ end
855
+ end
856
+
857
+ if args[:default]
858
+ ret[:recommended] << args[:default] if ret[:recommended].index(args[:default]) == nil
859
+ end
860
+
861
+ return ret
862
+ end
863
+
864
+ def self.hiddens(hidden_arr)
865
+ html = ""
866
+
867
+ hidden_arr.each do |hidden_hash|
868
+ html += "<input type=\"hidden\" name=\"#{hidden_hash[:name].to_s.html}\" value=\"#{hidden_hash[:value].to_s.html}\" />"
869
+ end
870
+
871
+ return html
872
+ end
873
+
874
+ def self.ahref_parse(str)
875
+ return str.to_s.gsub("&", "&amp;")
876
+ end
877
+ end
878
+
879
+ def alert(string)
880
+ return Knj::Web.alert(string)
881
+ end
882
+
883
+ def redirect(string)
884
+ return Knj::Web.redirect(string)
885
+ end
886
+
887
+ def jsback(string)
888
+ return Knj::Web.back
889
+ end
890
+
891
+ class String
892
+ def html
893
+ return self.to_s.gsub(/&/, "&amp;").gsub(/\"/, "&quot;").gsub(/>/, "&gt;").gsub(/</, "&lt;")
894
+ end
895
+
896
+ def sql
897
+ begin
898
+ return _httpsession.db.escape(self)
899
+ rescue NameError
900
+ #ignore - not in KnjAppServer HTTP-session.
901
+ end
902
+
903
+ begin
904
+ return _db.escape(self)
905
+ rescue NameError
906
+ #ignore - not i KnjAppServer HTTP-session.
907
+ end
908
+
909
+ return $db.escape(self) if $db
910
+ raise "Could not figure out where to find db object."
911
+ end
912
+ end
913
+
914
+ class Symbol
915
+ def html
916
+ return self.to_s.html
917
+ end
918
+
919
+ def sql
920
+ return self.to_s.sql
921
+ end
922
+ end
923
+
924
+ class Fixnum
925
+ def sql
926
+ return self.to_s.sql
927
+ end
928
+
929
+ def html
930
+ return self.to_s.html
931
+ end
932
+ end