mad_chatter 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
- }