mad_chatter 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.txt CHANGED
@@ -1,6 +1,13 @@
1
1
  Mad Chatter
2
2
 
3
- Version 0.1.1
3
+ Version 0.2.0
4
+ - Added a '/clear' command to client-side javascript to be able to clear all chat messages
5
+ - Fixed HTML injection vulnerability by adding markdown parsing and escaping all incoming html
6
+ - Created a MacRuby application as a GUI wrapper (still need to add a link to the github repo)
7
+ - Disabled extensions directory for now since example is no longer working.
8
+ - Finally added /youtube example mentioned in the readme
9
+
10
+ Version 0.1.1-3
4
11
  - Added a 'preview' command to CLI to run both a web server and web socket server
5
12
  - Fixed bug where user leaving chatroom didn't notify other users
6
13
 
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mad_chatter (0.1.1)
4
+ mad_chatter (0.2.0)
5
5
  em-websocket
6
6
  eventmachine
7
+ redcarpet
7
8
  thor
8
9
 
9
10
  GEM
@@ -11,10 +12,11 @@ GEM
11
12
  specs:
12
13
  addressable (2.2.6)
13
14
  diff-lcs (1.1.3)
14
- em-websocket (0.3.5)
15
+ em-websocket (0.3.6)
15
16
  addressable (>= 2.1.1)
16
17
  eventmachine (>= 0.12.9)
17
18
  eventmachine (0.12.10)
19
+ redcarpet (2.0.1)
18
20
  rspec (2.7.0)
19
21
  rspec-core (~> 2.7.0)
20
22
  rspec-expectations (~> 2.7.0)
data/README.md CHANGED
@@ -16,7 +16,7 @@ This command will generate the following structure:
16
16
 
17
17
  mychatroom/
18
18
  config.rb
19
- extensions/
19
+ extensions.rb
20
20
  web/
21
21
  index.html
22
22
  javascript.js
@@ -58,7 +58,7 @@ If you want to customize the html/css of your chatroom, you'll find them in the
58
58
 
59
59
  There is an example config file that shows a few examples of things you can customize.
60
60
 
61
- The extensions directory is for you to create your own chat actions. You can add your custom extensions by specifying them in the config file.
61
+ The extensions.rb file is for you to create your own chat extensions. You will find an example in that file.
62
62
 
63
63
 
64
64
  ##Contributing
data/TODO.txt CHANGED
@@ -1,5 +1,10 @@
1
1
  Goal: to become an open-source version of https://www.hipchat.com/
2
2
 
3
3
  TODO:
4
- Fix 'leave chatroom' functionality
5
- Fix 'HTML injection' security vulnerability
4
+
5
+ FEATURES:
6
+ ...
7
+
8
+ BUGS:
9
+ ...
10
+
data/bin/mad_chatter CHANGED
@@ -15,11 +15,10 @@ module MadChatter
15
15
  def new(name)
16
16
  copy_file "templates/config.yml", "#{name}/config.yml"
17
17
  copy_file "templates/extensions.rb", "#{name}/extensions.rb"
18
- empty_directory "#{name}/extensions"
18
+ # empty_directory "#{name}/extensions"
19
19
  copy_file "templates/web/index.html", "#{name}/web/index.html"
20
20
  copy_file "templates/web/javascript.js", "#{name}/web/javascript.js"
21
- copy_file "templates/web/stylesheets/reset.css", "#{name}/web/stylesheets/reset.css"
22
- copy_file "templates/web/stylesheets/styles.css", "#{name}/web/stylesheets/styles.css"
21
+ copy_file "templates/web/styles.css", "#{name}/web/styles.css"
23
22
  end
24
23
 
25
24
  desc 'preview', 'Starts both a web server and the Mad Chatter chat server'
@@ -39,9 +39,9 @@ module MadChatter
39
39
  MadChatter::Extensions.load_simple_extensions(file_contents)
40
40
  end
41
41
 
42
- Dir[Dir.pwd + '/extensions/*.rb'].each do |file|
43
- require file
44
- end
42
+ # Dir[Dir.pwd + '/extensions/*.rb'].each do |file|
43
+ # require file
44
+ # end
45
45
  end
46
46
 
47
47
  end
