vkhater-social_stream 0.16.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1177) hide show
  1. data/.gitignore +15 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +10 -0
  4. data/.yardopts +2 -0
  5. data/Gemfile +17 -0
  6. data/LICENSE +20 -0
  7. data/README.rdoc +67 -0
  8. data/Rakefile +28 -0
  9. data/base/.gitignore +16 -0
  10. data/base/.rspec +1 -0
  11. data/base/.yardopts +2 -0
  12. data/base/Gemfile +10 -0
  13. data/base/LICENSE +20 -0
  14. data/base/README.rdoc +68 -0
  15. data/base/Rakefile +35 -0
  16. data/base/app/assets/images/HTML5.png +0 -0
  17. data/base/app/assets/images/HTML5_Semantics.png +0 -0
  18. data/base/app/assets/images/HTML5_Styling.png +0 -0
  19. data/base/app/assets/images/Jcrop.gif +0 -0
  20. data/base/app/assets/images/arrow-end.png +0 -0
  21. data/base/app/assets/images/arrow-start.png +0 -0
  22. data/base/app/assets/images/arrow.png +0 -0
  23. data/base/app/assets/images/big-logo.png +0 -0
  24. data/base/app/assets/images/btn/1-facebook.png +0 -0
  25. data/base/app/assets/images/btn/_notes/btn_certificates.png.mno +4 -0
  26. data/base/app/assets/images/btn/activity.png +0 -0
  27. data/base/app/assets/images/btn/arrowBlue.png +0 -0
  28. data/base/app/assets/images/btn/arrow_session_change.png +0 -0
  29. data/base/app/assets/images/btn/arrows-ffffff.png +0 -0
  30. data/base/app/assets/images/btn/bold.png +0 -0
  31. data/base/app/assets/images/btn/btn_account.png +0 -0
  32. data/base/app/assets/images/btn/btn_activities.png +0 -0
  33. data/base/app/assets/images/btn/btn_bookmark.png +0 -0
  34. data/base/app/assets/images/btn/btn_browse.png +0 -0
  35. data/base/app/assets/images/btn/btn_check.png +0 -0
  36. data/base/app/assets/images/btn/btn_close.png +0 -0
  37. data/base/app/assets/images/btn/btn_comment.png +0 -0
  38. data/base/app/assets/images/btn/btn_comment_add.png +0 -0
  39. data/base/app/assets/images/btn/btn_config.png +0 -0
  40. data/base/app/assets/images/btn/btn_date.png +0 -0
  41. data/base/app/assets/images/btn/btn_delete.png +0 -0
  42. data/base/app/assets/images/btn/btn_down.png +0 -0
  43. data/base/app/assets/images/btn/btn_edit.png +0 -0
  44. data/base/app/assets/images/btn/btn_exit.png +0 -0
  45. data/base/app/assets/images/btn/btn_find.png +0 -0
  46. data/base/app/assets/images/btn/btn_follow.png +0 -0
  47. data/base/app/assets/images/btn/btn_foward.png +0 -0
  48. data/base/app/assets/images/btn/btn_friend.png +0 -0
  49. data/base/app/assets/images/btn/btn_gallery.png +0 -0
  50. data/base/app/assets/images/btn/btn_group.png +0 -0
  51. data/base/app/assets/images/btn/btn_help.png +0 -0
  52. data/base/app/assets/images/btn/btn_home.png +0 -0
  53. data/base/app/assets/images/btn/btn_inbox.png +0 -0
  54. data/base/app/assets/images/btn/btn_info.png +0 -0
  55. data/base/app/assets/images/btn/btn_invitation.png +0 -0
  56. data/base/app/assets/images/btn/btn_like.png +0 -0
  57. data/base/app/assets/images/btn/btn_next.png +0 -0
  58. data/base/app/assets/images/btn/btn_notification.png +0 -0
  59. data/base/app/assets/images/btn/btn_notification_delete.png +0 -0
  60. data/base/app/assets/images/btn/btn_notification_read.png +0 -0
  61. data/base/app/assets/images/btn/btn_notifications.png +0 -0
  62. data/base/app/assets/images/btn/btn_page_link.png +0 -0
  63. data/base/app/assets/images/btn/btn_partner.png +0 -0
  64. data/base/app/assets/images/btn/btn_photo.png +0 -0
  65. data/base/app/assets/images/btn/btn_play.png +0 -0
  66. data/base/app/assets/images/btn/btn_printer.png +0 -0
  67. data/base/app/assets/images/btn/btn_profile.png +0 -0
  68. data/base/app/assets/images/btn/btn_rank.png +0 -0
  69. data/base/app/assets/images/btn/btn_read.png +0 -0
  70. data/base/app/assets/images/btn/btn_security.png +0 -0
  71. data/base/app/assets/images/btn/btn_send.png +0 -0
  72. data/base/app/assets/images/btn/btn_spam.png +0 -0
  73. data/base/app/assets/images/btn/btn_star.png +0 -0
  74. data/base/app/assets/images/btn/btn_tag.png +0 -0
  75. data/base/app/assets/images/btn/btn_write.png +0 -0
  76. data/base/app/assets/images/btn/close.png +0 -0
  77. data/base/app/assets/images/btn/date.png +0 -0
  78. data/base/app/assets/images/btn/delete.png +0 -0
  79. data/base/app/assets/images/btn/download.png +0 -0
  80. data/base/app/assets/images/btn/edit.png +0 -0
  81. data/base/app/assets/images/btn/error.png +0 -0
  82. data/base/app/assets/images/btn/facebook.png +0 -0
  83. data/base/app/assets/images/btn/flag.png +0 -0
  84. data/base/app/assets/images/btn/group_left.png +0 -0
  85. data/base/app/assets/images/btn/group_right.png +0 -0
  86. data/base/app/assets/images/btn/header_notifications.png +0 -0
  87. data/base/app/assets/images/btn/index_71.png +0 -0
  88. data/base/app/assets/images/btn/info.png +0 -0
  89. data/base/app/assets/images/btn/italic.png +0 -0
  90. data/base/app/assets/images/btn/like.png +0 -0
  91. data/base/app/assets/images/btn/linkedin.png +0 -0
  92. data/base/app/assets/images/btn/message_conversation.png +0 -0
  93. data/base/app/assets/images/btn/message_inbox.png +0 -0
  94. data/base/app/assets/images/btn/message_new.png +0 -0
  95. data/base/app/assets/images/btn/message_sentbox.png +0 -0
  96. data/base/app/assets/images/btn/message_trash.png +0 -0
  97. data/base/app/assets/images/btn/new.png +0 -0
  98. data/base/app/assets/images/btn/next_conference.png +0 -0
  99. data/base/app/assets/images/btn/next_space.png +0 -0
  100. data/base/app/assets/images/btn/nolike.png +0 -0
  101. data/base/app/assets/images/btn/notifications.png +0 -0
  102. data/base/app/assets/images/btn/pixel.png +0 -0
  103. data/base/app/assets/images/btn/point_blue.png +0 -0
  104. data/base/app/assets/images/btn/point_gray.png +0 -0
  105. data/base/app/assets/images/btn/post.png +0 -0
  106. data/base/app/assets/images/btn/search.png +0 -0
  107. data/base/app/assets/images/btn/search_icon.png +0 -0
  108. data/base/app/assets/images/btn/shadow.png +0 -0
  109. data/base/app/assets/images/btn/share.png +0 -0
  110. data/base/app/assets/images/btn/subtime.png +0 -0
  111. data/base/app/assets/images/btn/success.png +0 -0
  112. data/base/app/assets/images/btn/tag_cloud.png +0 -0
  113. data/base/app/assets/images/btn/twitter-follow-icon.png +0 -0
  114. data/base/app/assets/images/btn/twitter.png +0 -0
  115. data/base/app/assets/images/btn/uno.png +0 -0
  116. data/base/app/assets/images/btn/viewer.png +0 -0
  117. data/base/app/assets/images/btn/warning.png +0 -0
  118. data/base/app/assets/images/cancel.png +0 -0
  119. data/base/app/assets/images/cleditor/buttons.gif +0 -0
  120. data/base/app/assets/images/cleditor/toolbar.gif +0 -0
  121. data/base/app/assets/images/frontpage/collaborate.png +0 -0
  122. data/base/app/assets/images/frontpage/comments.png +0 -0
  123. data/base/app/assets/images/frontpage/green_sq.png +0 -0
  124. data/base/app/assets/images/frontpage/meet.png +0 -0
  125. data/base/app/assets/images/frontpage/people.png +0 -0
  126. data/base/app/assets/images/frontpage/purple_sq.png +0 -0
  127. data/base/app/assets/images/frontpage/right_comments.gif +0 -0
  128. data/base/app/assets/images/frontpage/right_conference.png +0 -0
  129. data/base/app/assets/images/frontpage/right_organizers.gif +0 -0
  130. data/base/app/assets/images/frontpage/right_people.gif +0 -0
  131. data/base/app/assets/images/frontpage/right_social.gif +0 -0
  132. data/base/app/assets/images/frontpage/right_tags.gif +0 -0
  133. data/base/app/assets/images/frontpage/right_webcam.gif +0 -0
  134. data/base/app/assets/images/frontpage/share.png +0 -0
  135. data/base/app/assets/images/frontpage/tags.png +0 -0
  136. data/base/app/assets/images/frontpage/yellow_sq.png +0 -0
  137. data/base/app/assets/images/header-logo.png +0 -0
  138. data/base/app/assets/images/html5-badge-h-css3-semantics.png +0 -0
  139. data/base/app/assets/images/icon_checkbox.png +0 -0
  140. data/base/app/assets/images/icons/favicon.ico +0 -0
  141. data/base/app/assets/images/left.png +0 -0
  142. data/base/app/assets/images/lightbox-blank.gif +0 -0
  143. data/base/app/assets/images/lightbox-btn-close.gif +0 -0
  144. data/base/app/assets/images/lightbox-btn-next.gif +0 -0
  145. data/base/app/assets/images/lightbox-btn-prev.gif +0 -0
  146. data/base/app/assets/images/lightbox-ico-loading.gif +0 -0
  147. data/base/app/assets/images/loader.gif +0 -0
  148. data/base/app/assets/images/loading.gif +0 -0
  149. data/base/app/assets/images/logo.png +0 -0
  150. data/base/app/assets/images/logos/actor/group.png +0 -0
  151. data/base/app/assets/images/logos/actor/remote_subject.png +0 -0
  152. data/base/app/assets/images/logos/actor/remote_user.png +0 -0
  153. data/base/app/assets/images/logos/actor/user.png +0 -0
  154. data/base/app/assets/images/logos/contact/group.png +0 -0
  155. data/base/app/assets/images/logos/contact/user.png +0 -0
  156. data/base/app/assets/images/logos/original/group.png +0 -0
  157. data/base/app/assets/images/logos/original/user.png +0 -0
  158. data/base/app/assets/images/logos/profile/group.png +0 -0
  159. data/base/app/assets/images/logos/profile/user.png +0 -0
  160. data/base/app/assets/images/logos/representation/group.png +0 -0
  161. data/base/app/assets/images/logos/representation/user.png +0 -0
  162. data/base/app/assets/images/mini-loading.gif +0 -0
  163. data/base/app/assets/images/right.png +0 -0
  164. data/base/app/assets/images/tipsy.gif +0 -0
  165. data/base/app/assets/javascripts/activities.js.erb +250 -0
  166. data/base/app/assets/javascripts/activities_security_chosen-modified.jquery.js +767 -0
  167. data/base/app/assets/javascripts/cheesecake.js +6 -0
  168. data/base/app/assets/javascripts/contacts.js +4 -0
  169. data/base/app/assets/javascripts/conversations.js +3 -0
  170. data/base/app/assets/javascripts/groups.js +5 -0
  171. data/base/app/assets/javascripts/invitations.js +8 -0
  172. data/base/app/assets/javascripts/jquery.ad-gallery.js +850 -0
  173. data/base/app/assets/javascripts/jquery.ad-gallery.pack.js +10 -0
  174. data/base/app/assets/javascripts/layouts.js +21 -0
  175. data/base/app/assets/javascripts/messages.js +4 -0
  176. data/base/app/assets/javascripts/posts.js +1 -0
  177. data/base/app/assets/javascripts/preloader.js +6 -0
  178. data/base/app/assets/javascripts/profiles.js +9 -0
  179. data/base/app/assets/javascripts/relation_customs.js +32 -0
  180. data/base/app/assets/javascripts/search.js.erb +3 -0
  181. data/base/app/assets/javascripts/settings.js +14 -0
  182. data/base/app/assets/javascripts/social_stream-base.js +11 -0
  183. data/base/app/assets/javascripts/ties.js +67 -0
  184. data/base/app/assets/javascripts/toolbar.js +1 -0
  185. data/base/app/assets/javascripts/users.js +2 -0
  186. data/base/app/assets/stylesheets/0_devise_sign.css +28 -0
  187. data/base/app/assets/stylesheets/_colors.scss +25 -0
  188. data/base/app/assets/stylesheets/activities.css.scss +88 -0
  189. data/base/app/assets/stylesheets/base.css.scss +257 -0
  190. data/base/app/assets/stylesheets/cheesecake.css.scss +55 -0
  191. data/base/app/assets/stylesheets/contacts.css.scss +100 -0
  192. data/base/app/assets/stylesheets/conversations.css +4 -0
  193. data/base/app/assets/stylesheets/footer.css.scss +22 -0
  194. data/base/app/assets/stylesheets/frontpage.css.scss +70 -0
  195. data/base/app/assets/stylesheets/groups.css +4 -0
  196. data/base/app/assets/stylesheets/header.css.scss +203 -0
  197. data/base/app/assets/stylesheets/home.css.scss +53 -0
  198. data/base/app/assets/stylesheets/images/add-policy.png +0 -0
  199. data/base/app/assets/stylesheets/images/fcbkcomplete/close.gif +0 -0
  200. data/base/app/assets/stylesheets/images/loading.gif +0 -0
  201. data/base/app/assets/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  202. data/base/app/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  203. data/base/app/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  204. data/base/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  205. data/base/app/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  206. data/base/app/assets/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  207. data/base/app/assets/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  208. data/base/app/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  209. data/base/app/assets/stylesheets/images/ui-icons_222222_256x240.png +0 -0
  210. data/base/app/assets/stylesheets/images/ui-icons_2e83ff_256x240.png +0 -0
  211. data/base/app/assets/stylesheets/images/ui-icons_454545_256x240.png +0 -0
  212. data/base/app/assets/stylesheets/images/ui-icons_888888_256x240.png +0 -0
  213. data/base/app/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png +0 -0
  214. data/base/app/assets/stylesheets/invitations.css +3 -0
  215. data/base/app/assets/stylesheets/location.css.scss +38 -0
  216. data/base/app/assets/stylesheets/menu.css.scss +19 -0
  217. data/base/app/assets/stylesheets/messages.css.scss +141 -0
  218. data/base/app/assets/stylesheets/opa75.png +0 -0
  219. data/base/app/assets/stylesheets/profiles.css +4 -0
  220. data/base/app/assets/stylesheets/relation_customs.css.scss +233 -0
  221. data/base/app/assets/stylesheets/search.css.scss +165 -0
  222. data/base/app/assets/stylesheets/settings.css +9 -0
  223. data/base/app/assets/stylesheets/social_stream-base.css +5 -0
  224. data/base/app/assets/stylesheets/ties.css.scss +12 -0
  225. data/base/app/assets/stylesheets/toolbar.css +10 -0
  226. data/base/app/assets/stylesheets/users.css +4 -0
  227. data/base/app/controllers/activities_controller.rb +19 -0
  228. data/base/app/controllers/api_controller.rb +38 -0
  229. data/base/app/controllers/authentications_controller.rb +17 -0
  230. data/base/app/controllers/cheesecake_controller.rb +9 -0
  231. data/base/app/controllers/comments_controller.rb +8 -0
  232. data/base/app/controllers/contacts_controller.rb +95 -0
  233. data/base/app/controllers/conversations_controller.rb +102 -0
  234. data/base/app/controllers/frontpage_controller.rb +23 -0
  235. data/base/app/controllers/groups_controller.rb +58 -0
  236. data/base/app/controllers/home_controller.rb +3 -0
  237. data/base/app/controllers/invitations_controller.rb +36 -0
  238. data/base/app/controllers/likes_controller.rb +41 -0
  239. data/base/app/controllers/messages_controller.rb +87 -0
  240. data/base/app/controllers/notifications_controller.rb +73 -0
  241. data/base/app/controllers/omniauth_callbacks_controller.rb +17 -0
  242. data/base/app/controllers/permissions_controller.rb +15 -0
  243. data/base/app/controllers/posts_controller.rb +3 -0
  244. data/base/app/controllers/profiles_controller.rb +9 -0
  245. data/base/app/controllers/relation/customs_controller.rb +6 -0
  246. data/base/app/controllers/search_controller.rb +79 -0
  247. data/base/app/controllers/settings_controller.rb +43 -0
  248. data/base/app/controllers/subjects_controller.rb +7 -0
  249. data/base/app/controllers/tags_controller.rb +15 -0
  250. data/base/app/controllers/ties_controller.rb +11 -0
  251. data/base/app/controllers/users_controller.rb +31 -0
  252. data/base/app/helpers/activities_helper.rb +37 -0
  253. data/base/app/helpers/contacts_helper.rb +24 -0
  254. data/base/app/helpers/groups_helper.rb +3 -0
  255. data/base/app/helpers/location_helper.rb +46 -0
  256. data/base/app/helpers/permissions_helper.rb +16 -0
  257. data/base/app/helpers/profiles_helper.rb +37 -0
  258. data/base/app/helpers/search_helper.rb +38 -0
  259. data/base/app/helpers/settings_helper.rb +9 -0
  260. data/base/app/helpers/sidebar_helper.rb +10 -0
  261. data/base/app/helpers/subjects_helper.rb +15 -0
  262. data/base/app/helpers/toolbar_helper.rb +109 -0
  263. data/base/app/helpers/users_helper.rb +4 -0
  264. data/base/app/mailers/invitation_mailer.rb +11 -0
  265. data/base/app/models/ability.rb +2 -0
  266. data/base/app/models/activity.rb +390 -0
  267. data/base/app/models/activity_object.rb +64 -0
  268. data/base/app/models/activity_object_activity.rb +14 -0
  269. data/base/app/models/activity_verb.rb +22 -0
  270. data/base/app/models/actor.rb +553 -0
  271. data/base/app/models/audience.rb +9 -0
  272. data/base/app/models/authentication.rb +3 -0
  273. data/base/app/models/comment.rb +10 -0
  274. data/base/app/models/contact.rb +209 -0
  275. data/base/app/models/group.rb +51 -0
  276. data/base/app/models/like.rb +49 -0
  277. data/base/app/models/permission.rb +52 -0
  278. data/base/app/models/post.rb +12 -0
  279. data/base/app/models/profile.rb +58 -0
  280. data/base/app/models/relation.rb +169 -0
  281. data/base/app/models/relation/custom.rb +112 -0
  282. data/base/app/models/relation/public.rb +11 -0
  283. data/base/app/models/relation/reject.rb +3 -0
  284. data/base/app/models/relation/single.rb +22 -0
  285. data/base/app/models/relation_permission.rb +4 -0
  286. data/base/app/models/tie.rb +147 -0
  287. data/base/app/models/user.rb +148 -0
  288. data/base/app/views/activities/_activity.html.erb +5 -0
  289. data/base/app/views/activities/_child.html.erb +18 -0
  290. data/base/app/views/activities/_comments.html.erb +3 -0
  291. data/base/app/views/activities/_filter.html.erb +83 -0
  292. data/base/app/views/activities/_index.html.erb +14 -0
  293. data/base/app/views/activities/_new.html.erb +56 -0
  294. data/base/app/views/activities/_options.html.erb +27 -0
  295. data/base/app/views/activities/_root.html.erb +37 -0
  296. data/base/app/views/activities/_wall.html.erb +5 -0
  297. data/base/app/views/activities/index.html.erb +0 -0
  298. data/base/app/views/activities/index.js.erb +3 -0
  299. data/base/app/views/activity_objects/_activity_object.html.erb +7 -0
  300. data/base/app/views/actors/_actor.html.erb +0 -0
  301. data/base/app/views/actors/_actor_cheesecake.html.erb +4 -0
  302. data/base/app/views/api/activity_atom_feed.atom.builder +40 -0
  303. data/base/app/views/avatars/index.html.erb +15 -0
  304. data/base/app/views/avatars/update.js.erb +15 -0
  305. data/base/app/views/cheesecake/_index.html.erb +38 -0
  306. data/base/app/views/cheesecake/index.html.erb +10 -0
  307. data/base/app/views/comments/_comment.html.erb +1 -0
  308. data/base/app/views/comments/_new.html.erb +47 -0
  309. data/base/app/views/comments/create.js.erb +10 -0
  310. data/base/app/views/comments/destroy.js.erb +1 -0
  311. data/base/app/views/contacts/_contact.html.erb +20 -0
  312. data/base/app/views/contacts/_form.html.erb +38 -0
  313. data/base/app/views/contacts/_index.html.erb +40 -0
  314. data/base/app/views/contacts/_link.html.erb +9 -0
  315. data/base/app/views/contacts/_pendings.html.erb +18 -0
  316. data/base/app/views/contacts/_suggestions.html.erb +15 -0
  317. data/base/app/views/contacts/_suggestions_and_pendings.html.erb +6 -0
  318. data/base/app/views/contacts/destroy.js.erb +6 -0
  319. data/base/app/views/contacts/edit.html.erb +6 -0
  320. data/base/app/views/contacts/index.html.erb +37 -0
  321. data/base/app/views/contacts/index.js.erb +3 -0
  322. data/base/app/views/contacts/new.html.erb +5 -0
  323. data/base/app/views/contacts/suggestion.html.erb +1 -0
  324. data/base/app/views/contacts/suggestion.js.erb +1 -0
  325. data/base/app/views/conversations/_conversation.html.erb +38 -0
  326. data/base/app/views/conversations/_conversation_full.html.erb +71 -0
  327. data/base/app/views/conversations/_conversations.html.erb +5 -0
  328. data/base/app/views/conversations/_index.html.erb +11 -0
  329. data/base/app/views/conversations/_show.html.erb +13 -0
  330. data/base/app/views/conversations/edit.html.erb +10 -0
  331. data/base/app/views/conversations/index.html.erb +15 -0
  332. data/base/app/views/conversations/index.js.erb +6 -0
  333. data/base/app/views/conversations/show.html.erb +33 -0
  334. data/base/app/views/conversations/show.js.erb +26 -0
  335. data/base/app/views/devise/passwords/edit.html.erb +21 -0
  336. data/base/app/views/devise/passwords/new.html.erb +27 -0
  337. data/base/app/views/devise/registrations/_delete_account.html.erb +20 -0
  338. data/base/app/views/devise/registrations/_edit_user.html.erb +113 -0
  339. data/base/app/views/devise/registrations/edit.html.erb +20 -0
  340. data/base/app/views/devise/registrations/new.html.erb +44 -0
  341. data/base/app/views/devise/sessions/new.html.erb +35 -0
  342. data/base/app/views/devise/shared/_links.erb +25 -0
  343. data/base/app/views/frontpage/_caracteristics.html.erb +23 -0
  344. data/base/app/views/frontpage/_social_networks.html.erb +3 -0
  345. data/base/app/views/frontpage/_sponsor.html.erb +12 -0
  346. data/base/app/views/frontpage/host_meta.xml.builder +11 -0
  347. data/base/app/views/frontpage/index.html.erb +69 -0
  348. data/base/app/views/groups/_group.html.erb +4 -0
  349. data/base/app/views/groups/_group_focus_search.html.erb +2 -0
  350. data/base/app/views/groups/_group_global_search.html.erb +2 -0
  351. data/base/app/views/groups/_group_with_details.html.erb +2 -0
  352. data/base/app/views/groups/_index.html.erb +19 -0
  353. data/base/app/views/groups/_new.html.erb +81 -0
  354. data/base/app/views/groups/_show.html.erb +33 -0
  355. data/base/app/views/groups/_tag_cloud.html.erb +25 -0
  356. data/base/app/views/groups/index.html.erb +57 -0
  357. data/base/app/views/groups/index.js.erb +1 -0
  358. data/base/app/views/groups/new.html.erb +9 -0
  359. data/base/app/views/groups/show.html.erb +1 -0
  360. data/base/app/views/groups/show.js.erb +2 -0
  361. data/base/app/views/home/_groups.html.erb +24 -0
  362. data/base/app/views/home/index.html.erb +19 -0
  363. data/base/app/views/home/index.js.erb +5 -0
  364. data/base/app/views/invitation_mailer/send_invitation.html.erb +79 -0
  365. data/base/app/views/invitation_mailer/send_invitation.text.erb +21 -0
  366. data/base/app/views/invitations/_new.html.erb +28 -0
  367. data/base/app/views/invitations/new.html.erb +9 -0
  368. data/base/app/views/invitations/new.js.erb +4 -0
  369. data/base/app/views/layouts/_account.html.erb +18 -0
  370. data/base/app/views/layouts/_flash.html.erb +5 -0
  371. data/base/app/views/layouts/_footer.html.erb +16 -0
  372. data/base/app/views/layouts/_header.erb +5 -0
  373. data/base/app/views/layouts/_header_dropdown_menu.html.erb +19 -0
  374. data/base/app/views/layouts/_header_dropdown_menu_sessions.html.erb +14 -0
  375. data/base/app/views/layouts/_header_signed_in.erb +45 -0
  376. data/base/app/views/layouts/_header_signed_out.erb +34 -0
  377. data/base/app/views/layouts/_representation.html.erb +28 -0
  378. data/base/app/views/layouts/_search.html.erb +62 -0
  379. data/base/app/views/layouts/_settings.html.erb +18 -0
  380. data/base/app/views/layouts/application.html.erb +60 -0
  381. data/base/app/views/layouts/frontpage.html.erb +43 -0
  382. data/base/app/views/likes/create.js.erb +2 -0
  383. data/base/app/views/likes/destroy.js.erb +1 -0
  384. data/base/app/views/location/_location.html.erb +3 -0
  385. data/base/app/views/location/_location_body.html.erb +18 -0
  386. data/base/app/views/message_mailer/new_message_email.html.erb +35 -0
  387. data/base/app/views/message_mailer/new_message_email.text.erb +8 -0
  388. data/base/app/views/message_mailer/reply_message_email.html.erb +35 -0
  389. data/base/app/views/message_mailer/reply_message_email.text.erb +8 -0
  390. data/base/app/views/messages/_form.html.erb +39 -0
  391. data/base/app/views/messages/_message.html.erb +31 -0
  392. data/base/app/views/messages/_new.html.erb +10 -0
  393. data/base/app/views/messages/new.html.erb +37 -0
  394. data/base/app/views/messages/new.js.erb +28 -0
  395. data/base/app/views/notification_mailer/new_notification_email.html.erb +35 -0
  396. data/base/app/views/notification_mailer/new_notification_email.text.erb +9 -0
  397. data/base/app/views/notifications/_index.html.erb +21 -0
  398. data/base/app/views/notifications/_notification.html.erb +41 -0
  399. data/base/app/views/notifications/activities/_follow.html.erb +10 -0
  400. data/base/app/views/notifications/activities/_follow.text.erb +8 -0
  401. data/base/app/views/notifications/activities/_like.html.erb +30 -0
  402. data/base/app/views/notifications/activities/_like.text.erb +23 -0
  403. data/base/app/views/notifications/activities/_make-friend.html.erb +10 -0
  404. data/base/app/views/notifications/activities/_make-friend.text.erb +7 -0
  405. data/base/app/views/notifications/activities/_post.html.erb +22 -0
  406. data/base/app/views/notifications/activities/_post.text.erb +17 -0
  407. data/base/app/views/notifications/activities/_update.html.erb +18 -0
  408. data/base/app/views/notifications/activities/_update.text.erb +15 -0
  409. data/base/app/views/notifications/index.html.erb +13 -0
  410. data/base/app/views/notifications/index.js.erb +6 -0
  411. data/base/app/views/objects/_destroy.js.erb +2 -0
  412. data/base/app/views/objects/_new_activity.html.erb +8 -0
  413. data/base/app/views/objects/_show.html.erb +3 -0
  414. data/base/app/views/permissions/_index.html.erb +35 -0
  415. data/base/app/views/permissions/index.js.erb +15 -0
  416. data/base/app/views/posts/_new_activity.html.erb +1 -0
  417. data/base/app/views/posts/_new_activity_fields.erb +7 -0
  418. data/base/app/views/posts/_post.html.erb +3 -0
  419. data/base/app/views/posts/_post_focus_search.html.erb +37 -0
  420. data/base/app/views/posts/_post_global_search.html.erb +18 -0
  421. data/base/app/views/posts/_post_with_details.html.erb +3 -0
  422. data/base/app/views/posts/create.js.erb +7 -0
  423. data/base/app/views/posts/destroy.js.erb +1 -0
  424. data/base/app/views/posts/show.html.erb +10 -0
  425. data/base/app/views/profiles/_contact.html.erb +81 -0
  426. data/base/app/views/profiles/_experience.html.erb +22 -0
  427. data/base/app/views/profiles/_personal.html.erb +74 -0
  428. data/base/app/views/profiles/_profile.html.erb +40 -0
  429. data/base/app/views/profiles/_tags.html.erb +22 -0
  430. data/base/app/views/profiles/edit.html.erb +205 -0
  431. data/base/app/views/profiles/show.html.erb +22 -0
  432. data/base/app/views/profiles/update.js.erb +20 -0
  433. data/base/app/views/relation/customs/_form.html.erb +29 -0
  434. data/base/app/views/relation/customs/_list.html.erb +63 -0
  435. data/base/app/views/relation/customs/_update_rules.js.erb +5 -0
  436. data/base/app/views/relation/customs/create.js.erb +21 -0
  437. data/base/app/views/relation/customs/index.html.erb +43 -0
  438. data/base/app/views/relation/customs/update.js.erb +11 -0
  439. data/base/app/views/search/_extended_search.html.erb +19 -0
  440. data/base/app/views/search/_form.html.erb +54 -0
  441. data/base/app/views/search/_header_search.html.erb +16 -0
  442. data/base/app/views/search/_index.html.erb +12 -0
  443. data/base/app/views/search/index.html.erb +9 -0
  444. data/base/app/views/search/index.js.erb +22 -0
  445. data/base/app/views/settings/_api_key.html.erb +26 -0
  446. data/base/app/views/settings/_destroy.html.erb +17 -0
  447. data/base/app/views/settings/_index.html.erb +8 -0
  448. data/base/app/views/settings/_notifications.html.erb +34 -0
  449. data/base/app/views/settings/index.html.erb +16 -0
  450. data/base/app/views/settings/index.js.erb +7 -0
  451. data/base/app/views/subjects/_contacts.html.erb +18 -0
  452. data/base/app/views/subjects/_show.js.erb +5 -0
  453. data/base/app/views/subjects/_subject.html.erb +8 -0
  454. data/base/app/views/subjects/_subject_with_details.html.erb +17 -0
  455. data/base/app/views/ties/index.html.erb +8 -0
  456. data/base/app/views/toolbar/_home.html.erb +15 -0
  457. data/base/app/views/toolbar/_logo.html.erb +23 -0
  458. data/base/app/views/toolbar/_messages.html.erb +11 -0
  459. data/base/app/views/toolbar/_profile.html.erb +24 -0
  460. data/base/app/views/toolbar/_subject.html.erb +10 -0
  461. data/base/app/views/users/_groups.html.erb +22 -0
  462. data/base/app/views/users/_index.html.erb +19 -0
  463. data/base/app/views/users/_show.html.erb +34 -0
  464. data/base/app/views/users/_user.html.erb +2 -0
  465. data/base/app/views/users/_user_focus_search.html.erb +2 -0
  466. data/base/app/views/users/_user_global_search.html.erb +2 -0
  467. data/base/app/views/users/_user_with_details.html.erb +2 -0
  468. data/base/app/views/users/index.html.erb +41 -0
  469. data/base/app/views/users/index.js.erb +1 -0
  470. data/base/app/views/users/info.html.erb +0 -0
  471. data/base/app/views/users/show.html.erb +1 -0
  472. data/base/app/views/users/show.js.erb +2 -0
  473. data/base/app/views/users/show.xml.builder +15 -0
  474. data/base/config/locales/en.yml +472 -0
  475. data/base/config/locales/es.yml +470 -0
  476. data/base/config/routes.rb +102 -0
  477. data/base/db/migrate/20110610112023_create_social_stream.rb +319 -0
  478. data/base/db/migrate/20110705103202_empty_ties_count.rb +17 -0
  479. data/base/db/migrate/20110712090343_remove_spheres.rb +30 -0
  480. data/base/db/migrate/20110712142140_remove_permission_function.rb +26 -0
  481. data/base/db/migrate/20110912074426_add_reject_relation.rb +29 -0
  482. data/base/db/migrate/20111124100618_object_actors.rb +52 -0
  483. data/base/db/migrate/20111221103509_add_language_field.rb +13 -0
  484. data/base/lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb +37 -0
  485. data/base/lib/acts_as_taggable_on/social_stream.rb +58 -0
  486. data/base/lib/generators/social_stream/base/install_generator.rb +66 -0
  487. data/base/lib/generators/social_stream/base/templates/initializer.rb +32 -0
  488. data/base/lib/generators/social_stream/base/templates/navigation.rb +4 -0
  489. data/base/lib/generators/social_stream/base/templates/relations.yml +39 -0
  490. data/base/lib/generators/social_stream/base/templates/sphinx.yml +9 -0
  491. data/base/lib/paperclip/social_stream.rb +6 -0
  492. data/base/lib/social_stream-base.rb +104 -0
  493. data/base/lib/social_stream/ability.rb +7 -0
  494. data/base/lib/social_stream/ability/base.rb +101 -0
  495. data/base/lib/social_stream/base/dependencies.rb +47 -0
  496. data/base/lib/social_stream/base/engine.rb +69 -0
  497. data/base/lib/social_stream/base/version.rb +5 -0
  498. data/base/lib/social_stream/controllers/cancan_devise_integration.rb +33 -0
  499. data/base/lib/social_stream/controllers/helpers.rb +135 -0
  500. data/base/lib/social_stream/controllers/objects.rb +39 -0
  501. data/base/lib/social_stream/d3.rb +53 -0
  502. data/base/lib/social_stream/migrations/base.rb +58 -0
  503. data/base/lib/social_stream/migrations/components.rb +19 -0
  504. data/base/lib/social_stream/models/object.rb +133 -0
  505. data/base/lib/social_stream/models/subject.rb +118 -0
  506. data/base/lib/social_stream/models/supertype.rb +37 -0
  507. data/base/lib/social_stream/populate.rb +26 -0
  508. data/base/lib/social_stream/test_helpers.rb +11 -0
  509. data/base/lib/social_stream/test_helpers/controllers.rb +122 -0
  510. data/base/lib/social_stream/toolbar_config/base.rb +94 -0
  511. data/base/lib/social_stream/views/list.rb +17 -0
  512. data/base/lib/social_stream/views/settings/base.rb +43 -0
  513. data/base/lib/social_stream/views/sidebar/base.rb +27 -0
  514. data/base/lib/tasks/db/populate.rake +241 -0
  515. data/base/lib/tasks/workers.rake +163 -0
  516. data/base/social_stream-base.gemspec +83 -0
  517. data/base/spec/controllers/comments_controller_spec.rb +66 -0
  518. data/base/spec/controllers/contacts_controller_spec.rb +111 -0
  519. data/base/spec/controllers/frontpage_controller_spec.rb +16 -0
  520. data/base/spec/controllers/groups_controller_spec.rb +178 -0
  521. data/base/spec/controllers/home_controller_spec.rb +56 -0
  522. data/base/spec/controllers/invitations_controller_spec.rb +34 -0
  523. data/base/spec/controllers/likes_controller_spec.rb +48 -0
  524. data/base/spec/controllers/notifications_controller_spec.rb +46 -0
  525. data/base/spec/controllers/permissions_controller_spec.rb +45 -0
  526. data/base/spec/controllers/posts_controller_spec.rb +233 -0
  527. data/base/spec/controllers/profiles_controller_spec.rb +102 -0
  528. data/base/spec/controllers/relation_customs_controller_spec.rb +139 -0
  529. data/base/spec/controllers/representations_spec.rb +74 -0
  530. data/base/spec/controllers/settings_controller_spec.rb +41 -0
  531. data/base/spec/controllers/subjects_controller.rb +14 -0
  532. data/base/spec/controllers/users_controller_spec.rb +98 -0
  533. data/base/spec/dummy/.gitignore +5 -0
  534. data/base/spec/dummy/Rakefile +7 -0
  535. data/base/spec/dummy/app/assets/javascripts/application.js +8 -0
  536. data/base/spec/dummy/app/assets/stylesheets/application.css +8 -0
  537. data/base/spec/dummy/app/controllers/application_controller.rb +3 -0
  538. data/base/spec/dummy/app/helpers/application_helper.rb +2 -0
  539. data/base/spec/dummy/config.ru +4 -0
  540. data/base/spec/dummy/config/application.rb +44 -0
  541. data/base/spec/dummy/config/boot.rb +10 -0
  542. data/base/spec/dummy/config/database.yml +40 -0
  543. data/base/spec/dummy/config/environment.rb +5 -0
  544. data/base/spec/dummy/config/environments/development.rb +30 -0
  545. data/base/spec/dummy/config/environments/production.rb +54 -0
  546. data/base/spec/dummy/config/environments/test.rb +40 -0
  547. data/base/spec/dummy/config/environments/test_pg.rb +35 -0
  548. data/base/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  549. data/base/spec/dummy/config/initializers/devise.rb +220 -0
  550. data/base/spec/dummy/config/initializers/inflections.rb +10 -0
  551. data/base/spec/dummy/config/initializers/mailboxer.rb +8 -0
  552. data/base/spec/dummy/config/initializers/mime_types.rb +5 -0
  553. data/base/spec/dummy/config/initializers/secret_token.rb +7 -0
  554. data/base/spec/dummy/config/initializers/session_store.rb +8 -0
  555. data/base/spec/dummy/config/initializers/social_stream.rb +32 -0
  556. data/base/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  557. data/base/spec/dummy/config/locales/en.yml +5 -0
  558. data/base/spec/dummy/config/navigation.rb +4 -0
  559. data/base/spec/dummy/config/relations.yml +39 -0
  560. data/base/spec/dummy/config/routes.rb +60 -0
  561. data/base/spec/dummy/db/schema.rb +5 -0
  562. data/base/spec/dummy/db/seeds.rb +8 -0
  563. data/base/spec/dummy/public/404.html +26 -0
  564. data/base/spec/dummy/public/422.html +26 -0
  565. data/base/spec/dummy/public/500.html +26 -0
  566. data/base/spec/dummy/public/favicon.ico +0 -0
  567. data/base/spec/dummy/script/rails +6 -0
  568. data/base/spec/factories/activity.rb +52 -0
  569. data/base/spec/factories/comment.rb +6 -0
  570. data/base/spec/factories/contact.rb +16 -0
  571. data/base/spec/factories/group.rb +5 -0
  572. data/base/spec/factories/post.rb +11 -0
  573. data/base/spec/factories/relation_custom.rb +4 -0
  574. data/base/spec/factories/tie.rb +43 -0
  575. data/base/spec/factories/user.rb +6 -0
  576. data/base/spec/integration/navigation_spec.rb +33 -0
  577. data/base/spec/models/activity_authorization_spec.rb +350 -0
  578. data/base/spec/models/activity_spec.rb +131 -0
  579. data/base/spec/models/actor_spec.rb +80 -0
  580. data/base/spec/models/contact_spec.rb +53 -0
  581. data/base/spec/models/group_spec.rb +28 -0
  582. data/base/spec/models/like_spec.rb +68 -0
  583. data/base/spec/models/post_spec.rb +63 -0
  584. data/base/spec/models/profile_spec.rb +39 -0
  585. data/base/spec/models/relation_spec.rb +78 -0
  586. data/base/spec/models/tie_spec.rb +169 -0
  587. data/base/spec/models/user_spec.rb +109 -0
  588. data/base/spec/social_stream_spec.rb +7 -0
  589. data/base/spec/spec_helper.rb +26 -0
  590. data/base/spec/support/cancan.rb +1 -0
  591. data/base/spec/support/db.rb +7 -0
  592. data/base/spec/support/devise.rb +4 -0
  593. data/base/spec/support/mock.rb +4 -0
  594. data/base/vendor/assets/javascripts/ajax.paginate.js +46 -0
  595. data/base/vendor/assets/javascripts/d3.geom.js +825 -0
  596. data/base/vendor/assets/javascripts/d3.js +4013 -0
  597. data/base/vendor/assets/javascripts/d3.layout.js +1865 -0
  598. data/base/vendor/assets/javascripts/hoverIntent.js +84 -0
  599. data/base/vendor/assets/javascripts/jqcloud-0.1.3.js +87 -0
  600. data/base/vendor/assets/javascripts/jquery.ae.image.resize.js +69 -0
  601. data/base/vendor/assets/javascripts/jquery.ba-url.js +1091 -0
  602. data/base/vendor/assets/javascripts/jquery.cleditor.min.js +31 -0
  603. data/base/vendor/assets/javascripts/jquery.fcbkcomplete.js +553 -0
  604. data/base/vendor/assets/javascripts/jquery.lightbox-with-resize-plugin.js +533 -0
  605. data/base/vendor/assets/javascripts/jquery.livequery.js +250 -0
  606. data/base/vendor/assets/javascripts/jquery.screw.js +186 -0
  607. data/base/vendor/assets/javascripts/jquery.scrollTo.min.js +11 -0
  608. data/base/vendor/assets/javascripts/jquery.tipsy.js +263 -0
  609. data/base/vendor/assets/javascripts/jquery.validate.js +1166 -0
  610. data/base/vendor/assets/javascripts/jquery.validate.old.js +1132 -0
  611. data/base/vendor/assets/javascripts/jquery.watermarkinput.js +81 -0
  612. data/base/vendor/assets/javascripts/menu.js +25 -0
  613. data/base/vendor/assets/javascripts/superfish.js +121 -0
  614. data/base/vendor/assets/stylesheets/carousel.css +23 -0
  615. data/base/vendor/assets/stylesheets/chosen-sprite.png +0 -0
  616. data/base/vendor/assets/stylesheets/chosen.css +317 -0
  617. data/base/vendor/assets/stylesheets/fcbkComplete.css +44 -0
  618. data/base/vendor/assets/stylesheets/jqcloud.css +15 -0
  619. data/base/vendor/assets/stylesheets/jquery-ui.css +620 -0
  620. data/base/vendor/assets/stylesheets/jquery.cleditor.css +24 -0
  621. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  622. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  623. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  624. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  625. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  626. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  627. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  628. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  629. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
  630. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  631. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
  632. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
  633. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  634. data/base/vendor/assets/stylesheets/smoothness/jquery-ui-1.7.3.custom.css +405 -0
  635. data/base/vendor/assets/stylesheets/smoothness/jquery-ui-1.8.4.custom.css +572 -0
  636. data/base/vendor/assets/stylesheets/tipsy.css +25 -0
  637. data/bin/social_stream +57 -0
  638. data/bin/social_stream_heroku +76 -0
  639. data/documents/.gitignore +15 -0
  640. data/documents/.rspec +1 -0
  641. data/documents/Gemfile +5 -0
  642. data/documents/MIT-LICENSE +20 -0
  643. data/documents/README.rdoc +6 -0
  644. data/documents/Rakefile +26 -0
  645. data/documents/app/assets/flash/Jplayer.swf +0 -0
  646. data/documents/app/assets/images/16/audio.png +0 -0
  647. data/documents/app/assets/images/16/btn_documents.png +0 -0
  648. data/documents/app/assets/images/16/default.png +0 -0
  649. data/documents/app/assets/images/16/doc.png +0 -0
  650. data/documents/app/assets/images/16/mpeg.png +0 -0
  651. data/documents/app/assets/images/16/pdf.png +0 -0
  652. data/documents/app/assets/images/16/photo.png +0 -0
  653. data/documents/app/assets/images/16/plain.png +0 -0
  654. data/documents/app/assets/images/16/ppt.png +0 -0
  655. data/documents/app/assets/images/16/rar.png +0 -0
  656. data/documents/app/assets/images/16/video.png +0 -0
  657. data/documents/app/assets/images/16/xls.png +0 -0
  658. data/documents/app/assets/images/16/zip.png +0 -0
  659. data/documents/app/assets/images/48/audio.png +0 -0
  660. data/documents/app/assets/images/48/default.png +0 -0
  661. data/documents/app/assets/images/48/excel.png +0 -0
  662. data/documents/app/assets/images/48/mpeg.png +0 -0
  663. data/documents/app/assets/images/48/pdf.png +0 -0
  664. data/documents/app/assets/images/48/ppt.png +0 -0
  665. data/documents/app/assets/images/48/rar.png +0 -0
  666. data/documents/app/assets/images/48/resource.png +0 -0
  667. data/documents/app/assets/images/48/video.png +0 -0
  668. data/documents/app/assets/images/48/word.png +0 -0
  669. data/documents/app/assets/images/48/zip.png +0 -0
  670. data/documents/app/assets/images/btn/btn_audio.png +0 -0
  671. data/documents/app/assets/images/btn/btn_document.png +0 -0
  672. data/documents/app/assets/images/btn/btn_excel.png +0 -0
  673. data/documents/app/assets/images/btn/btn_pdf.png +0 -0
  674. data/documents/app/assets/images/btn/btn_picture.png +0 -0
  675. data/documents/app/assets/images/btn/btn_resource.png +0 -0
  676. data/documents/app/assets/images/btn/btn_video.png +0 -0
  677. data/documents/app/assets/images/btn/btn_word.png +0 -0
  678. data/documents/app/assets/images/btn/document.png +0 -0
  679. data/documents/app/assets/javascripts/documents.js.erb +71 -0
  680. data/documents/app/assets/javascripts/social_stream-documents.js +3 -0
  681. data/documents/app/assets/stylesheets/documents.css.scss +271 -0
  682. data/documents/app/assets/stylesheets/show.css.scss +111 -0
  683. data/documents/app/assets/stylesheets/social_stream-documents.css +6 -0
  684. data/documents/app/controllers/audios_controller.rb +2 -0
  685. data/documents/app/controllers/documents_controller.rb +97 -0
  686. data/documents/app/controllers/pictures_controller.rb +2 -0
  687. data/documents/app/controllers/videos_controller.rb +2 -0
  688. data/documents/app/helpers/documents_helper.rb +30 -0
  689. data/documents/app/models/audio.rb +24 -0
  690. data/documents/app/models/document.rb +78 -0
  691. data/documents/app/models/picture.rb +30 -0
  692. data/documents/app/models/video.rb +29 -0
  693. data/documents/app/views/audios/_audio.html.erb +27 -0
  694. data/documents/app/views/audios/_audio_focus_search.html.erb +3 -0
  695. data/documents/app/views/audios/_audio_global_search.html.erb +3 -0
  696. data/documents/app/views/audios/_audio_processed.html.erb +45 -0
  697. data/documents/app/views/audios/_audio_processing.html.erb +7 -0
  698. data/documents/app/views/audios/_audio_show.html.erb +62 -0
  699. data/documents/app/views/audios/_audio_with_details.html.erb +3 -0
  700. data/documents/app/views/audios/_new.html.erb +1 -0
  701. data/documents/app/views/audios/destroy.js.erb +1 -0
  702. data/documents/app/views/audios/index.html.erb +1 -0
  703. data/documents/app/views/audios/show.html.erb +2 -0
  704. data/documents/app/views/common_documents/_document_info.html.erb +48 -0
  705. data/documents/app/views/common_documents/_edit_form.html.erb +57 -0
  706. data/documents/app/views/common_documents/_headers.html.erb +72 -0
  707. data/documents/app/views/common_documents/_index.html.erb +68 -0
  708. data/documents/app/views/common_documents/_show.html.erb +34 -0
  709. data/documents/app/views/documents/_document.html.erb +15 -0
  710. data/documents/app/views/documents/_document_focus_search.html.erb +2 -0
  711. data/documents/app/views/documents/_document_global_search.html.erb +2 -0
  712. data/documents/app/views/documents/_document_show.html.erb +7 -0
  713. data/documents/app/views/documents/_document_with_details.html.erb +13 -0
  714. data/documents/app/views/documents/_new_activity.html.erb +1 -0
  715. data/documents/app/views/documents/_new_activity_fields.html.erb +1 -0
  716. data/documents/app/views/documents/destroy.js.erb +1 -0
  717. data/documents/app/views/documents/index.html.erb +1 -0
  718. data/documents/app/views/documents/show.html.erb +2 -0
  719. data/documents/app/views/pictures/_new.html.erb +1 -0
  720. data/documents/app/views/pictures/_picture.html.erb +42 -0
  721. data/documents/app/views/pictures/_picture_focus_search.html.erb +2 -0
  722. data/documents/app/views/pictures/_picture_global_search.html.erb +2 -0
  723. data/documents/app/views/pictures/_picture_show.html.erb +26 -0
  724. data/documents/app/views/pictures/_picture_with_details.html.erb +2 -0
  725. data/documents/app/views/pictures/destroy.js.erb +1 -0
  726. data/documents/app/views/pictures/index.html.erb +1 -0
  727. data/documents/app/views/pictures/show.html.erb +2 -0
  728. data/documents/app/views/videos/_new.html.erb +1 -0
  729. data/documents/app/views/videos/_video.html.erb +29 -0
  730. data/documents/app/views/videos/_video_focus_search.html.erb +2 -0
  731. data/documents/app/views/videos/_video_global_search.html.erb +2 -0
  732. data/documents/app/views/videos/_video_processed.html.erb +50 -0
  733. data/documents/app/views/videos/_video_processing.html.erb +7 -0
  734. data/documents/app/views/videos/_video_show.html.erb +64 -0
  735. data/documents/app/views/videos/_video_with_details.html.erb +2 -0
  736. data/documents/app/views/videos/destroy.js.erb +1 -0
  737. data/documents/app/views/videos/index.html.erb +1 -0
  738. data/documents/app/views/videos/show.html.erb +2 -0
  739. data/documents/app/worker/audioencoder.rb +7 -0
  740. data/documents/app/worker/videoencoder.rb +7 -0
  741. data/documents/config/locales/en.yml +67 -0
  742. data/documents/config/locales/es.yml +67 -0
  743. data/documents/config/routes.rb +22 -0
  744. data/documents/db/migrate/20110615143707_create_social_stream_documents.rb +24 -0
  745. data/documents/db/migrate/20110922173707_add_file_processing_to_document.rb +9 -0
  746. data/documents/db/migrate/20111005112707_add_title_and_description_to_document.rb +11 -0
  747. data/documents/lib/generators/social_stream/documents/install_generator.rb +24 -0
  748. data/documents/lib/social_stream-documents.rb +25 -0
  749. data/documents/lib/social_stream/documents/engine.rb +46 -0
  750. data/documents/lib/social_stream/documents/version.rb +5 -0
  751. data/documents/lib/social_stream/migrations/documents.rb +9 -0
  752. data/documents/lib/social_stream/toolbar_config/documents.rb +27 -0
  753. data/documents/social_stream-documents.gemspec +30 -0
  754. data/documents/spec/controllers/documents_controller_spec.rb +118 -0
  755. data/documents/spec/controllers/pictures_controller_spec.rb +80 -0
  756. data/documents/spec/dummy/.gitignore +1 -0
  757. data/documents/spec/dummy/Rakefile +7 -0
  758. data/documents/spec/dummy/app/controllers/application_controller.rb +3 -0
  759. data/documents/spec/dummy/app/helpers/application_helper.rb +2 -0
  760. data/documents/spec/dummy/app/views/layouts/application.html.erb +14 -0
  761. data/documents/spec/dummy/config.ru +4 -0
  762. data/documents/spec/dummy/config/application.rb +45 -0
  763. data/documents/spec/dummy/config/boot.rb +10 -0
  764. data/documents/spec/dummy/config/database.yml +22 -0
  765. data/documents/spec/dummy/config/environment.rb +5 -0
  766. data/documents/spec/dummy/config/environments/development.rb +25 -0
  767. data/documents/spec/dummy/config/environments/production.rb +49 -0
  768. data/documents/spec/dummy/config/environments/test.rb +37 -0
  769. data/documents/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  770. data/documents/spec/dummy/config/initializers/devise.rb +176 -0
  771. data/documents/spec/dummy/config/initializers/inflections.rb +10 -0
  772. data/documents/spec/dummy/config/initializers/mime_types.rb +5 -0
  773. data/documents/spec/dummy/config/initializers/secret_token.rb +7 -0
  774. data/documents/spec/dummy/config/initializers/session_store.rb +8 -0
  775. data/documents/spec/dummy/config/locales/en.yml +5 -0
  776. data/documents/spec/dummy/config/navigation.rb +0 -0
  777. data/documents/spec/dummy/config/relations.yml +39 -0
  778. data/documents/spec/dummy/config/routes.rb +60 -0
  779. data/documents/spec/dummy/db/.gitkeep +0 -0
  780. data/documents/spec/dummy/public/404.html +26 -0
  781. data/documents/spec/dummy/public/422.html +26 -0
  782. data/documents/spec/dummy/public/500.html +26 -0
  783. data/documents/spec/dummy/public/favicon.ico +0 -0
  784. data/documents/spec/dummy/public/javascripts/application.js +2 -0
  785. data/documents/spec/dummy/public/javascripts/controls.js +965 -0
  786. data/documents/spec/dummy/public/javascripts/dragdrop.js +974 -0
  787. data/documents/spec/dummy/public/javascripts/effects.js +1123 -0
  788. data/documents/spec/dummy/public/javascripts/prototype.js +6001 -0
  789. data/documents/spec/dummy/public/javascripts/rails.js +191 -0
  790. data/documents/spec/dummy/public/stylesheets/.gitkeep +0 -0
  791. data/documents/spec/dummy/script/rails +6 -0
  792. data/documents/spec/factories/document.rb +20 -0
  793. data/documents/spec/factories/files/privado.png +0 -0
  794. data/documents/spec/factories/files/rails.png +0 -0
  795. data/documents/spec/factories/files/small.pdf +157 -0
  796. data/documents/spec/factories/picture.rb +21 -0
  797. data/documents/spec/integration/navigation_spec.rb +9 -0
  798. data/documents/spec/models/video_spec.rb +9 -0
  799. data/documents/spec/socialstream_documents_spec.rb +7 -0
  800. data/documents/spec/spec_helper.rb +46 -0
  801. data/documents/spec/support/cancan.rb +1 -0
  802. data/documents/spec/support/db.rb +8 -0
  803. data/documents/spec/support/devise.rb +4 -0
  804. data/documents/spec/support/mock.rb +4 -0
  805. data/documents/vendor/assets/javascripts/jquery.jplayer.js +78 -0
  806. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.css +448 -0
  807. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.jpg +0 -0
  808. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.video.play.hover.png +0 -0
  809. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.video.play.png +0 -0
  810. data/documents/vendor/assets/stylesheets/jquery.lightbox.css +101 -0
  811. data/documents/vendor/assets/stylesheets/pbar-ani.gif +0 -0
  812. data/events/.gitignore +10 -0
  813. data/events/Gemfile +5 -0
  814. data/events/README.rdoc +3 -0
  815. data/events/Rakefile +26 -0
  816. data/events/app/assets/javascripts/0_init.js +4 -0
  817. data/events/app/assets/javascripts/events.js.coffee +66 -0
  818. data/events/app/assets/javascripts/social_stream-events.js +1 -0
  819. data/events/app/assets/stylesheets/events.css.scss +66 -0
  820. data/events/app/assets/stylesheets/social_stream-events.css +3 -0
  821. data/events/app/controllers/events_controller.rb +40 -0
  822. data/events/app/controllers/rooms_controller.rb +7 -0
  823. data/events/app/helpers/events_helper.rb +16 -0
  824. data/events/app/models/event.rb +53 -0
  825. data/events/app/models/room.rb +8 -0
  826. data/events/app/views/events/_calendar_month.erb +1 -0
  827. data/events/app/views/events/_event.html.erb +1 -0
  828. data/events/app/views/events/_new.html.erb +40 -0
  829. data/events/app/views/events/_sidebar_calendar.html.erb +34 -0
  830. data/events/app/views/events/create.js.erb +21 -0
  831. data/events/app/views/events/destroy.js.erb +1 -0
  832. data/events/app/views/events/index.html.erb +99 -0
  833. data/events/app/views/rooms/_form.html.erb +31 -0
  834. data/events/app/views/rooms/_index.html.erb +10 -0
  835. data/events/app/views/rooms/_settings.html.erb +23 -0
  836. data/events/app/views/rooms/create.js.erb +7 -0
  837. data/events/app/views/rooms/destroy.js.erb +1 -0
  838. data/events/config/locales/en.yml +35 -0
  839. data/events/config/locales/es.yml +35 -0
  840. data/events/config/routes.rb +3 -0
  841. data/events/db/migrate/20111101193523_create_events.rb +13 -0
  842. data/events/db/migrate/20111120104349_create_rooms.rb +26 -0
  843. data/events/db/migrate/20111204155637_add_scheduler.rb +33 -0
  844. data/events/db/migrate/20111218203314_change_scheduler.rb +11 -0
  845. data/events/lib/generators/social_stream/events/install_generator.rb +24 -0
  846. data/events/lib/social_stream-events.rb +27 -0
  847. data/events/lib/social_stream/events/ability.rb +13 -0
  848. data/events/lib/social_stream/events/engine.rb +29 -0
  849. data/events/lib/social_stream/events/models/actor.rb +13 -0
  850. data/events/lib/social_stream/events/version.rb +5 -0
  851. data/events/lib/social_stream/migrations/events.rb +8 -0
  852. data/events/lib/social_stream/toolbar_config/events.rb +22 -0
  853. data/events/lib/social_stream/views/settings/events.rb +18 -0
  854. data/events/lib/social_stream/views/sidebar/events.rb +15 -0
  855. data/events/social_stream-events.gemspec +24 -0
  856. data/events/vendor/assets/images/boxy-ne.png +0 -0
  857. data/events/vendor/assets/images/boxy-nw.png +0 -0
  858. data/events/vendor/assets/images/boxy-se.png +0 -0
  859. data/events/vendor/assets/images/boxy-sw.png +0 -0
  860. data/events/vendor/assets/javascripts/fullcalendar.js +5210 -0
  861. data/events/vendor/assets/javascripts/gcal.js +112 -0
  862. data/events/vendor/assets/javascripts/jquery.boxy.js +570 -0
  863. data/events/vendor/assets/javascripts/sprintf.js +183 -0
  864. data/events/vendor/assets/stylesheets/boxy.css +49 -0
  865. data/events/vendor/assets/stylesheets/fullcalendar.css +618 -0
  866. data/events/vendor/assets/stylesheets/fullcalendar.print.css +61 -0
  867. data/lib/generators/social_stream/USAGE +6 -0
  868. data/lib/generators/social_stream/install_generator.rb +6 -0
  869. data/lib/social_stream.rb +13 -0
  870. data/lib/social_stream/release.rb +51 -0
  871. data/lib/social_stream/release/component/release.rb +29 -0
  872. data/lib/social_stream/release/component/version_file.rb +18 -0
  873. data/lib/social_stream/release/dependency_update.rb +14 -0
  874. data/lib/social_stream/release/global/release.rb +70 -0
  875. data/lib/social_stream/release/global/version_file.rb +68 -0
  876. data/lib/social_stream/version.rb +3 -0
  877. data/linkser/.gitignore +14 -0
  878. data/linkser/.rspec +1 -0
  879. data/linkser/Gemfile +5 -0
  880. data/linkser/MIT-LICENSE +20 -0
  881. data/linkser/README.rdoc +6 -0
  882. data/linkser/Rakefile +26 -0
  883. data/linkser/app/assets/javascripts/linkser.js.erb +63 -0
  884. data/linkser/app/assets/javascripts/social_stream-linkser.js +2 -0
  885. data/linkser/app/assets/stylesheets/linkser.css.scss +68 -0
  886. data/linkser/app/assets/stylesheets/social_stream-linkser.css +3 -0
  887. data/linkser/app/controllers/links_controller.rb +3 -0
  888. data/linkser/app/controllers/linkser_controller.rb +20 -0
  889. data/linkser/app/models/link.rb +47 -0
  890. data/linkser/app/views/links/_error.html.erb +4 -0
  891. data/linkser/app/views/links/_link.html.erb +37 -0
  892. data/linkser/app/views/links/_link_preview.html.erb +34 -0
  893. data/linkser/app/views/links/create.js.erb +15 -0
  894. data/linkser/app/views/links/destroy.js.erb +1 -0
  895. data/linkser/app/views/links/show.html.erb +10 -0
  896. data/linkser/config/locales/en.yml +14 -0
  897. data/linkser/config/locales/es.yml +14 -0
  898. data/linkser/config/routes.rb +3 -0
  899. data/linkser/db/migrate/20111129100618_create_social_stream_linkser.rb +21 -0
  900. data/linkser/db/migrate/20111219122952_add_width_height_to_link.rb +15 -0
  901. data/linkser/lib/generators/social_stream/linkser/install_generator.rb +24 -0
  902. data/linkser/lib/social_stream-linkser.rb +16 -0
  903. data/linkser/lib/social_stream/linkser/engine.rb +7 -0
  904. data/linkser/lib/social_stream/linkser/version.rb +5 -0
  905. data/linkser/lib/social_stream/migrations/linkser.rb +9 -0
  906. data/linkser/social_stream-linkser.gemspec +26 -0
  907. data/linkser/spec/dummy/Rakefile +7 -0
  908. data/linkser/spec/dummy/app/controllers/application_controller.rb +3 -0
  909. data/linkser/spec/dummy/app/helpers/application_helper.rb +2 -0
  910. data/linkser/spec/dummy/app/views/layouts/application.html.erb +14 -0
  911. data/linkser/spec/dummy/config.ru +4 -0
  912. data/linkser/spec/dummy/config/application.rb +45 -0
  913. data/linkser/spec/dummy/config/boot.rb +10 -0
  914. data/linkser/spec/dummy/config/database.yml +22 -0
  915. data/linkser/spec/dummy/config/environment.rb +5 -0
  916. data/linkser/spec/dummy/config/environments/development.rb +25 -0
  917. data/linkser/spec/dummy/config/environments/production.rb +49 -0
  918. data/linkser/spec/dummy/config/environments/test.rb +37 -0
  919. data/linkser/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  920. data/linkser/spec/dummy/config/initializers/devise.rb +176 -0
  921. data/linkser/spec/dummy/config/initializers/inflections.rb +10 -0
  922. data/linkser/spec/dummy/config/initializers/mime_types.rb +5 -0
  923. data/linkser/spec/dummy/config/initializers/secret_token.rb +7 -0
  924. data/linkser/spec/dummy/config/initializers/session_store.rb +8 -0
  925. data/linkser/spec/dummy/config/locales/en.yml +5 -0
  926. data/linkser/spec/dummy/config/navigation.rb +0 -0
  927. data/linkser/spec/dummy/config/relations.yml +39 -0
  928. data/linkser/spec/dummy/config/routes.rb +60 -0
  929. data/linkser/spec/dummy/db/.gitkeep +0 -0
  930. data/linkser/spec/dummy/documents/documents/000/000/001/original.pdf +157 -0
  931. data/linkser/spec/dummy/documents/documents/000/000/002/original.pdf +157 -0
  932. data/linkser/spec/dummy/documents/documents/000/000/003/original.pdf +157 -0
  933. data/linkser/spec/dummy/documents/documents/000/000/004/original.pdf +157 -0
  934. data/linkser/spec/dummy/documents/documents/000/000/005/original.pdf +157 -0
  935. data/linkser/spec/dummy/documents/documents/000/000/006/original.pdf +157 -0
  936. data/linkser/spec/dummy/documents/documents/000/000/007/original.pdf +157 -0
  937. data/linkser/spec/dummy/documents/documents/000/000/008/original.pdf +157 -0
  938. data/linkser/spec/dummy/documents/documents/000/000/009/original.pdf +157 -0
  939. data/linkser/spec/dummy/documents/documents/000/000/010/original.pdf +157 -0
  940. data/linkser/spec/dummy/documents/pictures/000/000/011/original.png +0 -0
  941. data/linkser/spec/dummy/documents/pictures/000/000/011/thumb.png +0 -0
  942. data/linkser/spec/dummy/documents/pictures/000/000/011/thumb0.png +0 -0
  943. data/linkser/spec/dummy/documents/pictures/000/000/012/original.png +0 -0
  944. data/linkser/spec/dummy/documents/pictures/000/000/012/thumb.png +0 -0
  945. data/linkser/spec/dummy/documents/pictures/000/000/012/thumb0.png +0 -0
  946. data/linkser/spec/dummy/documents/pictures/000/000/013/original.png +0 -0
  947. data/linkser/spec/dummy/documents/pictures/000/000/013/thumb.png +0 -0
  948. data/linkser/spec/dummy/documents/pictures/000/000/013/thumb0.png +0 -0
  949. data/linkser/spec/dummy/documents/pictures/000/000/014/original.png +0 -0
  950. data/linkser/spec/dummy/documents/pictures/000/000/014/thumb.png +0 -0
  951. data/linkser/spec/dummy/documents/pictures/000/000/014/thumb0.png +0 -0
  952. data/linkser/spec/dummy/documents/pictures/000/000/015/original.png +0 -0
  953. data/linkser/spec/dummy/documents/pictures/000/000/015/thumb.png +0 -0
  954. data/linkser/spec/dummy/documents/pictures/000/000/015/thumb0.png +0 -0
  955. data/linkser/spec/dummy/documents/pictures/000/000/016/original.png +0 -0
  956. data/linkser/spec/dummy/documents/pictures/000/000/016/thumb.png +0 -0
  957. data/linkser/spec/dummy/documents/pictures/000/000/016/thumb0.png +0 -0
  958. data/linkser/spec/dummy/documents/pictures/000/000/017/original.png +0 -0
  959. data/linkser/spec/dummy/documents/pictures/000/000/017/thumb.png +0 -0
  960. data/linkser/spec/dummy/documents/pictures/000/000/017/thumb0.png +0 -0
  961. data/linkser/spec/dummy/documents/pictures/000/000/018/original.png +0 -0
  962. data/linkser/spec/dummy/documents/pictures/000/000/018/thumb.png +0 -0
  963. data/linkser/spec/dummy/documents/pictures/000/000/018/thumb0.png +0 -0
  964. data/linkser/spec/dummy/documents/pictures/000/000/019/original.png +0 -0
  965. data/linkser/spec/dummy/documents/pictures/000/000/019/thumb.png +0 -0
  966. data/linkser/spec/dummy/documents/pictures/000/000/019/thumb0.png +0 -0
  967. data/linkser/spec/dummy/documents/pictures/000/000/020/original.png +0 -0
  968. data/linkser/spec/dummy/documents/pictures/000/000/020/thumb.png +0 -0
  969. data/linkser/spec/dummy/documents/pictures/000/000/020/thumb0.png +0 -0
  970. data/linkser/spec/dummy/public/404.html +26 -0
  971. data/linkser/spec/dummy/public/422.html +26 -0
  972. data/linkser/spec/dummy/public/500.html +26 -0
  973. data/linkser/spec/dummy/public/favicon.ico +0 -0
  974. data/linkser/spec/dummy/public/javascripts/application.js +2 -0
  975. data/linkser/spec/dummy/public/javascripts/controls.js +965 -0
  976. data/linkser/spec/dummy/public/javascripts/dragdrop.js +974 -0
  977. data/linkser/spec/dummy/public/javascripts/effects.js +1123 -0
  978. data/linkser/spec/dummy/public/javascripts/prototype.js +6001 -0
  979. data/linkser/spec/dummy/public/javascripts/rails.js +191 -0
  980. data/linkser/spec/dummy/public/stylesheets/.gitkeep +0 -0
  981. data/linkser/spec/dummy/script/rails +6 -0
  982. data/linkser/spec/integration/navigation_spec.rb +9 -0
  983. data/linkser/spec/socialstream_linkser_spec.rb +7 -0
  984. data/linkser/spec/spec_helper.rb +48 -0
  985. data/linkser/spec/support/cancan.rb +1 -0
  986. data/linkser/spec/support/db.rb +8 -0
  987. data/linkser/spec/support/devise.rb +4 -0
  988. data/linkser/spec/support/mock.rb +4 -0
  989. data/linkser/vendor/assets/javascripts/jquery.jplayer.js +78 -0
  990. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.css +448 -0
  991. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.jpg +0 -0
  992. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.video.play.hover.png +0 -0
  993. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.video.play.png +0 -0
  994. data/linkser/vendor/assets/stylesheets/jquery.lightbox.css +101 -0
  995. data/linkser/vendor/assets/stylesheets/pbar-ani.gif +0 -0
  996. data/presence/.gitignore +5 -0
  997. data/presence/Gemfile +4 -0
  998. data/presence/Rakefile +8 -0
  999. data/presence/app/assets/audio/chat/onMessageAudio.mp3 +0 -0
  1000. data/presence/app/assets/audio/chat/onMessageAudio.wav +0 -0
  1001. data/presence/app/assets/images/black_arrow3.png +0 -0
  1002. data/presence/app/assets/images/emoticons/beer.png +0 -0
  1003. data/presence/app/assets/images/emoticons/clock.png +0 -0
  1004. data/presence/app/assets/images/emoticons/face-raspberry.png +0 -0
  1005. data/presence/app/assets/images/emoticons/face-sad.png +0 -0
  1006. data/presence/app/assets/images/emoticons/face-smile.png +0 -0
  1007. data/presence/app/assets/images/emoticons/face-tired.png +0 -0
  1008. data/presence/app/assets/images/emoticons/face-wink.png +0 -0
  1009. data/presence/app/assets/images/emoticons/present.png +0 -0
  1010. data/presence/app/assets/images/emoticons/rain.png +0 -0
  1011. data/presence/app/assets/images/emoticons/sun.png +0 -0
  1012. data/presence/app/assets/images/status/available.png +0 -0
  1013. data/presence/app/assets/images/status/away.png +0 -0
  1014. data/presence/app/assets/images/status/dnd.png +0 -0
  1015. data/presence/app/assets/images/status/offline.png +0 -0
  1016. data/presence/app/assets/javascripts/chat_audio.js +73 -0
  1017. data/presence/app/assets/javascripts/chat_interface_manager.js.erb +334 -0
  1018. data/presence/app/assets/javascripts/chat_parser.js +257 -0
  1019. data/presence/app/assets/javascripts/chat_utilities.js +223 -0
  1020. data/presence/app/assets/javascripts/chat_window_manager.js +186 -0
  1021. data/presence/app/assets/javascripts/social_stream-presence.js +5 -0
  1022. data/presence/app/assets/javascripts/store.js +19 -0
  1023. data/presence/app/assets/javascripts/xmpp_client_management.js.erb +326 -0
  1024. data/presence/app/assets/stylesheets/chat.css.scss +350 -0
  1025. data/presence/app/assets/stylesheets/social_stream-presence.css +4 -0
  1026. data/presence/app/controllers/xmpp_controller.rb +187 -0
  1027. data/presence/app/helpers/xmpp_helper.rb +20 -0
  1028. data/presence/app/views/chat/_connecting.html.erb +8 -0
  1029. data/presence/app/views/chat/_contacts.html.erb +47 -0
  1030. data/presence/app/views/chat/_index.html.erb +41 -0
  1031. data/presence/app/views/chat/_off.html.erb +54 -0
  1032. data/presence/app/views/chat/_settings.html.erb +34 -0
  1033. data/presence/app/views/xmpp/active_users.html.erb +33 -0
  1034. data/presence/config/locales/en.yml +20 -0
  1035. data/presence/config/locales/es.yml +21 -0
  1036. data/presence/config/routes.rb +13 -0
  1037. data/presence/db/migrate/20110711111408_add_connected_column_to_user.rb +9 -0
  1038. data/presence/db/migrate/20110928135031_add_status_column_to_user.rb +9 -0
  1039. data/presence/db/migrate/20111116194112_add_chat_enabled_column_to_user.rb +9 -0
  1040. data/presence/ejabberd/conf/ejabberd_example.cfg +621 -0
  1041. data/presence/ejabberd/conf/ssconfig_example.cfg +33 -0
  1042. data/presence/ejabberd/ejabberd_files.zip +0 -0
  1043. data/presence/ejabberd/ejabberd_scripts/authentication_script +167 -0
  1044. data/presence/ejabberd/ejabberd_scripts/development_scripts/compile_module +34 -0
  1045. data/presence/ejabberd/ejabberd_scripts/development_scripts/generate_random_password +18 -0
  1046. data/presence/ejabberd/ejabberd_scripts/development_scripts/kill_authentication_script.sh +13 -0
  1047. data/presence/ejabberd/ejabberd_scripts/development_scripts/reset_logs.sh +21 -0
  1048. data/presence/ejabberd/ejabberd_scripts/development_scripts/show_config.sh +37 -0
  1049. data/presence/ejabberd/ejabberd_scripts/development_scripts/start_ejabberd.sh +68 -0
  1050. data/presence/ejabberd/ejabberd_scripts/development_scripts/stop_ejabberd.sh +12 -0
  1051. data/presence/ejabberd/ejabberd_scripts/emanagement +555 -0
  1052. data/presence/ejabberd/ejabberd_scripts/reset_connection_script +300 -0
  1053. data/presence/ejabberd/ejabberd_scripts/rest_api_client_script +304 -0
  1054. data/presence/ejabberd/ejabberd_scripts/set_script_header.sh +112 -0
  1055. data/presence/ejabberd/ejabberd_scripts/synchronize_presence_script +300 -0
  1056. data/presence/ejabberd/installer.sh +267 -0
  1057. data/presence/ejabberd/mod_admin_extra/mod_admin_extra.beam +0 -0
  1058. data/presence/ejabberd/mod_admin_extra/mod_admin_extra.erl +1560 -0
  1059. data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
  1060. data/presence/ejabberd/mod_sspresence/mod_sspresence.erl +193 -0
  1061. data/presence/lib/generators/social_stream/presence/install_generator.rb +28 -0
  1062. data/presence/lib/generators/social_stream/presence/templates/initializer.rb +34 -0
  1063. data/presence/lib/social_stream-presence.rb +50 -0
  1064. data/presence/lib/social_stream/migrations/presence.rb +8 -0
  1065. data/presence/lib/social_stream/presence/engine.rb +17 -0
  1066. data/presence/lib/social_stream/presence/models/buddy_manager.rb +104 -0
  1067. data/presence/lib/social_stream/presence/version.rb +5 -0
  1068. data/presence/lib/social_stream/presence/xmpp_server_order.rb +549 -0
  1069. data/presence/lib/social_stream/views/settings/presence.rb +20 -0
  1070. data/presence/lib/tasks/presence/installer.rake +136 -0
  1071. data/presence/lib/tasks/presence/synchronize.rake +22 -0
  1072. data/presence/social_stream-presence.gemspec +32 -0
  1073. data/presence/spec/demo/.gitignore +5 -0
  1074. data/presence/spec/demo/.rspec +1 -0
  1075. data/presence/spec/demo/README +261 -0
  1076. data/presence/spec/demo/Rakefile +7 -0
  1077. data/presence/spec/demo/app/assets/images/rails.png +0 -0
  1078. data/presence/spec/demo/app/assets/javascripts/application.js +9 -0
  1079. data/presence/spec/demo/app/assets/stylesheets/application.css +7 -0
  1080. data/presence/spec/demo/app/controllers/application_controller.rb +3 -0
  1081. data/presence/spec/demo/app/helpers/application_helper.rb +2 -0
  1082. data/presence/spec/demo/app/mailers/.gitkeep +0 -0
  1083. data/presence/spec/demo/app/models/.gitkeep +0 -0
  1084. data/presence/spec/demo/app/views/layouts/application.html.erb +14 -0
  1085. data/presence/spec/demo/autotest/discover.rb +2 -0
  1086. data/presence/spec/demo/config.ru +4 -0
  1087. data/presence/spec/demo/config/application.rb +41 -0
  1088. data/presence/spec/demo/config/boot.rb +6 -0
  1089. data/presence/spec/demo/config/database.yml +25 -0
  1090. data/presence/spec/demo/config/environment.rb +5 -0
  1091. data/presence/spec/demo/config/environments/development.rb +27 -0
  1092. data/presence/spec/demo/config/environments/production.rb +54 -0
  1093. data/presence/spec/demo/config/environments/test.rb +39 -0
  1094. data/presence/spec/demo/config/initializers/backtrace_silencers.rb +7 -0
  1095. data/presence/spec/demo/config/initializers/inflections.rb +10 -0
  1096. data/presence/spec/demo/config/initializers/mime_types.rb +5 -0
  1097. data/presence/spec/demo/config/initializers/secret_token.rb +7 -0
  1098. data/presence/spec/demo/config/initializers/session_store.rb +8 -0
  1099. data/presence/spec/demo/config/initializers/wrap_parameters.rb +12 -0
  1100. data/presence/spec/demo/config/locales/en.yml +5 -0
  1101. data/presence/spec/demo/config/routes.rb +58 -0
  1102. data/presence/spec/demo/db/seeds.rb +7 -0
  1103. data/presence/spec/demo/doc/README_FOR_APP +2 -0
  1104. data/presence/spec/demo/lib/tasks/.gitkeep +0 -0
  1105. data/presence/spec/demo/log/.gitkeep +0 -0
  1106. data/presence/spec/demo/public/404.html +26 -0
  1107. data/presence/spec/demo/public/422.html +26 -0
  1108. data/presence/spec/demo/public/500.html +26 -0
  1109. data/presence/spec/demo/public/favicon.ico +0 -0
  1110. data/presence/spec/demo/public/index.html +241 -0
  1111. data/presence/spec/demo/public/robots.txt +5 -0
  1112. data/presence/spec/demo/script/rails +6 -0
  1113. data/presence/spec/demo/spec/spec_helper.rb +27 -0
  1114. data/presence/spec/demo/test/fixtures/.gitkeep +0 -0
  1115. data/presence/spec/demo/test/functional/.gitkeep +0 -0
  1116. data/presence/spec/demo/test/integration/.gitkeep +0 -0
  1117. data/presence/spec/demo/test/performance/browsing_test.rb +12 -0
  1118. data/presence/spec/demo/test/test_helper.rb +13 -0
  1119. data/presence/spec/demo/test/unit/.gitkeep +0 -0
  1120. data/presence/spec/demo/vendor/assets/stylesheets/.gitkeep +0 -0
  1121. data/presence/spec/demo/vendor/plugins/.gitkeep +0 -0
  1122. data/presence/spec/discover.rb +2 -0
  1123. data/presence/spec/spec_helper.rb +27 -0
  1124. data/presence/vendor/assets/javascripts/jquery.tools.tooltip.js +11 -0
  1125. data/presence/vendor/assets/javascripts/jquery.ui.chatbox.js +341 -0
  1126. data/presence/vendor/assets/javascripts/strophe.js +3612 -0
  1127. data/presence/vendor/assets/stylesheets/jquery.ui.chatbox.css +54 -0
  1128. data/social_stream.gemspec +46 -0
  1129. data/social_stream.thor +10 -0
  1130. data/spec/controllers/frontpage_controller_spec.rb +11 -0
  1131. data/spec/dummy/.gitignore +5 -0
  1132. data/spec/dummy/Rakefile +7 -0
  1133. data/spec/dummy/app/assets/images/rails.png +0 -0
  1134. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  1135. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  1136. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  1137. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  1138. data/spec/dummy/app/mailers/.gitkeep +0 -0
  1139. data/spec/dummy/app/models/.gitkeep +0 -0
  1140. data/spec/dummy/config.ru +4 -0
  1141. data/spec/dummy/config/application.rb +45 -0
  1142. data/spec/dummy/config/boot.rb +10 -0
  1143. data/spec/dummy/config/database.yml +36 -0
  1144. data/spec/dummy/config/environment.rb +5 -0
  1145. data/spec/dummy/config/environments/development.rb +27 -0
  1146. data/spec/dummy/config/environments/production.rb +54 -0
  1147. data/spec/dummy/config/environments/test.rb +39 -0
  1148. data/spec/dummy/config/environments/test_mysql.rb +39 -0
  1149. data/spec/dummy/config/environments/test_postgres.rb +39 -0
  1150. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  1151. data/spec/dummy/config/initializers/devise.rb +176 -0
  1152. data/spec/dummy/config/initializers/inflections.rb +10 -0
  1153. data/spec/dummy/config/initializers/mailboxer.rb +8 -0
  1154. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  1155. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  1156. data/spec/dummy/config/initializers/session_store.rb +8 -0
  1157. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  1158. data/spec/dummy/config/locales/en.yml +5 -0
  1159. data/spec/dummy/config/navigation.rb +4 -0
  1160. data/spec/dummy/config/relations.yml +39 -0
  1161. data/spec/dummy/config/routes.rb +60 -0
  1162. data/spec/dummy/db/migrate/.gitkeep +0 -0
  1163. data/spec/dummy/db/schema.rb +9 -0
  1164. data/spec/dummy/db/seeds.rb +8 -0
  1165. data/spec/dummy/public/404.html +26 -0
  1166. data/spec/dummy/public/422.html +26 -0
  1167. data/spec/dummy/public/500.html +26 -0
  1168. data/spec/dummy/public/favicon.ico +0 -0
  1169. data/spec/dummy/public/robots.txt +5 -0
  1170. data/spec/dummy/script/rails +6 -0
  1171. data/spec/integration/navigation_spec.rb +9 -0
  1172. data/spec/social_stream_spec.rb +7 -0
  1173. data/spec/spec_helper.rb +27 -0
  1174. data/spec/support/components.rb +7 -0
  1175. data/spec/support/db.rb +15 -0
  1176. data/spec/support/optimizations.rb +4 -0
  1177. metadata +1340 -0
