ses-proxy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/app/public/bootstrap/css/bootstrap-responsive.css +1092 -0
  2. data/app/public/bootstrap/css/bootstrap-responsive.min.css +9 -0
  3. data/app/public/bootstrap/css/bootstrap.css +6039 -0
  4. data/app/public/bootstrap/css/bootstrap.min.css +9 -0
  5. data/app/public/bootstrap/img/glyphicons-halflings-white.png +0 -0
  6. data/app/public/bootstrap/img/glyphicons-halflings.png +0 -0
  7. data/app/public/bootstrap/js/bootstrap.js +2159 -0
  8. data/app/public/bootstrap/js/bootstrap.min.js +6 -0
  9. data/app/public/css/application.css +16 -0
  10. data/app/public/datepicker/css/datepicker.css +7 -0
  11. data/app/public/datepicker/js/bootstrap-datepicker.js +454 -0
  12. data/app/public/datepicker/less/datepicker.less +119 -0
  13. data/app/public/highcharts/adapters/mootools-adapter.js +13 -0
  14. data/app/public/highcharts/adapters/mootools-adapter.src.js +327 -0
  15. data/app/public/highcharts/adapters/prototype-adapter.js +16 -0
  16. data/app/public/highcharts/adapters/prototype-adapter.src.js +385 -0
  17. data/app/public/highcharts/highcharts-more.js +35 -0
  18. data/app/public/highcharts/highcharts.js +246 -0
  19. data/app/public/highcharts/highcharts.src.js +15111 -0
  20. data/app/public/highcharts/modules/canvas-tools.js +133 -0
  21. data/app/public/highcharts/modules/canvas-tools.src.js +3113 -0
  22. data/app/public/highcharts/modules/data.js +11 -0
  23. data/app/public/highcharts/modules/data.src.js +277 -0
  24. data/app/public/highcharts/modules/exporting.js +23 -0
  25. data/app/public/highcharts/modules/exporting.src.js +736 -0
  26. data/app/public/highcharts/themes/dark-blue.js +263 -0
  27. data/app/public/highcharts/themes/dark-green.js +263 -0
  28. data/app/public/highcharts/themes/gray.js +262 -0
  29. data/app/public/highcharts/themes/grid.js +95 -0
  30. data/app/public/highcharts/themes/skies.js +89 -0
  31. data/app/public/images/loader.gif +0 -0
  32. data/app/public/js/application.js +81 -0
  33. data/app/views/_chart.haml +2 -0
  34. data/app/views/_search_form.haml +23 -0
  35. data/app/views/bounces.haml +23 -0
  36. data/app/views/kaminari/_first_page.html.erb +3 -0
  37. data/app/views/kaminari/_gap.html.erb +3 -0
  38. data/app/views/kaminari/_last_page.html.erb +3 -0
  39. data/app/views/kaminari/_next_page.html.erb +3 -0
  40. data/app/views/kaminari/_page.html.erb +3 -0
  41. data/app/views/kaminari/_paginator.html.erb +17 -0
  42. data/app/views/kaminari/_prev_page.html.erb +3 -0
  43. data/app/views/layout.haml +25 -0
  44. data/app/views/mails.haml +26 -0
  45. data/app/web_panel.rb +149 -0
  46. data/bin/ses_proxy +20 -0
  47. data/lib/ses_proxy/conf.rb +9 -0
  48. data/lib/ses_proxy/main_command.rb +154 -0
  49. data/lib/ses_proxy/models/bounce.rb +14 -0
  50. data/lib/ses_proxy/models/complaint.rb +13 -0
  51. data/lib/ses_proxy/models/email.rb +15 -0
  52. data/lib/ses_proxy/smtp_server.rb +122 -0
  53. data/lib/ses_proxy/sns_endpoint.rb +199 -0
  54. data/ses_proxy.rb +10 -0
  55. data/template/mongoid.yml +12 -0
  56. data/template/ses-proxy.yml +19 -0
  57. metadata +294 -0
