ChipMaster's trial hacks on C++CMS starting with v1.2.1. Not sure I'll follow on with the v2 since it looks to be breaking and mostly frivolous.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

211 lines
9.9 KiB

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. #
  4. # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
  5. #
  6. import httplib
  7. import sys
  8. def test(name,A,B):
  9. if A != B:
  10. print "Error :" + name
  11. print "-----Actual--"
  12. print A,"---Expected--"
  13. print B,"-------------"
  14. sys.exit(1)
  15. else:
  16. print "Ok:"+name
  17. h=httplib.HTTPConnection('localhost:8080');
  18. h.request('GET','/test')
  19. r=h.getresponse()
  20. body=r.read();
  21. ref_body = \
  22. """\
  23. non loaded<br>
  24. <form action="/test" method="post" >
  25. <p>text&nbsp;<span class="cppcms_form_input"><input type="text" name="_1" ></span></p>
  26. <p>textarea&nbsp;<span class="cppcms_form_input"><textarea name="_2" ></textarea></span></p>
  27. <p>int&nbsp;<span class="cppcms_form_input"><input type="text" name="_3" value="" ></span></p>
  28. <p>double&nbsp;<span class="cppcms_form_input"><input type="text" name="_4" value="" ></span></p>
  29. <p>pass&nbsp;<span class="cppcms_form_input"><input type="password" name="_5" ></span></p>
  30. <p>pass2&nbsp;<span class="cppcms_form_input"><input type="password" name="_6" ></span></p>
  31. <p>yes or not&nbsp;<span class="cppcms_form_input"><input type="text" name="_7" ></span></p>
  32. <p>E-Mail&nbsp;<span class="cppcms_form_input"><input type="text" name="_8" ></span></p>
  33. <p>Checkbox&nbsp;<span class="cppcms_form_input"><input type="checkbox" name="_9" value="y" ></span></p>
  34. <p>Select Multiple&nbsp;<span class="cppcms_form_input"><select multiple name="_10" >
  35. <option value="0" selected >a</option>
  36. <option value="1" selected >b</option>
  37. <option value="2" >c</option>
  38. <option value="id1" >tr1</option>
  39. </select></span></p>
  40. <p>Select&nbsp;<span class="cppcms_form_input"><select name="_11" >
  41. <option value="0" >a</option>
  42. <option value="1" >b</option>
  43. <option value="2" >c</option>
  44. <option value="id2" selected >tr2</option>
  45. </select></span></p>
  46. <p>Radio&nbsp;<span class="cppcms_form_input"><div class="cppcms_radio" >
  47. <input type="radio" value="0" name="_12" checked > x<br>
  48. <input type="radio" value="1" name="_12" > y<br>
  49. <input type="radio" value="id3" name="_12" > tr3<br>
  50. </div></span></p>
  51. <p>Submit&nbsp;<span class="cppcms_form_input"><input type="submit" name="_13" value="Button" ></span></p>
  52. </form>
  53. """
  54. test("/test",body,ref_body)
  55. def test_valid(name,params,ans,url='/non_empty'):
  56. h=httplib.HTTPConnection('localhost:8080');
  57. h.request('GET','/test' + url + '?' + params)
  58. r=h.getresponse()
  59. test(name,r.read()[:len(ans)],ans)
  60. test_valid('non_empty1','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=1','valid')
  61. test_valid('non_empty2','_1=&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=1','invalid')
  62. test_valid('non_empty3','_1=1&_2=&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=1','invalid')
  63. test_valid('non_empty4','_1=1&_2=1&_3=&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=1','invalid')
  64. test_valid('non_empty5','_1=1&_2=1&_3=1&_4=1&_5=&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=1','invalid')
  65. test_valid('non_empty6','_1=1&_2=1&_3=1&_4=1&_5=1&_6=&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=1','invalid')
  66. test_valid('non_empty7','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=1','invalid')
  67. test_valid('non_empty8','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=&_9=10&_10=1&_11=1&_12=1&_13=1','invalid')
  68. test_valid('non_empty9','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=&_10=1&_11=1&_12=1&_13=1','valid') # checkbox ok
  69. test_valid('non_empty10','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=&_11=1&_12=1&_13=1','invalid')
  70. test_valid('non_empty11','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=&_12=1&_13=1','invalid')
  71. test_valid('non_empty12','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=&_13=1','invalid')
  72. test_valid('non_empty12','_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=yes&_8=a@a&_9=10&_10=1&_11=1&_12=1&_13=','valid') # Submit ok
  73. test_valid('empty','_1=&_2=&_3=&_4=&_5=&_6=&_7=yes&_8=a@a&_9=&_10=&_11=&_12=&_13=','valid','') # Empty ok only regex, email fails
  74. test_valid('empty1','_1=&_2=&_3=&_4=&_5=&_6=&_7=yes&_8=&_9=&_10=&_11=&_12=&_13=','invalid','') # Empty ok only regex, email fails
  75. test_valid('empty2','_1=&_2=&_3=&_4=&_5=&_6=&_7=&_8=a@a&_9=&_10=&_11=&_12=&_13=','invalid','') # Empty ok only regex, email fails
  76. h=httplib.HTTPConnection('localhost:8080');
  77. h.request('GET','/test/sub')
  78. r=h.getresponse()
  79. body=r.read();
  80. ref_body = \
  81. """\
  82. <p>pass&nbsp;<span class="cppcms_form_input"><input type="password" name="_5" ></span></p>
  83. <p>pass2&nbsp;<span class="cppcms_form_input"><input type="password" name="_6" ></span></p>
  84. <p>yes or not&nbsp;<span class="cppcms_form_input"><input type="text" name="_7" ></span></p>
  85. <p>E-Mail&nbsp;<span class="cppcms_form_input"><input type="text" name="_8" ></span></p>
  86. <p>Checkbox&nbsp;<span class="cppcms_form_input"><input type="checkbox" name="_9" value="y" ></span></p>
  87. <p>Select Multiple&nbsp;<span class="cppcms_form_input"><select multiple name="_10" >
  88. <option value="0" selected >a</option>
  89. <option value="1" selected >b</option>
  90. <option value="2" >c</option>
  91. <option value="id1" >tr1</option>
  92. </select></span></p>
  93. """
  94. test("subset",body,ref_body)
  95. def test_valid(name,url,params,ans):
  96. def get():
  97. h=httplib.HTTPConnection('localhost:8080');
  98. h.request('GET','/test' + url + '?' + params)
  99. r=h.getresponse()
  100. test(name+' GET',r.read(),ans)
  101. def post():
  102. h=httplib.HTTPConnection('localhost:8080');
  103. headers = {"Content-type": "application/x-www-form-urlencoded"}
  104. h.request('POST','/test' + url,params,headers)
  105. r=h.getresponse()
  106. test(name+' POST',r.read(),ans)
  107. get()
  108. post()
  109. test_valid('text','/text','_1=','invalid\n')
  110. test_valid('text1','/text','_1=x','invalid\nx')
  111. test_valid('text2','/text','_1=xx','valid\nxx')
  112. test_valid('text3','/text','_1=xxxxx','valid\nxxxxx')
  113. test_valid('text4','/text','_1=xxxxxx','invalid\nxxxxxx')
  114. test_valid('text5','/text','_1=%d7%a9%d6%b8%d7%9c%d7%95%d7%9d','valid\nשָלום')
  115. test_valid('text6','/text','_1=%d7%a9%d7%9c','valid\nשל')
  116. test_valid('text7','/text','_1=%FF%FF','invalid\n\xFF\xFF')
  117. test_valid('text8','/text','_1=%01%01','invalid\n\x01\x01')
  118. test_valid('text9.1','/text','_1=xx%DF%7F','invalid\nxx\xDF\x7F')
  119. test_valid('text9.2','/text','_1=xx%C2%7F','invalid\nxx\xC2\x7F')
  120. test_valid('text9.3','/text','_1=xx%e0%7F%80','invalid\nxx\xe0\x7F\x80')
  121. test_valid('text9.4','/text','_1=xx%f0%7F%80%80','invalid\nxx\xf0\x7F\x80\x80')
  122. test_valid('number','/number','_1=','invalid\n')
  123. test_valid('number1','/number','_1=10','valid\n10')
  124. test_valid('number2','/number','_1=10.0','valid\n10')
  125. test_valid('number3','/number','_1=10.0e+','invalid\n')
  126. test_valid('number5','/number','_1=10.0e1','valid\n100')
  127. test_valid('number6','/number','_1=10.0x','invalid\n')
  128. test_valid('number7','/number','_1=A10.0','invalid\n')
  129. test_valid('number8','/number','_1=0','invalid\n0')
  130. test_valid('number9','/number','_1=1000','invalid\n1000')
  131. test_valid('number10','/number','_1=10A','invalid\n')
  132. test_valid('pass1','/pass','_1=&_2=','invalid\n')
  133. test_valid('pass2','/pass','_1=x&_2=x','valid\n')
  134. test_valid('pass3','/pass','_1=x1&_2=x2','invalid\n')
  135. test_valid('checkbox1','/checkbox','_1=n','valid\n0')
  136. test_valid('checkbox2','/checkbox','_1=y','valid\n1')
  137. test_valid('sm1','/sm','foo=bar','invalid\n0 0 0 0 \n\n')
  138. test_valid('sm2','/sm','_1=1&_1=0','valid\n1 1 0 0 \n0 1 \n')
  139. test_valid('sm3','/sm','_1=1&_1=id1','valid\n0 1 0 1 \n1 id1 \n')
  140. test_valid('sm4','/sm','_1=0&_1=1&_1=2','invalid\n1 1 1 0 \n0 1 2 \n')
  141. test_valid('select1','/select','foo=bar','invalid\n-1 ')
  142. test_valid('select2','/select','_1=0','valid\n0 0')
  143. test_valid('select3','/select','_1=0&_1=1','invalid\n-1 ')
  144. test_valid('select4','/select','_1=10','invalid\n-1 ')
  145. test_valid('radio1','/radio','foo=bar','invalid\n-1 ')
  146. test_valid('radio2','/radio','_1=0','valid\n0 0')
  147. test_valid('radio3','/radio','_1=0&_1=1','invalid\n-1 ')
  148. test_valid('radio4','/radio','_1=10','invalid\n-1 ')
  149. test_valid('submit1','/submit','_1=1','valid\n1')
  150. test_valid('submit2','/submit','_2=1','valid\n0')
  151. body='<p><label for="submit_id">message</label>&nbsp;<span class="cppcms_form_error">error</span> <span class="cppcms_form_input"><input type="submit" id="submit_id" name="submit_name" value="test" ></span><span class="cppcms_form_help">help</span></p>\n'
  152. test_valid('submit3','/submitl','',body)
  153. def test_upload(name,url,content,ans):
  154. h=httplib.HTTPConnection('localhost:8080');
  155. headers = {"Content-type": "multipart/form-data; boundary=123456"}
  156. h.request('POST','/test' + url,content,headers)
  157. r=h.getresponse()
  158. test(name,r.read(),ans)
  159. def make_multipart_form_data(content,mime,name='test.txt'):
  160. return \
  161. '--123456\r\n' + \
  162. 'Content-Type: ' + mime + '\r\n' + \
  163. 'Content-Disposition: form-data; name="file"; filename="' + name +'"\r\n' + \
  164. '\r\n' + \
  165. content + \
  166. '\r\n--123456--\r\n'
  167. test_upload('file 1','/upload',make_multipart_form_data('foo','text/plain'),'valid\n')
  168. test_upload('file 2','/upload',make_multipart_form_data('foob','text/plain'),'valid\n')
  169. test_upload('file 3','/upload',make_multipart_form_data('P3','text/plain'),'valid\n')
  170. test_upload('file 4','/upload',make_multipart_form_data('P3 ' + 'x' * 17,'text/plain'),'valid\n')
  171. test_upload('file 5','/upload_regex',make_multipart_form_data('P3','text/html'),'valid\n')
  172. test_upload('file mime','/upload',make_multipart_form_data('foo','text/html'),'invalid\n')
  173. test_upload('file magic 1','/upload',make_multipart_form_data('fo','text/plain'),'invalid\n')
  174. test_upload('file magic 2','/upload',make_multipart_form_data('P','text/plain'),'invalid\n')
  175. test_upload('file magic 3','/upload',make_multipart_form_data('','text/plain'),'invalid\n')
  176. test_upload('file size','/upload',make_multipart_form_data('P3 ' + 'x' * 18,'text/plain'),'invalid\n')
  177. test_upload('file regex-mime','/upload_regex',make_multipart_form_data('P3','text/xhtml'),'invalid\n')
  178. test_upload('file encoding','/upload',make_multipart_form_data('foo','text/plain','\xFF\xFF.txt'),'invalid\n')
  179. test_upload('file empty','/upload','--123456--\r\n','invalid\n')