foreman_discovery 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1366) hide show
  1. data/LICENSE +619 -0
  2. data/README.md +128 -0
  3. data/Rakefile +111 -0
  4. data/app/controllers/discovers_controller.rb +151 -0
  5. data/app/helpers/discovers_helper.rb +37 -0
  6. data/app/models/host/discovered.rb +97 -0
  7. data/app/models/host/managed_extensions.rb +32 -0
  8. data/app/models/setting/discovered.rb +28 -0
  9. data/app/overrides/add_build_flag.rb +4 -0
  10. data/app/views/discovers/_discovers_list.html.erb +54 -0
  11. data/app/views/discovers/_selected_hosts.html.erb +29 -0
  12. data/app/views/discovers/index.html.erb +2 -0
  13. data/app/views/discovers/multiple_destroy.html.erb +5 -0
  14. data/app/views/discovers/select_multiple_location.html.erb +10 -0
  15. data/app/views/discovers/select_multiple_organization.html.erb +10 -0
  16. data/app/views/discovers/show.html.erb +16 -0
  17. data/config/environment.rb +0 -0
  18. data/config/initializers/discovery_setup.rb +20 -0
  19. data/config/routes.rb +26 -0
  20. data/lib/discovery_home_helper_patch.rb +21 -0
  21. data/lib/foreman_discovery.rb +4 -0
  22. data/lib/foreman_discovery/engine.rb +32 -0
  23. data/lib/foreman_discovery/facts.rb +12 -0
  24. data/lib/foreman_discovery/version.rb +3 -0
  25. data/lib/tasks.rake +72 -0
  26. data/test/foreman_app/CHANGELOG +3969 -0
  27. data/test/foreman_app/Contributors +94 -0
  28. data/test/foreman_app/Gemfile +33 -0
  29. data/test/foreman_app/README.md +17 -0
  30. data/test/foreman_app/Rakefile +7 -0
  31. data/test/foreman_app/VERSION +1 -0
  32. data/test/foreman_app/app/assets/images/Archlinux.png +0 -0
  33. data/test/foreman_app/app/assets/images/Centos.png +0 -0
  34. data/test/foreman_app/app/assets/images/Darwin.png +0 -0
  35. data/test/foreman_app/app/assets/images/Debian.png +0 -0
  36. data/test/foreman_app/app/assets/images/Fedora.png +0 -0
  37. data/test/foreman_app/app/assets/images/Redhat.png +0 -0
  38. data/test/foreman_app/app/assets/images/SLC.png +0 -0
  39. data/test/foreman_app/app/assets/images/Scientific.png +0 -0
  40. data/test/foreman_app/app/assets/images/Solaris.png +0 -0
  41. data/test/foreman_app/app/assets/images/Suse.png +0 -0
  42. data/test/foreman_app/app/assets/images/Ubuntu.png +0 -0
  43. data/test/foreman_app/app/assets/images/Windows.png +0 -0
  44. data/test/foreman_app/app/assets/images/bullet_toggle_plus.png +0 -0
  45. data/test/foreman_app/app/assets/images/edit-hover.png +0 -0
  46. data/test/foreman_app/app/assets/images/edit.png +0 -0
  47. data/test/foreman_app/app/assets/images/false.png +0 -0
  48. data/test/foreman_app/app/assets/images/foreman.png +0 -0
  49. data/test/foreman_app/app/assets/images/foreman_background.png +0 -0
  50. data/test/foreman_app/app/assets/images/foreman_large.png +0 -0
  51. data/test/foreman_app/app/assets/images/foreman_white.png +0 -0
  52. data/test/foreman_app/app/assets/images/pie_chart_icon.png +0 -0
  53. data/test/foreman_app/app/assets/images/pie_overlay.png +0 -0
  54. data/test/foreman_app/app/assets/images/spinner.gif +0 -0
  55. data/test/foreman_app/app/assets/images/switch.png +0 -0
  56. data/test/foreman_app/app/assets/images/toggle_check.png +0 -0
  57. data/test/foreman_app/app/assets/images/true.png +0 -0
  58. data/test/foreman_app/app/assets/images/user.jpg +0 -0
  59. data/test/foreman_app/app/assets/javascripts/application.js +348 -0
  60. data/test/foreman_app/app/assets/javascripts/charts.js +317 -0
  61. data/test/foreman_app/app/assets/javascripts/compute_resource.js +120 -0
  62. data/test/foreman_app/app/assets/javascripts/config_template.js +153 -0
  63. data/test/foreman_app/app/assets/javascripts/host_checkbox.js +151 -0
  64. data/test/foreman_app/app/assets/javascripts/host_edit.js +591 -0
  65. data/test/foreman_app/app/assets/javascripts/lookup_keys.js +184 -0
  66. data/test/foreman_app/app/assets/javascripts/nfs_visibility.js +33 -0
  67. data/test/foreman_app/app/assets/javascripts/noVNC.js +47 -0
  68. data/test/foreman_app/app/assets/javascripts/reports.js +27 -0
  69. data/test/foreman_app/app/assets/javascripts/spice.js +53 -0
  70. data/test/foreman_app/app/assets/javascripts/taxonomy.js +18 -0
  71. data/test/foreman_app/app/assets/javascripts/topbar.js +39 -0
  72. data/test/foreman_app/app/assets/javascripts/trends.js +10 -0
  73. data/test/foreman_app/app/assets/stylesheets/application.scss +350 -0
  74. data/test/foreman_app/app/assets/stylesheets/bootstrap_and_overrides.scss +130 -0
  75. data/test/foreman_app/app/assets/stylesheets/charts.scss +138 -0
  76. data/test/foreman_app/app/assets/stylesheets/dashboard.scss +42 -0
  77. data/test/foreman_app/app/assets/stylesheets/login.scss +77 -0
  78. data/test/foreman_app/app/assets/stylesheets/topbar.scss +83 -0
  79. data/test/foreman_app/app/assets/stylesheets/wizard.scss +60 -0
  80. data/test/foreman_app/app/controllers/api/base_controller.rb +162 -0
  81. data/test/foreman_app/app/controllers/api/v1/architectures_controller.rb +53 -0
  82. data/test/foreman_app/app/controllers/api/v1/audits_controller.rb +26 -0
  83. data/test/foreman_app/app/controllers/api/v1/auth_source_ldaps_controller.rb +72 -0
  84. data/test/foreman_app/app/controllers/api/v1/base_controller.rb +12 -0
  85. data/test/foreman_app/app/controllers/api/v1/bookmarks_controller.rb +59 -0
  86. data/test/foreman_app/app/controllers/api/v1/common_parameters_controller.rb +53 -0
  87. data/test/foreman_app/app/controllers/api/v1/compute_resources_controller.rb +71 -0
  88. data/test/foreman_app/app/controllers/api/v1/config_templates_controller.rb +102 -0
  89. data/test/foreman_app/app/controllers/api/v1/dashboard_controller.rb +20 -0
  90. data/test/foreman_app/app/controllers/api/v1/domains_controller.rb +74 -0
  91. data/test/foreman_app/app/controllers/api/v1/environments_controller.rb +50 -0
  92. data/test/foreman_app/app/controllers/api/v1/fact_values_controller.rb +23 -0
  93. data/test/foreman_app/app/controllers/api/v1/home_controller.rb +25 -0
  94. data/test/foreman_app/app/controllers/api/v1/hostgroups_controller.rb +70 -0
  95. data/test/foreman_app/app/controllers/api/v1/hosts_controller.rb +113 -0
  96. data/test/foreman_app/app/controllers/api/v1/images_controller.rb +73 -0
  97. data/test/foreman_app/app/controllers/api/v1/lookup_keys_controller.rb +63 -0
  98. data/test/foreman_app/app/controllers/api/v1/media_controller.rb +75 -0
  99. data/test/foreman_app/app/controllers/api/v1/models_controller.rb +56 -0
  100. data/test/foreman_app/app/controllers/api/v1/operatingsystems_controller.rb +79 -0
  101. data/test/foreman_app/app/controllers/api/v1/ptables_controller.rb +55 -0
  102. data/test/foreman_app/app/controllers/api/v1/puppetclasses_controller.rb +56 -0
  103. data/test/foreman_app/app/controllers/api/v1/reports_controller.rb +43 -0
  104. data/test/foreman_app/app/controllers/api/v1/roles_controller.rb +49 -0
  105. data/test/foreman_app/app/controllers/api/v1/settings_controller.rb +35 -0
  106. data/test/foreman_app/app/controllers/api/v1/smart_proxies_controller.rb +69 -0
  107. data/test/foreman_app/app/controllers/api/v1/subnets_controller.rb +77 -0
  108. data/test/foreman_app/app/controllers/api/v1/template_kinds_controller.rb +14 -0
  109. data/test/foreman_app/app/controllers/api/v1/usergroups_controller.rb +51 -0
  110. data/test/foreman_app/app/controllers/api/v1/users_controller.rb +102 -0
  111. data/test/foreman_app/app/controllers/api/v2/base_controller.rb +12 -0
  112. data/test/foreman_app/app/controllers/api/v2/compute_resources_controller.rb +20 -0
  113. data/test/foreman_app/app/controllers/api/v2/config_templates_controller.rb +26 -0
  114. data/test/foreman_app/app/controllers/api/v2/domains_controller.rb +20 -0
  115. data/test/foreman_app/app/controllers/api/v2/environments_controller.rb +20 -0
  116. data/test/foreman_app/app/controllers/api/v2/host_classes_controller.rb +49 -0
  117. data/test/foreman_app/app/controllers/api/v2/hostgroup_classes_controller.rb +44 -0
  118. data/test/foreman_app/app/controllers/api/v2/hostgroups_controller.rb +20 -0
  119. data/test/foreman_app/app/controllers/api/v2/locations_controller.rb +9 -0
  120. data/test/foreman_app/app/controllers/api/v2/media_controller.rb +20 -0
  121. data/test/foreman_app/app/controllers/api/v2/organizations_controller.rb +9 -0
  122. data/test/foreman_app/app/controllers/api/v2/parameters_controller.rb +131 -0
  123. data/test/foreman_app/app/controllers/api/v2/puppetclasses_controller.rb +60 -0
  124. data/test/foreman_app/app/controllers/api/v2/smart_proxies_controller.rb +20 -0
  125. data/test/foreman_app/app/controllers/api/v2/subnets_controller.rb +20 -0
  126. data/test/foreman_app/app/controllers/api/v2/template_combinations_controller.rb +46 -0
  127. data/test/foreman_app/app/controllers/api/v2/users_controller.rb +20 -0
  128. data/test/foreman_app/app/controllers/application_controller.rb +349 -0
  129. data/test/foreman_app/app/controllers/architectures_controller.rb +51 -0
  130. data/test/foreman_app/app/controllers/audits_controller.rb +19 -0
  131. data/test/foreman_app/app/controllers/auth_source_ldaps_controller.rb +49 -0
  132. data/test/foreman_app/app/controllers/bookmarks_controller.rb +55 -0
  133. data/test/foreman_app/app/controllers/common_parameters_controller.rb +46 -0
  134. data/test/foreman_app/app/controllers/compute_resources_controller.rb +103 -0
  135. data/test/foreman_app/app/controllers/compute_resources_vms_controller.rb +78 -0
  136. data/test/foreman_app/app/controllers/concerns/api/taxonomy_scope.rb +15 -0
  137. data/test/foreman_app/app/controllers/concerns/api/v2/taxonomies_controller.rb +99 -0
  138. data/test/foreman_app/app/controllers/config_templates_controller.rb +105 -0
  139. data/test/foreman_app/app/controllers/dashboard_controller.rb +21 -0
  140. data/test/foreman_app/app/controllers/domains_controller.rb +55 -0
  141. data/test/foreman_app/app/controllers/environments_controller.rb +59 -0
  142. data/test/foreman_app/app/controllers/fact_values_controller.rb +60 -0
  143. data/test/foreman_app/app/controllers/facts_controller.rb +25 -0
  144. data/test/foreman_app/app/controllers/home_controller.rb +37 -0
  145. data/test/foreman_app/app/controllers/hostgroups_controller.rb +115 -0
  146. data/test/foreman_app/app/controllers/hosts_controller.rb +570 -0
  147. data/test/foreman_app/app/controllers/images_controller.rb +57 -0
  148. data/test/foreman_app/app/controllers/locations_controller.rb +4 -0
  149. data/test/foreman_app/app/controllers/lookup_keys_controller.rb +60 -0
  150. data/test/foreman_app/app/controllers/lookup_values_controller.rb +58 -0
  151. data/test/foreman_app/app/controllers/media_controller.rb +56 -0
  152. data/test/foreman_app/app/controllers/models_controller.rb +49 -0
  153. data/test/foreman_app/app/controllers/notices_controller.rb +9 -0
  154. data/test/foreman_app/app/controllers/operatingsystems_controller.rb +77 -0
  155. data/test/foreman_app/app/controllers/organizations_controller.rb +4 -0
  156. data/test/foreman_app/app/controllers/ptables_controller.rb +56 -0
  157. data/test/foreman_app/app/controllers/puppetclasses_controller.rb +85 -0
  158. data/test/foreman_app/app/controllers/reports_controller.rb +60 -0
  159. data/test/foreman_app/app/controllers/roles_controller.rb +78 -0
  160. data/test/foreman_app/app/controllers/settings_controller.rb +21 -0
  161. data/test/foreman_app/app/controllers/smart_proxies/autosign_controller.rb +47 -0
  162. data/test/foreman_app/app/controllers/smart_proxies/puppetca_controller.rb +59 -0
  163. data/test/foreman_app/app/controllers/smart_proxies_controller.rb +43 -0
  164. data/test/foreman_app/app/controllers/statistics_controller.rb +27 -0
  165. data/test/foreman_app/app/controllers/subnets_controller.rb +88 -0
  166. data/test/foreman_app/app/controllers/tasks_controller.rb +16 -0
  167. data/test/foreman_app/app/controllers/topbar_sweeper.rb +24 -0
  168. data/test/foreman_app/app/controllers/trends_controller.rb +56 -0
  169. data/test/foreman_app/app/controllers/unattended_controller.rb +257 -0
  170. data/test/foreman_app/app/controllers/usergroups_controller.rb +44 -0
  171. data/test/foreman_app/app/controllers/users_controller.rb +150 -0
  172. data/test/foreman_app/app/helpers/application_helper.rb +317 -0
  173. data/test/foreman_app/app/helpers/architecture_helper.rb +2 -0
  174. data/test/foreman_app/app/helpers/architectures_helper.rb +2 -0
  175. data/test/foreman_app/app/helpers/audits_helper.rb +138 -0
  176. data/test/foreman_app/app/helpers/auth_source_ldaps_helper.rb +8 -0
  177. data/test/foreman_app/app/helpers/auth_sources_helper.rb +2 -0
  178. data/test/foreman_app/app/helpers/bookmarks_helper.rb +2 -0
  179. data/test/foreman_app/app/helpers/common_parameters_helper.rb +22 -0
  180. data/test/foreman_app/app/helpers/compute_resources_helper.rb +28 -0
  181. data/test/foreman_app/app/helpers/compute_resources_vms_helper.rb +45 -0
  182. data/test/foreman_app/app/helpers/config_templates_helper.rb +10 -0
  183. data/test/foreman_app/app/helpers/dashboard_helper.rb +35 -0
  184. data/test/foreman_app/app/helpers/domains_helper.rb +3 -0
  185. data/test/foreman_app/app/helpers/environments_helper.rb +3 -0
  186. data/test/foreman_app/app/helpers/fact_values_helper.rb +8 -0
  187. data/test/foreman_app/app/helpers/home_helper.rb +116 -0
  188. data/test/foreman_app/app/helpers/hostgroups_helper.rb +14 -0
  189. data/test/foreman_app/app/helpers/hosts_and_hostgroups_helper.rb +99 -0
  190. data/test/foreman_app/app/helpers/hosts_helper.rb +267 -0
  191. data/test/foreman_app/app/helpers/images_helper.rb +11 -0
  192. data/test/foreman_app/app/helpers/layout_helper.rb +214 -0
  193. data/test/foreman_app/app/helpers/lookup_keys_helper.rb +108 -0
  194. data/test/foreman_app/app/helpers/media_helper.rb +2 -0
  195. data/test/foreman_app/app/helpers/medium_helper.rb +2 -0
  196. data/test/foreman_app/app/helpers/model_helper.rb +2 -0
  197. data/test/foreman_app/app/helpers/models_helper.rb +2 -0
  198. data/test/foreman_app/app/helpers/notices_helper.rb +3 -0
  199. data/test/foreman_app/app/helpers/operatingsystems_helper.rb +40 -0
  200. data/test/foreman_app/app/helpers/organization_helper.rb +2 -0
  201. data/test/foreman_app/app/helpers/ptables_helper.rb +2 -0
  202. data/test/foreman_app/app/helpers/puppetclasses_and_environments_helper.rb +39 -0
  203. data/test/foreman_app/app/helpers/puppetclasses_helper.rb +16 -0
  204. data/test/foreman_app/app/helpers/reports_helper.rb +48 -0
  205. data/test/foreman_app/app/helpers/settings_helper.rb +27 -0
  206. data/test/foreman_app/app/helpers/smart_proxies/autosign_helper.rb +6 -0
  207. data/test/foreman_app/app/helpers/smart_proxies/puppetca_helper.rb +20 -0
  208. data/test/foreman_app/app/helpers/smart_proxies_helper.rb +2 -0
  209. data/test/foreman_app/app/helpers/statistics_helper.rb +16 -0
  210. data/test/foreman_app/app/helpers/subnets_helper.rb +9 -0
  211. data/test/foreman_app/app/helpers/tasks_helper.rb +22 -0
  212. data/test/foreman_app/app/helpers/taxonomy_helper.rb +107 -0
  213. data/test/foreman_app/app/helpers/trends_helper.rb +46 -0
  214. data/test/foreman_app/app/helpers/unattended_helper.rb +16 -0
  215. data/test/foreman_app/app/helpers/usergroups_helper.rb +2 -0
  216. data/test/foreman_app/app/helpers/users_helper.rb +21 -0
  217. data/test/foreman_app/app/models/architecture.rb +23 -0
  218. data/test/foreman_app/app/models/archlinux.rb +27 -0
  219. data/test/foreman_app/app/models/auth_source.rb +70 -0
  220. data/test/foreman_app/app/models/auth_source_internal.rb +17 -0
  221. data/test/foreman_app/app/models/auth_source_ldap.rb +147 -0
  222. data/test/foreman_app/app/models/authorization.rb +51 -0
  223. data/test/foreman_app/app/models/bookmark.rb +30 -0
  224. data/test/foreman_app/app/models/classification.rb +126 -0
  225. data/test/foreman_app/app/models/common_parameter.rb +13 -0
  226. data/test/foreman_app/app/models/compute_resource.rb +232 -0
  227. data/test/foreman_app/app/models/config_template.rb +172 -0
  228. data/test/foreman_app/app/models/dashboard.rb +53 -0
  229. data/test/foreman_app/app/models/debian.rb +47 -0
  230. data/test/foreman_app/app/models/domain.rb +90 -0
  231. data/test/foreman_app/app/models/domain_parameter.rb +22 -0
  232. data/test/foreman_app/app/models/environment.rb +57 -0
  233. data/test/foreman_app/app/models/environment_class.rb +25 -0
  234. data/test/foreman_app/app/models/fact_name.rb +17 -0
  235. data/test/foreman_app/app/models/fact_trend.rb +57 -0
  236. data/test/foreman_app/app/models/fact_value.rb +83 -0
  237. data/test/foreman_app/app/models/facts_importer.rb +121 -0
  238. data/test/foreman_app/app/models/feature.rb +4 -0
  239. data/test/foreman_app/app/models/foreman_trend.rb +38 -0
  240. data/test/foreman_app/app/models/group_parameter.rb +22 -0
  241. data/test/foreman_app/app/models/host.rb +30 -0
  242. data/test/foreman_app/app/models/host/base.rb +141 -0
  243. data/test/foreman_app/app/models/host/hostmix.rb +13 -0
  244. data/test/foreman_app/app/models/host/managed.rb +854 -0
  245. data/test/foreman_app/app/models/host_class.rb +13 -0
  246. data/test/foreman_app/app/models/host_common.rb +95 -0
  247. data/test/foreman_app/app/models/host_mailer.rb +77 -0
  248. data/test/foreman_app/app/models/host_observer.rb +19 -0
  249. data/test/foreman_app/app/models/host_parameter.rb +20 -0
  250. data/test/foreman_app/app/models/host_template_helpers.rb +43 -0
  251. data/test/foreman_app/app/models/hostext/search.rb +128 -0
  252. data/test/foreman_app/app/models/hostgroup.rb +159 -0
  253. data/test/foreman_app/app/models/hostgroup_class.rb +15 -0
  254. data/test/foreman_app/app/models/image.rb +14 -0
  255. data/test/foreman_app/app/models/key_pair.rb +5 -0
  256. data/test/foreman_app/app/models/location.rb +25 -0
  257. data/test/foreman_app/app/models/log.rb +25 -0
  258. data/test/foreman_app/app/models/lookup_key.rb +261 -0
  259. data/test/foreman_app/app/models/lookup_value.rb +61 -0
  260. data/test/foreman_app/app/models/medium.rb +58 -0
  261. data/test/foreman_app/app/models/message.rb +19 -0
  262. data/test/foreman_app/app/models/model.rb +14 -0
  263. data/test/foreman_app/app/models/nic.rb +61 -0
  264. data/test/foreman_app/app/models/nic/bmc.rb +22 -0
  265. data/test/foreman_app/app/models/nic/bootable.rb +31 -0
  266. data/test/foreman_app/app/models/nic/interface.rb +23 -0
  267. data/test/foreman_app/app/models/nic/managed.rb +57 -0
  268. data/test/foreman_app/app/models/notice.rb +36 -0
  269. data/test/foreman_app/app/models/operatingsystem.rb +196 -0
  270. data/test/foreman_app/app/models/orchestration.rb +184 -0
  271. data/test/foreman_app/app/models/orchestration/compute.rb +157 -0
  272. data/test/foreman_app/app/models/orchestration/dhcp.rb +154 -0
  273. data/test/foreman_app/app/models/orchestration/dns.rb +130 -0
  274. data/test/foreman_app/app/models/orchestration/puppetca.rb +79 -0
  275. data/test/foreman_app/app/models/orchestration/ssh_provision.rb +115 -0
  276. data/test/foreman_app/app/models/orchestration/tftp.rb +133 -0
  277. data/test/foreman_app/app/models/organization.rb +24 -0
  278. data/test/foreman_app/app/models/os_default_template.rb +11 -0
  279. data/test/foreman_app/app/models/os_parameter.rb +16 -0
  280. data/test/foreman_app/app/models/parameter.rb +34 -0
  281. data/test/foreman_app/app/models/ptable.rb +25 -0
  282. data/test/foreman_app/app/models/puppet_class_importer.rb +269 -0
  283. data/test/foreman_app/app/models/puppetclass.rb +172 -0
  284. data/test/foreman_app/app/models/redhat.rb +61 -0
  285. data/test/foreman_app/app/models/report.rb +356 -0
  286. data/test/foreman_app/app/models/report_common.rb +52 -0
  287. data/test/foreman_app/app/models/role.rb +156 -0
  288. data/test/foreman_app/app/models/setting.rb +174 -0
  289. data/test/foreman_app/app/models/setting/auth.rb +29 -0
  290. data/test/foreman_app/app/models/setting/general.rb +27 -0
  291. data/test/foreman_app/app/models/setting/provisioning.rb +28 -0
  292. data/test/foreman_app/app/models/setting/puppet.rb +36 -0
  293. data/test/foreman_app/app/models/smart_proxies/puppet_ca.rb +66 -0
  294. data/test/foreman_app/app/models/smart_proxy.rb +96 -0
  295. data/test/foreman_app/app/models/solaris.rb +114 -0
  296. data/test/foreman_app/app/models/source.rb +18 -0
  297. data/test/foreman_app/app/models/subnet.rb +146 -0
  298. data/test/foreman_app/app/models/subnet_domain.rb +12 -0
  299. data/test/foreman_app/app/models/suse.rb +22 -0
  300. data/test/foreman_app/app/models/tax_host.rb +181 -0
  301. data/test/foreman_app/app/models/taxable_taxonomy.rb +14 -0
  302. data/test/foreman_app/app/models/taxonomix.rb +47 -0
  303. data/test/foreman_app/app/models/taxonomy.rb +135 -0
  304. data/test/foreman_app/app/models/template_combination.rb +12 -0
  305. data/test/foreman_app/app/models/template_kind.rb +6 -0
  306. data/test/foreman_app/app/models/token.rb +23 -0
  307. data/test/foreman_app/app/models/trend.rb +22 -0
  308. data/test/foreman_app/app/models/trend_counter.rb +7 -0
  309. data/test/foreman_app/app/models/trend_importer.rb +50 -0
  310. data/test/foreman_app/app/models/user.rb +251 -0
  311. data/test/foreman_app/app/models/user_fact.rb +26 -0
  312. data/test/foreman_app/app/models/user_hostgroup.rb +10 -0
  313. data/test/foreman_app/app/models/user_role.rb +32 -0
  314. data/test/foreman_app/app/models/usergroup.rb +61 -0
  315. data/test/foreman_app/app/models/usergroup_member.rb +5 -0
  316. data/test/foreman_app/app/models/windows.rb +20 -0
  317. data/test/foreman_app/app/views/api/v1/architectures/create.json.rabl +3 -0
  318. data/test/foreman_app/app/views/api/v1/architectures/index.json.rabl +3 -0
  319. data/test/foreman_app/app/views/api/v1/architectures/show.json.rabl +3 -0
  320. data/test/foreman_app/app/views/api/v1/audits/index.json.rabl +3 -0
  321. data/test/foreman_app/app/views/api/v1/audits/show.json.rabl +5 -0
  322. data/test/foreman_app/app/views/api/v1/auth_source_ldaps/index.json.rabl +3 -0
  323. data/test/foreman_app/app/views/api/v1/auth_source_ldaps/show.json.rabl +3 -0
  324. data/test/foreman_app/app/views/api/v1/bookmarks/create.json.rabl +2 -0
  325. data/test/foreman_app/app/views/api/v1/bookmarks/index.json.rabl +3 -0
  326. data/test/foreman_app/app/views/api/v1/bookmarks/show.json.rabl +2 -0
  327. data/test/foreman_app/app/views/api/v1/bookmarks/update.json.rabl +8 -0
  328. data/test/foreman_app/app/views/api/v1/common_parameters/create.json.rabl +3 -0
  329. data/test/foreman_app/app/views/api/v1/common_parameters/index.json.rabl +3 -0
  330. data/test/foreman_app/app/views/api/v1/common_parameters/show.json.rabl +3 -0
  331. data/test/foreman_app/app/views/api/v1/compute_resources/create.json.rabl +3 -0
  332. data/test/foreman_app/app/views/api/v1/compute_resources/ec2.json.rabl +1 -0
  333. data/test/foreman_app/app/views/api/v1/compute_resources/index.json.rabl +3 -0
  334. data/test/foreman_app/app/views/api/v1/compute_resources/libvirt.json.rabl +0 -0
  335. data/test/foreman_app/app/views/api/v1/compute_resources/openstack.json.rabl +1 -0
  336. data/test/foreman_app/app/views/api/v1/compute_resources/ovirt.json.rabl +1 -0
  337. data/test/foreman_app/app/views/api/v1/compute_resources/rackspace.json.rabl +1 -0
  338. data/test/foreman_app/app/views/api/v1/compute_resources/show.json.rabl +8 -0
  339. data/test/foreman_app/app/views/api/v1/compute_resources/vmware.json.rabl +1 -0
  340. data/test/foreman_app/app/views/api/v1/config_templates/create.json.rabl +3 -0
  341. data/test/foreman_app/app/views/api/v1/config_templates/index.json.rabl +3 -0
  342. data/test/foreman_app/app/views/api/v1/config_templates/show.json.rabl +11 -0
  343. data/test/foreman_app/app/views/api/v1/domains/index.json.rabl +3 -0
  344. data/test/foreman_app/app/views/api/v1/domains/show.json.rabl +2 -0
  345. data/test/foreman_app/app/views/api/v1/environments/create.json.rabl +3 -0
  346. data/test/foreman_app/app/views/api/v1/environments/index.json.rabl +3 -0
  347. data/test/foreman_app/app/views/api/v1/environments/show.json.rabl +5 -0
  348. data/test/foreman_app/app/views/api/v1/errors/access_denied.json.rabl +4 -0
  349. data/test/foreman_app/app/views/api/v1/errors/not_found.json.rabl +3 -0
  350. data/test/foreman_app/app/views/api/v1/errors/param_error.json.rabl +7 -0
  351. data/test/foreman_app/app/views/api/v1/errors/route_error.json.rabl +4 -0
  352. data/test/foreman_app/app/views/api/v1/errors/standard_error.json.rabl +5 -0
  353. data/test/foreman_app/app/views/api/v1/errors/unauthorized.json.rabl +3 -0
  354. data/test/foreman_app/app/views/api/v1/errors/unprocessable_entity.json.rabl +6 -0
  355. data/test/foreman_app/app/views/api/v1/home/index.json.rabl +24 -0
  356. data/test/foreman_app/app/views/api/v1/home/status.json.rabl +6 -0
  357. data/test/foreman_app/app/views/api/v1/hostgroups/create.json.rabl +3 -0
  358. data/test/foreman_app/app/views/api/v1/hostgroups/index.json.rabl +3 -0
  359. data/test/foreman_app/app/views/api/v1/hostgroups/show.json.rabl +3 -0
  360. data/test/foreman_app/app/views/api/v1/hosts/create.json.rabl +3 -0
  361. data/test/foreman_app/app/views/api/v1/hosts/index.json.rabl +3 -0
  362. data/test/foreman_app/app/views/api/v1/hosts/show.json.rabl +12 -0
  363. data/test/foreman_app/app/views/api/v1/images/index.json.rabl +3 -0
  364. data/test/foreman_app/app/views/api/v1/images/show.json.rabl +3 -0
  365. data/test/foreman_app/app/views/api/v1/lookup_keys/index.json.rabl +3 -0
  366. data/test/foreman_app/app/views/api/v1/lookup_keys/show.json.rabl +3 -0
  367. data/test/foreman_app/app/views/api/v1/media/index.json.rabl +3 -0
  368. data/test/foreman_app/app/views/api/v1/media/show.json.rabl +9 -0
  369. data/test/foreman_app/app/views/api/v1/models/index.rabl +4 -0
  370. data/test/foreman_app/app/views/api/v1/models/show.rabl +3 -0
  371. data/test/foreman_app/app/views/api/v1/operatingsystems/create.json.rabl +4 -0
  372. data/test/foreman_app/app/views/api/v1/operatingsystems/index.json.rabl +3 -0
  373. data/test/foreman_app/app/views/api/v1/operatingsystems/show.json.rabl +22 -0
  374. data/test/foreman_app/app/views/api/v1/operatingsystems/update.json.rabl +3 -0
  375. data/test/foreman_app/app/views/api/v1/ptables/index.json.rabl +3 -0
  376. data/test/foreman_app/app/views/api/v1/ptables/show.json.rabl +3 -0
  377. data/test/foreman_app/app/views/api/v1/reports/index.json.rabl +3 -0
  378. data/test/foreman_app/app/views/api/v1/reports/show.json.rabl +16 -0
  379. data/test/foreman_app/app/views/api/v1/roles/create.json.rabl +3 -0
  380. data/test/foreman_app/app/views/api/v1/roles/index.json.rabl +3 -0
  381. data/test/foreman_app/app/views/api/v1/roles/show.json.rabl +3 -0
  382. data/test/foreman_app/app/views/api/v1/settings/index.json.rabl +3 -0
  383. data/test/foreman_app/app/views/api/v1/settings/show.json.rabl +3 -0
  384. data/test/foreman_app/app/views/api/v1/smart_proxies/index.json.rabl +3 -0
  385. data/test/foreman_app/app/views/api/v1/smart_proxies/show.json.rabl +9 -0
  386. data/test/foreman_app/app/views/api/v1/subnets/create.json.rabl +3 -0
  387. data/test/foreman_app/app/views/api/v1/subnets/index.json.rabl +5 -0
  388. data/test/foreman_app/app/views/api/v1/subnets/show.json.rabl +17 -0
  389. data/test/foreman_app/app/views/api/v1/subnets/update.json.rabl +3 -0
  390. data/test/foreman_app/app/views/api/v1/template_kinds/index.json.rabl +3 -0
  391. data/test/foreman_app/app/views/api/v1/template_kinds/show.json.rabl +3 -0
  392. data/test/foreman_app/app/views/api/v1/usergroups/index.json.rabl +3 -0
  393. data/test/foreman_app/app/views/api/v1/usergroups/show.json.rabl +3 -0
  394. data/test/foreman_app/app/views/api/v1/users/create.json.rabl +3 -0
  395. data/test/foreman_app/app/views/api/v1/users/index.json.rabl +5 -0
  396. data/test/foreman_app/app/views/api/v1/users/show.json.rabl +13 -0
  397. data/test/foreman_app/app/views/api/v2/config_templates/create.json.rabl +3 -0
  398. data/test/foreman_app/app/views/api/v2/config_templates/index.json.rabl +3 -0
  399. data/test/foreman_app/app/views/api/v2/config_templates/show.json.rabl +33 -0
  400. data/test/foreman_app/app/views/api/v2/errors/access_denied.json.rabl +4 -0
  401. data/test/foreman_app/app/views/api/v2/errors/not_found.json.rabl +3 -0
  402. data/test/foreman_app/app/views/api/v2/errors/param_error.json.rabl +7 -0
  403. data/test/foreman_app/app/views/api/v2/errors/route_error.json.rabl +4 -0
  404. data/test/foreman_app/app/views/api/v2/errors/standard_error.json.rabl +5 -0
  405. data/test/foreman_app/app/views/api/v2/errors/unauthorized.json.rabl +3 -0
  406. data/test/foreman_app/app/views/api/v2/errors/unprocessable_entity.json.rabl +6 -0
  407. data/test/foreman_app/app/views/api/v2/parameters/create.json.rabl +3 -0
  408. data/test/foreman_app/app/views/api/v2/parameters/index.json.rabl +3 -0
  409. data/test/foreman_app/app/views/api/v2/parameters/show.json.rabl +3 -0
  410. data/test/foreman_app/app/views/api/v2/parameters/update.json.rabl +3 -0
  411. data/test/foreman_app/app/views/api/v2/puppetclasses/show.json.rabl +7 -0
  412. data/test/foreman_app/app/views/api/v2/taxonomies/index.json.rabl +3 -0
  413. data/test/foreman_app/app/views/api/v2/taxonomies/show.json.rabl +7 -0
  414. data/test/foreman_app/app/views/api/v2/taxonomies/update.json.rabl +3 -0
  415. data/test/foreman_app/app/views/api/v2/template_combinations/create.json.rabl +3 -0
  416. data/test/foreman_app/app/views/api/v2/template_combinations/index.json.rabl +3 -0
  417. data/test/foreman_app/app/views/api/v2/template_combinations/show.json.rabl +3 -0
  418. data/test/foreman_app/app/views/architectures/_form.html.erb +6 -0
  419. data/test/foreman_app/app/views/architectures/edit.html.erb +3 -0
  420. data/test/foreman_app/app/views/architectures/index.html.erb +21 -0
  421. data/test/foreman_app/app/views/architectures/new.html.erb +3 -0
  422. data/test/foreman_app/app/views/architectures/welcome.html.erb +14 -0
  423. data/test/foreman_app/app/views/audits/_list.erb +24 -0
  424. data/test/foreman_app/app/views/audits/index.html.erb +6 -0
  425. data/test/foreman_app/app/views/audits/show.html.erb +56 -0
  426. data/test/foreman_app/app/views/auth_source_ldaps/_form.html.erb +23 -0
  427. data/test/foreman_app/app/views/auth_source_ldaps/edit.html.erb +3 -0
  428. data/test/foreman_app/app/views/auth_source_ldaps/index.html.erb +22 -0
  429. data/test/foreman_app/app/views/auth_source_ldaps/new.html.erb +3 -0
  430. data/test/foreman_app/app/views/auth_source_ldaps/welcome.html.erb +8 -0
  431. data/test/foreman_app/app/views/bookmarks/_form.html.erb +8 -0
  432. data/test/foreman_app/app/views/bookmarks/_list.html.erb +7 -0
  433. data/test/foreman_app/app/views/bookmarks/edit.html.erb +3 -0
  434. data/test/foreman_app/app/views/bookmarks/index.html.erb +25 -0
  435. data/test/foreman_app/app/views/bookmarks/new.html.erb +3 -0
  436. data/test/foreman_app/app/views/bookmarks/welcome.html.erb +8 -0
  437. data/test/foreman_app/app/views/common/403.html.erb +9 -0
  438. data/test/foreman_app/app/views/common/404.html.erb +8 -0
  439. data/test/foreman_app/app/views/common/500.html.erb +19 -0
  440. data/test/foreman_app/app/views/common/_domain.html.erb +9 -0
  441. data/test/foreman_app/app/views/common/_domain_subnet.html.erb +10 -0
  442. data/test/foreman_app/app/views/common/_edit_habtm.erb +20 -0
  443. data/test/foreman_app/app/views/common/_notice.erb +20 -0
  444. data/test/foreman_app/app/views/common/_puppetclasses_or_envs_changed.html.erb +32 -0
  445. data/test/foreman_app/app/views/common/_searchbar.erb +37 -0
  446. data/test/foreman_app/app/views/common/_show_habtm.html.erb +1 -0
  447. data/test/foreman_app/app/views/common/os_selection/_architecture.html.erb +9 -0
  448. data/test/foreman_app/app/views/common/os_selection/_image_details.html.erb +7 -0
  449. data/test/foreman_app/app/views/common/os_selection/_initial.html.erb +15 -0
  450. data/test/foreman_app/app/views/common/os_selection/_operatingsystem.html.erb +15 -0
  451. data/test/foreman_app/app/views/common_parameters/_form.html.erb +6 -0
  452. data/test/foreman_app/app/views/common_parameters/_inherited_parameters.erb +23 -0
  453. data/test/foreman_app/app/views/common_parameters/_parameter.erb +14 -0
  454. data/test/foreman_app/app/views/common_parameters/_parameters.erb +6 -0
  455. data/test/foreman_app/app/views/common_parameters/_puppetclass_parameter.erb +16 -0
  456. data/test/foreman_app/app/views/common_parameters/_puppetclasses_parameters.erb +7 -0
  457. data/test/foreman_app/app/views/common_parameters/_show_parameter.html.erb +5 -0
  458. data/test/foreman_app/app/views/common_parameters/edit.html.erb +3 -0
  459. data/test/foreman_app/app/views/common_parameters/index.html.erb +22 -0
  460. data/test/foreman_app/app/views/common_parameters/new.html.erb +3 -0
  461. data/test/foreman_app/app/views/compute_resources/_form.html.erb +44 -0
  462. data/test/foreman_app/app/views/compute_resources/edit.html.erb +3 -0
  463. data/test/foreman_app/app/views/compute_resources/form/_ec2.html.erb +8 -0
  464. data/test/foreman_app/app/views/compute_resources/form/_libvirt.html.erb +9 -0
  465. data/test/foreman_app/app/views/compute_resources/form/_openstack.html.erb +9 -0
  466. data/test/foreman_app/app/views/compute_resources/form/_ovirt.html.erb +8 -0
  467. data/test/foreman_app/app/views/compute_resources/form/_rackspace.html.erb +8 -0
  468. data/test/foreman_app/app/views/compute_resources/form/_vmware.html.erb +8 -0
  469. data/test/foreman_app/app/views/compute_resources/index.html.erb +24 -0
  470. data/test/foreman_app/app/views/compute_resources/new.html.erb +3 -0
  471. data/test/foreman_app/app/views/compute_resources/show.html.erb +56 -0
  472. data/test/foreman_app/app/views/compute_resources_vms/form/_ec2.html.erb +10 -0
  473. data/test/foreman_app/app/views/compute_resources_vms/form/_libvirt.html.erb +33 -0
  474. data/test/foreman_app/app/views/compute_resources_vms/form/_openstack.html.erb +9 -0
  475. data/test/foreman_app/app/views/compute_resources_vms/form/_ovirt.html.erb +43 -0
  476. data/test/foreman_app/app/views/compute_resources_vms/form/_rackspace.html.erb +7 -0
  477. data/test/foreman_app/app/views/compute_resources_vms/form/_vmware.html.erb +37 -0
  478. data/test/foreman_app/app/views/compute_resources_vms/form/libvirt/_network.html.erb +9 -0
  479. data/test/foreman_app/app/views/compute_resources_vms/form/libvirt/_volume.html.erb +6 -0
  480. data/test/foreman_app/app/views/compute_resources_vms/form/ovirt/_network.html.erb +13 -0
  481. data/test/foreman_app/app/views/compute_resources_vms/form/ovirt/_volume.html.erb +18 -0
  482. data/test/foreman_app/app/views/compute_resources_vms/form/vmware/_network.html.erb +8 -0
  483. data/test/foreman_app/app/views/compute_resources_vms/form/vmware/_volume.html.erb +8 -0
  484. data/test/foreman_app/app/views/compute_resources_vms/index.html.erb +3 -0
  485. data/test/foreman_app/app/views/compute_resources_vms/index/_ec2.html.erb +25 -0
  486. data/test/foreman_app/app/views/compute_resources_vms/index/_libvirt.html.erb +23 -0
  487. data/test/foreman_app/app/views/compute_resources_vms/index/_openstack.html.erb +23 -0
  488. data/test/foreman_app/app/views/compute_resources_vms/index/_ovirt.html.erb +24 -0
  489. data/test/foreman_app/app/views/compute_resources_vms/index/_rackspace.html.erb +22 -0
  490. data/test/foreman_app/app/views/compute_resources_vms/index/_vmware.html.erb +27 -0
  491. data/test/foreman_app/app/views/compute_resources_vms/new.html.erb +9 -0
  492. data/test/foreman_app/app/views/compute_resources_vms/show.html.erb +8 -0
  493. data/test/foreman_app/app/views/compute_resources_vms/show/_ec2.html.erb +19 -0
  494. data/test/foreman_app/app/views/compute_resources_vms/show/_libvirt.html.erb +53 -0
  495. data/test/foreman_app/app/views/compute_resources_vms/show/_openstack.html.erb +19 -0
  496. data/test/foreman_app/app/views/compute_resources_vms/show/_ovirt.html.erb +47 -0
  497. data/test/foreman_app/app/views/compute_resources_vms/show/_rackspace.html.erb +19 -0
  498. data/test/foreman_app/app/views/compute_resources_vms/show/_vmware.html.erb +16 -0
  499. data/test/foreman_app/app/views/config_templates/_combination.html.erb +5 -0
  500. data/test/foreman_app/app/views/config_templates/_combinations.html.erb +6 -0
  501. data/test/foreman_app/app/views/config_templates/_diff.erb +14 -0
  502. data/test/foreman_app/app/views/config_templates/_form.html.erb +94 -0
  503. data/test/foreman_app/app/views/config_templates/edit.html.erb +3 -0
  504. data/test/foreman_app/app/views/config_templates/index.html.erb +31 -0
  505. data/test/foreman_app/app/views/config_templates/new.html.erb +3 -0
  506. data/test/foreman_app/app/views/dashboard/_status_table.html.erb +32 -0
  507. data/test/foreman_app/app/views/dashboard/index.html.erb +24 -0
  508. data/test/foreman_app/app/views/dashboard/welcome.html.erb +118 -0
  509. data/test/foreman_app/app/views/domains/_form.html.erb +43 -0
  510. data/test/foreman_app/app/views/domains/edit.html.erb +3 -0
  511. data/test/foreman_app/app/views/domains/index.html.erb +20 -0
  512. data/test/foreman_app/app/views/domains/new.html.erb +3 -0
  513. data/test/foreman_app/app/views/domains/welcome.html.erb +13 -0
  514. data/test/foreman_app/app/views/environments/_form.html.erb +38 -0
  515. data/test/foreman_app/app/views/environments/edit.html.erb +3 -0
  516. data/test/foreman_app/app/views/environments/index.html.erb +27 -0
  517. data/test/foreman_app/app/views/environments/new.html.erb +3 -0
  518. data/test/foreman_app/app/views/environments/welcome.html.erb +15 -0
  519. data/test/foreman_app/app/views/fact_values/index.html.erb +40 -0
  520. data/test/foreman_app/app/views/fact_values/welcome.html.erb +9 -0
  521. data/test/foreman_app/app/views/facts/show.html.erb +3 -0
  522. data/test/foreman_app/app/views/home/_location_dropdown.html.erb +17 -0
  523. data/test/foreman_app/app/views/home/_org_switcher.html.erb +11 -0
  524. data/test/foreman_app/app/views/home/_organization_dropdown.html.erb +17 -0
  525. data/test/foreman_app/app/views/home/_settings.html.erb +22 -0
  526. data/test/foreman_app/app/views/home/_topbar.html.erb +33 -0
  527. data/test/foreman_app/app/views/home/_user_dropdown.html.erb +10 -0
  528. data/test/foreman_app/app/views/host_mailer/_active_hosts.html.erb +30 -0
  529. data/test/foreman_app/app/views/host_mailer/_link_to_host.html.erb +5 -0
  530. data/test/foreman_app/app/views/host_mailer/_list.html.erb +13 -0
  531. data/test/foreman_app/app/views/host_mailer/_nonactive_hosts.html.erb +30 -0
  532. data/test/foreman_app/app/views/host_mailer/error_state.html.erb +10 -0
  533. data/test/foreman_app/app/views/host_mailer/summary.html.erb +17 -0
  534. data/test/foreman_app/app/views/hostgroups/_form.html.erb +69 -0
  535. data/test/foreman_app/app/views/hostgroups/edit.html.erb +3 -0
  536. data/test/foreman_app/app/views/hostgroups/index.html.erb +23 -0
  537. data/test/foreman_app/app/views/hostgroups/new.html.erb +3 -0
  538. data/test/foreman_app/app/views/hostgroups/welcome.html.erb +20 -0
  539. data/test/foreman_app/app/views/hosts/_assign_hosts.html.erb +42 -0
  540. data/test/foreman_app/app/views/hosts/_compute.html.erb +12 -0
  541. data/test/foreman_app/app/views/hosts/_conflicts.html.erb +28 -0
  542. data/test/foreman_app/app/views/hosts/_form.html.erb +109 -0
  543. data/test/foreman_app/app/views/hosts/_interfaces.html.erb +29 -0
  544. data/test/foreman_app/app/views/hosts/_list.html.erb +47 -0
  545. data/test/foreman_app/app/views/hosts/_metrics.html.erb +13 -0
  546. data/test/foreman_app/app/views/hosts/_operating_system.erb +41 -0
  547. data/test/foreman_app/app/views/hosts/_overview.html.erb +25 -0
  548. data/test/foreman_app/app/views/hosts/_progress.erb +8 -0
  549. data/test/foreman_app/app/views/hosts/_provisioning.html.erb +9 -0
  550. data/test/foreman_app/app/views/hosts/_selected_hosts.html.erb +31 -0
  551. data/test/foreman_app/app/views/hosts/_taxonomy_import_option.html.erb +2 -0
  552. data/test/foreman_app/app/views/hosts/_unattended.html.erb +34 -0
  553. data/test/foreman_app/app/views/hosts/assign_hosts.html.erb +5 -0
  554. data/test/foreman_app/app/views/hosts/console/log.html.erb +17 -0
  555. data/test/foreman_app/app/views/hosts/console/spice.html.erb +18 -0
  556. data/test/foreman_app/app/views/hosts/console/vnc.html.erb +21 -0
  557. data/test/foreman_app/app/views/hosts/edit.html.erb +7 -0
  558. data/test/foreman_app/app/views/hosts/index.html.erb +4 -0
  559. data/test/foreman_app/app/views/hosts/multiple_build.html.erb +6 -0
  560. data/test/foreman_app/app/views/hosts/multiple_destroy.html.erb +6 -0
  561. data/test/foreman_app/app/views/hosts/multiple_disable.html.erb +6 -0
  562. data/test/foreman_app/app/views/hosts/multiple_enable.html.erb +6 -0
  563. data/test/foreman_app/app/views/hosts/multiple_parameters.html.erb +12 -0
  564. data/test/foreman_app/app/views/hosts/multiple_puppetrun.html.erb +5 -0
  565. data/test/foreman_app/app/views/hosts/new.html.erb +3 -0
  566. data/test/foreman_app/app/views/hosts/query.html.erb +3 -0
  567. data/test/foreman_app/app/views/hosts/select_multiple_environment.html.erb +8 -0
  568. data/test/foreman_app/app/views/hosts/select_multiple_hostgroup.html.erb +6 -0
  569. data/test/foreman_app/app/views/hosts/select_multiple_location.html.erb +6 -0
  570. data/test/foreman_app/app/views/hosts/select_multiple_organization.html.erb +6 -0
  571. data/test/foreman_app/app/views/hosts/show.html.erb +55 -0
  572. data/test/foreman_app/app/views/hosts/storeconfig_klasses.html.erb +12 -0
  573. data/test/foreman_app/app/views/hosts/update_multiple_parameters.html.erb +18 -0
  574. data/test/foreman_app/app/views/hosts/welcome.html.erb +10 -0
  575. data/test/foreman_app/app/views/images/_form.html.erb +16 -0
  576. data/test/foreman_app/app/views/images/edit.html.erb +3 -0
  577. data/test/foreman_app/app/views/images/index.html.erb +26 -0
  578. data/test/foreman_app/app/views/images/new.html.erb +4 -0
  579. data/test/foreman_app/app/views/layouts/application.html.erb +69 -0
  580. data/test/foreman_app/app/views/locations/welcome.html.erb +9 -0
  581. data/test/foreman_app/app/views/lookup_keys/_fields.html.erb +42 -0
  582. data/test/foreman_app/app/views/lookup_keys/_value.html.erb +6 -0
  583. data/test/foreman_app/app/views/lookup_keys/edit.html.erb +7 -0
  584. data/test/foreman_app/app/views/lookup_keys/index.html.erb +22 -0
  585. data/test/foreman_app/app/views/media/_form.html.erb +53 -0
  586. data/test/foreman_app/app/views/media/edit.html.erb +3 -0
  587. data/test/foreman_app/app/views/media/index.html.erb +26 -0
  588. data/test/foreman_app/app/views/media/new.html.erb +3 -0
  589. data/test/foreman_app/app/views/media/welcome.html.erb +19 -0
  590. data/test/foreman_app/app/views/models/_form.html.erb +8 -0
  591. data/test/foreman_app/app/views/models/edit.html.erb +3 -0
  592. data/test/foreman_app/app/views/models/index.html.erb +26 -0
  593. data/test/foreman_app/app/views/models/new.html.erb +3 -0
  594. data/test/foreman_app/app/views/operatingsystems/_form.html.erb +38 -0
  595. data/test/foreman_app/app/views/operatingsystems/_template_defaults.html.erb +19 -0
  596. data/test/foreman_app/app/views/operatingsystems/_templates.html.erb +2 -0
  597. data/test/foreman_app/app/views/operatingsystems/edit.html.erb +3 -0
  598. data/test/foreman_app/app/views/operatingsystems/index.html.erb +22 -0
  599. data/test/foreman_app/app/views/operatingsystems/new.html.erb +3 -0
  600. data/test/foreman_app/app/views/organizations/welcome.html.erb +14 -0
  601. data/test/foreman_app/app/views/ptables/_form.html.erb +8 -0
  602. data/test/foreman_app/app/views/ptables/edit.html.erb +3 -0
  603. data/test/foreman_app/app/views/ptables/index.html.erb +23 -0
  604. data/test/foreman_app/app/views/ptables/new.html.erb +3 -0
  605. data/test/foreman_app/app/views/ptables/welcome.html.erb +52 -0
  606. data/test/foreman_app/app/views/puppetclasses/_class_parameters.html.erb +16 -0
  607. data/test/foreman_app/app/views/puppetclasses/_class_selection.html.erb +44 -0
  608. data/test/foreman_app/app/views/puppetclasses/_classes.html.erb +23 -0
  609. data/test/foreman_app/app/views/puppetclasses/_classes_parameters.html.erb +14 -0
  610. data/test/foreman_app/app/views/puppetclasses/_form.html.erb +90 -0
  611. data/test/foreman_app/app/views/puppetclasses/_selectedClasses.html.erb +4 -0
  612. data/test/foreman_app/app/views/puppetclasses/edit.html.erb +3 -0
  613. data/test/foreman_app/app/views/puppetclasses/index.html.erb +33 -0
  614. data/test/foreman_app/app/views/puppetclasses/new.html.erb +3 -0
  615. data/test/foreman_app/app/views/puppetclasses/no_route.html.erb +11 -0
  616. data/test/foreman_app/app/views/reports/_list.html.erb +34 -0
  617. data/test/foreman_app/app/views/reports/_metrics.html.erb +25 -0
  618. data/test/foreman_app/app/views/reports/_output.html.erb +13 -0
  619. data/test/foreman_app/app/views/reports/index.html.erb +3 -0
  620. data/test/foreman_app/app/views/reports/show.html.erb +37 -0
  621. data/test/foreman_app/app/views/reports/welcome.html.erb +11 -0
  622. data/test/foreman_app/app/views/roles/_form.html.erb +28 -0
  623. data/test/foreman_app/app/views/roles/edit.html.erb +3 -0
  624. data/test/foreman_app/app/views/roles/index.html.erb +28 -0
  625. data/test/foreman_app/app/views/roles/new.html.erb +3 -0
  626. data/test/foreman_app/app/views/roles/report.html.erb +52 -0
  627. data/test/foreman_app/app/views/settings/index.html.erb +29 -0
  628. data/test/foreman_app/app/views/smart_proxies/_form.html.erb +38 -0
  629. data/test/foreman_app/app/views/smart_proxies/autosign/_form.html.erb +9 -0
  630. data/test/foreman_app/app/views/smart_proxies/autosign/index.html.erb +21 -0
  631. data/test/foreman_app/app/views/smart_proxies/autosign/new.html.erb +3 -0
  632. data/test/foreman_app/app/views/smart_proxies/edit.html.erb +3 -0
  633. data/test/foreman_app/app/views/smart_proxies/index.html.erb +37 -0
  634. data/test/foreman_app/app/views/smart_proxies/new.html.erb +3 -0
  635. data/test/foreman_app/app/views/smart_proxies/puppetca/index.html.erb +36 -0
  636. data/test/foreman_app/app/views/statistics/index.html.erb +5 -0
  637. data/test/foreman_app/app/views/subnets/_fields.html.erb +17 -0
  638. data/test/foreman_app/app/views/subnets/_form.html.erb +34 -0
  639. data/test/foreman_app/app/views/subnets/edit.html.erb +3 -0
  640. data/test/foreman_app/app/views/subnets/import.html.erb +26 -0
  641. data/test/foreman_app/app/views/subnets/index.html.erb +28 -0
  642. data/test/foreman_app/app/views/subnets/new.html.erb +3 -0
  643. data/test/foreman_app/app/views/tasks/_list.html.erb +5 -0
  644. data/test/foreman_app/app/views/tasks/show.html.erb +1 -0
  645. data/test/foreman_app/app/views/taxonomies/_form.html.erb +111 -0
  646. data/test/foreman_app/app/views/taxonomies/_step1.html.erb +14 -0
  647. data/test/foreman_app/app/views/taxonomies/_step2.html.erb +18 -0
  648. data/test/foreman_app/app/views/taxonomies/clone.html.erb +3 -0
  649. data/test/foreman_app/app/views/taxonomies/edit.html.erb +4 -0
  650. data/test/foreman_app/app/views/taxonomies/index.html.erb +39 -0
  651. data/test/foreman_app/app/views/taxonomies/mismatches.html.erb +37 -0
  652. data/test/foreman_app/app/views/taxonomies/new.html.erb +3 -0
  653. data/test/foreman_app/app/views/taxonomies/step2.html.erb +3 -0
  654. data/test/foreman_app/app/views/trends/_fields.html.erb +7 -0
  655. data/test/foreman_app/app/views/trends/_form.html.erb +9 -0
  656. data/test/foreman_app/app/views/trends/_hosts.html.erb +13 -0
  657. data/test/foreman_app/app/views/trends/edit.html.erb +33 -0
  658. data/test/foreman_app/app/views/trends/index.html.erb +47 -0
  659. data/test/foreman_app/app/views/trends/new.html.erb +3 -0
  660. data/test/foreman_app/app/views/trends/show.html.erb +19 -0
  661. data/test/foreman_app/app/views/unattended/autowaik.xml.erb +2 -0
  662. data/test/foreman_app/app/views/unattended/autoyast.xml.erb +80 -0
  663. data/test/foreman_app/app/views/unattended/gpxe_kickstart_config.erb +5 -0
  664. data/test/foreman_app/app/views/unattended/grubby.erb +9 -0
  665. data/test/foreman_app/app/views/unattended/jumpstart.html.erb +10 -0
  666. data/test/foreman_app/app/views/unattended/jumpstart_finish.html.erb +51 -0
  667. data/test/foreman_app/app/views/unattended/kickstart.html.erb +71 -0
  668. data/test/foreman_app/app/views/unattended/preseed.html.erb +66 -0
  669. data/test/foreman_app/app/views/unattended/preseed_finish.html.erb +7 -0
  670. data/test/foreman_app/app/views/unattended/pxe_autowaik.erb +3 -0
  671. data/test/foreman_app/app/views/unattended/pxe_autoyast.erb +4 -0
  672. data/test/foreman_app/app/views/unattended/pxe_debian_config.erb +4 -0
  673. data/test/foreman_app/app/views/unattended/pxe_default.erb +23 -0
  674. data/test/foreman_app/app/views/unattended/pxe_jumpstart_config.erb +10 -0
  675. data/test/foreman_app/app/views/unattended/pxe_kickstart_config.erb +4 -0
  676. data/test/foreman_app/app/views/unattended/pxe_local.erb +11 -0
  677. data/test/foreman_app/app/views/unattended/snippets/_epel.erb +15 -0
  678. data/test/foreman_app/app/views/unattended/snippets/_http_proxy.erb +8 -0
  679. data/test/foreman_app/app/views/unattended/snippets/_puppet.conf.erb +15 -0
  680. data/test/foreman_app/app/views/unattended/snippets/_puppet.init.erb +8 -0
  681. data/test/foreman_app/app/views/unattended/snippets/_redhat_register.erb +67 -0
  682. data/test/foreman_app/app/views/unattended/snippets/_vmware.erb +62 -0
  683. data/test/foreman_app/app/views/usergroups/_form.html.erb +7 -0
  684. data/test/foreman_app/app/views/usergroups/edit.html.erb +3 -0
  685. data/test/foreman_app/app/views/usergroups/index.html.erb +24 -0
  686. data/test/foreman_app/app/views/usergroups/new.html.erb +3 -0
  687. data/test/foreman_app/app/views/users/_filters.html.erb +38 -0
  688. data/test/foreman_app/app/views/users/_form.html.erb +58 -0
  689. data/test/foreman_app/app/views/users/_user_fact.html.erb +14 -0
  690. data/test/foreman_app/app/views/users/edit.html.erb +3 -0
  691. data/test/foreman_app/app/views/users/index.html.erb +31 -0
  692. data/test/foreman_app/app/views/users/login.html.erb +22 -0
  693. data/test/foreman_app/app/views/users/new.html.erb +3 -0
  694. data/test/foreman_app/bundler.d/Gemfile.local.rb +2 -0
  695. data/test/foreman_app/bundler.d/assets.rb +12 -0
  696. data/test/foreman_app/bundler.d/console.rb +5 -0
  697. data/test/foreman_app/bundler.d/development.rb +17 -0
  698. data/test/foreman_app/bundler.d/fog.rb +3 -0
  699. data/test/foreman_app/bundler.d/i18n.rb +5 -0
  700. data/test/foreman_app/bundler.d/jsonp.rb +3 -0
  701. data/test/foreman_app/bundler.d/libvirt.rb +3 -0
  702. data/test/foreman_app/bundler.d/mysql.rb +3 -0
  703. data/test/foreman_app/bundler.d/mysql2.rb +3 -0
  704. data/test/foreman_app/bundler.d/openid.rb +3 -0
  705. data/test/foreman_app/bundler.d/ovirt.rb +3 -0
  706. data/test/foreman_app/bundler.d/postgresql.rb +3 -0
  707. data/test/foreman_app/bundler.d/sqlite.rb +3 -0
  708. data/test/foreman_app/bundler.d/test.rb +17 -0
  709. data/test/foreman_app/bundler.d/vmware.rb +3 -0
  710. data/test/foreman_app/config.ru +8 -0
  711. data/test/foreman_app/config/application.rb +114 -0
  712. data/test/foreman_app/config/boot.rb +6 -0
  713. data/test/foreman_app/config/database.yml +22 -0
  714. data/test/foreman_app/config/database.yml.example +22 -0
  715. data/test/foreman_app/config/email.yaml.example +9 -0
  716. data/test/foreman_app/config/environment.rb +5 -0
  717. data/test/foreman_app/config/environments/development.rb +38 -0
  718. data/test/foreman_app/config/environments/production.rb +112 -0
  719. data/test/foreman_app/config/environments/test.rb +42 -0
  720. data/test/foreman_app/config/ignored_environments.yml.sample +9 -0
  721. data/test/foreman_app/config/initializers/apipie.rb +71 -0
  722. data/test/foreman_app/config/initializers/backtrace_silencers.rb +7 -0
  723. data/test/foreman_app/config/initializers/email.rb +17 -0
  724. data/test/foreman_app/config/initializers/fast_gettext.rb +49 -0
  725. data/test/foreman_app/config/initializers/foreman.rb +24 -0
  726. data/test/foreman_app/config/initializers/hostable.rb +3 -0
  727. data/test/foreman_app/config/initializers/inflections.rb +10 -0
  728. data/test/foreman_app/config/initializers/local_secret_token.rb.example +10 -0
  729. data/test/foreman_app/config/initializers/mime_types.rb +6 -0
  730. data/test/foreman_app/config/initializers/puppet.rb +22 -0
  731. data/test/foreman_app/config/initializers/rack_openid.rb +8 -0
  732. data/test/foreman_app/config/initializers/secret_token.rb +15 -0
  733. data/test/foreman_app/config/initializers/session_store.rb +8 -0
  734. data/test/foreman_app/config/initializers/will_paginate.rb +27 -0
  735. data/test/foreman_app/config/initializers/wrap_parameters.rb +13 -0
  736. data/test/foreman_app/config/locales/README +24 -0
  737. data/test/foreman_app/config/locales/de.yml +203 -0
  738. data/test/foreman_app/config/locales/en.yml +205 -0
  739. data/test/foreman_app/config/locales/es.yml +199 -0
  740. data/test/foreman_app/config/locales/ja.yml +197 -0
  741. data/test/foreman_app/config/model.mappings.example +342 -0
  742. data/test/foreman_app/config/routes.rb +332 -0
  743. data/test/foreman_app/config/routes/api/apipiedoc.rb +4 -0
  744. data/test/foreman_app/config/routes/api/v1.rb +65 -0
  745. data/test/foreman_app/config/routes/api/v2.rb +208 -0
  746. data/test/foreman_app/config/settings.rb +13 -0
  747. data/test/foreman_app/config/settings.yaml +18 -0
  748. data/test/foreman_app/config/settings.yaml.example +17 -0
  749. data/test/foreman_app/db/migrate/20090714132448_create_hosts.rb +47 -0
  750. data/test/foreman_app/db/migrate/20090714132449_add_audits_table.rb +27 -0
  751. data/test/foreman_app/db/migrate/20090715143858_create_architectures.rb +19 -0
  752. data/test/foreman_app/db/migrate/20090717025820_create_media.rb +19 -0
  753. data/test/foreman_app/db/migrate/20090718060746_create_domains.rb +15 -0
  754. data/test/foreman_app/db/migrate/20090718064254_create_subnets.rb +18 -0
  755. data/test/foreman_app/db/migrate/20090720134126_create_operatingsystems.rb +16 -0
  756. data/test/foreman_app/db/migrate/20090722140138_create_models.rb +16 -0
  757. data/test/foreman_app/db/migrate/20090722141107_create_environments.rb +18 -0
  758. data/test/foreman_app/db/migrate/20090729132209_create_reports.rb +14 -0
  759. data/test/foreman_app/db/migrate/20090730152224_create_ptables.rb +24 -0
  760. data/test/foreman_app/db/migrate/20090802062223_create_puppetclasses.rb +26 -0
  761. data/test/foreman_app/db/migrate/20090804130144_create_parameters.rb +13 -0
  762. data/test/foreman_app/db/migrate/20090820130541_create_auth_sources.rb +25 -0
  763. data/test/foreman_app/db/migrate/20090905150131_create_hostgroups.rb +24 -0
  764. data/test/foreman_app/db/migrate/20090905155444_add_type_to_parameter.rb +9 -0
  765. data/test/foreman_app/db/migrate/20090907045751_add_domain_to_parameter.rb +10 -0
  766. data/test/foreman_app/db/migrate/20090915030726_change_report_field_type_to_text.rb +13 -0
  767. data/test/foreman_app/db/migrate/20090916053824_change_host_build_default_to_false.rb +11 -0
  768. data/test/foreman_app/db/migrate/20090920043521_add_index_to_host.rb +25 -0
  769. data/test/foreman_app/db/migrate/20090920064156_add_index_to_parameters.rb +15 -0
  770. data/test/foreman_app/db/migrate/20090920065522_add_index_to_reports.rb +9 -0
  771. data/test/foreman_app/db/migrate/20091012135004_create_users.rb +19 -0
  772. data/test/foreman_app/db/migrate/20091016031017_create_sessions.rb +16 -0
  773. data/test/foreman_app/db/migrate/20091022054108_add_status_to_report.rb +15 -0
  774. data/test/foreman_app/db/migrate/20091214045923_calc_existing_reports.rb +19 -0
  775. data/test/foreman_app/db/migrate/20091219132338_create_lookup_keys.rb +14 -0
  776. data/test/foreman_app/db/migrate/20091219132839_create_lookup_values.rb +17 -0
  777. data/test/foreman_app/db/migrate/20100115021803_change_mysql_reports_column.rb +14 -0
  778. data/test/foreman_app/db/migrate/20100310080727_add_family_to_os.rb +33 -0
  779. data/test/foreman_app/db/migrate/20100325142616_update_fact_names_and_values_to_bin.rb +15 -0
  780. data/test/foreman_app/db/migrate/20100414125652_add_releasename_to_os.rb +24 -0
  781. data/test/foreman_app/db/migrate/20100416124600_create_usergroups.rb +17 -0
  782. data/test/foreman_app/db/migrate/20100419151910_add_owner_to_hosts.rb +26 -0
  783. data/test/foreman_app/db/migrate/20100523114430_add_ubuntu_custom_lvm_ptable.rb +67 -0
  784. data/test/foreman_app/db/migrate/20100523141204_create_media_operatingsystems_and_migrate_data.rb +34 -0
  785. data/test/foreman_app/db/migrate/20100524080302_migrate_installation_medium_uri.rb +15 -0
  786. data/test/foreman_app/db/migrate/20100525094200_simplify_parameters.rb +62 -0
  787. data/test/foreman_app/db/migrate/20100601221000_update_os_minor.rb +13 -0
  788. data/test/foreman_app/db/migrate/20100616114400_change_family_in_os.rb +50 -0
  789. data/test/foreman_app/db/migrate/20100625155400_create_notices.rb +21 -0
  790. data/test/foreman_app/db/migrate/20100628123400_add_internal_auth.rb +33 -0
  791. data/test/foreman_app/db/migrate/20100629093200_create_roles.rb +23 -0
  792. data/test/foreman_app/db/migrate/20100701081235_add_user_domains_and_hostgroups.rb +20 -0
  793. data/test/foreman_app/db/migrate/20100822072954_create_user_facts.rb +18 -0
  794. data/test/foreman_app/db/migrate/20100823181036_add_enabled_to_hosts.rb +9 -0
  795. data/test/foreman_app/db/migrate/20100914092104_add_my_booleans_to_user.rb +13 -0
  796. data/test/foreman_app/db/migrate/20101018120548_create_messages.rb +18 -0
  797. data/test/foreman_app/db/migrate/20101018120603_create_sources.rb +18 -0
  798. data/test/foreman_app/db/migrate/20101018120621_create_logs.rb +22 -0
  799. data/test/foreman_app/db/migrate/20101019122857_add_metrics_to_report.rb +9 -0
  800. data/test/foreman_app/db/migrate/20101019183859_convert_reports.rb +38 -0
  801. data/test/foreman_app/db/migrate/20101103150254_add_owned_filter_to_user.rb +9 -0
  802. data/test/foreman_app/db/migrate/20101118130026_correct_media.rb +35 -0
  803. data/test/foreman_app/db/migrate/20101121080425_create_config_templates.rb +15 -0
  804. data/test/foreman_app/db/migrate/20101121135521_create_template_combinations.rb +15 -0
  805. data/test/foreman_app/db/migrate/20101122132041_create_operatingsystems_config_templates.rb +12 -0
  806. data/test/foreman_app/db/migrate/20101123152150_create_template_kinds.rb +18 -0
  807. data/test/foreman_app/db/migrate/20101123153303_create_os_default_templates.rb +15 -0
  808. data/test/foreman_app/db/migrate/20101125153351_add_default_templates.rb +59 -0
  809. data/test/foreman_app/db/migrate/20101130093613_add_sub_systems_to_subnet.rb +13 -0
  810. data/test/foreman_app/db/migrate/20101130100315_create_proxies.rb +13 -0
  811. data/test/foreman_app/db/migrate/20101202104444_add_proxy_to_domain.rb +11 -0
  812. data/test/foreman_app/db/migrate/20101213085232_add_grubby_template.rb +15 -0
  813. data/test/foreman_app/db/migrate/20110117162722_add_host_group_defaults.rb +21 -0
  814. data/test/foreman_app/db/migrate/20110128130239_add_default_pxe_menu_template.rb +15 -0
  815. data/test/foreman_app/db/migrate/20110213104226_create_proxy_features.rb +28 -0
  816. data/test/foreman_app/db/migrate/20110216101848_change_puppetmaster_column.rb +21 -0
  817. data/test/foreman_app/db/migrate/20110301154453_add_managed_to_hosts.rb +15 -0
  818. data/test/foreman_app/db/migrate/20110321070954_revert_face_names_and_values_to_text_records.rb +13 -0
  819. data/test/foreman_app/db/migrate/20110327123639_add_priority_to_parameter.rb +11 -0
  820. data/test/foreman_app/db/migrate/20110404150043_add_media_path_to_medium.rb +13 -0
  821. data/test/foreman_app/db/migrate/20110407091150_add_image_to_host.rb +15 -0
  822. data/test/foreman_app/db/migrate/20110412103238_remove_unused_fields_from_puppet_classes.rb +9 -0
  823. data/test/foreman_app/db/migrate/20110417102947_add_table_bookmarks.rb +31 -0
  824. data/test/foreman_app/db/migrate/20110420150600_add_solaris_templates.rb +42 -0
  825. data/test/foreman_app/db/migrate/20110613141800_add_solaris_disks.rb +16 -0
  826. data/test/foreman_app/db/migrate/20110616080444_add_look_up_key_id_to_puppet_class.rb +28 -0
  827. data/test/foreman_app/db/migrate/20110617190131_add_sparc_info_to_model.rb +11 -0
  828. data/test/foreman_app/db/migrate/20110619130336_add_ancestry_to_hostgroup.rb +11 -0
  829. data/test/foreman_app/db/migrate/20110628115422_create_settings.rb +18 -0
  830. data/test/foreman_app/db/migrate/20110712064120_update_audits_table.rb +16 -0
  831. data/test/foreman_app/db/migrate/20110712070522_create_host_class.rb +11 -0
  832. data/test/foreman_app/db/migrate/20110725142054_add_suse_templates.rb +46 -0
  833. data/test/foreman_app/db/migrate/20110801090318_add_vm_defaults_to_hostgroup.rb +9 -0
  834. data/test/foreman_app/db/migrate/20110803114134_add_subnet_and_domain_to_host_groups.rb +11 -0
  835. data/test/foreman_app/db/migrate/20111124095053_rename_changes_to_audited_changes.rb +9 -0
  836. data/test/foreman_app/db/migrate/20111124095054_add_remote_address_to_audits.rb +10 -0
  837. data/test/foreman_app/db/migrate/20111124095055_rename_parent_to_association.rb +11 -0
  838. data/test/foreman_app/db/migrate/20111205231500_add_gateway_and_dns_to_subnets.rb +13 -0
  839. data/test/foreman_app/db/migrate/20111227095806_ensure_all_hostnames_are_lowercase.rb +9 -0
  840. data/test/foreman_app/db/migrate/20120102071633_add_from_and_to_ranges_to_subnets.rb +13 -0
  841. data/test/foreman_app/db/migrate/20120110113051_create_subnet_domain.rb +21 -0
  842. data/test/foreman_app/db/migrate/20120122131037_create_compute_resources.rb +19 -0
  843. data/test/foreman_app/db/migrate/20120126113850_add_uuid_and_compute_id_to_host.rb +11 -0
  844. data/test/foreman_app/db/migrate/20120127141602_add_windows_templates.rb +47 -0
  845. data/test/foreman_app/db/migrate/20120311081257_create_nics.rb +52 -0
  846. data/test/foreman_app/db/migrate/20120313081913_add_puppet_master_proxy_to_host_and_host_group.rb +41 -0
  847. data/test/foreman_app/db/migrate/20120502105518_update_report_field_to_large_int.rb +9 -0
  848. data/test/foreman_app/db/migrate/20120506143325_create_images.rb +18 -0
  849. data/test/foreman_app/db/migrate/20120509131302_add_cert_name_to_host.rb +12 -0
  850. data/test/foreman_app/db/migrate/20120510113417_create_key_pairs.rb +15 -0
  851. data/test/foreman_app/db/migrate/20120521142924_add_dns_id_to_subnet.rb +9 -0
  852. data/test/foreman_app/db/migrate/20120523065531_add_image_id_to_host.rb +9 -0
  853. data/test/foreman_app/db/migrate/20120529113900_add_user_compute_resources.rb +14 -0
  854. data/test/foreman_app/db/migrate/20120529115814_add_compute_resources_boolean_to_user.rb +9 -0
  855. data/test/foreman_app/db/migrate/20120604114049_add_epel_snippets.rb +10 -0
  856. data/test/foreman_app/db/migrate/20120607074318_convert_params_to_text.rb +11 -0
  857. data/test/foreman_app/db/migrate/20120612070100_change_bookmark_column_to_text.rb +10 -0
  858. data/test/foreman_app/db/migrate/20120613082125_rename_association_to_associated.rb +25 -0
  859. data/test/foreman_app/db/migrate/20120620124658_fix_auditable_type.rb +9 -0
  860. data/test/foreman_app/db/migrate/20120620124659_fix_associated_type.rb +9 -0
  861. data/test/foreman_app/db/migrate/20120621135042_create_taxonomies.rb +14 -0
  862. data/test/foreman_app/db/migrate/20120623002052_add_ok_hosts_book_mark.rb +13 -0
  863. data/test/foreman_app/db/migrate/20120624081510_add_auditable_name_and_associated_name_to_audit.rb +29 -0
  864. data/test/foreman_app/db/migrate/20120624093958_add_os_family_to_media.rb +14 -0
  865. data/test/foreman_app/db/migrate/20120624094034_add_os_family_to_ptable.rb +17 -0
  866. data/test/foreman_app/db/migrate/20120705130038_add_attributes_to_compute_resources.rb +9 -0
  867. data/test/foreman_app/db/migrate/20120824142048_add_some_indexes.rb +23 -0
  868. data/test/foreman_app/db/migrate/20120905095532_create_environment_classes.rb +16 -0
  869. data/test/foreman_app/db/migrate/20120905131841_add_lookup_keys_override_and_required.rb +15 -0
  870. data/test/foreman_app/db/migrate/20120916080843_add_lookup_values_count_to_lookup_keys.rb +9 -0
  871. data/test/foreman_app/db/migrate/20120916080926_cache_lookup_values_count.rb +8 -0
  872. data/test/foreman_app/db/migrate/20120921000313_add_iam_role_to_images.rb +9 -0
  873. data/test/foreman_app/db/migrate/20120921105349_create_tokens.rb +15 -0
  874. data/test/foreman_app/db/migrate/20120927020752_add_bmc_feature_to_proxy.rb +8 -0
  875. data/test/foreman_app/db/migrate/20121003172526_add_taxonomy_ids_to_hosts.rb +11 -0
  876. data/test/foreman_app/db/migrate/20121011115320_change_domain_character_count.rb +9 -0
  877. data/test/foreman_app/db/migrate/20121012170851_create_trends.rb +25 -0
  878. data/test/foreman_app/db/migrate/20121012170936_create_trend_counters.rb +16 -0
  879. data/test/foreman_app/db/migrate/20121015113502_update_media_path_limit.rb +9 -0
  880. data/test/foreman_app/db/migrate/20121018152459_create_hostgroup_classes.rb +11 -0
  881. data/test/foreman_app/db/migrate/20121026160433_add_localboot_template.rb +15 -0
  882. data/test/foreman_app/db/migrate/20121029164911_rename_reply_adress_setting.rb +9 -0
  883. data/test/foreman_app/db/migrate/20121101141448_add_locations_organizations.rb +12 -0
  884. data/test/foreman_app/db/migrate/20121118120028_migrate_hypervisors_to_compute_resources.rb +20 -0
  885. data/test/foreman_app/db/migrate/20121118125341_create_taxable_taxonomies.rb +19 -0
  886. data/test/foreman_app/db/migrate/20121119102104_add_my_taxonomy_to_user.rb +11 -0
  887. data/test/foreman_app/db/migrate/20121218084123_change_smart_variable_length.rb +9 -0
  888. data/test/foreman_app/db/migrate/20121219040534_remove_replay_address_setting.rb +8 -0
  889. data/test/foreman_app/db/migrate/20130109155024_add_ignore_types_to_taxonomy.rb +9 -0
  890. data/test/foreman_app/db/migrate/20130121130826_add_digest_to_messages.rb +18 -0
  891. data/test/foreman_app/db/migrate/20130211160200_add_sti_to_hosts.rb +11 -0
  892. data/test/foreman_app/db/migrate/20130228145456_add_digest_to_sources.rb +22 -0
  893. data/test/foreman_app/db/migrate/20130329195742_remove_duplicate_snippets.rb +20 -0
  894. data/test/foreman_app/db/migrate/20130409081924_add_label_to_host_group.rb +18 -0
  895. data/test/foreman_app/db/migrate/20130417110127_add_sti_to_settings.rb +17 -0
  896. data/test/foreman_app/db/migrate/20130418134513_fix_sti_host_auditable_type.rb +9 -0
  897. data/test/foreman_app/db/migrate/20130419145808_add_id_to_user_hostgroup.rb +9 -0
  898. data/test/foreman_app/db/schema.rb +746 -0
  899. data/test/foreman_app/db/seeds.rb +9 -0
  900. data/test/foreman_app/db/test.sqlite3 +0 -0
  901. data/test/foreman_app/doc/README_FOR_APP +2 -0
  902. data/test/foreman_app/doc/apipie_examples.yml +4645 -0
  903. data/test/foreman_app/extras/changelog +39 -0
  904. data/test/foreman_app/extras/ci/migration.sh +64 -0
  905. data/test/foreman_app/extras/ci/setup.sh +19 -0
  906. data/test/foreman_app/extras/cli/foremancli +210 -0
  907. data/test/foreman_app/extras/dbmigrate +10 -0
  908. data/test/foreman_app/extras/foreman-release.spec +41 -0
  909. data/test/foreman_app/extras/foreman.repo +11 -0
  910. data/test/foreman_app/extras/git2nightly_snapshot +9 -0
  911. data/test/foreman_app/extras/git2release +22 -0
  912. data/test/foreman_app/extras/ignored_environments.yml.sample +10 -0
  913. data/test/foreman_app/extras/jumpstart/README +2 -0
  914. data/test/foreman_app/extras/jumpstart/admin +11 -0
  915. data/test/foreman_app/extras/jumpstart/curl +0 -0
  916. data/test/foreman_app/extras/jumpstart/curl-license +22 -0
  917. data/test/foreman_app/extras/jumpstart/curl.i386 +0 -0
  918. data/test/foreman_app/extras/jumpstart/curl.sparc +0 -0
  919. data/test/foreman_app/extras/jumpstart/dynamic_finish +18 -0
  920. data/test/foreman_app/extras/jumpstart/dynamic_profile +17 -0
  921. data/test/foreman_app/extras/jumpstart/nsswitch.conf +34 -0
  922. data/test/foreman_app/extras/jumpstart/rules +1 -0
  923. data/test/foreman_app/extras/jumpstart/rules.ok +2 -0
  924. data/test/foreman_app/extras/jumpstart/sysidcfg/sysidcfg_primary/sysidcfg +12 -0
  925. data/test/foreman_app/extras/noVNC/websockify.py +5 -0
  926. data/test/foreman_app/extras/noVNC/websockify/__init__.py +2 -0
  927. data/test/foreman_app/extras/noVNC/websockify/websocket.py +982 -0
  928. data/test/foreman_app/extras/noVNC/websockify/websocketproxy.py +393 -0
  929. data/test/foreman_app/extras/packaging/rpm/rel-eng/comps/comps-foreman-fedora18.xml +76 -0
  930. data/test/foreman_app/extras/packaging/rpm/rel-eng/comps/comps-foreman-rhel6.xml +115 -0
  931. data/test/foreman_app/extras/packaging/rpm/rel-eng/packages/foreman +1 -0
  932. data/test/foreman_app/extras/packaging/rpm/rel-eng/releasers.conf +59 -0
  933. data/test/foreman_app/extras/packaging/rpm/rel-eng/tito.props +3 -0
  934. data/test/foreman_app/extras/packaging/rpm/sources/0001-rubygem-actionmailer-fix-dep-versions.patch +19 -0
  935. data/test/foreman_app/extras/packaging/rpm/sources/foreman.cron.d +27 -0
  936. data/test/foreman_app/extras/packaging/rpm/sources/foreman.init +154 -0
  937. data/test/foreman_app/extras/packaging/rpm/sources/foreman.logrotate +10 -0
  938. data/test/foreman_app/extras/packaging/rpm/sources/foreman.repo +11 -0
  939. data/test/foreman_app/extras/packaging/rpm/sources/foreman.spec-devel.patch +55 -0
  940. data/test/foreman_app/extras/packaging/rpm/sources/foreman.sysconfig +21 -0
  941. data/test/foreman_app/extras/query/ssh_using_foreman +136 -0
  942. data/test/foreman_app/extras/rdoc/rdoc_prepare_script.rb +51 -0
  943. data/test/foreman_app/foreman.spec +621 -0
  944. data/test/foreman_app/lib/api/api_responder.rb +17 -0
  945. data/test/foreman_app/lib/api/authorization.rb +78 -0
  946. data/test/foreman_app/lib/api/version1.rb +7 -0
  947. data/test/foreman_app/lib/api/version2.rb +7 -0
  948. data/test/foreman_app/lib/api_constraints.rb +15 -0
  949. data/test/foreman_app/lib/audit_extensions.rb +63 -0
  950. data/test/foreman_app/lib/core_extensions.rb +100 -0
  951. data/test/foreman_app/lib/fog_extensions.rb +45 -0
  952. data/test/foreman_app/lib/fog_extensions/aws/flavor.rb +9 -0
  953. data/test/foreman_app/lib/fog_extensions/aws/server.rb +18 -0
  954. data/test/foreman_app/lib/fog_extensions/libvirt/server.rb +24 -0
  955. data/test/foreman_app/lib/fog_extensions/model.rb +27 -0
  956. data/test/foreman_app/lib/fog_extensions/openstack/flavor.rb +13 -0
  957. data/test/foreman_app/lib/fog_extensions/openstack/server.rb +40 -0
  958. data/test/foreman_app/lib/fog_extensions/ovirt/server.rb +15 -0
  959. data/test/foreman_app/lib/fog_extensions/ovirt/volume.rb +11 -0
  960. data/test/foreman_app/lib/fog_extensions/vsphere/folder.rb +14 -0
  961. data/test/foreman_app/lib/fog_extensions/vsphere/mini_server.rb +20 -0
  962. data/test/foreman_app/lib/fog_extensions/vsphere/mini_servers.rb +22 -0
  963. data/test/foreman_app/lib/fog_extensions/vsphere/server.rb +19 -0
  964. data/test/foreman_app/lib/foreman.rb +14 -0
  965. data/test/foreman_app/lib/foreman/access_control.rb +120 -0
  966. data/test/foreman_app/lib/foreman/access_permissions.rb +572 -0
  967. data/test/foreman_app/lib/foreman/controller.rb +2 -0
  968. data/test/foreman_app/lib/foreman/controller/auto_complete_search.rb +23 -0
  969. data/test/foreman_app/lib/foreman/controller/environments.rb +36 -0
  970. data/test/foreman_app/lib/foreman/controller/host_details.rb +69 -0
  971. data/test/foreman_app/lib/foreman/controller/smart_proxy_auth.rb +68 -0
  972. data/test/foreman_app/lib/foreman/controller/taxonomies_controller.rb +178 -0
  973. data/test/foreman_app/lib/foreman/controller/taxonomy_multiple.rb +56 -0
  974. data/test/foreman_app/lib/foreman/default_data/loader.rb +166 -0
  975. data/test/foreman_app/lib/foreman/exception.rb +37 -0
  976. data/test/foreman_app/lib/foreman/importer_puppetclass.rb +48 -0
  977. data/test/foreman_app/lib/foreman/model.rb +2 -0
  978. data/test/foreman_app/lib/foreman/model/ec2.rb +128 -0
  979. data/test/foreman_app/lib/foreman/model/libvirt.rb +150 -0
  980. data/test/foreman_app/lib/foreman/model/openstack.rb +130 -0
  981. data/test/foreman_app/lib/foreman/model/ovirt.rb +250 -0
  982. data/test/foreman_app/lib/foreman/model/rackspace.rb +108 -0
  983. data/test/foreman_app/lib/foreman/model/vmware.rb +181 -0
  984. data/test/foreman_app/lib/foreman/provision.rb +3 -0
  985. data/test/foreman_app/lib/foreman/provision/ssh.rb +102 -0
  986. data/test/foreman_app/lib/foreman/renderer.rb +68 -0
  987. data/test/foreman_app/lib/foreman/sti.rb +30 -0
  988. data/test/foreman_app/lib/foreman/thread_session.rb +163 -0
  989. data/test/foreman_app/lib/foreman/util.rb +25 -0
  990. data/test/foreman_app/lib/foreman/wrapped_exception.rb +23 -0
  991. data/test/foreman_app/lib/net.rb +50 -0
  992. data/test/foreman_app/lib/net/dhcp.rb +6 -0
  993. data/test/foreman_app/lib/net/dhcp/record.rb +56 -0
  994. data/test/foreman_app/lib/net/dhcp/sparc_record.rb +25 -0
  995. data/test/foreman_app/lib/net/dns.rb +78 -0
  996. data/test/foreman_app/lib/net/dns/a_record.rb +47 -0
  997. data/test/foreman_app/lib/net/dns/ptr_record.rb +52 -0
  998. data/test/foreman_app/lib/net/validations.rb +47 -0
  999. data/test/foreman_app/lib/orchestration/queue.rb +58 -0
  1000. data/test/foreman_app/lib/proxy_api.rb +6 -0
  1001. data/test/foreman_app/lib/proxy_api/bmc.rb +120 -0
  1002. data/test/foreman_app/lib/proxy_api/dhcp.rb +70 -0
  1003. data/test/foreman_app/lib/proxy_api/dns.rb +26 -0
  1004. data/test/foreman_app/lib/proxy_api/features.rb +12 -0
  1005. data/test/foreman_app/lib/proxy_api/puppet.rb +28 -0
  1006. data/test/foreman_app/lib/proxy_api/puppetca.rb +38 -0
  1007. data/test/foreman_app/lib/proxy_api/resource.rb +90 -0
  1008. data/test/foreman_app/lib/proxy_api/tftp.rb +54 -0
  1009. data/test/foreman_app/lib/puppet_setting.rb +69 -0
  1010. data/test/foreman_app/lib/regexp_extensions.rb +14 -0
  1011. data/test/foreman_app/lib/sso.rb +13 -0
  1012. data/test/foreman_app/lib/sso/apache.rb +16 -0
  1013. data/test/foreman_app/lib/sso/base.rb +27 -0
  1014. data/test/foreman_app/lib/sso/signo.rb +60 -0
  1015. data/test/foreman_app/lib/task.rb +39 -0
  1016. data/test/foreman_app/lib/tasks/convert.rake +127 -0
  1017. data/test/foreman_app/lib/tasks/exception.rake +32 -0
  1018. data/test/foreman_app/lib/tasks/gettext.rake +9 -0
  1019. data/test/foreman_app/lib/tasks/hosts.rake +67 -0
  1020. data/test/foreman_app/lib/tasks/jenkins.rake +19 -0
  1021. data/test/foreman_app/lib/tasks/load_default_data.rake +16 -0
  1022. data/test/foreman_app/lib/tasks/locale.rake +43 -0
  1023. data/test/foreman_app/lib/tasks/model.rake +83 -0
  1024. data/test/foreman_app/lib/tasks/patches.rake +19 -0
  1025. data/test/foreman_app/lib/tasks/pkg.rake +19 -0
  1026. data/test/foreman_app/lib/tasks/puppet.rake +178 -0
  1027. data/test/foreman_app/lib/tasks/reports.rake +82 -0
  1028. data/test/foreman_app/lib/tasks/reset_permissions.rake +20 -0
  1029. data/test/foreman_app/lib/tasks/security.rake +21 -0
  1030. data/test/foreman_app/lib/tasks/smartproxy.rake +58 -0
  1031. data/test/foreman_app/lib/tasks/test_api_dir.rake +10 -0
  1032. data/test/foreman_app/lib/tasks/test_lib_dir.rake +14 -0
  1033. data/test/foreman_app/lib/tasks/trends.rake +32 -0
  1034. data/test/foreman_app/lib/timed_cached_store.rb +55 -0
  1035. data/test/foreman_app/lib/ws_proxy.rb +78 -0
  1036. data/test/foreman_app/locale/Makefile +54 -0
  1037. data/test/foreman_app/locale/README +26 -0
  1038. data/test/foreman_app/locale/de/foreman.po +4477 -0
  1039. data/test/foreman_app/locale/en/foreman.po +4198 -0
  1040. data/test/foreman_app/locale/es/foreman.po +4494 -0
  1041. data/test/foreman_app/locale/foreman.pot +4198 -0
  1042. data/test/foreman_app/locale/ja/foreman.po +4215 -0
  1043. data/test/foreman_app/locale/model_attributes.rb +442 -0
  1044. data/test/foreman_app/log/test.log +36021 -0
  1045. data/test/foreman_app/public/404.html +26 -0
  1046. data/test/foreman_app/public/422.html +26 -0
  1047. data/test/foreman_app/public/500.html +26 -0
  1048. data/test/foreman_app/public/blank.html +33 -0
  1049. data/test/foreman_app/public/favicon.ico +0 -0
  1050. data/test/foreman_app/public/robots.txt +5 -0
  1051. data/test/foreman_app/script/foreman-config +147 -0
  1052. data/test/foreman_app/script/performance/benchmarker +3 -0
  1053. data/test/foreman_app/script/performance/profiler +3 -0
  1054. data/test/foreman_app/script/rails +6 -0
  1055. data/test/foreman_app/script/show-missing-rails-locales.sh +25 -0
  1056. data/test/foreman_app/script/update-rails-locales.sh +16 -0
  1057. data/test/foreman_app/test/fixtures/architectures.yml +10 -0
  1058. data/test/foreman_app/test/fixtures/audits.yml +18 -0
  1059. data/test/foreman_app/test/fixtures/auth_sources.yml +20 -0
  1060. data/test/foreman_app/test/fixtures/bookmarks.yml +13 -0
  1061. data/test/foreman_app/test/fixtures/brslc022.facts.yaml +68 -0
  1062. data/test/foreman_app/test/fixtures/compute_resources.yml +28 -0
  1063. data/test/foreman_app/test/fixtures/config_templates.yml +47 -0
  1064. data/test/foreman_app/test/fixtures/domains.yml +18 -0
  1065. data/test/foreman_app/test/fixtures/environment_classes.yml +15 -0
  1066. data/test/foreman_app/test/fixtures/environments.yml +10 -0
  1067. data/test/foreman_app/test/fixtures/fact_names.yml +5 -0
  1068. data/test/foreman_app/test/fixtures/fact_values.yml +11 -0
  1069. data/test/foreman_app/test/fixtures/features.yml +23 -0
  1070. data/test/foreman_app/test/fixtures/host_classes.yml +9 -0
  1071. data/test/foreman_app/test/fixtures/hostgroup_classes.yml +9 -0
  1072. data/test/foreman_app/test/fixtures/hostgroups.yml +24 -0
  1073. data/test/foreman_app/test/fixtures/hosts.yml +198 -0
  1074. data/test/foreman_app/test/fixtures/images.yml +16 -0
  1075. data/test/foreman_app/test/fixtures/key_pairs.yml +7 -0
  1076. data/test/foreman_app/test/fixtures/logs.yml +11 -0
  1077. data/test/foreman_app/test/fixtures/lookup_keys.yml +32 -0
  1078. data/test/foreman_app/test/fixtures/media.yml +25 -0
  1079. data/test/foreman_app/test/fixtures/messages.yml +7 -0
  1080. data/test/foreman_app/test/fixtures/models.yml +10 -0
  1081. data/test/foreman_app/test/fixtures/notices.yml +7 -0
  1082. data/test/foreman_app/test/fixtures/operatingsystems.yml +49 -0
  1083. data/test/foreman_app/test/fixtures/os_default_templates.yml +21 -0
  1084. data/test/foreman_app/test/fixtures/parameters.yml +30 -0
  1085. data/test/foreman_app/test/fixtures/ptables.yml +17 -0
  1086. data/test/foreman_app/test/fixtures/puppetclasses.yml +13 -0
  1087. data/test/foreman_app/test/fixtures/report-2.6.12-noops.yaml +627 -0
  1088. data/test/foreman_app/test/fixtures/report-2.6.5-errors.yaml +60 -0
  1089. data/test/foreman_app/test/fixtures/report-2.6.5.yaml +413 -0
  1090. data/test/foreman_app/test/fixtures/report-3.0.1.yaml +283 -0
  1091. data/test/foreman_app/test/fixtures/report-applied.yaml +86 -0
  1092. data/test/foreman_app/test/fixtures/report-empty.yaml +31 -0
  1093. data/test/foreman_app/test/fixtures/report-errors.yaml +66 -0
  1094. data/test/foreman_app/test/fixtures/report-skipped.yaml +86 -0
  1095. data/test/foreman_app/test/fixtures/reports.yml +13 -0
  1096. data/test/foreman_app/test/fixtures/roles.yml +198 -0
  1097. data/test/foreman_app/test/fixtures/sample_http_preseed_template +66 -0
  1098. data/test/foreman_app/test/fixtures/sample_tokenised_template +66 -0
  1099. data/test/foreman_app/test/fixtures/settings.yml +176 -0
  1100. data/test/foreman_app/test/fixtures/smart_proxies.yml +23 -0
  1101. data/test/foreman_app/test/fixtures/sources.yml +7 -0
  1102. data/test/foreman_app/test/fixtures/subnet_domains.yml +9 -0
  1103. data/test/foreman_app/test/fixtures/subnets.yml +26 -0
  1104. data/test/foreman_app/test/fixtures/taxable_taxonomies.yml +15 -0
  1105. data/test/foreman_app/test/fixtures/taxonomies.yml +15 -0
  1106. data/test/foreman_app/test/fixtures/template_combinations.yml +19 -0
  1107. data/test/foreman_app/test/fixtures/template_kinds.yml +14 -0
  1108. data/test/foreman_app/test/fixtures/trend_counters.yml +9 -0
  1109. data/test/foreman_app/test/fixtures/trends.yml +9 -0
  1110. data/test/foreman_app/test/fixtures/trends_controller_test.rb +8 -0
  1111. data/test/foreman_app/test/fixtures/user_facts.yml +7 -0
  1112. data/test/foreman_app/test/fixtures/usergroups.yml +7 -0
  1113. data/test/foreman_app/test/fixtures/users.yml +52 -0
  1114. data/test/foreman_app/test/functional/api/v1/architectures_controller_test.rb +79 -0
  1115. data/test/foreman_app/test/functional/api/v1/audits_controller_test.rb +20 -0
  1116. data/test/foreman_app/test/functional/api/v1/auth_source_ldaps_controller_test.rb +41 -0
  1117. data/test/foreman_app/test/functional/api/v1/bookmarks_controller_test.rb +60 -0
  1118. data/test/foreman_app/test/functional/api/v1/common_parameters_controller_test.rb +41 -0
  1119. data/test/foreman_app/test/functional/api/v1/compute_resources_controller_test.rb +50 -0
  1120. data/test/foreman_app/test/functional/api/v1/config_templates_controller_test.rb +82 -0
  1121. data/test/foreman_app/test/functional/api/v1/dashboard_controller_test.rb +12 -0
  1122. data/test/foreman_app/test/functional/api/v1/domains_controller_test.rb +50 -0
  1123. data/test/foreman_app/test/functional/api/v1/environments_controller_test.rb +40 -0
  1124. data/test/foreman_app/test/functional/api/v1/fact_values_controller_test.rb +19 -0
  1125. data/test/foreman_app/test/functional/api/v1/home_controller_test.rb +11 -0
  1126. data/test/foreman_app/test/functional/api/v1/hostgroups_controller_test.rb +41 -0
  1127. data/test/foreman_app/test/functional/api/v1/hosts_controller_test.rb +66 -0
  1128. data/test/foreman_app/test/functional/api/v1/images_controller_test.rb +47 -0
  1129. data/test/foreman_app/test/functional/api/v1/lookup_keys_controller_test.rb +41 -0
  1130. data/test/foreman_app/test/functional/api/v1/media_controller_test.rb +48 -0
  1131. data/test/foreman_app/test/functional/api/v1/models_controller_test.rb +43 -0
  1132. data/test/foreman_app/test/functional/api/v1/operatingsystems_controller_test.rb +55 -0
  1133. data/test/foreman_app/test/functional/api/v1/ptables_controller_test.rb +48 -0
  1134. data/test/foreman_app/test/functional/api/v1/puppetclasses_controller_test.rb +40 -0
  1135. data/test/foreman_app/test/functional/api/v1/reports_controller_test.rb +66 -0
  1136. data/test/foreman_app/test/functional/api/v1/roles_controller_test.rb +41 -0
  1137. data/test/foreman_app/test/functional/api/v1/settings_controller_test.rb +25 -0
  1138. data/test/foreman_app/test/functional/api/v1/smart_proxies_controller_test.rb +72 -0
  1139. data/test/foreman_app/test/functional/api/v1/subnets_controller_test.rb +58 -0
  1140. data/test/foreman_app/test/functional/api/v1/template_kinds_controller_test.rb +11 -0
  1141. data/test/foreman_app/test/functional/api/v1/usergroups_controller_test.rb +41 -0
  1142. data/test/foreman_app/test/functional/api/v1/users_controller_test.rb +137 -0
  1143. data/test/foreman_app/test/functional/api/v2/config_templates_controller_test.rb +80 -0
  1144. data/test/foreman_app/test/functional/api/v2/domains_controller_test.rb +32 -0
  1145. data/test/foreman_app/test/functional/api/v2/host_classes_controller_test.rb +29 -0
  1146. data/test/foreman_app/test/functional/api/v2/hostgroup_class_controller_test.rb +29 -0
  1147. data/test/foreman_app/test/functional/api/v2/locations_controller_test.rb +85 -0
  1148. data/test/foreman_app/test/functional/api/v2/parameters_controller_test.rb +180 -0
  1149. data/test/foreman_app/test/functional/api/v2/puppetclasses_controller_test.rb +103 -0
  1150. data/test/foreman_app/test/functional/api/v2/template_combinations_controller_test.rb +38 -0
  1151. data/test/foreman_app/test/functional/architectures_controller_test.rb +97 -0
  1152. data/test/foreman_app/test/functional/audits_controller_test.rb +29 -0
  1153. data/test/foreman_app/test/functional/auth_source_ldaps_controller_test.rb +66 -0
  1154. data/test/foreman_app/test/functional/bookmarks_controller_test.rb +51 -0
  1155. data/test/foreman_app/test/functional/common_parameters_controller_test.rb +69 -0
  1156. data/test/foreman_app/test/functional/compute_resources_controller_test.rb +157 -0
  1157. data/test/foreman_app/test/functional/compute_resources_vms_controller_test.rb +160 -0
  1158. data/test/foreman_app/test/functional/config_templates_controller_test.rb +132 -0
  1159. data/test/foreman_app/test/functional/dashboard_controller_test.rb +38 -0
  1160. data/test/foreman_app/test/functional/domains_controller_test.rb +101 -0
  1161. data/test/foreman_app/test/functional/environments_controller_test.rb +234 -0
  1162. data/test/foreman_app/test/functional/fact_values_controller_test.rb +138 -0
  1163. data/test/foreman_app/test/functional/facts_controller_test.rb +12 -0
  1164. data/test/foreman_app/test/functional/home_controller_test.rb +9 -0
  1165. data/test/foreman_app/test/functional/hostgroups_controller_test.rb +125 -0
  1166. data/test/foreman_app/test/functional/hosts_controller_test.rb +830 -0
  1167. data/test/foreman_app/test/functional/images_controller_test.rb +55 -0
  1168. data/test/foreman_app/test/functional/locations_controller_test.rb +149 -0
  1169. data/test/foreman_app/test/functional/lookup_keys_controller_test.rb +43 -0
  1170. data/test/foreman_app/test/functional/lookup_values_controller_test.rb +8 -0
  1171. data/test/foreman_app/test/functional/media_controller_test.rb +95 -0
  1172. data/test/foreman_app/test/functional/models_controller_test.rb +66 -0
  1173. data/test/foreman_app/test/functional/notices_controller_test.rb +36 -0
  1174. data/test/foreman_app/test/functional/operatingsystems_controller_test.rb +104 -0
  1175. data/test/foreman_app/test/functional/organizations_controller_test.rb +148 -0
  1176. data/test/foreman_app/test/functional/ptables_controller_test.rb +142 -0
  1177. data/test/foreman_app/test/functional/puppetclasses_controller_test.rb +66 -0
  1178. data/test/foreman_app/test/functional/reports_controller_test.rb +191 -0
  1179. data/test/foreman_app/test/functional/roles_controller_test.rb +124 -0
  1180. data/test/foreman_app/test/functional/settings_controller_test.rb +34 -0
  1181. data/test/foreman_app/test/functional/smart_proxies/autosign_controller_test.rb +8 -0
  1182. data/test/foreman_app/test/functional/smart_proxies/puppetca_controller_test.rb +8 -0
  1183. data/test/foreman_app/test/functional/smart_proxies_controller_test.rb +85 -0
  1184. data/test/foreman_app/test/functional/statistics_controller_test.rb +21 -0
  1185. data/test/foreman_app/test/functional/subnets_controller_test.rb +89 -0
  1186. data/test/foreman_app/test/functional/tasks_controller_test.rb +8 -0
  1187. data/test/foreman_app/test/functional/unattended_controller_test.rb +141 -0
  1188. data/test/foreman_app/test/functional/usergroups_controller_test.rb +66 -0
  1189. data/test/foreman_app/test/functional/users_controller_test.rb +147 -0
  1190. data/test/foreman_app/test/lib/foreman/access_permissions_test.rb +50 -0
  1191. data/test/foreman_app/test/lib/foreman/default_settings/loader_test.rb +39 -0
  1192. data/test/foreman_app/test/lib/foreman/model/ovirt_test.rb +72 -0
  1193. data/test/foreman_app/test/lib/foreman/renderer_test.rb +32 -0
  1194. data/test/foreman_app/test/lib/foreman/util_test.rb +40 -0
  1195. data/test/foreman_app/test/lib/net/dhcp_test.rb +39 -0
  1196. data/test/foreman_app/test/lib/net/net_test.rb +21 -0
  1197. data/test/foreman_app/test/lib/net/validations_test.rb +19 -0
  1198. data/test/foreman_app/test/lib/proxy_api/bmc_test.rb +256 -0
  1199. data/test/foreman_app/test/lib/proxy_api/dhcp_test.rb +60 -0
  1200. data/test/foreman_app/test/lib/puppet_setting_test.rb +92 -0
  1201. data/test/foreman_app/test/performance/browsing_test.rb +9 -0
  1202. data/test/foreman_app/test/test_helper.rb +164 -0
  1203. data/test/foreman_app/test/unit/architecture_test.rb +106 -0
  1204. data/test/foreman_app/test/unit/auth_source_ldap_test.rb +205 -0
  1205. data/test/foreman_app/test/unit/auth_source_test.rb +34 -0
  1206. data/test/foreman_app/test/unit/bookmark_test.rb +32 -0
  1207. data/test/foreman_app/test/unit/classification_test.rb +46 -0
  1208. data/test/foreman_app/test/unit/common_parameter_test.rb +100 -0
  1209. data/test/foreman_app/test/unit/compute_resource_test.rb +88 -0
  1210. data/test/foreman_app/test/unit/config_template_test.rb +67 -0
  1211. data/test/foreman_app/test/unit/domain_parameter_test.rb +106 -0
  1212. data/test/foreman_app/test/unit/domain_test.rb +161 -0
  1213. data/test/foreman_app/test/unit/environment_class_test.rb +9 -0
  1214. data/test/foreman_app/test/unit/environment_test.rb +35 -0
  1215. data/test/foreman_app/test/unit/fact_value_test.rb +25 -0
  1216. data/test/foreman_app/test/unit/facts.yml +91 -0
  1217. data/test/foreman_app/test/unit/facts_importer_test.rb +50 -0
  1218. data/test/foreman_app/test/unit/facts_with_caps.yml +91 -0
  1219. data/test/foreman_app/test/unit/feature_test.rb +8 -0
  1220. data/test/foreman_app/test/unit/group_parameter_test.rb +108 -0
  1221. data/test/foreman_app/test/unit/helpers/architecture_helper_test.rb +4 -0
  1222. data/test/foreman_app/test/unit/helpers/audit_helper_test.rb +4 -0
  1223. data/test/foreman_app/test/unit/helpers/auth_sources_helper_test.rb +4 -0
  1224. data/test/foreman_app/test/unit/helpers/bookmarks_helper_test.rb +4 -0
  1225. data/test/foreman_app/test/unit/helpers/compute_resources_helper_test.rb +4 -0
  1226. data/test/foreman_app/test/unit/helpers/dashboard_helper_test.rb +4 -0
  1227. data/test/foreman_app/test/unit/helpers/domain_helper_test.rb +4 -0
  1228. data/test/foreman_app/test/unit/helpers/environments_helper_test.rb +4 -0
  1229. data/test/foreman_app/test/unit/helpers/fact_values_helper_test.rb +4 -0
  1230. data/test/foreman_app/test/unit/helpers/home_helper_test.rb +4 -0
  1231. data/test/foreman_app/test/unit/helpers/host_groups_helper_test.rb +14 -0
  1232. data/test/foreman_app/test/unit/helpers/hosts_helper_test.rb +4 -0
  1233. data/test/foreman_app/test/unit/helpers/images_helper_test.rb +4 -0
  1234. data/test/foreman_app/test/unit/helpers/lookup_keys_helper_test.rb +4 -0
  1235. data/test/foreman_app/test/unit/helpers/medium_helper_test.rb +4 -0
  1236. data/test/foreman_app/test/unit/helpers/model_helper_test.rb +4 -0
  1237. data/test/foreman_app/test/unit/helpers/operatingsystem_helper_test.rb +4 -0
  1238. data/test/foreman_app/test/unit/helpers/parameters_helper_test.rb +4 -0
  1239. data/test/foreman_app/test/unit/helpers/ptables_helper_test.rb +4 -0
  1240. data/test/foreman_app/test/unit/helpers/puppetclasses_helper_test.rb +4 -0
  1241. data/test/foreman_app/test/unit/helpers/reports_helper_test.rb +4 -0
  1242. data/test/foreman_app/test/unit/helpers/smart_proxies/autosign_helper_test.rb +4 -0
  1243. data/test/foreman_app/test/unit/helpers/smart_proxies/puppetca_helper_test.rb +4 -0
  1244. data/test/foreman_app/test/unit/helpers/statistics_helper_test.rb +4 -0
  1245. data/test/foreman_app/test/unit/helpers/tasks_helper_test.rb +4 -0
  1246. data/test/foreman_app/test/unit/helpers/trends_helper_test.rb +4 -0
  1247. data/test/foreman_app/test/unit/helpers/unattended_helper_test.rb +4 -0
  1248. data/test/foreman_app/test/unit/helpers/usergroups_helper_test.rb +4 -0
  1249. data/test/foreman_app/test/unit/helpers/users_helper_test.rb +4 -0
  1250. data/test/foreman_app/test/unit/host_class_test.rb +8 -0
  1251. data/test/foreman_app/test/unit/host_mailer_test.rb +70 -0
  1252. data/test/foreman_app/test/unit/host_observer_test.rb +35 -0
  1253. data/test/foreman_app/test/unit/host_parameter_test.rb +119 -0
  1254. data/test/foreman_app/test/unit/host_test.rb +606 -0
  1255. data/test/foreman_app/test/unit/hostgroup_class_test.rb +11 -0
  1256. data/test/foreman_app/test/unit/hostgroup_test.rb +178 -0
  1257. data/test/foreman_app/test/unit/image_test.rb +5 -0
  1258. data/test/foreman_app/test/unit/key_pair_test.rb +4 -0
  1259. data/test/foreman_app/test/unit/location_test.rb +162 -0
  1260. data/test/foreman_app/test/unit/log_test.rb +8 -0
  1261. data/test/foreman_app/test/unit/lookup_key_test.rb +88 -0
  1262. data/test/foreman_app/test/unit/medium_test.rb +120 -0
  1263. data/test/foreman_app/test/unit/message_test.rb +8 -0
  1264. data/test/foreman_app/test/unit/model_test.rb +90 -0
  1265. data/test/foreman_app/test/unit/nic_test.rb +49 -0
  1266. data/test/foreman_app/test/unit/notice_test.rb +19 -0
  1267. data/test/foreman_app/test/unit/operatingsystem_test.rb +139 -0
  1268. data/test/foreman_app/test/unit/orchestration/dhcp_test.rb +161 -0
  1269. data/test/foreman_app/test/unit/orchestration/dns_test.rb +54 -0
  1270. data/test/foreman_app/test/unit/orchestration/pxe_local_template +11 -0
  1271. data/test/foreman_app/test/unit/orchestration/pxe_template +4 -0
  1272. data/test/foreman_app/test/unit/orchestration/tftp_test.rb +49 -0
  1273. data/test/foreman_app/test/unit/orchestration_test.rb +25 -0
  1274. data/test/foreman_app/test/unit/organization_test.rb +163 -0
  1275. data/test/foreman_app/test/unit/os_default_template_test.rb +8 -0
  1276. data/test/foreman_app/test/unit/parameter_test.rb +44 -0
  1277. data/test/foreman_app/test/unit/ptable_test.rb +119 -0
  1278. data/test/foreman_app/test/unit/puppet_class_importer_test.rb +67 -0
  1279. data/test/foreman_app/test/unit/puppetclass_test.rb +90 -0
  1280. data/test/foreman_app/test/unit/report_test.rb +196 -0
  1281. data/test/foreman_app/test/unit/role_test.rb +104 -0
  1282. data/test/foreman_app/test/unit/setting_test.rb +158 -0
  1283. data/test/foreman_app/test/unit/smart_proxy_test.rb +27 -0
  1284. data/test/foreman_app/test/unit/source_test.rb +8 -0
  1285. data/test/foreman_app/test/unit/sso.rb +26 -0
  1286. data/test/foreman_app/test/unit/sso/apache_test.rb +38 -0
  1287. data/test/foreman_app/test/unit/sso/base_test.rb +14 -0
  1288. data/test/foreman_app/test/unit/sso/signo_test.rb +81 -0
  1289. data/test/foreman_app/test/unit/subnet_domain_test.rb +8 -0
  1290. data/test/foreman_app/test/unit/subnet_test.rb +182 -0
  1291. data/test/foreman_app/test/unit/suse_test.rb +46 -0
  1292. data/test/foreman_app/test/unit/taxable_taxonomy_test.rb +8 -0
  1293. data/test/foreman_app/test/unit/template_combination_test.rb +8 -0
  1294. data/test/foreman_app/test/unit/template_kind_test.rb +8 -0
  1295. data/test/foreman_app/test/unit/token_test.rb +67 -0
  1296. data/test/foreman_app/test/unit/trend_counter_test.rb +8 -0
  1297. data/test/foreman_app/test/unit/trend_test.rb +8 -0
  1298. data/test/foreman_app/test/unit/user_fact_test.rb +8 -0
  1299. data/test/foreman_app/test/unit/user_test.rb +196 -0
  1300. data/test/foreman_app/test/unit/usergroup_test.rb +161 -0
  1301. data/test/foreman_app/tmp/cache/505/030/idle_timeout +1 -0
  1302. data/test/foreman_app/tmp/cache/505/C00/use_gravatar +1 -0
  1303. data/test/foreman_app/tmp/cache/7D9/CD0/email_reply_address +1 -0
  1304. data/test/foreman_app/tmp/cache/94D/A30/discovery_organization +1 -0
  1305. data/test/foreman_app/tmp/cache/ACF/DB0/authorize_login_delegation +1 -0
  1306. data/test/foreman_app/tmp/secret_token +1 -0
  1307. data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.eot +0 -0
  1308. data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.svg +470 -0
  1309. data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.ttf +0 -0
  1310. data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.woff +0 -0
  1311. data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.eot +0 -0
  1312. data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.svg +470 -0
  1313. data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.ttf +0 -0
  1314. data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.woff +0 -0
  1315. data/test/foreman_app/vendor/assets/javascripts/ace/ace.js +10 -0
  1316. data/test/foreman_app/vendor/assets/javascripts/ace/cockpit.js +1 -0
  1317. data/test/foreman_app/vendor/assets/javascripts/ace/ext-static_highlight.js +1 -0
  1318. data/test/foreman_app/vendor/assets/javascripts/ace/ext-textarea.js +1 -0
  1319. data/test/foreman_app/vendor/assets/javascripts/ace/keybinding-emacs.js +1 -0
  1320. data/test/foreman_app/vendor/assets/javascripts/ace/keybinding-vim.js +1 -0
  1321. data/test/foreman_app/vendor/assets/javascripts/ace/mode-diff.js +165 -0
  1322. data/test/foreman_app/vendor/assets/javascripts/ace/mode-ruby.js +1 -0
  1323. data/test/foreman_app/vendor/assets/javascripts/ace/mode-sh.js +1 -0
  1324. data/test/foreman_app/vendor/assets/javascripts/ace/theme-clouds.js +137 -0
  1325. data/test/foreman_app/vendor/assets/javascripts/ace/theme-dawn.js +1 -0
  1326. data/test/foreman_app/vendor/assets/javascripts/ace/theme-textmate.js +1 -0
  1327. data/test/foreman_app/vendor/assets/javascripts/ace/theme-twilight.js +1 -0
  1328. data/test/foreman_app/vendor/assets/javascripts/ace/worker-coffee.js +1 -0
  1329. data/test/foreman_app/vendor/assets/javascripts/ace/worker-css.js +1 -0
  1330. data/test/foreman_app/vendor/assets/javascripts/ace/worker-javascript.js +1 -0
  1331. data/test/foreman_app/vendor/assets/javascripts/ace/worker-json.js +1 -0
  1332. data/test/foreman_app/vendor/assets/javascripts/ace/worker-xquery.js +1 -0
  1333. data/test/foreman_app/vendor/assets/javascripts/background-size.htc +7 -0
  1334. data/test/foreman_app/vendor/assets/javascripts/diff.js +296 -0
  1335. data/test/foreman_app/vendor/assets/javascripts/flot.js +5 -0
  1336. data/test/foreman_app/vendor/assets/javascripts/jquery.cookie.js +91 -0
  1337. data/test/foreman_app/vendor/assets/javascripts/jquery.dataTables.bootstrap-paging.js +101 -0
  1338. data/test/foreman_app/vendor/assets/javascripts/jquery.dataTables.min.js +155 -0
  1339. data/test/foreman_app/vendor/assets/javascripts/jquery.jeditable.js +556 -0
  1340. data/test/foreman_app/vendor/assets/javascripts/jquery.jnotify.js +209 -0
  1341. data/test/foreman_app/vendor/assets/javascripts/jquery.multi-select.js +503 -0
  1342. data/test/foreman_app/vendor/assets/javascripts/noVNC/base64.js +147 -0
  1343. data/test/foreman_app/vendor/assets/javascripts/noVNC/des.js +273 -0
  1344. data/test/foreman_app/vendor/assets/javascripts/noVNC/display.js +700 -0
  1345. data/test/foreman_app/vendor/assets/javascripts/noVNC/input.js +1911 -0
  1346. data/test/foreman_app/vendor/assets/javascripts/noVNC/jsunzip.js +668 -0
  1347. data/test/foreman_app/vendor/assets/javascripts/noVNC/logo.js +1 -0
  1348. data/test/foreman_app/vendor/assets/javascripts/noVNC/playback.js +90 -0
  1349. data/test/foreman_app/vendor/assets/javascripts/noVNC/rfb.js +1846 -0
  1350. data/test/foreman_app/vendor/assets/javascripts/noVNC/ui.js +649 -0
  1351. data/test/foreman_app/vendor/assets/javascripts/noVNC/util.js +303 -0
  1352. data/test/foreman_app/vendor/assets/javascripts/noVNC/web-socket-js/README.txt +109 -0
  1353. data/test/foreman_app/vendor/assets/javascripts/noVNC/web-socket-js/swfobject.js +4 -0
  1354. data/test/foreman_app/vendor/assets/javascripts/noVNC/web-socket-js/web_socket.js +341 -0
  1355. data/test/foreman_app/vendor/assets/javascripts/noVNC/websock.js +356 -0
  1356. data/test/foreman_app/vendor/assets/javascripts/noVNC/webutil.js +148 -0
  1357. data/test/foreman_app/vendor/assets/javascripts/vendor.js +7 -0
  1358. data/test/foreman_app/vendor/assets/stylesheets/jquery.jnotify.css +97 -0
  1359. data/test/foreman_app/vendor/assets/stylesheets/multi-select.scss +126 -0
  1360. data/test/foreman_app/vendor/assets/stylesheets/vendor.css +3 -0
  1361. data/test/functional/discovers_controller_test.rb +40 -0
  1362. data/test/test_helper.rb +28 -0
  1363. data/test/unit/facts.yml +91 -0
  1364. data/test/unit/host_discovered_test.rb +23 -0
  1365. data/test/unit/setting_discovered_test.rb +9 -0
  1366. metadata +2816 -0