@@ -0,0 +1,1560 @@
1
+ %%%-------------------------------------------------------------------
2
+ %%% File : mod_admin_extra.erl
3
+ %%% Author : Badlop <badlop@process-one.net>
4
+ %%% Purpose : Contributed administrative functions and commands
5
+ %%% Created : 10 Aug 2008 by Badlop <badlop@process-one.net>
6
+ %%%
7
+ %%%
8
+ %%% ejabberd, Copyright (C) 2002-2008 ProcessOne
9
+ %%%
10
+ %%% This program is free software; you can redistribute it and/or
11
+ %%% modify it under the terms of the GNU General Public License as
12
+ %%% published by the Free Software Foundation; either version 2 of the
13
+ %%% License, or (at your option) any later version.
14
+ %%%
15
+ %%% This program is distributed in the hope that it will be useful,
16
+ %%% but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ %%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18
+ %%% General Public License for more details.
19
+ %%%
20
+ %%% You should have received a copy of the GNU General Public License
21
+ %%% along with this program; if not, write to the Free Software
22
+ %%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23
+ %%% 02111-1307 USA
24
+ %%%
25
+ %%%-------------------------------------------------------------------
26
+
27
+ -module(mod_admin_extra).
28
+ -author('badlop@process-one.net').
29
+
30
+ -behaviour(gen_mod).
31
+
32
+ -export([start/2, stop/1,
33
+ %% Node
34
+ compile/1,
35
+ load_config/1,
36
+ get_cookie/0,
37
+ remove_node/1,
38
+ export2odbc/2,
39
+ %% Accounts
40
+ set_password/3,
41
+ check_password_hash/4,
42
+ delete_old_users/1,
43
+ delete_old_users_vhost/2,
44
+ ban_account/3,
45
+ num_active_users/2,
46
+ %% Sessions
47
+ num_resources/2,
48
+ resource_num/3,
49
+ kick_session/4,
50
+ status_num/2, status_num/1,
51
+ status_list/2, status_list/1,
52
+ connected_users_info/0,
53
+ connected_users_vhost/1,
54
+ set_presence/7,
55
+ user_sessions_info/2,
56
+ %% Vcard
57
+ set_nickname/3,
58
+ get_vcard/3,
59
+ get_vcard/4,
60
+ get_vcard_multi/4,
61
+ set_vcard/4,
62
+ set_vcard/5,
63
+ %% Roster
64
+ add_rosteritem/7,
65
+ delete_rosteritem/4,
66
+ process_rosteritems/5,
67
+ get_roster/2,
68
+ push_roster/3,
69
+ push_roster_all/1,
70
+ push_alltoall/2,
71
+ %% mod_last
72
+ set_last/4,
73
+ %% mod_private
74
+ private_get/4,
75
+ private_set/3,
76
+ %% mod_shared_roster
77
+ srg_create/5,
78
+ srg_delete/2,
79
+ srg_list/1,
80
+ srg_get_info/2,
81
+ srg_get_members/2,
82
+ srg_user_add/4,
83
+ srg_user_del/4,
84
+ %% Stanza
85
+ send_message_headline/4,
86
+ send_message_chat/3,
87
+ send_stanza_c2s/4,
88
+ privacy_set/3,
89
+ %% Stats
90
+ stats/1, stats/2
91
+ ]).
92
+
93
+ -include("ejabberd.hrl").
94
+ -include("ejabberd_commands.hrl").
95
+ -include("mod_roster.hrl").
96
+ -include("jlib.hrl").
97
+
98
+ %% Copied from ejabberd_sm.erl
99
+ -record(session, {sid, usr, us, priority, info}).
100
+
101
+
102
+ %%%
103
+ %%% gen_mod
104
+ %%%
105
+
106
+ start(_Host, _Opts) ->
107
+ ejabberd_commands:register_commands(commands()).
108
+
109
+ stop(_Host) ->
110
+ ejabberd_commands:unregister_commands(commands()).
111
+
112
+
113
+ %%%
114
+ %%% Register commands
115
+ %%%
116
+
117
+ commands() ->
118
+ Vcard1FieldsString = "Some vcard field names in get/set_vcard are:\n"
119
+ " FN - Full Name\n"
120
+ " NICKNAME - Nickname\n"
121
+ " BDAY - Birthday\n"
122
+ " TITLE - Work: Position\n",
123
+ " ROLE - Work: Role",
124
+
125
+ Vcard2FieldsString = "Some vcard field names and subnames in get/set_vcard2 are:\n"
126
+ " N FAMILY - Family name\n"
127
+ " N GIVEN - Given name\n"
128
+ " N MIDDLE - Middle name\n"
129
+ " ADR CTRY - Address: Country\n"
130
+ " ADR LOCALITY - Address: City\n"
131
+ " EMAIL USERID - E-Mail Address\n"
132
+ " ORG ORGNAME - Work: Company\n"
133
+ " ORG ORGUNIT - Work: Department",
134
+
135
+ VcardXEP = "For a full list of vCard fields check XEP-0054: vcard-temp at "
136
+ "http://www.xmpp.org/extensions/xep-0054.html",
137
+
138
+ [
139
+ #ejabberd_commands{name = compile, tags = [erlang],
140
+ desc = "Recompile and reload Erlang source code file",
141
+ module = ?MODULE, function = compile,
142
+ args = [{file, string}],
143
+ result = {res, rescode}},
144
+ #ejabberd_commands{name = load_config, tags = [server],
145
+ desc = "Load ejabberd configuration file",
146
+ module = ?MODULE, function = load_config,
147
+ args = [{file, string}],
148
+ result = {res, rescode}},
149
+ #ejabberd_commands{name = get_cookie, tags = [erlang],
150
+ desc = "Get the Erlang cookie of this node",
151
+ module = ?MODULE, function = get_cookie,
152
+ args = [],
153
+ result = {cookie, string}},
154
+ #ejabberd_commands{name = remove_node, tags = [erlang],
155
+ desc = "Remove an ejabberd node from Mnesia clustering config",
156
+ module = ?MODULE, function = remove_node,
157
+ args = [{node, string}],
158
+ result = {res, rescode}},
159
+ #ejabberd_commands{name = export2odbc, tags = [mnesia],
160
+ desc = "Export Mnesia tables to files in directory",
161
+ module = ?MODULE, function = export2odbc,
162
+ args = [{host, string}, {path, string}],
163
+ result = {res, rescode}},
164
+
165
+ #ejabberd_commands{name = num_active_users, tags = [accounts, stats],
166
+ desc = "Get number of users active in the last days",
167
+ module = ?MODULE, function = num_active_users,
168
+ args = [{host, string}, {days, integer}],
169
+ result = {users, integer}},
170
+ #ejabberd_commands{name = delete_old_users, tags = [accounts, purge],
171
+ desc = "Delete users that didn't log in last days, or that never logged",
172
+ module = ?MODULE, function = delete_old_users,
173
+ args = [{days, integer}],
174
+ result = {res, restuple}},
175
+ #ejabberd_commands{name = delete_old_users_vhost, tags = [accounts, purge],
176
+ desc = "Delete users that didn't log in last days in vhost, or that never logged",
177
+ module = ?MODULE, function = delete_old_users_vhost,
178
+ args = [{host, string}, {days, integer}],
179
+ result = {res, restuple}},
180
+
181
+ #ejabberd_commands{name = check_account, tags = [accounts],
182
+ desc = "Check if an account exists or not",
183
+ module = ejabberd_auth, function = is_user_exists,
184
+ args = [{user, string}, {host, string}],
185
+ result = {res, rescode}},
186
+ #ejabberd_commands{name = check_password, tags = [accounts],
187
+ desc = "Check if a password is correct",
188
+ module = ejabberd_auth, function = check_password,
189
+ args = [{user, string}, {host, string}, {password, string}],
190
+ result = {res, rescode}},
191
+ #ejabberd_commands{name = check_password_hash, tags = [accounts],
192
+ desc = "Check if the password hash is correct",
193
+ longdesc = "Allowed hash methods: md5, sha.",
194
+ module = ?MODULE, function = check_password_hash,
195
+ args = [{user, string}, {host, string}, {passwordhash, string}, {hashmethod, string}],
196
+ result = {res, rescode}},
197
+ #ejabberd_commands{name = change_password, tags = [accounts],
198
+ desc = "Change the password of an account",
199
+ module = ?MODULE, function = set_password,
200
+ args = [{user, string}, {host, string}, {newpass, string}],
201
+ result = {res, rescode}},
202
+ #ejabberd_commands{name = ban_account, tags = [accounts],
203
+ desc = "Ban an account: kick sessions and set random password",
204
+ module = ?MODULE, function = ban_account,
205
+ args = [{user, string}, {host, string}, {reason, string}],
206
+ result = {res, rescode}},
207
+
208
+ #ejabberd_commands{name = num_resources, tags = [session],
209
+ desc = "Get the number of resources of a user",
210
+ module = ?MODULE, function = num_resources,
211
+ args = [{user, string}, {host, string}],
212
+ result = {resources, integer}},
213
+ #ejabberd_commands{name = resource_num, tags = [session],
214
+ desc = "Resource string of a session number",
215
+ module = ?MODULE, function = resource_num,
216
+ args = [{user, string}, {host, string}, {num, integer}],
217
+ result = {resource, string}},
218
+ #ejabberd_commands{name = kick_session, tags = [session],
219
+ desc = "Kick a user session",
220
+ module = ?MODULE, function = kick_session,
221
+ args = [{user, string}, {host, string}, {resource, string}, {reason, string}],
222
+ result = {res, rescode}},
223
+ #ejabberd_commands{name = status_num_host, tags = [session, stats],
224
+ desc = "Number of logged users with this status in host",
225
+ module = ?MODULE, function = status_num,
226
+ args = [{host, string}, {status, string}],
227
+ result = {users, integer}},
228
+ #ejabberd_commands{name = status_num, tags = [session, stats],
229
+ desc = "Number of logged users with this status",
230
+ module = ?MODULE, function = status_num,
231
+ args = [{status, string}],
232
+ result = {users, integer}},
233
+ #ejabberd_commands{name = status_list_host, tags = [session],
234
+ desc = "List of users logged in host with their statuses",
235
+ module = ?MODULE, function = status_list,
236
+ args = [{host, string}, {status, string}],
237
+ result = {users, {list,
238
+ {userstatus, {tuple, [
239
+ {user, string},
240
+ {host, string},
241
+ {resource, string},
242
+ {priority, integer},
243
+ {status, string}
244
+ ]}}
245
+ }}},
246
+ #ejabberd_commands{name = status_list, tags = [session],
247
+ desc = "List of logged users with this status",
248
+ module = ?MODULE, function = status_list,
249
+ args = [{status, string}],
250
+ result = {users, {list,
251
+ {userstatus, {tuple, [
252
+ {user, string},
253
+ {host, string},
254
+ {resource, string},
255
+ {priority, integer},
256
+ {status, string}
257
+ ]}}
258
+ }}},
259
+ #ejabberd_commands{name = connected_users_info,
260
+ tags = [session],
261
+ desc = "List all established sessions and their information",
262
+ module = ?MODULE, function = connected_users_info,
263
+ args = [],
264
+ result = {connected_users_info,
265
+ {list,
266
+ {sessions, {tuple,
267
+ [{jid, string},
268
+ {connection, string},
269
+ {ip, string},
270
+ {port, integer},
271
+ {priority, integer},
272
+ {node, string},
273
+ {uptime, integer}
274
+ ]}}
275
+ }}},
276
+ #ejabberd_commands{name = connected_users_vhost,
277
+ tags = [session],
278
+ desc = "Get the list of established sessions in a vhost",
279
+ module = ?MODULE, function = connected_users_vhost,
280
+ args = [{host, string}],
281
+ result = {connected_users_vhost, {list, {sessions, string}}}},
282
+ #ejabberd_commands{name = user_sessions_info,
283
+ tags = [session],
284
+ desc = "Get information about all sessions of a user",
285
+ module = ?MODULE, function = user_sessions_info,
286
+ args = [{user, string}, {host, string}],
287
+ result = {sessions_info,
288
+ {list,
289
+ {session, {tuple,
290
+ [{connection, string},
291
+ {ip, string},
292
+ {port, integer},
293
+ {priority, integer},
294
+ {node, string},
295
+ {uptime, integer},
296
+ {status, string},
297
+ {resource, string},
298
+ {statustext, string}
299
+ ]}}
300
+ }}},
301
+
302
+ #ejabberd_commands{name = set_presence,
303
+ tags = [session],
304
+ desc = "Set presence of a session",
305
+ module = ?MODULE, function = set_presence,
306
+ args = [{user, string}, {host, string},
307
+ {resource, string}, {type, string},
308
+ {show, string}, {status, string},
309
+ {priority, string}],
310
+ result = {res, rescode}},
311
+
312
+ #ejabberd_commands{name = set_nickname, tags = [vcard],
313
+ desc = "Set nickname in a user's vCard",
314
+ module = ?MODULE, function = set_nickname,
315
+ args = [{user, string}, {host, string}, {nickname, string}],
316
+ result = {res, rescode}},
317
+
318
+ #ejabberd_commands{name = get_vcard, tags = [vcard],
319
+ desc = "Get content from a vCard field",
320
+ longdesc = Vcard1FieldsString ++ "\n" ++ Vcard2FieldsString ++ "\n\n" ++ VcardXEP,
321
+ module = ?MODULE, function = get_vcard,
322
+ args = [{user, string}, {host, string}, {name, string}],
323
+ result = {content, string}},
324
+ #ejabberd_commands{name = get_vcard2, tags = [vcard],
325
+ desc = "Get content from a vCard field",
326
+ longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
327
+ module = ?MODULE, function = get_vcard,
328
+ args = [{user, string}, {host, string}, {name, string}, {subname, string}],
329
+ result = {content, string}},
330
+ #ejabberd_commands{name = get_vcard2_multi, tags = [vcard],
331
+ desc = "Get multiple contents from a vCard field (requires exmpp installed)",
332
+ longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
333
+ module = ?MODULE, function = get_vcard_multi,
334
+ args = [{user, string}, {host, string}, {name, string}, {subname, string}],
335
+ result = {contents, {list, string}}},
336
+
337
+ #ejabberd_commands{name = set_vcard, tags = [vcard],
338
+ desc = "Set content in a vCard field",
339
+ longdesc = Vcard1FieldsString ++ "\n" ++ Vcard2FieldsString ++ "\n\n" ++ VcardXEP,
340
+ module = ?MODULE, function = set_vcard,
341
+ args = [{user, string}, {host, string}, {name, string}, {content, string}],
342
+ result = {res, rescode}},
343
+ #ejabberd_commands{name = set_vcard2, tags = [vcard],
344
+ desc = "Set content in a vCard subfield",
345
+ longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
346
+ module = ?MODULE, function = set_vcard,
347
+ args = [{user, string}, {host, string}, {name, string}, {subname, string}, {content, string}],
348
+ result = {res, rescode}},
349
+ #ejabberd_commands{name = set_vcard2_multi, tags = [vcard],
350
+ desc = "Set multiple contents in a vCard subfield",
351
+ longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
352
+ module = ?MODULE, function = set_vcard,
353
+ args = [{user, string}, {host, string}, {name, string}, {subname, string}, {contents, {list, string}}],
354
+ result = {res, rescode}},
355
+
356
+ #ejabberd_commands{name = add_rosteritem, tags = [roster],
357
+ desc = "Add an item to a user's roster",
358
+ module = ?MODULE, function = add_rosteritem,
359
+ args = [{localuser, string}, {localserver, string},
360
+ {user, string}, {server, string},
361
+ {nick, string}, {group, string},
362
+ {subs, string}],
363
+ result = {res, rescode}},
364
+ %%{"", "subs= none, from, to or both"},
365
+ %%{"", "example: add-roster peter localhost mike server.com MiKe Employees both"},
366
+ %%{"", "will add mike@server.com to peter@localhost roster"},
367
+ #ejabberd_commands{name = delete_rosteritem, tags = [roster],
368
+ desc = "Delete an item from a user's roster",
369
+ module = ?MODULE, function = delete_rosteritem,
370
+ args = [{localuser, string}, {localserver, string},
371
+ {user, string}, {server, string}],
372
+ result = {res, rescode}},
373
+ #ejabberd_commands{name = process_rosteritems, tags = [roster],
374
+ desc = "List or delete rosteritems that match filtering options",
375
+ longdesc = "Explanation of each argument:\n"
376
+ " - action: what to do with each rosteritem that "
377
+ "matches all the filtering options\n"
378
+ " - subs: subscription type\n"
379
+ " - asks: pending subscription\n"
380
+ " - users: the JIDs of the local user\n"
381
+ " - contacts: the JIDs of the contact in the roster\n"
382
+ "\n"
383
+ "Allowed values in the arguments:\n"
384
+ " ACTION = list | delete\n"
385
+ " SUBS = SUB[:SUB]* | any\n"
386
+ " SUB = none | from | to | both\n"
387
+ " ASKS = ASK[:ASK]* | any\n"
388
+ " ASK = none | out | in\n"
389
+ " USERS = JID[:JID]* | any\n"
390
+ " CONTACTS = JID[:JID]* | any\n"
391
+ " JID = characters valid in a JID, and can use the "
392
+ "globs: *, ?, ! and [...]\n"
393
+ "\n"
394
+ "This example will list roster items with subscription "
395
+ "'none', 'from' or 'to' that have any ask property, of "
396
+ "local users which JID is in the virtual host "
397
+ "'example.org' and that the contact JID is either a "
398
+ "bare server name (without user part) or that has a "
399
+ "user part and the server part contains the word 'icq'"
400
+ ":\n list none:from:to any *@example.org *:*@*icq*",
401
+ module = ?MODULE, function = process_rosteritems,
402
+ args = [{action, string}, {subs, string},
403
+ {asks, string}, {users, string},
404
+ {contacts, string}],
405
+ result = {res, rescode}},
406
+ #ejabberd_commands{name = get_roster, tags = [roster],
407
+ desc = "Get roster of a local user",
408
+ module = ?MODULE, function = get_roster,
409
+ args = [{user, string}, {host, string}],
410
+ result = {contacts, {list, {contact, {tuple, [
411
+ {jid, string},
412
+ {nick, string},
413
+ {subscription, string},
414
+ {ask, string},
415
+ {group, string}
416
+ ]}}}}},
417
+ #ejabberd_commands{name = push_roster, tags = [roster],
418
+ desc = "Push template roster from file to a user",
419
+ module = ?MODULE, function = push_roster,
420
+ args = [{file, string}, {user, string}, {host, string}],
421
+ result = {res, rescode}},
422
+ #ejabberd_commands{name = push_roster_all, tags = [roster],
423
+ desc = "Push template roster from file to all those users",
424
+ module = ?MODULE, function = push_roster_all,
425
+ args = [{file, string}],
426
+ result = {res, rescode}},
427
+ #ejabberd_commands{name = push_alltoall, tags = [roster],
428
+ desc = "Add all the users to all the users of Host in Group",
429
+ module = ?MODULE, function = push_alltoall,
430
+ args = [{host, string}, {group, string}],
431
+ result = {res, rescode}},
432
+
433
+ #ejabberd_commands{name = set_last, tags = [last],
434
+ desc = "Set last activity information",
435
+ longdesc = "Timestamp is the seconds since"
436
+ "1970-01-01 00:00:00 UTC, for example: date +%s",
437
+ module = ?MODULE, function = set_last,
438
+ args = [{user, string}, {host, string}, {timestamp, integer}, {status, string}],
439
+ result = {res, rescode}},
440
+
441
+ #ejabberd_commands{name = private_get, tags = [private],
442
+ desc = "Get some information from a user private storage",
443
+ module = ?MODULE, function = private_get,
444
+ args = [{user, string}, {host, string}, {element, string}, {ns, string}],
445
+ result = {res, string}},
446
+ #ejabberd_commands{name = private_set, tags = [private],
447
+ desc = "Set to the user private storage",
448
+ module = ?MODULE, function = private_set,
449
+ args = [{user, string}, {host, string}, {element, string}],
450
+ result = {res, rescode}},
451
+
452
+ #ejabberd_commands{name = srg_create, tags = [shared_roster_group],
453
+ desc = "Create a Shared Roster Group",
454
+ longdesc = "If you want to specify several group "
455
+ "identifiers in the Display argument,\n"
456
+ "put \\ \" around the argument and\nseparate the "
457
+ "identifiers with \\ \\ n\n"
458
+ "For example:\n"
459
+ " ejabberdctl srg_create group3 localhost "
460
+ "name desc \\\"group1\\\\ngroup2\\\"",
461
+ module = ?MODULE, function = srg_create,
462
+ args = [{group, string}, {host, string},
463
+ {name, string}, {description, string}, {display, string}],
464
+ result = {res, rescode}},
465
+ #ejabberd_commands{name = srg_delete, tags = [shared_roster_group],
466
+ desc = "Delete a Shared Roster Group",
467
+ module = ?MODULE, function = srg_delete,
468
+ args = [{group, string}, {host, string}],
469
+ result = {res, rescode}},
470
+ #ejabberd_commands{name = srg_list, tags = [shared_roster_group],
471
+ desc = "List the Shared Roster Groups in Host",
472
+ module = ?MODULE, function = srg_list,
473
+ args = [{host, string}],
474
+ result = {groups, {list, {id, string}}}},
475
+ #ejabberd_commands{name = srg_get_info, tags = [shared_roster_group],
476
+ desc = "Get info of a Shared Roster Group",
477
+ module = ?MODULE, function = srg_get_info,
478
+ args = [{group, string}, {host, string}],
479
+ result = {informations, {list, {information, {tuple, [{key, string}, {value, string}]}}}}},
480
+ #ejabberd_commands{name = srg_get_members, tags = [shared_roster_group],
481
+ desc = "Get members of a Shared Roster Group",
482
+ module = ?MODULE, function = srg_get_members,
483
+ args = [{group, string}, {host, string}],
484
+ result = {members, {list, {member, string}}}},
485
+ #ejabberd_commands{name = srg_user_add, tags = [shared_roster_group],
486
+ desc = "Add the JID user@host to the Shared Roster Group",
487
+ module = ?MODULE, function = srg_user_add,
488
+ args = [{user, string}, {host, string}, {group, string}, {grouphost, string}],
489
+ result = {res, rescode}},
490
+ #ejabberd_commands{name = srg_user_del, tags = [shared_roster_group],
491
+ desc = "Delete this JID user@host from the Shared Roster Group",
492
+ module = ?MODULE, function = srg_user_del,
493
+ args = [{user, string}, {host, string}, {group, string}, {grouphost, string}],
494
+ result = {res, rescode}},
495
+
496
+ #ejabberd_commands{name = send_message_chat, tags = [stanza],
497
+ desc = "Send a chat message to a local or remote bare of full JID",
498
+ module = ?MODULE, function = send_message_chat,
499
+ args = [{from, string}, {to, string}, {body, string}],
500
+ result = {res, rescode}},
501
+ #ejabberd_commands{name = send_message_headline, tags = [stanza],
502
+ desc = "Send a headline message to a local or remote bare of full JID",
503
+ module = ?MODULE, function = send_message_headline,
504
+ args = [{from, string}, {to, string},
505
+ {subject, string}, {body, string}],
506
+ result = {res, rescode}},
507
+ #ejabberd_commands{name = send_stanza_c2s, tags = [stanza],
508
+ desc = "Send a stanza as if sent from a c2s session",
509
+ module = ?MODULE, function = send_stanza_c2s,
510
+ args = [{user, string}, {host, string}, {resource, string}, {stanza, string}],
511
+ result = {res, rescode}},
512
+ #ejabberd_commands{name = privacy_set, tags = [stanza],
513
+ desc = "Send a IQ set privacy stanza for a local account",
514
+ module = ?MODULE, function = privacy_set,
515
+ args = [{user, string}, {host, string}, {xmlquery, string}],
516
+ result = {res, rescode}},
517
+
518
+ #ejabberd_commands{name = stats, tags = [stats],
519
+ desc = "Get statistical value: registeredusers onlineusers onlineusersnode uptimeseconds",
520
+ module = ?MODULE, function = stats,
521
+ args = [{name, string}],
522
+ result = {stat, integer}},
523
+ #ejabberd_commands{name = stats_host, tags = [stats],
524
+ desc = "Get statistical value for this host: registeredusers onlineusers",
525
+ module = ?MODULE, function = stats,
526
+ args = [{name, string}, {host, string}],
527
+ result = {stat, integer}}
528
+ ].
529
+
530
+
531
+ %%%
532
+ %%% Node
533
+ %%%
534
+
535
+ compile(File) ->
536
+ case compile:file(File) of
537
+ ok -> ok;
538
+ _ -> error
539
+ end.
540
+
541
+ load_config(Path) ->
542
+ ok = ejabberd_config:load_file(Path).
543
+
544
+ get_cookie() ->
545
+ atom_to_list(erlang:get_cookie()).
546
+
547
+ remove_node(Node) ->
548
+ mnesia:del_table_copy(schema, list_to_atom(Node)),
549
+ ok.
550
+
551
+ export2odbc(Host, Directory) ->
552
+ Tables = [
553
+ {export_last, last},
554
+ {export_offline, offline},
555
+ {export_passwd, passwd},
556
+ {export_private_storage, private_storage},
557
+ {export_roster, roster},
558
+ {export_vcard, vcard},
559
+ {export_vcard_search, vcard_search}],
560
+ Export = fun({TableFun, Table}) ->
561
+ Filename = filename:join([Directory, atom_to_list(Table)++".txt"]),
562
+ io:format("Trying to export Mnesia table '~p' on Host '~s' to file '~s'~n", [Table, Host, Filename]),
563
+ Res = (catch ejd2odbc:TableFun(Host, Filename)),
564
+ io:format(" Result: ~p~n", [Res])
565
+ end,
566
+ lists:foreach(Export, Tables),
567
+ ok.
568
+
569
+
570
+ %%%
571
+ %%% Accounts
572
+ %%%
573
+
574
+ set_password(User, Host, Password) ->
575
+ case ejabberd_auth:set_password(User, Host, Password) of
576
+ ok ->
577
+ ok;
578
+ _ ->
579
+ error
580
+ end.
581
+
582
+ %% Copied some code from ejabberd_commands.erl
583
+ check_password_hash(User, Host, PasswordHash, HashMethod) ->
584
+ AccountPass = ejabberd_auth:get_password_s(User, Host),
585
+ AccountPassHash = case HashMethod of
586
+ "md5" -> get_md5(AccountPass);
587
+ "sha" -> get_sha(AccountPass);
588
+ _ -> undefined
589
+ end,
590
+ case AccountPassHash of
591
+ undefined -> error;
592
+ PasswordHash -> ok;
593
+ _ -> error
594
+ end.
595
+ get_md5(AccountPass) ->
596
+ lists:flatten([io_lib:format("~.16B", [X])
597
+ || X <- binary_to_list(crypto:md5(AccountPass))]).
598
+ get_sha(AccountPass) ->
599
+ lists:flatten([io_lib:format("~.16B", [X])
600
+ || X <- binary_to_list(crypto:sha(AccountPass))]).
601
+
602
+ num_active_users(Host, Days) ->
603
+ list_last_activity(Host, true, Days).
604
+
605
+ %% Code based on ejabberd/src/web/ejabberd_web_admin.erl
606
+ list_last_activity(Host, Integral, Days) ->
607
+ {MegaSecs, Secs, _MicroSecs} = now(),
608
+ TimeStamp = MegaSecs * 1000000 + Secs,
609
+ TS = TimeStamp - Days * 86400,
610
+ case catch mnesia:dirty_select(
611
+ last_activity, [{{last_activity, {'_', Host}, '$1', '_'},
612
+ [{'>', '$1', TS}],
613
+ [{'trunc', {'/',
614
+ {'-', TimeStamp, '$1'},
615
+ 86400}}]}]) of
616
+ {'EXIT', _Reason} ->
617
+ [];
618
+ Vals ->
619
+ Hist = histogram(Vals, Integral),
620
+ if
621
+ Hist == [] ->
622
+ 0;
623
+ true ->
624
+ Left = Days - length(Hist),
625
+ Tail = if
626
+ Integral ->
627
+ lists:duplicate(Left, lists:last(Hist));
628
+ true ->
629
+ lists:duplicate(Left, 0)
630
+ end,
631
+ lists:nth(Days, Hist ++ Tail)
632
+ end
633
+ end.
634
+ histogram(Values, Integral) ->
635
+ histogram(lists:sort(Values), Integral, 0, 0, []).
636
+ histogram([H | T], Integral, Current, Count, Hist) when Current == H ->
637
+ histogram(T, Integral, Current, Count + 1, Hist);
638
+ histogram([H | _] = Values, Integral, Current, Count, Hist) when Current < H ->
639
+ if
640
+ Integral ->
641
+ histogram(Values, Integral, Current + 1, Count, [Count | Hist]);
642
+ true ->
643
+ histogram(Values, Integral, Current + 1, 0, [Count | Hist])
644
+ end;
645
+ histogram([], _Integral, _Current, Count, Hist) ->
646
+ if
647
+ Count > 0 ->
648
+ lists:reverse([Count | Hist]);
649
+ true ->
650
+ lists:reverse(Hist)
651
+ end.
652
+
653
+
654
+ delete_old_users(Days) ->
655
+ %% Get the list of registered users
656
+ Users = ejabberd_auth:dirty_get_registered_users(),
657
+
658
+ {removed, N, UR} = delete_old_users(Days, Users),
659
+ {ok, io_lib:format("Deleted ~p users: ~p", [N, UR])}.
660
+
661
+ delete_old_users_vhost(Host, Days) ->
662
+ %% Get the list of registered users
663
+ Users = ejabberd_auth:get_vh_registered_users(Host),
664
+
665
+ {removed, N, UR} = delete_old_users(Days, Users),
666
+ {ok, io_lib:format("Deleted ~p users: ~p", [N, UR])}.
667
+
668
+ delete_old_users(Days, Users) ->
669
+ %% Convert older time
670
+ SecOlder = Days*24*60*60,
671
+
672
+ %% Get current time
673
+ {MegaSecs, Secs, _MicroSecs} = now(),
674
+ TimeStamp_now = MegaSecs * 1000000 + Secs,
675
+
676
+ %% For a user, remove if required and answer true
677
+ F = fun({LUser, LServer}) ->
678
+ %% Check if the user is logged
679
+ case ejabberd_sm:get_user_resources(LUser, LServer) of
680
+ %% If it isnt
681
+ [] ->
682
+ %% Look for his last_activity
683
+ case (get_lastactivity_module(LServer)):get_last_info(LUser, LServer) of
684
+ %% If it is
685
+ %% existent:
686
+ {ok, TimeStamp, _Status} ->
687
+ %% get his age
688
+ Sec = TimeStamp_now - TimeStamp,
689
+ %% If he is
690
+ if
691
+ %% younger than SecOlder:
692
+ Sec < SecOlder ->
693
+ %% do nothing
694
+ false;
695
+ %% older:
696
+ true ->
697
+ %% remove the user
698
+ ejabberd_auth:remove_user(LUser, LServer),
699
+ true
700
+ end;
701
+ %% nonexistent:
702
+ not_found ->
703
+ %% remove the user
704
+ ejabberd_auth:remove_user(LUser, LServer),
705
+ true
706
+ end;
707
+ %% Else
708
+ _ ->
709
+ %% do nothing
710
+ false
711
+ end
712
+ end,
713
+ %% Apply the function to every user in the list
714
+ Users_removed = lists:filter(F, Users),
715
+ {removed, length(Users_removed), Users_removed}.
716
+
717
+ get_lastactivity_module(Server) ->
718
+ case lists:member(mod_last, gen_mod:loaded_modules(Server)) of
719
+ true -> mod_last;
720
+ _ -> mod_last_odbc
721
+ end.
722
+
723
+
724
+ %%
725
+ %% Ban account
726
+
727
+ ban_account(User, Host, ReasonText) ->
728
+ Reason = prepare_reason(ReasonText),
729
+ kick_sessions(User, Host, Reason),
730
+ set_random_password(User, Host, Reason),
731
+ ok.
732
+
733
+ kick_sessions(User, Server, Reason) ->
734
+ lists:map(
735
+ fun(Resource) ->
736
+ kick_this_session(User, Server, Resource, Reason)
737
+ end,
738
+ get_resources(User, Server)).
739
+
740
+ get_resources(User, Server) ->
741
+ lists:map(
742
+ fun(Session) ->
743
+ element(3, Session#session.usr)
744
+ end,
745
+ get_sessions(User, Server)).
746
+
747
+ get_sessions(User, Server) ->
748
+ LUser = jlib:nodeprep(User),
749
+ LServer = jlib:nameprep(Server),
750
+ Sessions = mnesia:dirty_index_read(session, {LUser, LServer}, #session.us),
751
+ true = is_list(Sessions),
752
+ Sessions.
753
+
754
+ set_random_password(User, Server, Reason) ->
755
+ NewPass = build_random_password(Reason),
756
+ set_password_auth(User, Server, NewPass).
757
+
758
+ build_random_password(Reason) ->
759
+ Date = jlib:timestamp_to_iso(calendar:universal_time()),
760
+ RandomString = randoms:get_string(),
761
+ "BANNED_ACCOUNT--" ++ Date ++ "--" ++ RandomString ++ "--" ++ Reason.
762
+
763
+ set_password_auth(User, Server, Password) ->
764
+ ok = ejabberd_auth:set_password(User, Server, Password).
765
+
766
+ prepare_reason([]) ->
767
+ "Kicked by administrator";
768
+ prepare_reason([Reason]) ->
769
+ Reason;
770
+ prepare_reason(Reason) when is_list(Reason) ->
771
+ Reason;
772
+ prepare_reason(StringList) ->
773
+ string:join(StringList, "_").
774
+
775
+
776
+ %%%
777
+ %%% Sessions
778
+ %%%
779
+
780
+ num_resources(User, Host) ->
781
+ length(ejabberd_sm:get_user_resources(User, Host)).
782
+
783
+ resource_num(User, Host, Num) ->
784
+ Resources = ejabberd_sm:get_user_resources(User, Host),
785
+ case (0<Num) and (Num=<length(Resources)) of
786
+ true ->
787
+ lists:nth(Num, Resources);
788
+ false ->
789
+ lists:flatten(io_lib:format("Error: Wrong resource number: ~p", [Num]))
790
+ end.
791
+
792
+ kick_session(User, Server, Resource, ReasonText) ->
793
+ kick_this_session(User, Server, Resource, prepare_reason(ReasonText)),
794
+ ok.
795
+
796
+ kick_this_session(User, Server, Resource, Reason) ->
797
+ ejabberd_router:route(
798
+ jlib:make_jid("", "", ""),
799
+ jlib:make_jid(User, Server, Resource),
800
+ {xmlelement, "broadcast", [], [{exit, Reason}]}).
801
+
802
+
803
+ status_num(Host, Status) ->
804
+ length(get_status_list(Host, Status)).
805
+ status_num(Status) ->
806
+ status_num("all", Status).
807
+ status_list(Host, Status) ->
808
+ Res = get_status_list(Host, Status),
809
+ [{U, S, R, P, St} || {U, S, R, P, St} <- Res].
810
+ status_list(Status) ->
811
+ status_list("all", Status).
812
+
813
+
814
+ get_status_list(Host, Status_required) ->
815
+ %% Get list of all logged users
816
+ Sessions = ejabberd_sm:dirty_get_my_sessions_list(),
817
+ %% Reformat the list
818
+ Sessions2 = [ {Session#session.usr, Session#session.sid, Session#session.priority} || Session <- Sessions],
819
+ Fhost = case Host of
820
+ "all" ->
821
+ %% All hosts are requested, so dont filter at all
822
+ fun(_, _) -> true end;
823
+ _ ->
824
+ %% Filter the list, only Host is interesting
825
+ fun(A, B) -> A == B end
826
+ end,
827
+ Sessions3 = [ {Pid, Server, Priority} || {{_User, Server, _Resource}, {_, Pid}, Priority} <- Sessions2, apply(Fhost, [Server, Host])],
828
+ %% For each Pid, get its presence
829
+ Sessions4 = [ {ejabberd_c2s:get_presence(Pid), Server, Priority} || {Pid, Server, Priority} <- Sessions3],
830
+ %% Filter by status
831
+ Fstatus = case Status_required of
832
+ "all" ->
833
+ fun(_, _) -> true end;
834
+ _ ->
835
+ fun(A, B) -> A == B end
836
+ end,
837
+ [{User, Server, Resource, Priority, stringize(Status_text)}
838
+ || {{User, Resource, Status, Status_text}, Server, Priority} <- Sessions4,
839
+ apply(Fstatus, [Status, Status_required])].
840
+
841
+ connected_users_info() ->
842
+ USRIs = dirty_get_sessions_list2(),
843
+ CurrentSec = calendar:datetime_to_gregorian_seconds({date(), time()}),
844
+ lists:map(
845
+ fun([{U, S, R}, {Now, Pid}, Priority, Info]) ->
846
+ Conn = proplists:get_value(conn, Info),
847
+ {Ip, Port} = proplists:get_value(ip, Info),
848
+ IPS = inet_parse:ntoa(Ip),
849
+ NodeS = atom_to_list(node(Pid)),
850
+ Uptime = CurrentSec - calendar:datetime_to_gregorian_seconds(
851
+ calendar:now_to_local_time(Now)),
852
+ {[U, $@, S, $/, R], atom_to_list(Conn), IPS, Port, Priority, NodeS, Uptime}
853
+ end,
854
+ USRIs).
855
+
856
+ connected_users_vhost(Host) ->
857
+ USRs = ejabberd_sm:get_vh_session_list(Host),
858
+ [ [U, $@, S, $/, R] || {U, S, R} <- USRs].
859
+
860
+ %% Code copied from ejabberd_sm.erl and customized
861
+ dirty_get_sessions_list2() ->
862
+ mnesia:dirty_select(
863
+ session,
864
+ [{#session{usr = '$1', sid = '$2', priority = '$3', info = '$4', _ = '_'},
865
+ [],
866
+ [['$1', '$2', '$3', '$4']]}]).
867
+
868
+ %% Make string more print-friendly
869
+ stringize(String) ->
870
+ %% Replace newline characters with other code
871
+ element(2, regexp:gsub(String, "\n", "\\n")).
872
+
873
+ set_presence(User, Host, Resource, Type, Show, Status, Priority) ->
874
+ Pid = ejabberd_sm:get_session_pid(User, Host, Resource),
875
+ USR = User ++ "@" ++ Host ++ "/" ++ Resource,
876
+ US = User ++ "@" ++ Host,
877
+ Message = {route_xmlstreamelement,
878
+ {xmlelement, "presence",
879
+ [{"from", USR}, {"to", US}, {"type", Type}],
880
+ [{xmlelement, "show", [], [{xmlcdata, Show}]},
881
+ {xmlelement, "status", [], [{xmlcdata, Status}]},
882
+ {xmlelement, "priority", [], [{xmlcdata, Priority}]}]}},
883
+ Pid ! Message.
884
+
885
+ user_sessions_info(User, Host) ->
886
+ CurrentSec = calendar:datetime_to_gregorian_seconds({date(), time()}),
887
+ US = {User, Host},
888
+ Sessions = case catch mnesia:dirty_index_read(session, US, #session.us) of
889
+ {'EXIT', _Reason} ->
890
+ [];
891
+ Ss ->
892
+ Ss
893
+ end,
894
+ lists:map(
895
+ fun(Session) ->
896
+ {_U, _S, Resource} = Session#session.usr,
897
+ {Now, Pid} = Session#session.sid,
898
+ {_U, _Resource, Status, StatusText} = ejabberd_c2s:get_presence(Pid),
899
+ Info = Session#session.info,
900
+ Priority = Session#session.priority,
901
+ Conn = proplists:get_value(conn, Info),
902
+ {Ip, Port} = proplists:get_value(ip, Info),
903
+ IPS = inet_parse:ntoa(Ip),
904
+ NodeS = atom_to_list(node(Pid)),
905
+ Uptime = CurrentSec - calendar:datetime_to_gregorian_seconds(
906
+ calendar:now_to_local_time(Now)),
907
+ {atom_to_list(Conn), IPS, Port, Priority, NodeS, Uptime, Status, Resource, StatusText}
908
+ end,
909
+ Sessions).
910
+
911
+
912
+ %%%
913
+ %%% Vcard
914
+ %%%
915
+
916
+ set_nickname(User, Host, Nickname) ->
917
+ R = mod_vcard:process_sm_iq(
918
+ {jid, User, Host, "", User, Host, ""},
919
+ {jid, User, Host, "", User, Host, ""},
920
+ {iq, "", set, "", "en",
921
+ {xmlelement, "vCard",
922
+ [{"xmlns", "vcard-temp"}], [
923
+ {xmlelement, "NICKNAME", [], [{xmlcdata, Nickname}]}
924
+ ]
925
+ }}),
926
+ case R of
927
+ {iq, [], result, [], _L, []} ->
928
+ ok;
929
+ _ ->
930
+ error
931
+ end.
932
+
933
+ get_vcard(User, Host, Name) ->
934
+ [Res | _] = get_vcard_content(User, Host, [Name]),
935
+ Res.
936
+
937
+ get_vcard(User, Host, Name, Subname) ->
938
+ [Res | _] = get_vcard_content(User, Host, [Name, Subname]),
939
+ Res.
940
+
941
+ get_vcard_multi(User, Host, Name, Subname) ->
942
+ get_vcard_content(User, Host, [Name, Subname]).
943
+
944
+ set_vcard(User, Host, Name, SomeContent) ->
945
+ set_vcard_content(User, Host, [Name], SomeContent).
946
+
947
+ set_vcard(User, Host, Name, Subname, SomeContent) ->
948
+ set_vcard_content(User, Host, [Name, Subname], SomeContent).
949
+
950
+
951
+ %%
952
+ %% Internal vcard
953
+
954
+ get_module_resource(Server) ->
955
+ case gen_mod:get_module_opt(Server, ?MODULE, module_resource, none) of
956
+ none -> atom_to_list(?MODULE);
957
+ R when is_list(R) -> R
958
+ end.
959
+
960
+ get_vcard_content(User, Server, Data) ->
961
+ [{_, Module, Function, _Opts}] = ets:lookup(sm_iqtable, {?NS_VCARD, Server}),
962
+ JID = jlib:make_jid(User, Server, get_module_resource(Server)),
963
+ IQ = #iq{type = get, xmlns = ?NS_VCARD},
964
+ IQr = Module:Function(JID, JID, IQ),
965
+ case IQr#iq.sub_el of
966
+ [A1] ->
967
+ case get_vcard(Data, A1) of
968
+ [] -> throw(error_no_value_found_in_vcard);
969
+ ElemList -> [xml:get_tag_cdata(Elem) || Elem <- ElemList]
970
+ end;
971
+ [] ->
972
+ throw(error_no_vcard_found)
973
+ end.
974
+
975
+ get_vcard([Data1, Data2], A1) ->
976
+ case get_subtag(A1, Data1) of
977
+ false -> false;
978
+ A2List -> lists:flatten([get_vcard([Data2], A2) || A2 <- A2List])
979
+ end;
980
+
981
+ get_vcard([Data], A1) ->
982
+ get_subtag(A1, Data).
983
+
984
+ get_subtag(Xmlelement, Name) ->
985
+ case code:ensure_loaded(exmpp_xml) of
986
+ {error, _} ->
987
+ [get_subtag_xml(Xmlelement, Name)];
988
+ {module, exmpp_xml} ->
989
+ get_subtag_exmpp(Xmlelement, Name)
990
+ end.
991
+
992
+ get_subtag_xml(Xmlelement, Name) ->
993
+ xml:get_subtag(Xmlelement, Name).
994
+
995
+ get_subtag_exmpp(Xmlelement, Name) ->
996
+ Xmlel = exmpp_xml:xmlelement_to_xmlel(Xmlelement),
997
+ XmlelList = exmpp_xml:get_elements(Xmlel, Name),
998
+ [exmpp_xml:xmlel_to_xmlelement(Xmlel2) || Xmlel2 <- XmlelList].
999
+
1000
+ set_vcard_content(User, Server, Data, SomeContent) ->
1001
+ ContentList = case SomeContent of
1002
+ [Char | _] when not is_list(Char) -> [SomeContent];
1003
+ [Char | _] when is_list(Char) -> SomeContent
1004
+ end,
1005
+ [{_, Module, Function, _Opts}] = ets:lookup(sm_iqtable, {?NS_VCARD, Server}),
1006
+ JID = jlib:make_jid(User, Server, get_module_resource(Server)),
1007
+ IQ = #iq{type = get, xmlns = ?NS_VCARD},
1008
+ IQr = Module:Function(JID, JID, IQ),
1009
+
1010
+ %% Get old vcard
1011
+ A4 = case IQr#iq.sub_el of
1012
+ [A1] ->
1013
+ {_, _, _, A2} = A1,
1014
+ update_vcard_els(Data, ContentList, A2);
1015
+ [] ->
1016
+ update_vcard_els(Data, ContentList, [])
1017
+ end,
1018
+
1019
+ %% Build new vcard
1020
+ SubEl = {xmlelement, "vCard", [{"xmlns","vcard-temp"}], A4},
1021
+ IQ2 = #iq{type=set, sub_el = SubEl},
1022
+
1023
+ Module:Function(JID, JID, IQ2),
1024
+ ok.
1025
+
1026
+ update_vcard_els(Data, ContentList, Els1) ->
1027
+ Els2 = lists:keysort(2, Els1),
1028
+ [Data1 | Data2] = Data,
1029
+ NewEls = case Data2 of
1030
+ [] ->
1031
+ [{xmlelement, Data1, [], [{xmlcdata,Content}]} || Content <- ContentList];
1032
+ [D2] ->
1033
+ OldEl = case lists:keysearch(Data1, 2, Els2) of
1034
+ {value, A} -> A;
1035
+ false -> {xmlelement, Data1, [], []}
1036
+ end,
1037
+ {xmlelement, _, _, ContentOld1} = OldEl,
1038
+ Content2 = [{xmlelement, D2, [], [{xmlcdata,Content}]} || Content <- ContentList],
1039
+ ContentOld2 = [A || {_, X, _, _} = A <- ContentOld1, X/=D2],
1040
+ ContentOld3 = lists:keysort(2, ContentOld2),
1041
+ ContentNew = lists:keymerge(2, Content2, ContentOld3),
1042
+ [{xmlelement, Data1, [], ContentNew}]
1043
+ end,
1044
+ Els3 = lists:keydelete(Data1, 2, Els2),
1045
+ lists:keymerge(2, NewEls, Els3).
1046
+
1047
+
1048
+ %%%
1049
+ %%% Roster
1050
+ %%%
1051
+
1052
+ add_rosteritem(LocalUser, LocalServer, User, Server, Nick, Group, Subs) ->
1053
+ case add_rosteritem(LocalUser, LocalServer, User, Server, Nick, Group, list_to_atom(Subs), []) of
1054
+ {atomic, ok} ->
1055
+ push_roster_item(LocalUser, LocalServer, User, Server, {add, Nick, Subs, Group}),
1056
+ ok;
1057
+ _ ->
1058
+ error
1059
+ end.
1060
+
1061
+ add_rosteritem(LU, LS, User, Server, Nick, Group, Subscription, Xattrs) ->
1062
+ subscribe(LU, LS, User, Server, Nick, Group, Subscription, Xattrs).
1063
+
1064
+ subscribe(LU, LS, User, Server, Nick, Group, Subscription, Xattrs) ->
1065
+ mnesia:transaction(
1066
+ fun() ->
1067
+ mnesia:write({roster,
1068
+ {LU,LS,{User,Server,[]}}, % uj
1069
+ {LU,LS}, % user
1070
+ {User,Server,[]}, % jid
1071
+ Nick, % name: "Mom", []
1072
+ Subscription, % subscription: none, to=you see him, from=he sees you, both
1073
+ none, % ask: out=send request, in=somebody requests you, none
1074
+ [Group], % groups: ["Family"]
1075
+ Xattrs, % xattrs: [{"category","conference"}]
1076
+ [] % xs: []
1077
+ })
1078
+ end).
1079
+
1080
+ delete_rosteritem(LocalUser, LocalServer, User, Server) ->
1081
+ case unsubscribe(LocalUser, LocalServer, User, Server) of
1082
+ {atomic, ok} ->
1083
+ push_roster_item(LocalUser, LocalServer, User, Server, remove),
1084
+ ok;
1085
+ _ ->
1086
+ error
1087
+ end.
1088
+
1089
+ unsubscribe(LU, LS, User, Server) ->
1090
+ mnesia:transaction(
1091
+ fun() ->
1092
+ mnesia:delete({roster, {LU, LS, {User, Server, []}}})
1093
+ end).
1094
+
1095
+
1096
+ %% -----------------------------
1097
+ %% Get Roster
1098
+ %% -----------------------------
1099
+
1100
+ get_roster(User, Server) ->
1101
+ Items = ejabberd_hooks:run_fold(roster_get, Server, [], [{User, Server}]),
1102
+ make_roster_xmlrpc(Items).
1103
+
1104
+ %% Note: if a contact is in several groups, the contact is returned
1105
+ %% several times, each one in a different group.
1106
+ make_roster_xmlrpc(Roster) ->
1107
+ lists:foldl(
1108
+ fun(Item, Res) ->
1109
+ JIDS = jlib:jid_to_string(Item#roster.jid),
1110
+ Nick = Item#roster.name,
1111
+ Subs = atom_to_list(Item#roster.subscription),
1112
+ Ask = atom_to_list(Item#roster.ask),
1113
+ Groups = case Item#roster.groups of
1114
+ [] -> [""];
1115
+ Gs -> Gs
1116
+ end,
1117
+ ItemsX = [{JIDS, Nick, Subs, Ask, Group}
1118
+ || Group <- Groups],
1119
+ ItemsX ++ Res
1120
+ end,
1121
+ [],
1122
+ Roster).
1123
+
1124
+
1125
+ %%-----------------------------
1126
+ %% Push Roster from file
1127
+ %%-----------------------------
1128
+
1129
+ push_roster(File, User, Server) ->
1130
+ {ok, [Roster]} = file:consult(File),
1131
+ subscribe_roster({User, Server, "", User}, Roster).
1132
+
1133
+ push_roster_all(File) ->
1134
+ {ok, [Roster]} = file:consult(File),
1135
+ subscribe_all(Roster).
1136
+
1137
+ subscribe_all(Roster) ->
1138
+ subscribe_all(Roster, Roster).
1139
+ subscribe_all([], _) ->
1140
+ ok;
1141
+ subscribe_all([User1 | Users], Roster) ->
1142
+ subscribe_roster(User1, Roster),
1143
+ subscribe_all(Users, Roster).
1144
+
1145
+ subscribe_roster(_, []) ->
1146
+ ok;
1147
+ %% Do not subscribe a user to itself
1148
+ subscribe_roster({Name, Server, Group, Nick}, [{Name, Server, _, _} | Roster]) ->
1149
+ subscribe_roster({Name, Server, Group, Nick}, Roster);
1150
+ %% Subscribe Name2 to Name1
1151
+ subscribe_roster({Name1, Server1, Group1, Nick1}, [{Name2, Server2, Group2, Nick2} | Roster]) ->
1152
+ subscribe(Name1, Server1, Name2, Server2, Nick2, Group2, both, []),
1153
+ subscribe_roster({Name1, Server1, Group1, Nick1}, Roster).
1154
+
1155
+ push_alltoall(S, G) ->
1156
+ Users = ejabberd_auth:get_vh_registered_users(S),
1157
+ Users2 = build_list_users(G, Users, []),
1158
+ subscribe_all(Users2),
1159
+ ok.
1160
+
1161
+ build_list_users(_Group, [], Res) ->
1162
+ Res;
1163
+ build_list_users(Group, [{User, Server}|Users], Res) ->
1164
+ build_list_users(Group, Users, [{User, Server, Group, User}|Res]).
1165
+
1166
+ %% @spec(LU, LS, U, S, Action) -> ok
1167
+ %% Action = {add, Nick, Subs, Group} | remove
1168
+ %% @doc Push to the roster of account LU@LS the contact U@S.
1169
+ %% The specific action to perform is defined in Action.
1170
+ push_roster_item(LU, LS, U, S, Action) ->
1171
+ lists:foreach(fun(R) ->
1172
+ push_roster_item(LU, LS, R, U, S, Action)
1173
+ end, ejabberd_sm:get_user_resources(LU, LS)).
1174
+
1175
+ push_roster_item(LU, LS, R, U, S, Action) ->
1176
+ LJID = jlib:make_jid(LU, LS, R),
1177
+ BroadcastEl = build_broadcast(U, S, Action),
1178
+ ejabberd_router:route(LJID, LJID, BroadcastEl),
1179
+ Item = build_roster_item(U, S, Action),
1180
+ ResIQ = build_iq_roster_push(Item),
1181
+ ejabberd_router:route(LJID, LJID, ResIQ).
1182
+
1183
+ build_roster_item(U, S, {add, Nick, Subs, Group}) ->
1184
+ {xmlelement, "item",
1185
+ [{"jid", jlib:jid_to_string(jlib:make_jid(U, S, ""))},
1186
+ {"name", Nick},
1187
+ {"subscription", Subs}],
1188
+ [{xmlelement, "group", [], [{xmlcdata, Group}]}]
1189
+ };
1190
+ build_roster_item(U, S, remove) ->
1191
+ {xmlelement, "item",
1192
+ [{"jid", jlib:jid_to_string(jlib:make_jid(U, S, ""))},
1193
+ {"subscription", "remove"}],
1194
+ []
1195
+ }.
1196
+
1197
+ build_iq_roster_push(Item) ->
1198
+ {xmlelement, "iq",
1199
+ [{"type", "set"}, {"id", "push"}],
1200
+ [{xmlelement, "query",
1201
+ [{"xmlns", ?NS_ROSTER}],
1202
+ [Item]
1203
+ }
1204
+ ]
1205
+ }.
1206
+
1207
+ build_broadcast(U, S, {add, _Nick, Subs, _Group}) ->
1208
+ build_broadcast(U, S, list_to_atom(Subs));
1209
+ build_broadcast(U, S, remove) ->
1210
+ build_broadcast(U, S, none);
1211
+ %% @spec (U::string(), S::string(), Subs::atom()) -> any()
1212
+ %% Subs = both | from | to | none
1213
+ build_broadcast(U, S, SubsAtom) when is_atom(SubsAtom) ->
1214
+ {xmlelement, "broadcast", [],
1215
+ [{item, {U, S, ""}, SubsAtom}]
1216
+ }.
1217
+
1218
+ %%%
1219
+ %%% Last Activity
1220
+ %%%
1221
+
1222
+ set_last(User, Server, Timestamp, Status) ->
1223
+ Mod = get_lastactivity_module(Server),
1224
+ Mod:store_last_info(User, Server, Timestamp, Status).
1225
+
1226
+ %%%
1227
+ %%% Private Storage
1228
+ %%%
1229
+
1230
+ %% Example usage:
1231
+ %% $ ejabberdctl private_set badlop localhost "\<aa\ xmlns=\'bb\'\>Cluth\</aa\>"
1232
+ %% $ ejabberdctl private_get badlop localhost aa bb
1233
+ %% <aa xmlns='bb'>Cluth</aa>
1234
+
1235
+ private_get(Username, Host, Element, Ns) ->
1236
+ From = jlib:make_jid(Username, Host, ""),
1237
+ To = jlib:make_jid(Username, Host, ""),
1238
+ IQ = {iq, "", get, ?NS_PRIVATE, "",
1239
+ {xmlelement,"query",
1240
+ [{"xmlns",?NS_PRIVATE}],
1241
+ [{xmlelement, Element, [{"xmlns", Ns}], []}]}},
1242
+ ResIq = mod_private:process_sm_iq(From, To, IQ),
1243
+ [{xmlelement,"query",
1244
+ [{"xmlns","jabber:iq:private"}],
1245
+ [SubEl]}] = ResIq#iq.sub_el,
1246
+ xml:element_to_string(SubEl).
1247
+
1248
+ private_set(Username, Host, ElementString) ->
1249
+ case xml_stream:parse_element(ElementString) of
1250
+ {error, Error} ->
1251
+ io:format("Error found parsing the element:~n ~p~nError: ~p~n",
1252
+ [ElementString, Error]),
1253
+ error;
1254
+ Xml ->
1255
+ private_set2(Username, Host, Xml)
1256
+ end.
1257
+
1258
+ private_set2(Username, Host, Xml) ->
1259
+ From = jlib:make_jid(Username, Host, ""),
1260
+ To = jlib:make_jid(Username, Host, ""),
1261
+ IQ = {iq, "", set, ?NS_PRIVATE, "",
1262
+ {xmlelement,"query",
1263
+ [{"xmlns",?NS_PRIVATE}],
1264
+ [Xml]}},
1265
+ mod_private:process_sm_iq(From, To, IQ),
1266
+ ok.
1267
+
1268
+ %%%
1269
+ %%% Shared Roster Groups
1270
+ %%%
1271
+
1272
+ srg_create(Group, Host, Name, Description, Display) ->
1273
+ {ok, DisplayList} = case Display of
1274
+ [] -> {ok, []};
1275
+ _ -> regexp:split(Display, "\\\\n")
1276
+ end,
1277
+ Opts = [{name, Name},
1278
+ {displayed_groups, DisplayList},
1279
+ {description, Description}],
1280
+ {atomic, ok} = mod_shared_roster:create_group(Host, Group, Opts),
1281
+ ok.
1282
+
1283
+ srg_delete(Group, Host) ->
1284
+ {atomic, ok} = mod_shared_roster:delete_group(Host, Group),
1285
+ ok.
1286
+
1287
+ srg_list(Host) ->
1288
+ lists:sort(mod_shared_roster:list_groups(Host)).
1289
+
1290
+ srg_get_info(Group, Host) ->
1291
+ Opts = mod_shared_roster:get_group_opts(Host,Group),
1292
+ [{io_lib:format("~p", [Title]),
1293
+ io_lib:format("~p", [Value])} || {Title, Value} <- Opts].
1294
+
1295
+ srg_get_members(Group, Host) ->
1296
+ Members = mod_shared_roster:get_group_explicit_users(Host,Group),
1297
+ [jlib:jid_to_string(jlib:make_jid(MUser, MServer, ""))
1298
+ || {MUser, MServer} <- Members].
1299
+
1300
+ srg_user_add(User, Host, Group, GroupHost) ->
1301
+ {atomic, ok} = mod_shared_roster:add_user_to_group(GroupHost, {User, Host}, Group),
1302
+ ok.
1303
+
1304
+ srg_user_del(User, Host, Group, GroupHost) ->
1305
+ {atomic, ok} = mod_shared_roster:remove_user_from_group(GroupHost, {User, Host}, Group),
1306
+ ok.
1307
+
1308
+
1309
+ %%%
1310
+ %%% Stanza
1311
+ %%%
1312
+
1313
+ %% @doc Send a chat message to a Jabber account.
1314
+ %% @spec (From::string(), To::string(), Body::string()) -> ok
1315
+ send_message_chat(From, To, Body) ->
1316
+ Packet = build_packet(message_chat, [Body]),
1317
+ send_packet_all_resources(From, To, Packet).
1318
+
1319
+ %% @doc Send a headline message to a Jabber account.
1320
+ %% @spec (From::string(), To::string(), Subject::string(), Body::string()) -> ok
1321
+ send_message_headline(From, To, Subject, Body) ->
1322
+ Packet = build_packet(message_headline, [Subject, Body]),
1323
+ send_packet_all_resources(From, To, Packet).
1324
+
1325
+ %% @doc Send a packet to a Jabber account.
1326
+ %% If a resource was specified in the JID,
1327
+ %% the packet is sent only to that specific resource.
1328
+ %% If no resource was specified in the JID,
1329
+ %% and the user is remote or local but offline,
1330
+ %% the packet is sent to the bare JID.
1331
+ %% If the user is local and is online in several resources,
1332
+ %% the packet is sent to all its resources.
1333
+ send_packet_all_resources(FromJIDString, ToJIDString, Packet) ->
1334
+ FromJID = jlib:string_to_jid(FromJIDString),
1335
+ ToJID = jlib:string_to_jid(ToJIDString),
1336
+ ToUser = ToJID#jid.user,
1337
+ ToServer = ToJID#jid.server,
1338
+ case ToJID#jid.resource of
1339
+ "" ->
1340
+ send_packet_all_resources(FromJID, ToUser, ToServer, Packet);
1341
+ Res ->
1342
+ send_packet_all_resources(FromJID, ToUser, ToServer, Res, Packet)
1343
+ end.
1344
+
1345
+ send_packet_all_resources(FromJID, ToUser, ToServer, Packet) ->
1346
+ case ejabberd_sm:get_user_resources(ToUser, ToServer) of
1347
+ [] ->
1348
+ send_packet_all_resources(FromJID, ToUser, ToServer, "", Packet);
1349
+ ToResources ->
1350
+ lists:foreach(
1351
+ fun(ToResource) ->
1352
+ send_packet_all_resources(FromJID, ToUser, ToServer,
1353
+ ToResource, Packet)
1354
+ end,
1355
+ ToResources)
1356
+ end.
1357
+
1358
+ send_packet_all_resources(FromJID, ToU, ToS, ToR, Packet) ->
1359
+ ToJID = jlib:make_jid(ToU, ToS, ToR),
1360
+ ejabberd_router:route(FromJID, ToJID, Packet).
1361
+
1362
+
1363
+ build_packet(message_chat, [Body]) ->
1364
+ {xmlelement, "message",
1365
+ [{"type", "chat"}, {"id", randoms:get_string()}],
1366
+ [{xmlelement, "body", [], [{xmlcdata, Body}]}]
1367
+ };
1368
+ build_packet(message_headline, [Subject, Body]) ->
1369
+ {xmlelement, "message",
1370
+ [{"type", "headline"}, {"id", randoms:get_string()}],
1371
+ [{xmlelement, "subject", [], [{xmlcdata, Subject}]},
1372
+ {xmlelement, "body", [], [{xmlcdata, Body}]}
1373
+ ]
1374
+ }.
1375
+
1376
+ send_stanza_c2s(Username, Host, Resource, Stanza) ->
1377
+ C2sPid = ejabberd_sm:get_session_pid(Username, Host, Resource),
1378
+ XmlEl = xml_stream:parse_element(Stanza),
1379
+ p1_fsm:send_event(C2sPid, {xmlstreamelement, XmlEl}).
1380
+
1381
+ privacy_set(Username, Host, QueryS) ->
1382
+ From = jlib:string_to_jid(Username ++ "@" ++ Host),
1383
+ To = jlib:string_to_jid(Host),
1384
+ QueryEl = xml_stream:parse_element(QueryS),
1385
+ StanzaEl = {xmlelement, "iq", [{"type", "set"}], [QueryEl]},
1386
+ IQ = jlib:iq_query_info(StanzaEl),
1387
+ {result, []} = ejabberd_hooks:run_fold(
1388
+ privacy_iq_set,
1389
+ Host,
1390
+ {error, ?ERR_FEATURE_NOT_IMPLEMENTED},
1391
+ [From, To, IQ]
1392
+ ),
1393
+ ok.
1394
+
1395
+ %%%
1396
+ %%% Stats
1397
+ %%%
1398
+
1399
+ stats(Name) ->
1400
+ case Name of
1401
+ "uptimeseconds" -> trunc(element(1, erlang:statistics(wall_clock))/1000);
1402
+ "registeredusers" -> length(ejabberd_auth:dirty_get_registered_users());
1403
+ "onlineusersnode" -> length(ejabberd_sm:dirty_get_my_sessions_list());
1404
+ "onlineusers" -> length(ejabberd_sm:dirty_get_sessions_list())
1405
+ end.
1406
+
1407
+ stats(Name, Host) ->
1408
+ case Name of
1409
+ "registeredusers" -> length(ejabberd_auth:get_vh_registered_users(Host));
1410
+ "onlineusers" -> length(ejabberd_sm:get_vh_session_list(Host))
1411
+ end.
1412
+
1413
+
1414
+
1415
+ %%-----------------------------
1416
+ %% Purge roster items
1417
+ %%-----------------------------
1418
+
1419
+ process_rosteritems(ActionS, SubsS, AsksS, UsersS, ContactsS) ->
1420
+ Action = case ActionS of
1421
+ "list" -> list;
1422
+ "delete" -> delete
1423
+ end,
1424
+
1425
+ Subs = lists:foldl(
1426
+ fun(any, _) -> [none, from, to, both];
1427
+ (Sub, Subs) -> [Sub | Subs]
1428
+ end,
1429
+ [],
1430
+ [list_to_atom(S) || S <- string:tokens(SubsS, ":")]
1431
+ ),
1432
+
1433
+ Asks = lists:foldl(
1434
+ fun(any, _) -> [none, out, in];
1435
+ (Ask, Asks) -> [Ask | Asks]
1436
+ end,
1437
+ [],
1438
+ [list_to_atom(S) || S <- string:tokens(AsksS, ":")]
1439
+ ),
1440
+
1441
+ Users = lists:foldl(
1442
+ fun("any", _) -> ["*", "*@*"];
1443
+ (U, Us) -> [U | Us]
1444
+ end,
1445
+ [],
1446
+ [S || S <- string:tokens(UsersS, ":")]
1447
+ ),
1448
+
1449
+ Contacts = lists:foldl(
1450
+ fun("any", _) -> ["*", "*@*"];
1451
+ (U, Us) -> [U | Us]
1452
+ end,
1453
+ [],
1454
+ [S || S <- string:tokens(ContactsS, ":")]
1455
+ ),
1456
+
1457
+ case rosteritem_purge({Action, Subs, Asks, Users, Contacts}) of
1458
+ {atomic, ok} ->
1459
+ ok;
1460
+ {error, Reason} ->
1461
+ io:format("Error purging rosteritems: ~p~n", [Reason]),
1462
+ error;
1463
+ {badrpc, Reason} ->
1464
+ io:format("BadRPC purging rosteritems: ~p~n", [Reason]),
1465
+ error
1466
+ end.
1467
+
1468
+ %% @spec ({Action::atom(), Subs::[atom()], Asks::[atom()], User::string(), Contact::string()}) -> {atomic, ok}
1469
+ rosteritem_purge(Options) ->
1470
+ Num_rosteritems = mnesia:table_info(roster, size),
1471
+ io:format("There are ~p roster items in total.~n", [Num_rosteritems]),
1472
+ Key = mnesia:dirty_first(roster),
1473
+ ok = rip(Key, Options, {0, Num_rosteritems, 0, 0}),
1474
+ {atomic, ok}.
1475
+
1476
+ rip('$end_of_table', _Options, Counters) ->
1477
+ print_progress_line(Counters),
1478
+ ok;
1479
+ rip(Key, Options, {Pr, NT, NV, ND}) ->
1480
+ Key_next = mnesia:dirty_next(roster, Key),
1481
+ {Action, _, _, _, _} = Options,
1482
+ ND2 = case decide_rip(Key, Options) of
1483
+ true ->
1484
+ apply_action(Action, Key),
1485
+ ND+1;
1486
+ false ->
1487
+ ND
1488
+ end,
1489
+ NV2 = NV+1,
1490
+ Pr2 = print_progress_line({Pr, NT, NV2, ND2}),
1491
+ rip(Key_next, Options, {Pr2, NT, NV2, ND2}).
1492
+
1493
+ apply_action(list, Key) ->
1494
+ {User, Server, JID} = Key,
1495
+ {RUser, RServer, _} = JID,
1496
+ io:format("Matches: ~s@~s ~s@~s~n", [User, Server, RUser, RServer]);
1497
+ apply_action(delete, Key) ->
1498
+ apply_action(list, Key),
1499
+ mnesia:dirty_delete(roster, Key).
1500
+
1501
+ print_progress_line({Pr, NT, NV, ND}) ->
1502
+ Pr2 = trunc((NV/NT)*100),
1503
+ case Pr == Pr2 of
1504
+ true ->
1505
+ ok;
1506
+ false ->
1507
+ io:format("Progress ~p% - visited ~p - deleted ~p~n", [Pr2, NV, ND])
1508
+ end,
1509
+ Pr2.
1510
+
1511
+ decide_rip(Key, {_Action, Subs, Asks, User, Contact}) ->
1512
+ case catch mnesia:dirty_read(roster, Key) of
1513
+ [RI] ->
1514
+ lists:member(RI#roster.subscription, Subs)
1515
+ andalso lists:member(RI#roster.ask, Asks)
1516
+ andalso decide_rip_jid(RI#roster.us, User)
1517
+ andalso decide_rip_jid(RI#roster.jid, Contact);
1518
+ _ ->
1519
+ false
1520
+ end.
1521
+
1522
+ %% Returns true if the server of the JID is included in the servers
1523
+ decide_rip_jid({UName, UServer, _UResource}, Match_list) ->
1524
+ decide_rip_jid({UName, UServer}, Match_list);
1525
+ decide_rip_jid({UName, UServer}, Match_list) ->
1526
+ lists:any(
1527
+ fun(Match_string) ->
1528
+ MJID = jlib:string_to_jid(Match_string),
1529
+ MName = MJID#jid.luser,
1530
+ MServer = MJID#jid.lserver,
1531
+ Is_server = is_glob_match(UServer, MServer),
1532
+ case MName of
1533
+ [] when UName == [] ->
1534
+ Is_server;
1535
+ [] ->
1536
+ false;
1537
+ _ ->
1538
+ Is_server
1539
+ andalso is_glob_match(UName, MName)
1540
+ end
1541
+ end,
1542
+ Match_list).
1543
+
1544
+ %% Copied from ejabberd-2.0.0/src/acl.erl
1545
+ is_regexp_match(String, RegExp) ->
1546
+ case regexp:first_match(String, RegExp) of
1547
+ nomatch ->
1548
+ false;
1549
+ {match, _, _} ->
1550
+ true;
1551
+ {error, ErrDesc} ->
1552
+ io:format(
1553
+ "Wrong regexp ~p in ACL: ~p",
1554
+ [RegExp, lists:flatten(regexp:format_error(ErrDesc))]),
1555
+ false
1556
+ end.
1557
+ is_glob_match(String, [$! | Glob]) ->
1558
+ not is_regexp_match(String, regexp:sh_to_awk(Glob));
1559
+ is_glob_match(String, Glob) ->
1560
+ is_regexp_match(String, regexp:sh_to_awk(Glob)).