@@ -0,0 +1,119 @@
1
+ /*!
2
+ * Datepicker for Bootstrap
3
+ *
4
+ * Copyright 2012 Stefan Petre
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ */
9
+
10
+ .datepicker {
11
+ top: 0;
12
+ left: 0;
13
+ padding: 4px;
14
+ margin-top: 1px;
15
+ .border-radius(4px);
16
+ &:before {
17
+ content: '';
18
+ display: inline-block;
19
+ border-left: 7px solid transparent;
20
+ border-right: 7px solid transparent;
21
+ border-bottom: 7px solid #ccc;
22
+ border-bottom-color: rgba(0,0,0,.2);
23
+ position: absolute;
24
+ top: -7px;
25
+ left: 6px;
26
+ }
27
+ &:after {
28
+ content: '';
29
+ display: inline-block;
30
+ border-left: 6px solid transparent;
31
+ border-right: 6px solid transparent;
32
+ border-bottom: 6px solid @white;
33
+ position: absolute;
34
+ top: -6px;
35
+ left: 7px;
36
+ }
37
+ >div {
38
+ display: none;
39
+ }
40
+ table{
41
+ width: 100%;
42
+ margin: 0;
43
+ }
44
+ td,
45
+ th{
46
+ text-align: center;
47
+ width: 20px;
48
+ height: 20px;
49
+ .border-radius(4px);
50
+ }
51
+ td {
52
+ &.day:hover {
53
+ background: @grayLighter;
54
+ cursor: pointer;
55
+ }
56
+ &.old,
57
+ &.new {
58
+ color: @grayLight;
59
+ }
60
+ &.active,
61
+ &.active:hover {
62
+ .buttonBackground(@primaryButtonBackground, spin(@primaryButtonBackground, 20));
63
+ color: #fff;
64
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
65
+ }
66
+ span {
67
+ display: block;
68
+ width: 47px;
69
+ height: 54px;
70
+ line-height: 54px;
71
+ float: left;
72
+ margin: 2px;
73
+ cursor: pointer;
74
+ .border-radius(4px);
75
+ &:hover {
76
+ background: @grayLighter;
77
+ }
78
+ &.active {
79
+ .buttonBackground(@primaryButtonBackground, spin(@primaryButtonBackground, 20));
80
+ color: #fff;
81
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
82
+ }
83
+ &.old {
84
+ color: @grayLight;
85
+ }
86
+ }
87
+ }
88
+
89
+ th {
90
+ &.switch {
91
+ width: 145px;
92
+ }
93
+ &.next,
94
+ &.prev {
95
+ font-size: @baseFontSize * 1.5;
96
+ }
97
+ }
98
+
99
+ thead tr:first-child th {
100
+ cursor: pointer;
101
+ &:hover{
102
+ background: @grayLighter;
103
+ }
104
+ }
105
+ /*.dow {
106
+ border-top: 1px solid #ddd !important;
107
+ }*/
108
+ }
109
+ .input-append,
110
+ .input-prepend {
111
+ &.date {
112
+ .add-on i {
113
+ display: block;
114
+ cursor: pointer;
115
+ width: 16px;
116
+ height: 16px;
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ Highcharts JS v2.3.3 (2012-10-04)
3
+ MooTools adapter
4
+
5
+ (c) 2010-2011 Torstein Hønsi
6
+
7
+ License: www.highcharts.com/license
8
+ */
9
+ (function(){var e=window,i=document,f=e.MooTools.version.substring(0,3),g=f==="1.2"||f==="1.1",j=g||f==="1.3",h=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,e=d.compute;b.start=function(b,d){var e=this.element;if(b.d)this.paths=a.init(e,e.d,this.toD);c.apply(this,arguments);return this};d.compute=function(b,c,d){var f=this.paths;if(f)this.element.attr("d",a.step(f[0],f[1],d,this.toD));else return e.apply(this,
10
+ arguments)}},adapterRun:function(a,b){if(b==="width"||b==="height")return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=i.getElementsByTagName("head")[0],d=i.createElement("script");d.type="text/javascript";d.src=a;d.onload=b;c.appendChild(d)},animate:function(a,b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle)a.getStyle=a.attr,a.setStyle=function(){var b=arguments;a.attr.call(a,b[0],b[1][0])},a.$family=function(){return!0};e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),h({transition:Fx.Transitions.Quad.easeInOut},
11
+ c));if(d)c.element=a;if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return g?$each(a,b):Array.each(a,b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},inArray:function(a,b,c){return b.indexOf(a,c)},merge:function(){var a=arguments,b=[{}],c=a.length;if(g)a=$merge.apply(null,a);else{for(;c--;)typeof a[c]!=="boolean"&&(b[c+1]=a[c]);a=Object.merge.apply(Object,b)}return a},offset:function(a){a=$(a).getOffsets();return{left:a.x,top:a.y}},
12
+ extendWithEvents:function(a){a.addEvent||(a.nodeName?$(a):h(a,new Events))},addEvent:function(a,b,c){typeof b==="string"&&(b==="unload"&&(b="beforeunload"),e.HighchartsAdapter.extendWithEvents(a),a.addEvent(b,c))},removeEvent:function(a,b,c){typeof a!=="string"&&(e.HighchartsAdapter.extendWithEvents(a),b?(b==="unload"&&(b="beforeunload"),c?a.removeEvent(b,c):a.removeEvents&&a.removeEvents(b)):a.removeEvents())},fireEvent:function(a,b,c,d){b={type:b,target:a};b=j?new Event(b):new DOMEvent(b);b=h(b,
13
+ c);b.preventDefault=function(){d=null};a.fireEvent&&a.fireEvent(b.type,b);d&&d(b)},washMouseEvent:function(a){return a.event||a},stop:function(a){a.fx&&a.fx.cancel()}}})();
@@ -0,0 +1,327 @@
1
+ /**
2
+ * @license Highcharts JS v2.3.3 (2012-10-04)
3
+ * MooTools adapter
4
+ *
5
+ * (c) 2010-2011 Torstein Hønsi
6
+ *
7
+ * License: www.highcharts.com/license
8
+ */
9
+
10
+ // JSLint options:
11
+ /*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */
12
+
13
+ (function () {
14
+
15
+ var win = window,
16
+ doc = document,
17
+ mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number
18
+ legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not.
19
+ legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent.
20
+ $extend = win.$extend || function () {
21
+ return Object.append.apply(Object, arguments);
22
+ };
23
+
24
+ win.HighchartsAdapter = {
25
+ /**
26
+ * Initialize the adapter. This is run once as Highcharts is first run.
27
+ * @param {Object} pathAnim The helper object to do animations across adapters.
28
+ */
29
+ init: function (pathAnim) {
30
+ var fxProto = Fx.prototype,
31
+ fxStart = fxProto.start,
32
+ morphProto = Fx.Morph.prototype,
33
+ morphCompute = morphProto.compute;
34
+
35
+ // override Fx.start to allow animation of SVG element wrappers
36
+ /*jslint unparam: true*//* allow unused parameters in fx functions */
37
+ fxProto.start = function (from, to) {
38
+ var fx = this,
39
+ elem = fx.element;
40
+
41
+ // special for animating paths
42
+ if (from.d) {
43
+ //this.fromD = this.element.d.split(' ');
44
+ fx.paths = pathAnim.init(
45
+ elem,
46
+ elem.d,
47
+ fx.toD
48
+ );
49
+ }
50
+ fxStart.apply(fx, arguments);
51
+
52
+ return this; // chainable
53
+ };
54
+
55
+ // override Fx.step to allow animation of SVG element wrappers
56
+ morphProto.compute = function (from, to, delta) {
57
+ var fx = this,
58
+ paths = fx.paths;
59
+
60
+ if (paths) {
61
+ fx.element.attr(
62
+ 'd',
63
+ pathAnim.step(paths[0], paths[1], delta, fx.toD)
64
+ );
65
+ } else {
66
+ return morphCompute.apply(fx, arguments);
67
+ }
68
+ };
69
+ /*jslint unparam: false*/
70
+ },
71
+
72
+ /**
73
+ * Run a general method on the framework, following jQuery syntax
74
+ * @param {Object} el The HTML element
75
+ * @param {String} method Which method to run on the wrapped element
76
+ */
77
+ adapterRun: function (el, method) {
78
+
79
+ // This currently works for getting inner width and height. If adding
80
+ // more methods later, we need a conditional implementation for each.
81
+ if (method === 'width' || method === 'height') {
82
+ return parseInt($(el).getStyle(method), 10);
83
+ }
84
+ },
85
+
86
+ /**
87
+ * Downloads a script and executes a callback when done.
88
+ * @param {String} scriptLocation
89
+ * @param {Function} callback
90
+ */
91
+ getScript: function (scriptLocation, callback) {
92
+ // We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
93
+ var head = doc.getElementsByTagName('head')[0];
94
+ var script = doc.createElement('script');
95
+
96
+ script.type = 'text/javascript';
97
+ script.src = scriptLocation;
98
+ script.onload = callback;
99
+
100
+ head.appendChild(script);
101
+ },
102
+
103
+ /**
104
+ * Animate a HTML element or SVG element wrapper
105
+ * @param {Object} el
106
+ * @param {Object} params
107
+ * @param {Object} options jQuery-like animation options: duration, easing, callback
108
+ */
109
+ animate: function (el, params, options) {
110
+ var isSVGElement = el.attr,
111
+ effect,
112
+ complete = options && options.complete;
113
+
114
+ if (isSVGElement && !el.setStyle) {
115
+ // add setStyle and getStyle methods for internal use in Moo
116
+ el.getStyle = el.attr;
117
+ el.setStyle = function () { // property value is given as array in Moo - break it down
118
+ var args = arguments;
119
+ el.attr.call(el, args[0], args[1][0]);
120
+ };
121
+ // dirty hack to trick Moo into handling el as an element wrapper
122
+ el.$family = function () { return true; };
123
+ }
124
+
125
+ // stop running animations
126
+ win.HighchartsAdapter.stop(el);
127
+
128
+ // define and run the effect
129
+ effect = new Fx.Morph(
130
+ isSVGElement ? el : $(el),
131
+ $extend({
132
+ transition: Fx.Transitions.Quad.easeInOut
133
+ }, options)
134
+ );
135
+
136
+ // Make sure that the element reference is set when animating svg elements
137
+ if (isSVGElement) {
138
+ effect.element = el;
139
+ }
140
+
141
+ // special treatment for paths
142
+ if (params.d) {
143
+ effect.toD = params.d;
144
+ }
145
+
146
+ // jQuery-like events
147
+ if (complete) {
148
+ effect.addEvent('complete', complete);
149
+ }
150
+
151
+ // run
152
+ effect.start(params);
153
+
154
+ // record for use in stop method
155
+ el.fx = effect;
156
+ },
157
+
158
+ /**
159
+ * MooTool's each function
160
+ *
161
+ */
162
+ each: function (arr, fn) {
163
+ return legacy ?
164
+ $each(arr, fn) :
165
+ Array.each(arr, fn);
166
+ },
167
+
168
+ /**
169
+ * Map an array
170
+ * @param {Array} arr
171
+ * @param {Function} fn
172
+ */
173
+ map: function (arr, fn) {
174
+ return arr.map(fn);
175
+ },
176
+
177
+ /**
178
+ * Grep or filter an array
179
+ * @param {Array} arr
180
+ * @param {Function} fn
181
+ */
182
+ grep: function (arr, fn) {
183
+ return arr.filter(fn);
184
+ },
185
+
186
+ /**
187
+ * Return the index of an item in an array, or -1 if not matched
188
+ */
189
+ inArray: function (item, arr, from) {
190
+ return arr.indexOf(item, from);
191
+ },
192
+
193
+ /**
194
+ * Deep merge two objects and return a third
195
+ */
196
+ merge: function () {
197
+ var args = arguments,
198
+ args13 = [{}], // MooTools 1.3+
199
+ i = args.length,
200
+ ret;
201
+
202
+ if (legacy) {
203
+ ret = $merge.apply(null, args);
204
+ } else {
205
+ while (i--) {
206
+ // Boolean argumens should not be merged.
207
+ // JQuery explicitly skips this, so we do it here as well.
208
+ if (typeof args[i] !== 'boolean') {
209
+ args13[i + 1] = args[i];
210
+ }
211
+ }
212
+ ret = Object.merge.apply(Object, args13);
213
+ }
214
+
215
+ return ret;
216
+ },
217
+
218
+ /**
219
+ * Get the offset of an element relative to the top left corner of the web page
220
+ */
221
+ offset: function (el) {
222
+ var offsets = $(el).getOffsets();
223
+ return {
224
+ left: offsets.x,
225
+ top: offsets.y
226
+ };
227
+ },
228
+
229
+ /**
230
+ * Extends an object with Events, if its not done
231
+ */
232
+ extendWithEvents: function (el) {
233
+ // if the addEvent method is not defined, el is a custom Highcharts object
234
+ // like series or point
235
+ if (!el.addEvent) {
236
+ if (el.nodeName) {
237
+ el = $(el); // a dynamically generated node
238
+ } else {
239
+ $extend(el, new Events()); // a custom object
240
+ }
241
+ }
242
+ },
243
+
244
+ /**
245
+ * Add an event listener
246
+ * @param {Object} el HTML element or custom object
247
+ * @param {String} type Event type
248
+ * @param {Function} fn Event handler
249
+ */
250
+ addEvent: function (el, type, fn) {
251
+ if (typeof type === 'string') { // chart broke due to el being string, type function
252
+
253
+ if (type === 'unload') { // Moo self destructs before custom unload events
254
+ type = 'beforeunload';
255
+ }
256
+
257
+ win.HighchartsAdapter.extendWithEvents(el);
258
+
259
+ el.addEvent(type, fn);
260
+ }
261
+ },
262
+
263
+ removeEvent: function (el, type, fn) {
264
+ if (typeof el === 'string') {
265
+ // el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out.
266
+ return;
267
+ }
268
+
269
+ win.HighchartsAdapter.extendWithEvents(el);
270
+ if (type) {
271
+ if (type === 'unload') { // Moo self destructs before custom unload events
272
+ type = 'beforeunload';
273
+ }
274
+
275
+ if (fn) {
276
+ el.removeEvent(type, fn);
277
+ } else if (el.removeEvents) { // #958
278
+ el.removeEvents(type);
279
+ }
280
+ } else {
281
+ el.removeEvents();
282
+ }
283
+ },
284
+
285
+ fireEvent: function (el, event, eventArguments, defaultFunction) {
286
+ var eventArgs = {
287
+ type: event,
288
+ target: el
289
+ };
290
+ // create an event object that keeps all functions
291
+ event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs);
292
+ event = $extend(event, eventArguments);
293
+ // override the preventDefault function to be able to use
294
+ // this for custom events
295
+ event.preventDefault = function () {
296
+ defaultFunction = null;
297
+ };
298
+ // if fireEvent is not available on the object, there hasn't been added
299
+ // any events to it above
300
+ if (el.fireEvent) {
301
+ el.fireEvent(event.type, event);
302
+ }
303
+
304
+ // fire the default if it is passed and it is not prevented above
305
+ if (defaultFunction) {
306
+ defaultFunction(event);
307
+ }
308
+ },
309
+
310
+ /**
311
+ * Set back e.pageX and e.pageY that MooTools has abstracted away
312
+ */
313
+ washMouseEvent: function (e) {
314
+ return e.event || e;
315
+ },
316
+
317
+ /**
318
+ * Stop running animations on the object
319
+ */
320
+ stop: function (el) {
321
+ if (el.fx) {
322
+ el.fx.cancel();
323
+ }
324
+ }
325
+ };
326
+
327
+ }());