@@ -0,0 +1 @@
1
+ noVNC_logo = {"width": 640, "height": 435, "data": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAGzCAYAAAC/y6a9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAStAAAErQBBHTWggAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N13fBvlwQfw3522ZMm2vPdIGCFkA4GyoYyGsCmjk+7dQksHL2/H2/dtC4W2tLTlfelu2VA2lEILFCgQIHEGJCQkdjzkLdmWZGvfvX8oOkmJEy/pNO73/Xz44DtLzz2RT7qfnnXC8uXLZUxDlqfdnUYQhIP+bjbPn+5xhypzrmUf6rGzOc5cjzVduXN9/nTPyfRrMt/jzOcY05U5n3L2f95s/34LPW4m/p6FbLp/73xe+5nKnWuZs/07ZOOcnusx5nucbJU727LneuxslDmdTBxn/2NmusyEuZS7kHMxG/XP5Gf3TOVmQzY+u/PhPMnkMcSsH5WIiIiI8goDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHG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"};
@@ -0,0 +1,90 @@
1
+ /*
2
+ * noVNC: HTML5 VNC client
3
+ * Copyright (C) 2011 Joel Martin
4
+ * Licensed under LGPL-3 (see LICENSE.LGPL-3)
5
+ */
6
+
7
+ "use strict";
8
+ /*jslint browser: true, white: false */
9
+ /*global Util, VNC_frame_data, finish */
10
+
11
+ var rfb, mode, test_state, frame_idx, frame_length,
12
+ iteration, iterations, istart_time,
13
+
14
+ // Pre-declarations for jslint
15
+ send_array, next_iteration, queue_next_packet, do_packet;
16
+
17
+ // Override send_array
18
+ send_array = function (arr) {
19
+ // Stub out send_array
20
+ };
21
+
22
+ next_iteration = function () {
23
+ if (iteration === 0) {
24
+ frame_length = VNC_frame_data.length;
25
+ test_state = 'running';
26
+ } else {
27
+ rfb.disconnect();
28
+ }
29
+
30
+ if (test_state !== 'running') { return; }
31
+
32
+ iteration += 1;
33
+ if (iteration > iterations) {
34
+ finish();
35
+ return;
36
+ }
37
+
38
+ frame_idx = 0;
39
+ istart_time = (new Date()).getTime();
40
+ rfb.connect('test', 0, "bogus");
41
+
42
+ queue_next_packet();
43
+
44
+ };
45
+
46
+ queue_next_packet = function () {
47
+ var frame, foffset, toffset, delay;
48
+ if (test_state !== 'running') { return; }
49
+
50
+ frame = VNC_frame_data[frame_idx];
51
+ while ((frame_idx < frame_length) && (frame.charAt(0) === "}")) {
52
+ //Util.Debug("Send frame " + frame_idx);
53
+ frame_idx += 1;
54
+ frame = VNC_frame_data[frame_idx];
55
+ }
56
+
57
+ if (frame === 'EOF') {
58
+ Util.Debug("Finished, found EOF");
59
+ next_iteration();
60
+ return;
61
+ }
62
+ if (frame_idx >= frame_length) {
63
+ Util.Debug("Finished, no more frames");
64
+ next_iteration();
65
+ return;
66
+ }
67
+
68
+ if (mode === 'realtime') {
69
+ foffset = frame.slice(1, frame.indexOf('{', 1));
70
+ toffset = (new Date()).getTime() - istart_time;
71
+ delay = foffset - toffset;
72
+ if (delay < 1) {
73
+ delay = 1;
74
+ }
75
+
76
+ setTimeout(do_packet, delay);
77
+ } else {
78
+ setTimeout(do_packet, 1);
79
+ }
80
+ };
81
+
82
+ do_packet = function () {
83
+ //Util.Debug("Processing frame: " + frame_idx);
84
+ var frame = VNC_frame_data[frame_idx];
85
+ rfb.recv_message({'data' : frame.slice(frame.indexOf('{', 1) + 1)});
86
+ frame_idx += 1;
87
+
88
+ queue_next_packet();
89
+ };
90
+
@@ -0,0 +1,1846 @@
1
+ /*
2
+ * noVNC: HTML5 VNC client
3
+ * Copyright (C) 2011 Joel Martin
4
+ * Licensed under LGPL-3 (see LICENSE.txt)
5
+ *
6
+ * See README.md for usage and integration instructions.
7
+ *
8
+ * TIGHT decoder portion:
9
+ * (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca)
10
+ */
11
+
12
+ /*jslint white: false, browser: true, bitwise: false, plusplus: false */
13
+ /*global window, Util, Display, Keyboard, Mouse, Websock, Websock_native, Base64, DES */
14
+
15
+
16
+ function RFB(defaults) {
17
+ "use strict";
18
+
19
+ var that = {}, // Public API methods
20
+ conf = {}, // Configuration attributes
21
+
22
+ // Pre-declare private functions used before definitions (jslint)
23
+ init_vars, updateState, fail, handle_message,
24
+ init_msg, normal_msg, framebufferUpdate, print_stats,
25
+
26
+ pixelFormat, clientEncodings, fbUpdateRequest, fbUpdateRequests,
27
+ keyEvent, pointerEvent, clientCutText,
28
+
29
+ getTightCLength, extract_data_uri, scan_tight_imgQ,
30
+ keyPress, mouseButton, mouseMove,
31
+
32
+ checkEvents, // Overridable for testing
33
+
34
+
35
+ //
36
+ // Private RFB namespace variables
37
+ //
38
+ rfb_host = '',
39
+ rfb_port = 5900,
40
+ rfb_password = '',
41
+ rfb_path = '',
42
+
43
+ rfb_state = 'disconnected',
44
+ rfb_version = 0,
45
+ rfb_max_version= 3.8,
46
+ rfb_auth_scheme= '',
47
+
48
+
49
+ // In preference order
50
+ encodings = [
51
+ ['COPYRECT', 0x01 ],
52
+ ['TIGHT', 0x07 ],
53
+ ['TIGHT_PNG', -260 ],
54
+ ['HEXTILE', 0x05 ],
55
+ ['RRE', 0x02 ],
56
+ ['RAW', 0x00 ],
57
+ ['DesktopSize', -223 ],
58
+ ['Cursor', -239 ],
59
+
60
+ // Psuedo-encoding settings
61
+ //['JPEG_quality_lo', -32 ],
62
+ ['JPEG_quality_med', -26 ],
63
+ //['JPEG_quality_hi', -23 ],
64
+ //['compress_lo', -255 ],
65
+ ['compress_hi', -247 ],
66
+ ['last_rect', -224 ]
67
+ ],
68
+
69
+ encHandlers = {},
70
+ encNames = {},
71
+ encStats = {}, // [rectCnt, rectCntTot]
72
+
73
+ ws = null, // Websock object
74
+ display = null, // Display object
75
+ keyboard = null, // Keyboard input handler object
76
+ mouse = null, // Mouse input handler object
77
+ sendTimer = null, // Send Queue check timer
78
+ connTimer = null, // connection timer
79
+ disconnTimer = null, // disconnection timer
80
+ msgTimer = null, // queued handle_message timer
81
+
82
+ // Frame buffer update state
83
+ FBU = {
84
+ rects : 0,
85
+ subrects : 0, // RRE
86
+ lines : 0, // RAW
87
+ tiles : 0, // HEXTILE
88
+ bytes : 0,
89
+ x : 0,
90
+ y : 0,
91
+ width : 0,
92
+ height : 0,
93
+ encoding : 0,
94
+ subencoding : -1,
95
+ background : null,
96
+ imgQ : [], // TIGHT_PNG image queue
97
+ zlibs : [] // TIGHT zlib streams
98
+ },
99
+
100
+ fb_Bpp = 4,
101
+ fb_depth = 3,
102
+ fb_width = 0,
103
+ fb_height = 0,
104
+ fb_name = "",
105
+
106
+ scan_imgQ_rate = 40, // 25 times per second or so
107
+ last_req_time = 0,
108
+ rre_chunk_sz = 100,
109
+
110
+ timing = {
111
+ last_fbu : 0,
112
+ fbu_total : 0,
113
+ fbu_total_cnt : 0,
114
+ full_fbu_total : 0,
115
+ full_fbu_cnt : 0,
116
+
117
+ fbu_rt_start : 0,
118
+ fbu_rt_total : 0,
119
+ fbu_rt_cnt : 0,
120
+ pixels : 0
121
+ },
122
+
123
+ test_mode = false,
124
+
125
+ def_con_timeout = Websock_native ? 10 : 25,
126
+
127
+ /* Mouse state */
128
+ mouse_buttonMask = 0,
129
+ mouse_arr = [],
130
+ viewportDragging = false,
131
+ viewportDragPos = {};
132
+
133
+ // Configuration attributes
134
+ Util.conf_defaults(conf, that, defaults, [
135
+ ['target', 'wo', 'dom', null, 'VNC display rendering Canvas object'],
136
+ ['focusContainer', 'wo', 'dom', document, 'DOM element that captures keyboard input'],
137
+
138
+ ['encrypt', 'rw', 'bool', false, 'Use TLS/SSL/wss encryption'],
139
+ ['true_color', 'rw', 'bool', true, 'Request true color pixel data'],
140
+ ['local_cursor', 'rw', 'bool', false, 'Request locally rendered cursor'],
141
+ ['shared', 'rw', 'bool', true, 'Request shared mode'],
142
+ ['view_only', 'rw', 'bool', false, 'Disable client mouse/keyboard'],
143
+
144
+ ['connectTimeout', 'rw', 'int', def_con_timeout, 'Time (s) to wait for connection'],
145
+ ['disconnectTimeout', 'rw', 'int', 10, 'Time (s) to wait for disconnection'],
146
+
147
+ ['viewportDrag', 'rw', 'bool', false, 'Move the viewport on mouse drags'],
148
+
149
+ ['check_rate', 'rw', 'int', 217, 'Timing (ms) of send/receive check'],
150
+ ['fbu_req_rate', 'rw', 'int', 1413, 'Timing (ms) of frameBufferUpdate requests'],
151
+
152
+ // Callback functions
153
+ ['onUpdateState', 'rw', 'func', function() { },
154
+ 'onUpdateState(rfb, state, oldstate, statusMsg): RFB state update/change '],
155
+ ['onPasswordRequired', 'rw', 'func', function() { },
156
+ 'onPasswordRequired(rfb): VNC password is required '],
157
+ ['onClipboard', 'rw', 'func', function() { },
158
+ 'onClipboard(rfb, text): RFB clipboard contents received'],
159
+ ['onBell', 'rw', 'func', function() { },
160
+ 'onBell(rfb): RFB Bell message received '],
161
+ ['onFBUReceive', 'rw', 'func', function() { },
162
+ 'onFBUReceive(rfb, fbu): RFB FBU received but not yet processed '],
163
+ ['onFBUComplete', 'rw', 'func', function() { },
164
+ 'onFBUComplete(rfb, fbu): RFB FBU received and processed '],
165
+
166
+ // These callback names are deprecated
167
+ ['updateState', 'rw', 'func', function() { },
168
+ 'obsolete, use onUpdateState'],
169
+ ['clipboardReceive', 'rw', 'func', function() { },
170
+ 'obsolete, use onClipboard']
171
+ ]);
172
+
173
+
174
+ // Override/add some specific configuration getters/setters
175
+ that.set_local_cursor = function(cursor) {
176
+ if ((!cursor) || (cursor in {'0':1, 'no':1, 'false':1})) {
177
+ conf.local_cursor = false;
178
+ } else {
179
+ if (display.get_cursor_uri()) {
180
+ conf.local_cursor = true;
181
+ } else {
182
+ Util.Warn("Browser does not support local cursor");
183
+ }
184
+ }
185
+ };
186
+
187
+ // These are fake configuration getters
188
+ that.get_display = function() { return display; };
189
+
190
+ that.get_keyboard = function() { return keyboard; };
191
+
192
+ that.get_mouse = function() { return mouse; };
193
+
194
+
195
+
196
+ //
197
+ // Setup routines
198
+ //
199
+
200
+ // Create the public API interface and initialize values that stay
201
+ // constant across connect/disconnect
202
+ function constructor() {
203
+ var i, rmode;
204
+ Util.Debug(">> RFB.constructor");
205
+
206
+ // Create lookup tables based encoding number
207
+ for (i=0; i < encodings.length; i+=1) {
208
+ encHandlers[encodings[i][1]] = encHandlers[encodings[i][0]];
209
+ encNames[encodings[i][1]] = encodings[i][0];
210
+ encStats[encodings[i][1]] = [0, 0];
211
+ }
212
+ // Initialize display, mouse, keyboard, and websock
213
+ try {
214
+ display = new Display({'target': conf.target});
215
+ } catch (exc) {
216
+ Util.Error("Display exception: " + exc);
217
+ updateState('fatal', "No working Display");
218
+ }
219
+ keyboard = new Keyboard({'target': conf.focusContainer,
220
+ 'onKeyPress': keyPress});
221
+ mouse = new Mouse({'target': conf.target,
222
+ 'onMouseButton': mouseButton,
223
+ 'onMouseMove': mouseMove});
224
+
225
+ rmode = display.get_render_mode();
226
+
227
+ ws = new Websock();
228
+ ws.on('message', handle_message);
229
+ ws.on('open', function() {
230
+ if (rfb_state === "connect") {
231
+ updateState('ProtocolVersion', "Starting VNC handshake");
232
+ } else {
233
+ fail("Got unexpected WebSockets connection");
234
+ }
235
+ });
236
+ ws.on('close', function(e) {
237
+ if (e.code) {
238
+ Util.Info("Close code: " + e.code + ", reason: " + e.reason + ", wasClean: " + e.wasClean);
239
+ }
240
+ if (rfb_state === 'disconnect') {
241
+ updateState('disconnected', 'VNC disconnected');
242
+ } else if (rfb_state === 'ProtocolVersion') {
243
+ fail('Failed to connect to server');
244
+ } else if (rfb_state in {'failed':1, 'disconnected':1}) {
245
+ Util.Error("Received onclose while disconnected");
246
+ } else {
247
+ fail('Server disconnected');
248
+ }
249
+ });
250
+ ws.on('error', function(e) {
251
+ fail("WebSock error: " + e);
252
+ });
253
+
254
+
255
+ init_vars();
256
+
257
+ /* Check web-socket-js if no builtin WebSocket support */
258
+ if (Websock_native) {
259
+ Util.Info("Using native WebSockets");
260
+ updateState('loaded', 'noVNC ready: native WebSockets, ' + rmode);
261
+ } else {
262
+ Util.Warn("Using web-socket-js bridge. Flash version: " +
263
+ Util.Flash.version);
264
+ if ((! Util.Flash) ||
265
+ (Util.Flash.version < 9)) {
266
+ updateState('fatal', "WebSockets or <a href='http://get.adobe.com/flashplayer'>Adobe Flash<\/a> is required");
267
+ } else if (document.location.href.substr(0, 7) === "file://") {
268
+ updateState('fatal',
269
+ "'file://' URL is incompatible with Adobe Flash");
270
+ } else {
271
+ updateState('loaded', 'noVNC ready: WebSockets emulation, ' + rmode);
272
+ }
273
+ }
274
+
275
+ Util.Debug("<< RFB.constructor");
276
+ return that; // Return the public API interface
277
+ }
278
+
279
+ function connect() {
280
+ Util.Debug(">> RFB.connect");
281
+ var uri;
282
+
283
+ if (typeof UsingSocketIO !== "undefined") {
284
+ uri = "http://" + rfb_host + ":" + rfb_port + "/" + rfb_path;
285
+ } else {
286
+ if (conf.encrypt) {
287
+ uri = "wss://";
288
+ } else {
289
+ uri = "ws://";
290
+ }
291
+ uri += rfb_host + ":" + rfb_port + "/" + rfb_path;
292
+ }
293
+ Util.Info("connecting to " + uri);
294
+ ws.open(uri);
295
+
296
+ Util.Debug("<< RFB.connect");
297
+ }
298
+
299
+ // Initialize variables that are reset before each connection
300
+ init_vars = function() {
301
+ var i;
302
+
303
+ /* Reset state */
304
+ ws.init();
305
+
306
+ FBU.rects = 0;
307
+ FBU.subrects = 0; // RRE and HEXTILE
308
+ FBU.lines = 0; // RAW
309
+ FBU.tiles = 0; // HEXTILE
310
+ FBU.imgQ = []; // TIGHT_PNG image queue
311
+ FBU.zlibs = []; // TIGHT zlib encoders
312
+ mouse_buttonMask = 0;
313
+ mouse_arr = [];
314
+
315
+ // Clear the per connection encoding stats
316
+ for (i=0; i < encodings.length; i+=1) {
317
+ encStats[encodings[i][1]][0] = 0;
318
+ }
319
+
320
+ for (i=0; i < 4; i++) {
321
+ //FBU.zlibs[i] = new InflateStream();
322
+ FBU.zlibs[i] = new TINF();
323
+ FBU.zlibs[i].init();
324
+ }
325
+ };
326
+
327
+ // Print statistics
328
+ print_stats = function() {
329
+ var i, s;
330
+ Util.Info("Encoding stats for this connection:");
331
+ for (i=0; i < encodings.length; i+=1) {
332
+ s = encStats[encodings[i][1]];
333
+ if ((s[0] + s[1]) > 0) {
334
+ Util.Info(" " + encodings[i][0] + ": " +
335
+ s[0] + " rects");
336
+ }
337
+ }
338
+ Util.Info("Encoding stats since page load:");
339
+ for (i=0; i < encodings.length; i+=1) {
340
+ s = encStats[encodings[i][1]];
341
+ if ((s[0] + s[1]) > 0) {
342
+ Util.Info(" " + encodings[i][0] + ": " +
343
+ s[1] + " rects");
344
+ }
345
+ }
346
+ };
347
+
348
+ //
349
+ // Utility routines
350
+ //
351
+
352
+
353
+ /*
354
+ * Page states:
355
+ * loaded - page load, equivalent to disconnected
356
+ * disconnected - idle state
357
+ * connect - starting to connect (to ProtocolVersion)
358
+ * normal - connected
359
+ * disconnect - starting to disconnect
360
+ * failed - abnormal disconnect
361
+ * fatal - failed to load page, or fatal error
362
+ *
363
+ * RFB protocol initialization states:
364
+ * ProtocolVersion
365
+ * Security
366
+ * Authentication
367
+ * password - waiting for password, not part of RFB
368
+ * SecurityResult
369
+ * ClientInitialization - not triggered by server message
370
+ * ServerInitialization (to normal)
371
+ */
372
+ updateState = function(state, statusMsg) {
373
+ var func, cmsg, oldstate = rfb_state;
374
+
375
+ if (state === oldstate) {
376
+ /* Already here, ignore */
377
+ Util.Debug("Already in state '" + state + "', ignoring.");
378
+ return;
379
+ }
380
+
381
+ /*
382
+ * These are disconnected states. A previous connect may
383
+ * asynchronously cause a connection so make sure we are closed.
384
+ */
385
+ if (state in {'disconnected':1, 'loaded':1, 'connect':1,
386
+ 'disconnect':1, 'failed':1, 'fatal':1}) {
387
+ if (sendTimer) {
388
+ clearInterval(sendTimer);
389
+ sendTimer = null;
390
+ }
391
+
392
+ if (msgTimer) {
393
+ clearInterval(msgTimer);
394
+ msgTimer = null;
395
+ }
396
+
397
+ if (display && display.get_context()) {
398
+ keyboard.ungrab();
399
+ mouse.ungrab();
400
+ display.defaultCursor();
401
+ if ((Util.get_logging() !== 'debug') ||
402
+ (state === 'loaded')) {
403
+ // Show noVNC logo on load and when disconnected if
404
+ // debug is off
405
+ display.clear();
406
+ }
407
+ }
408
+
409
+ ws.close();
410
+ }
411
+
412
+ if (oldstate === 'fatal') {
413
+ Util.Error("Fatal error, cannot continue");
414
+ }
415
+
416
+ if ((state === 'failed') || (state === 'fatal')) {
417
+ func = Util.Error;
418
+ } else {
419
+ func = Util.Warn;
420
+ }
421
+
422
+ if ((oldstate === 'failed') && (state === 'disconnected')) {
423
+ // Do disconnect action, but stay in failed state.
424
+ rfb_state = 'failed';
425
+ } else {
426
+ rfb_state = state;
427
+ }
428
+
429
+ cmsg = typeof(statusMsg) !== 'undefined' ? (" Msg: " + statusMsg) : "";
430
+ func("New state '" + rfb_state + "', was '" + oldstate + "'." + cmsg);
431
+
432
+ if (connTimer && (rfb_state !== 'connect')) {
433
+ Util.Debug("Clearing connect timer");
434
+ clearInterval(connTimer);
435
+ connTimer = null;
436
+ }
437
+
438
+ if (disconnTimer && (rfb_state !== 'disconnect')) {
439
+ Util.Debug("Clearing disconnect timer");
440
+ clearInterval(disconnTimer);
441
+ disconnTimer = null;
442
+ }
443
+
444
+ switch (state) {
445
+ case 'normal':
446
+ if ((oldstate === 'disconnected') || (oldstate === 'failed')) {
447
+ Util.Error("Invalid transition from 'disconnected' or 'failed' to 'normal'");
448
+ }
449
+
450
+ break;
451
+
452
+
453
+ case 'connect':
454
+
455
+ connTimer = setTimeout(function () {
456
+ fail("Connect timeout");
457
+ }, conf.connectTimeout * 1000);
458
+
459
+ init_vars();
460
+ connect();
461
+
462
+ // WebSocket.onopen transitions to 'ProtocolVersion'
463
+ break;
464
+
465
+
466
+ case 'disconnect':
467
+
468
+ if (! test_mode) {
469
+ disconnTimer = setTimeout(function () {
470
+ fail("Disconnect timeout");
471
+ }, conf.disconnectTimeout * 1000);
472
+ }
473
+
474
+ print_stats();
475
+
476
+ // WebSocket.onclose transitions to 'disconnected'
477
+ break;
478
+
479
+
480
+ case 'failed':
481
+ if (oldstate === 'disconnected') {
482
+ Util.Error("Invalid transition from 'disconnected' to 'failed'");
483
+ }
484
+ if (oldstate === 'normal') {
485
+ Util.Error("Error while connected.");
486
+ }
487
+ if (oldstate === 'init') {
488
+ Util.Error("Error while initializing.");
489
+ }
490
+
491
+ // Make sure we transition to disconnected
492
+ setTimeout(function() { updateState('disconnected'); }, 50);
493
+
494
+ break;
495
+
496
+
497
+ default:
498
+ // No state change action to take
499
+
500
+ }
501
+
502
+ if ((oldstate === 'failed') && (state === 'disconnected')) {
503
+ // Leave the failed message
504
+ conf.updateState(that, state, oldstate); // Obsolete
505
+ conf.onUpdateState(that, state, oldstate);
506
+ } else {
507
+ conf.updateState(that, state, oldstate, statusMsg); // Obsolete
508
+ conf.onUpdateState(that, state, oldstate, statusMsg);
509
+ }
510
+ };
511
+
512
+ fail = function(msg) {
513
+ updateState('failed', msg);
514
+ return false;
515
+ };
516
+
517
+ handle_message = function() {
518
+ //Util.Debug(">> handle_message ws.rQlen(): " + ws.rQlen());
519
+ //Util.Debug("ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")");
520
+ if (ws.rQlen() === 0) {
521
+ Util.Warn("handle_message called on empty receive queue");
522
+ return;
523
+ }
524
+ switch (rfb_state) {
525
+ case 'disconnected':
526
+ case 'failed':
527
+ Util.Error("Got data while disconnected");
528
+ break;
529
+ case 'normal':
530
+ if (normal_msg() && ws.rQlen() > 0) {
531
+ // true means we can continue processing
532
+ // Give other events a chance to run
533
+ if (msgTimer === null) {
534
+ Util.Debug("More data to process, creating timer");
535
+ msgTimer = setTimeout(function () {
536
+ msgTimer = null;
537
+ handle_message();
538
+ }, 10);
539
+ } else {
540
+ Util.Debug("More data to process, existing timer");
541
+ }
542
+ }
543
+ break;
544
+ default:
545
+ init_msg();
546
+ break;
547
+ }
548
+ };
549
+
550
+
551
+ function genDES(password, challenge) {
552
+ var i, passwd = [];
553
+ for (i=0; i < password.length; i += 1) {
554
+ passwd.push(password.charCodeAt(i));
555
+ }
556
+ return (new DES(passwd)).encrypt(challenge);
557
+ }
558
+
559
+ function flushClient() {
560
+ if (mouse_arr.length > 0) {
561
+ //send(mouse_arr.concat(fbUpdateRequests()));
562
+ ws.send(mouse_arr);
563
+ setTimeout(function() {
564
+ ws.send(fbUpdateRequests());
565
+ }, 50);
566
+
567
+ mouse_arr = [];
568
+ return true;
569
+ } else {
570
+ return false;
571
+ }
572
+ }
573
+
574
+ // overridable for testing
575
+ checkEvents = function() {
576
+ var now;
577
+ if (rfb_state === 'normal' && !viewportDragging) {
578
+ if (! flushClient()) {
579
+ now = new Date().getTime();
580
+ if (now > last_req_time + conf.fbu_req_rate) {
581
+ last_req_time = now;
582
+ ws.send(fbUpdateRequests());
583
+ }
584
+ }
585
+ }
586
+ setTimeout(checkEvents, conf.check_rate);
587
+ };
588
+
589
+ keyPress = function(keysym, down) {
590
+ var arr;
591
+
592
+ if (conf.view_only) { return; } // View only, skip keyboard events
593
+
594
+ arr = keyEvent(keysym, down);
595
+ arr = arr.concat(fbUpdateRequests());
596
+ ws.send(arr);
597
+ };
598
+
599
+ mouseButton = function(x, y, down, bmask) {
600
+ if (down) {
601
+ mouse_buttonMask |= bmask;
602
+ } else {
603
+ mouse_buttonMask ^= bmask;
604
+ }
605
+
606
+ if (conf.viewportDrag) {
607
+ if (down && !viewportDragging) {
608
+ viewportDragging = true;
609
+ viewportDragPos = {'x': x, 'y': y};
610
+
611
+ // Skip sending mouse events
612
+ return;
613
+ } else {
614
+ viewportDragging = false;
615
+ ws.send(fbUpdateRequests()); // Force immediate redraw
616
+ }
617
+ }
618
+
619
+ if (conf.view_only) { return; } // View only, skip mouse events
620
+
621
+ mouse_arr = mouse_arr.concat(
622
+ pointerEvent(display.absX(x), display.absY(y)) );
623
+ flushClient();
624
+ };
625
+
626
+ mouseMove = function(x, y) {
627
+ //Util.Debug('>> mouseMove ' + x + "," + y);
628
+ var deltaX, deltaY;
629
+
630
+ if (viewportDragging) {
631
+ //deltaX = x - viewportDragPos.x; // drag viewport
632
+ deltaX = viewportDragPos.x - x; // drag frame buffer
633
+ //deltaY = y - viewportDragPos.y; // drag viewport
634
+ deltaY = viewportDragPos.y - y; // drag frame buffer
635
+ viewportDragPos = {'x': x, 'y': y};
636
+
637
+ display.viewportChange(deltaX, deltaY);
638
+
639
+ // Skip sending mouse events
640
+ return;
641
+ }
642
+
643
+ if (conf.view_only) { return; } // View only, skip mouse events
644
+
645
+ mouse_arr = mouse_arr.concat(
646
+ pointerEvent(display.absX(x), display.absY(y)) );
647
+ };
648
+
649
+
650
+ //
651
+ // Server message handlers
652
+ //
653
+
654
+ // RFB/VNC initialisation message handler
655
+ init_msg = function() {
656
+ //Util.Debug(">> init_msg [rfb_state '" + rfb_state + "']");
657
+
658
+ var strlen, reason, length, sversion, cversion,
659
+ i, types, num_types, challenge, response, bpp, depth,
660
+ big_endian, red_max, green_max, blue_max, red_shift,
661
+ green_shift, blue_shift, true_color, name_length;
662
+
663
+ //Util.Debug("ws.rQ (" + ws.rQlen() + ") " + ws.rQslice(0));
664
+ switch (rfb_state) {
665
+
666
+ case 'ProtocolVersion' :
667
+ if (ws.rQlen() < 12) {
668
+ return fail("Incomplete protocol version");
669
+ }
670
+ sversion = ws.rQshiftStr(12).substr(4,7);
671
+ Util.Info("Server ProtocolVersion: " + sversion);
672
+ switch (sversion) {
673
+ case "003.003": rfb_version = 3.3; break;
674
+ case "003.006": rfb_version = 3.3; break; // UltraVNC
675
+ case "003.007": rfb_version = 3.7; break;
676
+ case "003.008": rfb_version = 3.8; break;
677
+ case "004.000": rfb_version = 3.8; break; // Intel AMT KVM
678
+ default:
679
+ return fail("Invalid server version " + sversion);
680
+ }
681
+ if (rfb_version > rfb_max_version) {
682
+ rfb_version = rfb_max_version;
683
+ }
684
+
685
+ if (! test_mode) {
686
+ sendTimer = setInterval(function() {
687
+ // Send updates either at a rate of one update
688
+ // every 50ms, or whatever slower rate the network
689
+ // can handle.
690
+ ws.flush();
691
+ }, 50);
692
+ }
693
+
694
+ cversion = "00" + parseInt(rfb_version,10) +
695
+ ".00" + ((rfb_version * 10) % 10);
696
+ ws.send_string("RFB " + cversion + "\n");
697
+ updateState('Security', "Sent ProtocolVersion: " + cversion);
698
+ break;
699
+
700
+ case 'Security' :
701
+ if (rfb_version >= 3.7) {
702
+ // Server sends supported list, client decides
703
+ num_types = ws.rQshift8();
704
+ if (ws.rQwait("security type", num_types, 1)) { return false; }
705
+ if (num_types === 0) {
706
+ strlen = ws.rQshift32();
707
+ reason = ws.rQshiftStr(strlen);
708
+ return fail("Security failure: " + reason);
709
+ }
710
+ rfb_auth_scheme = 0;
711
+ types = ws.rQshiftBytes(num_types);
712
+ Util.Debug("Server security types: " + types);
713
+ for (i=0; i < types.length; i+=1) {
714
+ if ((types[i] > rfb_auth_scheme) && (types[i] < 3)) {
715
+ rfb_auth_scheme = types[i];
716
+ }
717
+ }
718
+ if (rfb_auth_scheme === 0) {
719
+ return fail("Unsupported security types: " + types);
720
+ }
721
+
722
+ ws.send([rfb_auth_scheme]);
723
+ } else {
724
+ // Server decides
725
+ if (ws.rQwait("security scheme", 4)) { return false; }
726
+ rfb_auth_scheme = ws.rQshift32();
727
+ }
728
+ updateState('Authentication',
729
+ "Authenticating using scheme: " + rfb_auth_scheme);
730
+ init_msg(); // Recursive fallthrough (workaround JSLint complaint)
731
+ break;
732
+
733
+ // Triggered by fallthough, not by server message
734
+ case 'Authentication' :
735
+ //Util.Debug("Security auth scheme: " + rfb_auth_scheme);
736
+ switch (rfb_auth_scheme) {
737
+ case 0: // connection failed
738
+ if (ws.rQwait("auth reason", 4)) { return false; }
739
+ strlen = ws.rQshift32();
740
+ reason = ws.rQshiftStr(strlen);
741
+ return fail("Auth failure: " + reason);
742
+ case 1: // no authentication
743
+ if (rfb_version >= 3.8) {
744
+ updateState('SecurityResult');
745
+ return;
746
+ }
747
+ // Fall through to ClientInitialisation
748
+ break;
749
+ case 2: // VNC authentication
750
+ if (rfb_password.length === 0) {
751
+ // Notify via both callbacks since it is kind of
752
+ // a RFB state change and a UI interface issue.
753
+ updateState('password', "Password Required");
754
+ conf.onPasswordRequired(that);
755
+ return;
756
+ }
757
+ if (ws.rQwait("auth challenge", 16)) { return false; }
758
+ challenge = ws.rQshiftBytes(16);
759
+ //Util.Debug("Password: " + rfb_password);
760
+ //Util.Debug("Challenge: " + challenge +
761
+ // " (" + challenge.length + ")");
762
+ response = genDES(rfb_password, challenge);
763
+ //Util.Debug("Response: " + response +
764
+ // " (" + response.length + ")");
765
+
766
+ //Util.Debug("Sending DES encrypted auth response");
767
+ ws.send(response);
768
+ updateState('SecurityResult');
769
+ return;
770
+ default:
771
+ fail("Unsupported auth scheme: " + rfb_auth_scheme);
772
+ return;
773
+ }
774
+ updateState('ClientInitialisation', "No auth required");
775
+ init_msg(); // Recursive fallthrough (workaround JSLint complaint)
776
+ break;
777
+
778
+ case 'SecurityResult' :
779
+ if (ws.rQwait("VNC auth response ", 4)) { return false; }
780
+ switch (ws.rQshift32()) {
781
+ case 0: // OK
782
+ // Fall through to ClientInitialisation
783
+ break;
784
+ case 1: // failed
785
+ if (rfb_version >= 3.8) {
786
+ length = ws.rQshift32();
787
+ if (ws.rQwait("SecurityResult reason", length, 8)) {
788
+ return false;
789
+ }
790
+ reason = ws.rQshiftStr(length);
791
+ fail(reason);
792
+ } else {
793
+ fail("Authentication failed");
794
+ }
795
+ return;
796
+ case 2: // too-many
797
+ return fail("Too many auth attempts");
798
+ }
799
+ updateState('ClientInitialisation', "Authentication OK");
800
+ init_msg(); // Recursive fallthrough (workaround JSLint complaint)
801
+ break;
802
+
803
+ // Triggered by fallthough, not by server message
804
+ case 'ClientInitialisation' :
805
+ ws.send([conf.shared ? 1 : 0]); // ClientInitialisation
806
+ updateState('ServerInitialisation', "Authentication OK");
807
+ break;
808
+
809
+ case 'ServerInitialisation' :
810
+ if (ws.rQwait("server initialization", 24)) { return false; }
811
+
812
+ /* Screen size */
813
+ fb_width = ws.rQshift16();
814
+ fb_height = ws.rQshift16();
815
+
816
+ /* PIXEL_FORMAT */
817
+ bpp = ws.rQshift8();
818
+ depth = ws.rQshift8();
819
+ big_endian = ws.rQshift8();
820
+ true_color = ws.rQshift8();
821
+
822
+ red_max = ws.rQshift16();
823
+ green_max = ws.rQshift16();
824
+ blue_max = ws.rQshift16();
825
+ red_shift = ws.rQshift8();
826
+ green_shift = ws.rQshift8();
827
+ blue_shift = ws.rQshift8();
828
+ ws.rQshiftStr(3); // padding
829
+
830
+ Util.Info("Screen: " + fb_width + "x" + fb_height +
831
+ ", bpp: " + bpp + ", depth: " + depth +
832
+ ", big_endian: " + big_endian +
833
+ ", true_color: " + true_color +
834
+ ", red_max: " + red_max +
835
+ ", green_max: " + green_max +
836
+ ", blue_max: " + blue_max +
837
+ ", red_shift: " + red_shift +
838
+ ", green_shift: " + green_shift +
839
+ ", blue_shift: " + blue_shift);
840
+
841
+ if (big_endian !== 0) {
842
+ Util.Warn("Server native endian is not little endian");
843
+ }
844
+ if (red_shift !== 16) {
845
+ Util.Warn("Server native red-shift is not 16");
846
+ }
847
+ if (blue_shift !== 0) {
848
+ Util.Warn("Server native blue-shift is not 0");
849
+ }
850
+
851
+ /* Connection name/title */
852
+ name_length = ws.rQshift32();
853
+ fb_name = ws.rQshiftStr(name_length);
854
+
855
+ if (conf.true_color && fb_name === "Intel(r) AMT KVM")
856
+ {
857
+ Util.Warn("Intel AMT KVM only support 8/16 bit depths. Disabling true color");
858
+ conf.true_color = false;
859
+ }
860
+
861
+ display.set_true_color(conf.true_color);
862
+ display.resize(fb_width, fb_height);
863
+ keyboard.grab();
864
+ mouse.grab();
865
+
866
+ if (conf.true_color) {
867
+ fb_Bpp = 4;
868
+ fb_depth = 3;
869
+ } else {
870
+ fb_Bpp = 1;
871
+ fb_depth = 1;
872
+ }
873
+
874
+ response = pixelFormat();
875
+ response = response.concat(clientEncodings());
876
+ response = response.concat(fbUpdateRequests());
877
+ timing.fbu_rt_start = (new Date()).getTime();
878
+ ws.send(response);
879
+
880
+ /* Start pushing/polling */
881
+ setTimeout(checkEvents, conf.check_rate);
882
+ setTimeout(scan_tight_imgQ, scan_imgQ_rate);
883
+
884
+ if (conf.encrypt) {
885
+ updateState('normal', "Connected (encrypted) to: " + fb_name);
886
+ } else {
887
+ updateState('normal', "Connected (unencrypted) to: " + fb_name);
888
+ }
889
+ break;
890
+ }
891
+ //Util.Debug("<< init_msg");
892
+ };
893
+
894
+
895
+ /* Normal RFB/VNC server message handler */
896
+ normal_msg = function() {
897
+ //Util.Debug(">> normal_msg");
898
+
899
+ var ret = true, msg_type, length, text,
900
+ c, first_colour, num_colours, red, green, blue;
901
+
902
+ if (FBU.rects > 0) {
903
+ msg_type = 0;
904
+ } else {
905
+ msg_type = ws.rQshift8();
906
+ }
907
+ switch (msg_type) {
908
+ case 0: // FramebufferUpdate
909
+ ret = framebufferUpdate(); // false means need more data
910
+ break;
911
+ case 1: // SetColourMapEntries
912
+ Util.Debug("SetColourMapEntries");
913
+ ws.rQshift8(); // Padding
914
+ first_colour = ws.rQshift16(); // First colour
915
+ num_colours = ws.rQshift16();
916
+ if (ws.rQwait("SetColourMapEntries", num_colours*6, 6)) { return false; }
917
+
918
+ for (c=0; c < num_colours; c+=1) {
919
+ red = ws.rQshift16();
920
+ //Util.Debug("red before: " + red);
921
+ red = parseInt(red / 256, 10);
922
+ //Util.Debug("red after: " + red);
923
+ green = parseInt(ws.rQshift16() / 256, 10);
924
+ blue = parseInt(ws.rQshift16() / 256, 10);
925
+ display.set_colourMap([blue, green, red], first_colour + c);
926
+ }
927
+ Util.Debug("colourMap: " + display.get_colourMap());
928
+ Util.Info("Registered " + num_colours + " colourMap entries");
929
+ //Util.Debug("colourMap: " + display.get_colourMap());
930
+ break;
931
+ case 2: // Bell
932
+ Util.Debug("Bell");
933
+ conf.onBell(that);
934
+ break;
935
+ case 3: // ServerCutText
936
+ Util.Debug("ServerCutText");
937
+ if (ws.rQwait("ServerCutText header", 7, 1)) { return false; }
938
+ ws.rQshiftBytes(3); // Padding
939
+ length = ws.rQshift32();
940
+ if (ws.rQwait("ServerCutText", length, 8)) { return false; }
941
+
942
+ text = ws.rQshiftStr(length);
943
+ conf.clipboardReceive(that, text); // Obsolete
944
+ conf.onClipboard(that, text);
945
+ break;
946
+ default:
947
+ fail("Disconnected: illegal server message type " + msg_type);
948
+ Util.Debug("ws.rQslice(0,30):" + ws.rQslice(0,30));
949
+ break;
950
+ }
951
+ //Util.Debug("<< normal_msg");
952
+ return ret;
953
+ };
954
+
955
+ framebufferUpdate = function() {
956
+ var now, hdr, fbu_rt_diff, ret = true;
957
+
958
+ if (FBU.rects === 0) {
959
+ //Util.Debug("New FBU: ws.rQslice(0,20): " + ws.rQslice(0,20));
960
+ if (ws.rQwait("FBU header", 3)) {
961
+ ws.rQunshift8(0); // FBU msg_type
962
+ return false;
963
+ }
964
+ ws.rQshift8(); // padding
965
+ FBU.rects = ws.rQshift16();
966
+ //Util.Debug("FramebufferUpdate, rects:" + FBU.rects);
967
+ FBU.bytes = 0;
968
+ timing.cur_fbu = 0;
969
+ if (timing.fbu_rt_start > 0) {
970
+ now = (new Date()).getTime();
971
+ Util.Info("First FBU latency: " + (now - timing.fbu_rt_start));
972
+ }
973
+ }
974
+
975
+ while (FBU.rects > 0) {
976
+ if (rfb_state !== "normal") {
977
+ return false;
978
+ }
979
+ if (ws.rQwait("FBU", FBU.bytes)) { return false; }
980
+ if (FBU.bytes === 0) {
981
+ if (ws.rQwait("rect header", 12)) { return false; }
982
+ /* New FramebufferUpdate */
983
+
984
+ hdr = ws.rQshiftBytes(12);
985
+ FBU.x = (hdr[0] << 8) + hdr[1];
986
+ FBU.y = (hdr[2] << 8) + hdr[3];
987
+ FBU.width = (hdr[4] << 8) + hdr[5];
988
+ FBU.height = (hdr[6] << 8) + hdr[7];
989
+ FBU.encoding = parseInt((hdr[8] << 24) + (hdr[9] << 16) +
990
+ (hdr[10] << 8) + hdr[11], 10);
991
+
992
+ conf.onFBUReceive(that,
993
+ {'x': FBU.x, 'y': FBU.y,
994
+ 'width': FBU.width, 'height': FBU.height,
995
+ 'encoding': FBU.encoding,
996
+ 'encodingName': encNames[FBU.encoding]});
997
+
998
+ if (encNames[FBU.encoding]) {
999
+ // Debug:
1000
+ /*
1001
+ var msg = "FramebufferUpdate rects:" + FBU.rects;
1002
+ msg += " x: " + FBU.x + " y: " + FBU.y;
1003
+ msg += " width: " + FBU.width + " height: " + FBU.height;
1004
+ msg += " encoding:" + FBU.encoding;
1005
+ msg += "(" + encNames[FBU.encoding] + ")";
1006
+ msg += ", ws.rQlen(): " + ws.rQlen();
1007
+ Util.Debug(msg);
1008
+ */
1009
+ } else {
1010
+ fail("Disconnected: unsupported encoding " +
1011
+ FBU.encoding);
1012
+ return false;
1013
+ }
1014
+ }
1015
+
1016
+ timing.last_fbu = (new Date()).getTime();
1017
+
1018
+ ret = encHandlers[FBU.encoding]();
1019
+
1020
+ now = (new Date()).getTime();
1021
+ timing.cur_fbu += (now - timing.last_fbu);
1022
+
1023
+ if (ret) {
1024
+ encStats[FBU.encoding][0] += 1;
1025
+ encStats[FBU.encoding][1] += 1;
1026
+ timing.pixels += FBU.width * FBU.height;
1027
+ }
1028
+
1029
+ if (FBU.rects === 0 || (timing.pixels >= (fb_width * fb_height))) {
1030
+ if (((FBU.width === fb_width) &&
1031
+ (FBU.height === fb_height)) ||
1032
+ (timing.fbu_rt_start > 0)) {
1033
+ timing.full_fbu_total += timing.cur_fbu;
1034
+ timing.full_fbu_cnt += 1;
1035
+ Util.Info("Timing of full FBU, cur: " +
1036
+ timing.cur_fbu + ", total: " +
1037
+ timing.full_fbu_total + ", cnt: " +
1038
+ timing.full_fbu_cnt + ", avg: " +
1039
+ (timing.full_fbu_total /
1040
+ timing.full_fbu_cnt));
1041
+ }
1042
+ if (timing.fbu_rt_start > 0) {
1043
+ fbu_rt_diff = now - timing.fbu_rt_start;
1044
+ timing.fbu_rt_total += fbu_rt_diff;
1045
+ timing.fbu_rt_cnt += 1;
1046
+ Util.Info("full FBU round-trip, cur: " +
1047
+ fbu_rt_diff + ", total: " +
1048
+ timing.fbu_rt_total + ", cnt: " +
1049
+ timing.fbu_rt_cnt + ", avg: " +
1050
+ (timing.fbu_rt_total /
1051
+ timing.fbu_rt_cnt));
1052
+ timing.fbu_rt_start = 0;
1053
+ }
1054
+ }
1055
+ if (! ret) {
1056
+ return ret; // false ret means need more data
1057
+ }
1058
+ }
1059
+
1060
+ conf.onFBUComplete(that,
1061
+ {'x': FBU.x, 'y': FBU.y,
1062
+ 'width': FBU.width, 'height': FBU.height,
1063
+ 'encoding': FBU.encoding,
1064
+ 'encodingName': encNames[FBU.encoding]});
1065
+
1066
+ return true; // We finished this FBU
1067
+ };
1068
+
1069
+ //
1070
+ // FramebufferUpdate encodings
1071
+ //
1072
+
1073
+ encHandlers.RAW = function display_raw() {
1074
+ //Util.Debug(">> display_raw (" + ws.rQlen() + " bytes)");
1075
+
1076
+ var cur_y, cur_height;
1077
+
1078
+ if (FBU.lines === 0) {
1079
+ FBU.lines = FBU.height;
1080
+ }
1081
+ FBU.bytes = FBU.width * fb_Bpp; // At least a line
1082
+ if (ws.rQwait("RAW", FBU.bytes)) { return false; }
1083
+ cur_y = FBU.y + (FBU.height - FBU.lines);
1084
+ cur_height = Math.min(FBU.lines,
1085
+ Math.floor(ws.rQlen()/(FBU.width * fb_Bpp)));
1086
+ display.blitImage(FBU.x, cur_y, FBU.width, cur_height,
1087
+ ws.get_rQ(), ws.get_rQi());
1088
+ ws.rQshiftBytes(FBU.width * cur_height * fb_Bpp);
1089
+ FBU.lines -= cur_height;
1090
+
1091
+ if (FBU.lines > 0) {
1092
+ FBU.bytes = FBU.width * fb_Bpp; // At least another line
1093
+ } else {
1094
+ FBU.rects -= 1;
1095
+ FBU.bytes = 0;
1096
+ }
1097
+ //Util.Debug("<< display_raw (" + ws.rQlen() + " bytes)");
1098
+ return true;
1099
+ };
1100
+
1101
+ encHandlers.COPYRECT = function display_copy_rect() {
1102
+ //Util.Debug(">> display_copy_rect");
1103
+
1104
+ var old_x, old_y;
1105
+
1106
+ if (ws.rQwait("COPYRECT", 4)) { return false; }
1107
+ old_x = ws.rQshift16();
1108
+ old_y = ws.rQshift16();
1109
+ display.copyImage(old_x, old_y, FBU.x, FBU.y, FBU.width, FBU.height);
1110
+ FBU.rects -= 1;
1111
+ FBU.bytes = 0;
1112
+ return true;
1113
+ };
1114
+
1115
+ encHandlers.RRE = function display_rre() {
1116
+ //Util.Debug(">> display_rre (" + ws.rQlen() + " bytes)");
1117
+ var color, x, y, width, height, chunk;
1118
+
1119
+ if (FBU.subrects === 0) {
1120
+ if (ws.rQwait("RRE", 4+fb_Bpp)) { return false; }
1121
+ FBU.subrects = ws.rQshift32();
1122
+ color = ws.rQshiftBytes(fb_Bpp); // Background
1123
+ display.fillRect(FBU.x, FBU.y, FBU.width, FBU.height, color);
1124
+ }
1125
+ while ((FBU.subrects > 0) && (ws.rQlen() >= (fb_Bpp + 8))) {
1126
+ color = ws.rQshiftBytes(fb_Bpp);
1127
+ x = ws.rQshift16();
1128
+ y = ws.rQshift16();
1129
+ width = ws.rQshift16();
1130
+ height = ws.rQshift16();
1131
+ display.fillRect(FBU.x + x, FBU.y + y, width, height, color);
1132
+ FBU.subrects -= 1;
1133
+ }
1134
+ //Util.Debug(" display_rre: rects: " + FBU.rects +
1135
+ // ", FBU.subrects: " + FBU.subrects);
1136
+
1137
+ if (FBU.subrects > 0) {
1138
+ chunk = Math.min(rre_chunk_sz, FBU.subrects);
1139
+ FBU.bytes = (fb_Bpp + 8) * chunk;
1140
+ } else {
1141
+ FBU.rects -= 1;
1142
+ FBU.bytes = 0;
1143
+ }
1144
+ //Util.Debug("<< display_rre, FBU.bytes: " + FBU.bytes);
1145
+ return true;
1146
+ };
1147
+
1148
+ encHandlers.HEXTILE = function display_hextile() {
1149
+ //Util.Debug(">> display_hextile");
1150
+ var subencoding, subrects, color, cur_tile,
1151
+ tile_x, x, w, tile_y, y, h, xy, s, sx, sy, wh, sw, sh,
1152
+ rQ = ws.get_rQ(), rQi = ws.get_rQi();
1153
+
1154
+ if (FBU.tiles === 0) {
1155
+ FBU.tiles_x = Math.ceil(FBU.width/16);
1156
+ FBU.tiles_y = Math.ceil(FBU.height/16);
1157
+ FBU.total_tiles = FBU.tiles_x * FBU.tiles_y;
1158
+ FBU.tiles = FBU.total_tiles;
1159
+ }
1160
+
1161
+ /* FBU.bytes comes in as 1, ws.rQlen() at least 1 */
1162
+ while (FBU.tiles > 0) {
1163
+ FBU.bytes = 1;
1164
+ if (ws.rQwait("HEXTILE subencoding", FBU.bytes)) { return false; }
1165
+ subencoding = rQ[rQi]; // Peek
1166
+ if (subencoding > 30) { // Raw
1167
+ fail("Disconnected: illegal hextile subencoding " + subencoding);
1168
+ //Util.Debug("ws.rQslice(0,30):" + ws.rQslice(0,30));
1169
+ return false;
1170
+ }
1171
+ subrects = 0;
1172
+ cur_tile = FBU.total_tiles - FBU.tiles;
1173
+ tile_x = cur_tile % FBU.tiles_x;
1174
+ tile_y = Math.floor(cur_tile / FBU.tiles_x);
1175
+ x = FBU.x + tile_x * 16;
1176
+ y = FBU.y + tile_y * 16;
1177
+ w = Math.min(16, (FBU.x + FBU.width) - x);
1178
+ h = Math.min(16, (FBU.y + FBU.height) - y);
1179
+
1180
+ /* Figure out how much we are expecting */
1181
+ if (subencoding & 0x01) { // Raw
1182
+ //Util.Debug(" Raw subencoding");
1183
+ FBU.bytes += w * h * fb_Bpp;
1184
+ } else {
1185
+ if (subencoding & 0x02) { // Background
1186
+ FBU.bytes += fb_Bpp;
1187
+ }
1188
+ if (subencoding & 0x04) { // Foreground
1189
+ FBU.bytes += fb_Bpp;
1190
+ }
1191
+ if (subencoding & 0x08) { // AnySubrects
1192
+ FBU.bytes += 1; // Since we aren't shifting it off
1193
+ if (ws.rQwait("hextile subrects header", FBU.bytes)) { return false; }
1194
+ subrects = rQ[rQi + FBU.bytes-1]; // Peek
1195
+ if (subencoding & 0x10) { // SubrectsColoured
1196
+ FBU.bytes += subrects * (fb_Bpp + 2);
1197
+ } else {
1198
+ FBU.bytes += subrects * 2;
1199
+ }
1200
+ }
1201
+ }
1202
+
1203
+ /*
1204
+ Util.Debug(" tile:" + cur_tile + "/" + (FBU.total_tiles - 1) +
1205
+ " (" + tile_x + "," + tile_y + ")" +
1206
+ " [" + x + "," + y + "]@" + w + "x" + h +
1207
+ ", subenc:" + subencoding +
1208
+ "(last: " + FBU.lastsubencoding + "), subrects:" +
1209
+ subrects +
1210
+ ", ws.rQlen():" + ws.rQlen() + ", FBU.bytes:" + FBU.bytes +
1211
+ " last:" + ws.rQslice(FBU.bytes-10, FBU.bytes) +
1212
+ " next:" + ws.rQslice(FBU.bytes-1, FBU.bytes+10));
1213
+ */
1214
+ if (ws.rQwait("hextile", FBU.bytes)) { return false; }
1215
+
1216
+ /* We know the encoding and have a whole tile */
1217
+ FBU.subencoding = rQ[rQi];
1218
+ rQi += 1;
1219
+ if (FBU.subencoding === 0) {
1220
+ if (FBU.lastsubencoding & 0x01) {
1221
+ /* Weird: ignore blanks after RAW */
1222
+ Util.Debug(" Ignoring blank after RAW");
1223
+ } else {
1224
+ display.fillRect(x, y, w, h, FBU.background);
1225
+ }
1226
+ } else if (FBU.subencoding & 0x01) { // Raw
1227
+ display.blitImage(x, y, w, h, rQ, rQi);
1228
+ rQi += FBU.bytes - 1;
1229
+ } else {
1230
+ if (FBU.subencoding & 0x02) { // Background
1231
+ FBU.background = rQ.slice(rQi, rQi + fb_Bpp);
1232
+ rQi += fb_Bpp;
1233
+ }
1234
+ if (FBU.subencoding & 0x04) { // Foreground
1235
+ FBU.foreground = rQ.slice(rQi, rQi + fb_Bpp);
1236
+ rQi += fb_Bpp;
1237
+ }
1238
+
1239
+ display.startTile(x, y, w, h, FBU.background);
1240
+ if (FBU.subencoding & 0x08) { // AnySubrects
1241
+ subrects = rQ[rQi];
1242
+ rQi += 1;
1243
+ for (s = 0; s < subrects; s += 1) {
1244
+ if (FBU.subencoding & 0x10) { // SubrectsColoured
1245
+ color = rQ.slice(rQi, rQi + fb_Bpp);
1246
+ rQi += fb_Bpp;
1247
+ } else {
1248
+ color = FBU.foreground;
1249
+ }
1250
+ xy = rQ[rQi];
1251
+ rQi += 1;
1252
+ sx = (xy >> 4);
1253
+ sy = (xy & 0x0f);
1254
+
1255
+ wh = rQ[rQi];
1256
+ rQi += 1;
1257
+ sw = (wh >> 4) + 1;
1258
+ sh = (wh & 0x0f) + 1;
1259
+
1260
+ display.subTile(sx, sy, sw, sh, color);
1261
+ }
1262
+ }
1263
+ display.finishTile();
1264
+ }
1265
+ ws.set_rQi(rQi);
1266
+ FBU.lastsubencoding = FBU.subencoding;
1267
+ FBU.bytes = 0;
1268
+ FBU.tiles -= 1;
1269
+ }
1270
+
1271
+ if (FBU.tiles === 0) {
1272
+ FBU.rects -= 1;
1273
+ }
1274
+
1275
+ //Util.Debug("<< display_hextile");
1276
+ return true;
1277
+ };
1278
+
1279
+
1280
+ // Get 'compact length' header and data size
1281
+ getTightCLength = function (arr) {
1282
+ var header = 1, data = 0;
1283
+ data += arr[0] & 0x7f;
1284
+ if (arr[0] & 0x80) {
1285
+ header += 1;
1286
+ data += (arr[1] & 0x7f) << 7;
1287
+ if (arr[1] & 0x80) {
1288
+ header += 1;
1289
+ data += arr[2] << 14;
1290
+ }
1291
+ }
1292
+ return [header, data];
1293
+ };
1294
+
1295
+ function display_tight(isTightPNG) {
1296
+ //Util.Debug(">> display_tight");
1297
+
1298
+ if (fb_depth === 1) {
1299
+ fail("Tight protocol handler only implements true color mode");
1300
+ }
1301
+
1302
+ var ctl, cmode, clength, color, img, data;
1303
+ var filterId = -1, resetStreams = 0, streamId = -1;
1304
+ var rQ = ws.get_rQ(), rQi = ws.get_rQi();
1305
+
1306
+ FBU.bytes = 1; // compression-control byte
1307
+ if (ws.rQwait("TIGHT compression-control", FBU.bytes)) { return false; }
1308
+
1309
+ var checksum = function(data) {
1310
+ var sum=0, i;
1311
+ for (i=0; i<data.length;i++) {
1312
+ sum += data[i];
1313
+ if (sum > 65536) sum -= 65536;
1314
+ }
1315
+ return sum;
1316
+ }
1317
+
1318
+ var decompress = function(data) {
1319
+ for (var i=0; i<4; i++) {
1320
+ if ((resetStreams >> i) & 1) {
1321
+ FBU.zlibs[i].reset();
1322
+ Util.Info("Reset zlib stream " + i);
1323
+ }
1324
+ }
1325
+ var uncompressed = FBU.zlibs[streamId].uncompress(data, 0);
1326
+ if (uncompressed.status !== 0) {
1327
+ Util.Error("Invalid data in zlib stream");
1328
+ }
1329
+ //Util.Warn("Decompressed " + data.length + " to " +
1330
+ // uncompressed.data.length + " checksums " +
1331
+ // checksum(data) + ":" + checksum(uncompressed.data));
1332
+
1333
+ return uncompressed.data;
1334
+ }
1335
+
1336
+ var handlePalette = function() {
1337
+ var numColors = rQ[rQi + 2] + 1;
1338
+ var paletteSize = numColors * fb_depth;
1339
+ FBU.bytes += paletteSize;
1340
+ if (ws.rQwait("TIGHT palette " + cmode, FBU.bytes)) { return false; }
1341
+
1342
+ var bpp = (numColors <= 2) ? 1 : 8;
1343
+ var rowSize = Math.floor((FBU.width * bpp + 7) / 8);
1344
+ var raw = false;
1345
+ if (rowSize * FBU.height < 12) {
1346
+ raw = true;
1347
+ clength = [0, rowSize * FBU.height];
1348
+ } else {
1349
+ clength = getTightCLength(ws.rQslice(3 + paletteSize,
1350
+ 3 + paletteSize + 3));
1351
+ }
1352
+ FBU.bytes += clength[0] + clength[1];
1353
+ if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
1354
+
1355
+ // Shift ctl, filter id, num colors, palette entries, and clength off
1356
+ ws.rQshiftBytes(3);
1357
+ var palette = ws.rQshiftBytes(paletteSize);
1358
+ ws.rQshiftBytes(clength[0]);
1359
+
1360
+ if (raw) {
1361
+ data = ws.rQshiftBytes(clength[1]);
1362
+ } else {
1363
+ data = decompress(ws.rQshiftBytes(clength[1]));
1364
+ }
1365
+
1366
+ // Convert indexed (palette based) image data to RGB
1367
+ // TODO: reduce number of calculations inside loop
1368
+ var dest = [];
1369
+ var x, y, b, w, w1, dp, sp;
1370
+ if (numColors === 2) {
1371
+ w = Math.floor((FBU.width + 7) / 8);
1372
+ w1 = Math.floor(FBU.width / 8);
1373
+ for (y = 0; y < FBU.height; y++) {
1374
+ for (x = 0; x < w1; x++) {
1375
+ for (b = 7; b >= 0; b--) {
1376
+ dp = (y*FBU.width + x*8 + 7-b) * 3;
1377
+ sp = (data[y*w + x] >> b & 1) * 3;
1378
+ dest[dp ] = palette[sp ];
1379
+ dest[dp+1] = palette[sp+1];
1380
+ dest[dp+2] = palette[sp+2];
1381
+ }
1382
+ }
1383
+ for (b = 7; b >= 8 - FBU.width % 8; b--) {
1384
+ dp = (y*FBU.width + x*8 + 7-b) * 3;
1385
+ sp = (data[y*w + x] >> b & 1) * 3;
1386
+ dest[dp ] = palette[sp ];
1387
+ dest[dp+1] = palette[sp+1];
1388
+ dest[dp+2] = palette[sp+2];
1389
+ }
1390
+ }
1391
+ } else {
1392
+ for (y = 0; y < FBU.height; y++) {
1393
+ for (x = 0; x < FBU.width; x++) {
1394
+ dp = (y*FBU.width + x) * 3;
1395
+ sp = data[y*FBU.width + x] * 3;
1396
+ dest[dp ] = palette[sp ];
1397
+ dest[dp+1] = palette[sp+1];
1398
+ dest[dp+2] = palette[sp+2];
1399
+ }
1400
+ }
1401
+ }
1402
+
1403
+ FBU.imgQ.push({
1404
+ 'type': 'rgb',
1405
+ 'img': {'complete': true, 'data': dest},
1406
+ 'x': FBU.x,
1407
+ 'y': FBU.y,
1408
+ 'width': FBU.width,
1409
+ 'height': FBU.height});
1410
+ return true;
1411
+ }
1412
+
1413
+ var handleCopy = function() {
1414
+ var raw = false;
1415
+ var uncompressedSize = FBU.width * FBU.height * fb_depth;
1416
+ if (uncompressedSize < 12) {
1417
+ raw = true;
1418
+ clength = [0, uncompressedSize];
1419
+ } else {
1420
+ clength = getTightCLength(ws.rQslice(1, 4));
1421
+ }
1422
+ FBU.bytes = 1 + clength[0] + clength[1];
1423
+ if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
1424
+
1425
+ // Shift ctl, clength off
1426
+ ws.rQshiftBytes(1 + clength[0]);
1427
+
1428
+ if (raw) {
1429
+ data = ws.rQshiftBytes(clength[1]);
1430
+ } else {
1431
+ data = decompress(ws.rQshiftBytes(clength[1]));
1432
+ }
1433
+
1434
+ FBU.imgQ.push({
1435
+ 'type': 'rgb',
1436
+ 'img': {'complete': true, 'data': data},
1437
+ 'x': FBU.x,
1438
+ 'y': FBU.y,
1439
+ 'width': FBU.width,
1440
+ 'height': FBU.height});
1441
+ return true;
1442
+ }
1443
+
1444
+ ctl = ws.rQpeek8();
1445
+
1446
+ // Keep tight reset bits
1447
+ resetStreams = ctl & 0xF;
1448
+
1449
+ // Figure out filter
1450
+ ctl = ctl >> 4;
1451
+ streamId = ctl & 0x3;
1452
+
1453
+ if (ctl === 0x08) cmode = "fill";
1454
+ else if (ctl === 0x09) cmode = "jpeg";
1455
+ else if (ctl === 0x0A) cmode = "png";
1456
+ else if (ctl & 0x04) cmode = "filter";
1457
+ else if (ctl < 0x04) cmode = "copy";
1458
+ else throw("Illegal tight compression received, ctl: " + ctl);
1459
+
1460
+ if (isTightPNG && (cmode === "filter" || cmode === "copy")) {
1461
+ throw("filter/copy received in tightPNG mode");
1462
+ }
1463
+
1464
+ switch (cmode) {
1465
+ // fill uses fb_depth because TPIXELs drop the padding byte
1466
+ case "fill": FBU.bytes += fb_depth; break; // TPIXEL
1467
+ case "jpeg": FBU.bytes += 3; break; // max clength
1468
+ case "png": FBU.bytes += 3; break; // max clength
1469
+ case "filter": FBU.bytes += 2; break; // filter id + num colors if palette
1470
+ case "copy": break;
1471
+ }
1472
+
1473
+ if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
1474
+
1475
+ //Util.Debug(" ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")");
1476
+ //Util.Debug(" cmode: " + cmode);
1477
+
1478
+ // Determine FBU.bytes
1479
+ switch (cmode) {
1480
+ case "fill":
1481
+ ws.rQshift8(); // shift off ctl
1482
+ color = ws.rQshiftBytes(fb_depth);
1483
+ FBU.imgQ.push({
1484
+ 'type': 'fill',
1485
+ 'img': {'complete': true},
1486
+ 'x': FBU.x,
1487
+ 'y': FBU.y,
1488
+ 'width': FBU.width,
1489
+ 'height': FBU.height,
1490
+ 'color': [color[2], color[1], color[0]] });
1491
+ break;
1492
+ case "png":
1493
+ case "jpeg":
1494
+ clength = getTightCLength(ws.rQslice(1, 4));
1495
+ FBU.bytes = 1 + clength[0] + clength[1]; // ctl + clength size + jpeg-data
1496
+ if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
1497
+
1498
+ // We have everything, render it
1499
+ //Util.Debug(" jpeg, ws.rQlen(): " + ws.rQlen() + ", clength[0]: " +
1500
+ // clength[0] + ", clength[1]: " + clength[1]);
1501
+ ws.rQshiftBytes(1 + clength[0]); // shift off ctl + compact length
1502
+ img = new Image();
1503
+ //img.onload = scan_tight_imgQ;
1504
+ FBU.imgQ.push({
1505
+ 'type': 'img',
1506
+ 'img': img,
1507
+ 'x': FBU.x,
1508
+ 'y': FBU.y});
1509
+ img.src = "data:image/" + cmode +
1510
+ extract_data_uri(ws.rQshiftBytes(clength[1]));
1511
+ img = null;
1512
+ break;
1513
+ case "filter":
1514
+ filterId = rQ[rQi + 1];
1515
+ if (filterId === 1) {
1516
+ if (!handlePalette()) { return false; }
1517
+ } else {
1518
+ // Filter 0, Copy could be valid here, but servers don't send it as an explicit filter
1519
+ // Filter 2, Gradient is valid but not used if jpeg is enabled
1520
+ throw("Unsupported tight subencoding received, filter: " + filterId);
1521
+ }
1522
+ break;
1523
+ case "copy":
1524
+ if (!handleCopy()) { return false; }
1525
+ break;
1526
+ }
1527
+
1528
+ FBU.bytes = 0;
1529
+ FBU.rects -= 1;
1530
+ //Util.Debug(" ending ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")");
1531
+ //Util.Debug("<< display_tight_png");
1532
+ return true;
1533
+ }
1534
+
1535
+ extract_data_uri = function(arr) {
1536
+ //var i, stra = [];
1537
+ //for (i=0; i< arr.length; i += 1) {
1538
+ // stra.push(String.fromCharCode(arr[i]));
1539
+ //}
1540
+ //return "," + escape(stra.join(''));
1541
+ return ";base64," + Base64.encode(arr);
1542
+ };
1543
+
1544
+ scan_tight_imgQ = function() {
1545
+ var data, imgQ, ctx;
1546
+ ctx = display.get_context();
1547
+ if (rfb_state === 'normal') {
1548
+ imgQ = FBU.imgQ;
1549
+ while ((imgQ.length > 0) && (imgQ[0].img.complete)) {
1550
+ data = imgQ.shift();
1551
+ if (data.type === 'fill') {
1552
+ display.fillRect(data.x, data.y, data.width, data.height, data.color);
1553
+ } else if (data.type === 'rgb') {
1554
+ display.blitRgbImage(data.x, data.y, data.width, data.height, data.img.data, 0);
1555
+ } else {
1556
+ ctx.drawImage(data.img, data.x, data.y);
1557
+ }
1558
+ }
1559
+ setTimeout(scan_tight_imgQ, scan_imgQ_rate);
1560
+ }
1561
+ };
1562
+
1563
+ encHandlers.TIGHT = function () { return display_tight(false); };
1564
+ encHandlers.TIGHT_PNG = function () { return display_tight(true); };
1565
+
1566
+ encHandlers.last_rect = function last_rect() {
1567
+ Util.Debug(">> set_desktopsize");
1568
+ FBU.rects = 0;
1569
+ Util.Debug("<< set_desktopsize");
1570
+ return true;
1571
+ };
1572
+
1573
+ encHandlers.DesktopSize = function set_desktopsize() {
1574
+ Util.Debug(">> set_desktopsize");
1575
+ fb_width = FBU.width;
1576
+ fb_height = FBU.height;
1577
+ display.resize(fb_width, fb_height);
1578
+ timing.fbu_rt_start = (new Date()).getTime();
1579
+ // Send a new non-incremental request
1580
+ ws.send(fbUpdateRequests());
1581
+
1582
+ FBU.bytes = 0;
1583
+ FBU.rects -= 1;
1584
+
1585
+ Util.Debug("<< set_desktopsize");
1586
+ return true;
1587
+ };
1588
+
1589
+ encHandlers.Cursor = function set_cursor() {
1590
+ var x, y, w, h, pixelslength, masklength;
1591
+ //Util.Debug(">> set_cursor");
1592
+ x = FBU.x; // hotspot-x
1593
+ y = FBU.y; // hotspot-y
1594
+ w = FBU.width;
1595
+ h = FBU.height;
1596
+
1597
+ pixelslength = w * h * fb_Bpp;
1598
+ masklength = Math.floor((w + 7) / 8) * h;
1599
+
1600
+ FBU.bytes = pixelslength + masklength;
1601
+ if (ws.rQwait("cursor encoding", FBU.bytes)) { return false; }
1602
+
1603
+ //Util.Debug(" set_cursor, x: " + x + ", y: " + y + ", w: " + w + ", h: " + h);
1604
+
1605
+ display.changeCursor(ws.rQshiftBytes(pixelslength),
1606
+ ws.rQshiftBytes(masklength),
1607
+ x, y, w, h);
1608
+
1609
+ FBU.bytes = 0;
1610
+ FBU.rects -= 1;
1611
+
1612
+ //Util.Debug("<< set_cursor");
1613
+ return true;
1614
+ };
1615
+
1616
+ encHandlers.JPEG_quality_lo = function set_jpeg_quality() {
1617
+ Util.Error("Server sent jpeg_quality pseudo-encoding");
1618
+ };
1619
+
1620
+ encHandlers.compress_lo = function set_compress_level() {
1621
+ Util.Error("Server sent compress level pseudo-encoding");
1622
+ };
1623
+
1624
+ /*
1625
+ * Client message routines
1626
+ */
1627
+
1628
+ pixelFormat = function() {
1629
+ //Util.Debug(">> pixelFormat");
1630
+ var arr;
1631
+ arr = [0]; // msg-type
1632
+ arr.push8(0); // padding
1633
+ arr.push8(0); // padding
1634
+ arr.push8(0); // padding
1635
+
1636
+ arr.push8(fb_Bpp * 8); // bits-per-pixel
1637
+ arr.push8(fb_depth * 8); // depth
1638
+ arr.push8(0); // little-endian
1639
+ arr.push8(conf.true_color ? 1 : 0); // true-color
1640
+
1641
+ arr.push16(255); // red-max
1642
+ arr.push16(255); // green-max
1643
+ arr.push16(255); // blue-max
1644
+ arr.push8(16); // red-shift
1645
+ arr.push8(8); // green-shift
1646
+ arr.push8(0); // blue-shift
1647
+
1648
+ arr.push8(0); // padding
1649
+ arr.push8(0); // padding
1650
+ arr.push8(0); // padding
1651
+ //Util.Debug("<< pixelFormat");
1652
+ return arr;
1653
+ };
1654
+
1655
+ clientEncodings = function() {
1656
+ //Util.Debug(">> clientEncodings");
1657
+ var arr, i, encList = [];
1658
+
1659
+ for (i=0; i<encodings.length; i += 1) {
1660
+ if ((encodings[i][0] === "Cursor") &&
1661
+ (! conf.local_cursor)) {
1662
+ Util.Debug("Skipping Cursor pseudo-encoding");
1663
+ } else {
1664
+ //Util.Debug("Adding encoding: " + encodings[i][0]);
1665
+ encList.push(encodings[i][1]);
1666
+ }
1667
+ }
1668
+
1669
+ arr = [2]; // msg-type
1670
+ arr.push8(0); // padding
1671
+
1672
+ arr.push16(encList.length); // encoding count
1673
+ for (i=0; i < encList.length; i += 1) {
1674
+ arr.push32(encList[i]);
1675
+ }
1676
+ //Util.Debug("<< clientEncodings: " + arr);
1677
+ return arr;
1678
+ };
1679
+
1680
+ fbUpdateRequest = function(incremental, x, y, xw, yw) {
1681
+ //Util.Debug(">> fbUpdateRequest");
1682
+ if (typeof(x) === "undefined") { x = 0; }
1683
+ if (typeof(y) === "undefined") { y = 0; }
1684
+ if (typeof(xw) === "undefined") { xw = fb_width; }
1685
+ if (typeof(yw) === "undefined") { yw = fb_height; }
1686
+ var arr;
1687
+ arr = [3]; // msg-type
1688
+ arr.push8(incremental);
1689
+ arr.push16(x);
1690
+ arr.push16(y);
1691
+ arr.push16(xw);
1692
+ arr.push16(yw);
1693
+ //Util.Debug("<< fbUpdateRequest");
1694
+ return arr;
1695
+ };
1696
+
1697
+ // Based on clean/dirty areas, generate requests to send
1698
+ fbUpdateRequests = function() {
1699
+ var cleanDirty = display.getCleanDirtyReset(),
1700
+ arr = [], i, cb, db;
1701
+
1702
+ cb = cleanDirty.cleanBox;
1703
+ if (cb.w > 0 && cb.h > 0) {
1704
+ // Request incremental for clean box
1705
+ arr = arr.concat(fbUpdateRequest(1, cb.x, cb.y, cb.w, cb.h));
1706
+ }
1707
+ for (i = 0; i < cleanDirty.dirtyBoxes.length; i++) {
1708
+ db = cleanDirty.dirtyBoxes[i];
1709
+ // Force all (non-incremental for dirty box
1710
+ arr = arr.concat(fbUpdateRequest(0, db.x, db.y, db.w, db.h));
1711
+ }
1712
+ return arr;
1713
+ };
1714
+
1715
+
1716
+
1717
+ keyEvent = function(keysym, down) {
1718
+ //Util.Debug(">> keyEvent, keysym: " + keysym + ", down: " + down);
1719
+ var arr;
1720
+ arr = [4]; // msg-type
1721
+ arr.push8(down);
1722
+ arr.push16(0);
1723
+ arr.push32(keysym);
1724
+ //Util.Debug("<< keyEvent");
1725
+ return arr;
1726
+ };
1727
+
1728
+ pointerEvent = function(x, y) {
1729
+ //Util.Debug(">> pointerEvent, x,y: " + x + "," + y +
1730
+ // " , mask: " + mouse_buttonMask);
1731
+ var arr;
1732
+ arr = [5]; // msg-type
1733
+ arr.push8(mouse_buttonMask);
1734
+ arr.push16(x);
1735
+ arr.push16(y);
1736
+ //Util.Debug("<< pointerEvent");
1737
+ return arr;
1738
+ };
1739
+
1740
+ clientCutText = function(text) {
1741
+ //Util.Debug(">> clientCutText");
1742
+ var arr, i, n;
1743
+ arr = [6]; // msg-type
1744
+ arr.push8(0); // padding
1745
+ arr.push8(0); // padding
1746
+ arr.push8(0); // padding
1747
+ arr.push32(text.length);
1748
+ n = text.length;
1749
+ for (i=0; i < n; i+=1) {
1750
+ arr.push(text.charCodeAt(i));
1751
+ }
1752
+ //Util.Debug("<< clientCutText:" + arr);
1753
+ return arr;
1754
+ };
1755
+
1756
+
1757
+
1758
+ //
1759
+ // Public API interface functions
1760
+ //
1761
+
1762
+ that.connect = function(host, port, password, path) {
1763
+ //Util.Debug(">> connect");
1764
+
1765
+ rfb_host = host;
1766
+ rfb_port = port;
1767
+ rfb_password = (password !== undefined) ? password : "";
1768
+ rfb_path = (path !== undefined) ? path : "";
1769
+
1770
+ if ((!rfb_host) || (!rfb_port)) {
1771
+ return fail("Must set host and port");
1772
+ }
1773
+
1774
+ updateState('connect');
1775
+ //Util.Debug("<< connect");
1776
+
1777
+ };
1778
+
1779
+ that.disconnect = function() {
1780
+ //Util.Debug(">> disconnect");
1781
+ updateState('disconnect', 'Disconnecting');
1782
+ //Util.Debug("<< disconnect");
1783
+ };
1784
+
1785
+ that.sendPassword = function(passwd) {
1786
+ rfb_password = passwd;
1787
+ rfb_state = "Authentication";
1788
+ setTimeout(init_msg, 1);
1789
+ };
1790
+
1791
+ that.sendCtrlAltDel = function() {
1792
+ if (rfb_state !== "normal" || conf.view_only) { return false; }
1793
+ Util.Info("Sending Ctrl-Alt-Del");
1794
+ var arr = [];
1795
+ arr = arr.concat(keyEvent(0xFFE3, 1)); // Control
1796
+ arr = arr.concat(keyEvent(0xFFE9, 1)); // Alt
1797
+ arr = arr.concat(keyEvent(0xFFFF, 1)); // Delete
1798
+ arr = arr.concat(keyEvent(0xFFFF, 0)); // Delete
1799
+ arr = arr.concat(keyEvent(0xFFE9, 0)); // Alt
1800
+ arr = arr.concat(keyEvent(0xFFE3, 0)); // Control
1801
+ arr = arr.concat(fbUpdateRequests());
1802
+ ws.send(arr);
1803
+ };
1804
+
1805
+ // Send a key press. If 'down' is not specified then send a down key
1806
+ // followed by an up key.
1807
+ that.sendKey = function(code, down) {
1808
+ if (rfb_state !== "normal" || conf.view_only) { return false; }
1809
+ var arr = [];
1810
+ if (typeof down !== 'undefined') {
1811
+ Util.Info("Sending key code (" + (down ? "down" : "up") + "): " + code);
1812
+ arr = arr.concat(keyEvent(code, down ? 1 : 0));
1813
+ } else {
1814
+ Util.Info("Sending key code (down + up): " + code);
1815
+ arr = arr.concat(keyEvent(code, 1));
1816
+ arr = arr.concat(keyEvent(code, 0));
1817
+ }
1818
+ arr = arr.concat(fbUpdateRequests());
1819
+ ws.send(arr);
1820
+ };
1821
+
1822
+ that.clipboardPasteFrom = function(text) {
1823
+ if (rfb_state !== "normal") { return; }
1824
+ //Util.Debug(">> clipboardPasteFrom: " + text.substr(0,40) + "...");
1825
+ ws.send(clientCutText(text));
1826
+ //Util.Debug("<< clipboardPasteFrom");
1827
+ };
1828
+
1829
+ // Override internal functions for testing
1830
+ that.testMode = function(override_send) {
1831
+ test_mode = true;
1832
+ that.recv_message = ws.testMode(override_send);
1833
+
1834
+ checkEvents = function () { /* Stub Out */ };
1835
+ that.connect = function(host, port, password) {
1836
+ rfb_host = host;
1837
+ rfb_port = port;
1838
+ rfb_password = password;
1839
+ updateState('ProtocolVersion', "Starting VNC handshake");
1840
+ };
1841
+ };
1842
+
1843
+
1844
+ return constructor(); // Return the public API interface
1845
+
1846
+ } // End of RFB()