@@ -52,7 +52,7 @@ module MadChatter
52
52
  def message_received(json)
53
53
  msg = JSON.parse(json)
54
54
  username = MadChatter::Users.find_username_by_token(msg['token'])
55
- message = MadChatter::Message.new(msg['type'], msg['message'], msg['token'], username)
55
+ message = MadChatter::Message.new(msg['type'], filter_message(msg['message']), msg['token'], username)
56
56
 
57
57
  if message.token.nil?
58
58
  return # Token is required to send messages
@@ -78,6 +78,19 @@ module MadChatter
78
78
  end
79
79
  end
80
80
 
81
+ def filter_message(text)
82
+ @markdown ||= Redcarpet::Markdown.new(
83
+ Redcarpet::Render::HTML.new(
84
+ :filter_html => true,
85
+ :hard_wrap => true
86
+ ),
87
+ :autolink => true,
88
+ :no_intra_emphasis => true
89
+ )
90
+ filtered_text = @markdown.render(text)
91
+ filtered_text = /^<p>(.*)<\/p>$/.match(filtered_text)[1] # remove the <p> tags that markdown wraps by default
92
+ end
93
+
81
94
  def self.send_json(json)
82
95
  MadChatter::Server.main_channel.push(json)
83
96
  end
@@ -1,5 +1,5 @@
1
1
  module MadChatter
2
2
 
3
- VERSION = '0.1.3'
3
+ VERSION = '0.2.0'
4
4
 
5
5
  end
data/lib/mad_chatter.rb CHANGED
@@ -2,6 +2,7 @@ lib_dir = File.expand_path('..', __FILE__)
2
2
  $:.unshift( lib_dir ) unless $:.include?( lib_dir )
3
3
 
4
4
  require 'eventmachine'
5
+ require 'redcarpet'
5
6
  require 'yaml'
6
7
  require 'json'
7
8
  require 'digest/sha1'
data/mad_chatter.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_runtime_dependency "thor"
22
22
  s.add_runtime_dependency "eventmachine"
23
23
  s.add_runtime_dependency "em-websocket"
24
- # s.add_runtime_dependency "sinatra"
24
+ s.add_runtime_dependency "redcarpet"
25
25
 
26
26
  s.add_development_dependency "rspec"
27
27
  s.add_development_dependency "shoulda"
@@ -1,5 +1,6 @@
1
+ # I dont think this works anymore
2
+
1
3
  class Example
2
-
3
4
  # include MadChatter::Extension
4
5
 
5
6
  def handle(message)
@@ -7,7 +7,12 @@
7
7
  #
8
8
  # Example:
9
9
  #
10
- # on_message /hey andrew: (.+)/ do |msg|
10
+ # on_message /hey andrew: (.+)/ do |regex_capture|
11
11
  # send_status_message 'Someone is talking to andrew'
12
12
  # end
13
- #
13
+ #
14
+
15
+ on_message %r{/youtube http://youtu.be/(.*)} do |youtube_id|
16
+ send_message "<iframe width='560' height='315' src='http://www.youtube.com/embed/#{youtube_id}' frameborder='0' allowfullscreen></iframe>"
17
+ stop_message_handling
18
+ end
@@ -2,8 +2,7 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>Mad Chatter</title>
5
- <link rel="stylesheet" href="stylesheets/reset.css">
6
- <link rel="stylesheet" href="stylesheets/styles.css">
5
+ <link rel="stylesheet" href="styles.css">
7
6
  <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js'></script>
8
7
  <script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'></script>
9
8
  <script src='javascript.js'></script>
@@ -1,15 +1,3 @@
1
- function get_current_time(){
2
- var time = new Date();
3
- var hours = time.getHours();
4
- var minutes = time.getMinutes();
5
- var ampm = 'am';
6
- if (hours > 11) { ampm = 'pm'; }
7
- if (minutes < 10) { minutes = "0" + minutes; }
8
- if (hours == 0) { hours = 12; }
9
- if (hours > 12) { hours = hours - 12; }
10
- return hours + ':' + minutes + ampm;
11
- }
12
-
13
1
  var MadChatter = {
14
2
 
15
3
  init: function(ws_host){
@@ -52,7 +40,7 @@ var MadChatter = {
52
40
  var keyboard = $("#keyboard input");
53
41
  keyboard.keyup(function (event) {
54
42
  if (event.keyCode == 13) { // The enter key.
55
- MadChatter.send_message(keyboard.val());
43
+ MadChatter.send_message(keyboard.val());
56
44
  keyboard.val('');
57
45
  }
58
46
  });
@@ -109,11 +97,11 @@ var MadChatter = {
109
97
  },
110
98
 
111
99
  display_status: function(message){
112
- $("#messages").append("<p class='status'>" + message + "<time>" + get_current_time() + "</time></p>");
100
+ $("#messages").append("<p class='status'>" + message + "<time>" + MadChatter.get_current_time() + "</time></p>");
113
101
  },
114
102
 
115
103
  display_message: function(username, message){
116
- $("#messages").append("<p class='message'><span class='username'>" + username + ":</span> " + message + "<time>" + get_current_time() + "</time></p>");
104
+ $("#messages").append("<p class='message'><span class='username'>" + username + ":</span> " + message + "<time>" + MadChatter.get_current_time() + "</time></p>");
117
105
  },
118
106
 
119
107
  scroll_to_bottom_of_chat: function(){
@@ -121,11 +109,31 @@ var MadChatter = {
121
109
  },
122
110
 
123
111
  send_message: function(message){
124
- MadChatter.send_json('message', message);
112
+ if (message == '/clear') {
113
+ MadChatter.clear_messages();
114
+ } else {
115
+ MadChatter.send_json('message', message);
116
+ }
125
117
  },
126
118
 
127
119
  send_json: function(type, msg){
128
120
  var json = { type: type, token: MadChatter.client_token, message: msg };
129
121
  MadChatter.ws.send(JSON.stringify(json));
122
+ },
123
+
124
+ clear_messages: function(){
125
+ $('#messages').empty();
126
+ },
127
+
128
+ get_current_time: function(){
129
+ var time = new Date();
130
+ var hours = time.getHours();
131
+ var minutes = time.getMinutes();
132
+ var ampm = 'am';
133
+ if (hours > 11) { ampm = 'pm'; }
134
+ if (minutes < 10) { minutes = "0" + minutes; }
135
+ if (hours == 0) { hours = 12; }
136
+ if (hours > 12) { hours = hours - 12; }
137
+ return hours + ':' + minutes + ampm;
130
138
  }
131
139
  };
@@ -1,3 +1,57 @@
1
+ /*
2
+ * CSS Reset Styles
3
+ * http://meyerweb.com/eric/tools/css/reset/
4
+ * v2.0 | 20110126
5
+ * License: none (public domain)
6
+ */
7
+ html, body, div, span, applet, object, iframe,
8
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
9
+ a, abbr, acronym, address, big, cite, code,
10
+ del, dfn, em, img, ins, kbd, q, s, samp,
11
+ small, strike, strong, sub, sup, tt, var,
12
+ b, u, i, center,
13
+ dl, dt, dd, ol, ul, li,
14
+ fieldset, form, label, legend,
15
+ table, caption, tbody, tfoot, thead, tr, th, td,
16
+ article, aside, canvas, details, embed,
17
+ figure, figcaption, footer, header, hgroup,
18
+ menu, nav, output, ruby, section, summary,
19
+ time, mark, audio, video {
20
+ margin: 0;
21
+ padding: 0;
22
+ border: 0;
23
+ font-size: 100%;
24
+ font: inherit;
25
+ vertical-align: baseline;
26
+ }
27
+ /* HTML5 display-role reset for older browsers */
28
+ article, aside, details, figcaption, figure,
29
+ footer, header, hgroup, menu, nav, section {
30
+ display: block;
31
+ }
32
+ body {
33
+ line-height: 1;
34
+ }
35
+ ol, ul {
36
+ list-style: none;
37
+ }
38
+ blockquote, q {
39
+ quotes: none;
40
+ }
41
+ blockquote:before, blockquote:after,
42
+ q:before, q:after {
43
+ content: '';
44
+ content: none;
45
+ }
46
+ table {
47
+ border-collapse: collapse;
48
+ border-spacing: 0;
49
+ }
50
+
51
+ /*
52
+ * Mad Chatter Styles
53
+ */
54
+
1
55
  #login_screen header {
2
56
  padding: 150px 0 20px;
3
57
  color: #fff;
@@ -70,8 +124,7 @@
70
124
  color: #999;
71
125
  }
72
126
 
73
- #keyboard{
74
- /* position:absolute;*/
127
+ #keyboard {
75
128
  bottom:0;
76
129
  left:220px;
77
130
  width:400%;
@@ -101,4 +154,12 @@
101
154
  * html div#messages{
102
155
  height:100%;
103
156
  overflow:auto;
157
+ }
158
+
159
+ /* Message Markdown Styles */
160
+ .message pre, .message code {
161
+ font: 12px 'Bitstream Vera Sans Mono','Courier',monospace;
162
+ padding: 0!important;
163
+ background-color: #EEE!important;
164
+ border: 1px solid #DDD;
104
165
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mad_chatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-22 00:00:00.000000000 Z
12
+ date: 2012-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
16
- requirement: &2153285260 !ruby/object:Gem::Requirement
16
+ requirement: &2169116300 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2153285260
24
+ version_requirements: *2169116300
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2153284840 !ruby/object:Gem::Requirement
27
+ requirement: &2156007600 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2153284840
35
+ version_requirements: *2156007600
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-websocket
38
- requirement: &2153284420 !ruby/object:Gem::Requirement
38
+ requirement: &2156002260 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,21 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2153284420
46
+ version_requirements: *2156002260
47
+ - !ruby/object:Gem::Dependency
48
+ name: redcarpet
49
+ requirement: &2164626100 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2164626100
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: rspec
49
- requirement: &2153284000 !ruby/object:Gem::Requirement
60
+ requirement: &2164625680 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *2153284000
68
+ version_requirements: *2164625680
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: shoulda
60
- requirement: &2153283580 !ruby/object:Gem::Requirement
71
+ requirement: &2164625260 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,7 +76,7 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2153283580
79
+ version_requirements: *2164625260
69
80
  description: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5
70
81
  Web Sockets
71
82
  email:
@@ -104,8 +115,7 @@ files:
104
115
  - templates/extensions/example.rb
105
116
  - templates/web/index.html
106
117
  - templates/web/javascript.js
107
- - templates/web/stylesheets/reset.css
108
- - templates/web/stylesheets/styles.css
118
+ - templates/web/styles.css
109
119
  - test/helper.rb
110
120
  - test/test_mad_chatter.rb
111
121
  homepage: http://github.com/andrewhavens/mad_chatter
@@ -1,48 +0,0 @@
1
- /* http://meyerweb.com/eric/tools/css/reset/
2
- v2.0 | 20110126
3
- License: none (public domain)
4
- */
5
-
6
- html, body, div, span, applet, object, iframe,
7
- h1, h2, h3, h4, h5, h6, p, blockquote, pre,
8
- a, abbr, acronym, address, big, cite, code,
9
- del, dfn, em, img, ins, kbd, q, s, samp,
10
- small, strike, strong, sub, sup, tt, var,
11
- b, u, i, center,
12
- dl, dt, dd, ol, ul, li,
13
- fieldset, form, label, legend,
14
- table, caption, tbody, tfoot, thead, tr, th, td,
15
- article, aside, canvas, details, embed,
16
- figure, figcaption, footer, header, hgroup,
17
- menu, nav, output, ruby, section, summary,
18
- time, mark, audio, video {
19
- margin: 0;
20
- padding: 0;
21
- border: 0;
22
- font-size: 100%;
23
- font: inherit;
24
- vertical-align: baseline;
25
- }
26
- /* HTML5 display-role reset for older browsers */
27
- article, aside, details, figcaption, figure,
28
- footer, header, hgroup, menu, nav, section {
29
- display: block;
30
- }
31
- body {
32
- line-height: 1;
33
- }
34
- ol, ul {
35
- list-style: none;
36
- }
37
- blockquote, q {
38
- quotes: none;
39
- }
40
- blockquote:before, blockquote:after,
41
- q:before, q:after {
42
- content: '';
43
- content: none;
44
- }
45
- table {
46
- border-collapse: collapse;
47
- border-spacing: 0;
48
- }