This part deals mostly with the requesting of videos to load. Currently I have set up a Tor Hidden HTTP Service for adding video files to. I then request those videos through Tor/Privoxy Client which connects using PyCURL/CURL. Videos are dynamically managed by passing the filename into a flashvars parameter from my database table where it requests the file from the Tor Hidden HTTP Service.
This is my flash embed code:
<div class="responsive-video"> <section itemscope itemtype="http://schema.org/VideoObject"> <meta itemprop="embedURL" content="http://hidden.cryaboutcrypt.ninja/static/flashplayer/shinobu.swf?video={{=query.filename}}" /><br /> <object width="100%;" height="100%" style="max-width:720px; max-height:406px;" id="videos" align="middle"> <param name="movie" value="{{=URL('static', 'flashplayer/shinobu.swf')}}" /> <param name=FlashVars value="video={{=query.filename}}" /> <!--[if !IE]>--> <object type="application/x-shockwave-flash" data="{{=URL('static', 'flashplayer/shinobu.swf')}}" width="100%;" height="100%" style="max-width:720px;max-height:406px;"> <param name="movie" value="{{=URL('static', 'flashplayer/shinobu.swf')}}" /> <param name=FlashVars value="video={{=query.filename}}" /> <!--<![endif]--> <a href="http://www.adobe.com/go/getflash"> <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /> </a> <!--[if !IE]>--> </object> <!--<![endif]--> </object> </section> </div>
And the updated Actionscript Code:
package { // Media import flash.display.MovieClip; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.media.Video; // Network import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLLoaderDataFormat; import flash.net.NetConnection; import flash.net.NetStream; import flash.net.NetStreamAppendBytesAction; // Events import flash.events.Event; import flash.events.ProgressEvent; import flash.events.NetStatusEvent; import flash.events.IOErrorEvent; // Data import flash.utils.ByteArray; // Security import flash.system.Security; public class Main extends MovieClip { // Handle For Desktop/Web/Mobile try { // Security Policies Security.allowDomain('62.75.246.181'); Security.loadPolicyFile('http://hidden.cryaboutcrypt.ninja/strange/static/crossdomain.xml'); } catch (e) {}; // Proxy URL private var videoName:String = stage.loaderInfo.parameters["video"]; private var proxy:String = "http://hidden.cryaboutcrypt.ninja/strange/hidden_request?param1=" + videoName; // Video Playback private var netConnection:NetConnection; private var netStream:NetStream; private var video:Video; private var bytes:ByteArray; private var statusText:TextField; private var format:TextFormat; public function Main() { statusText = new TextField(); format = new TextFormat(); statusText.text = ""; statusText.autoSize = TextFieldAutoSize.CENTER; statusText.x = 360; statusText.y = 203; format.font = "Verdana"; format.color = 0xFFFFFF; format.size = 15; statusText.defaultTextFormat = format; addChild(statusText); video = new Video(720, 406); netConnection = new NetConnection(); netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionStatusHandler); addChild(video); var ur:URLRequest = new URLRequest(proxy); var ul:URLLoader = new URLLoader(); ul.dataFormat = URLLoaderDataFormat.BINARY; ul.addEventListener(ProgressEvent.PROGRESS, progressLoader); ul.addEventListener(Event.COMPLETE, function(ev:Event):void { bytes = ul.data; netConnection.connect(null); }); ul.load(ur); } function progressLoader(event:ProgressEvent):void { statusText.text = "Network Connection Success. Video is Loading ..."; statusText.autoSize = TextFieldAutoSize.CENTER; } public function netConnectionStatusHandler(ev:NetStatusEvent):void { switch(ev.info.code) { case 'NetConnection.Connect.Success': netStream = new NetStream(netConnection); netStream.client = {}; video.attachNetStream(netStream); netStream.play(null); netStream.appendBytes(bytes); break; } } } }
The source code for the PyCURL request over tor/privoxy to the hidden service using the web2py framework.
def hidden_request(): param1 = str(request.get_vars["param1"]) url = http://oniondomain param1 = param1.rstrip() re_url = url + param1 header = StringIO() buffer = StringIO() c = pycurl.Curl() c.setopt(c.URL, re_url) c.setopt(c.USERAGENT, "Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)") c.setopt(c.PROXY, SERVER_IP) c.setopt(c.PROXYPORT, 8118) c.setopt(c.PROXYTYPE, c.PROXYTYPE_HTTP) c.setopt(c.HTTPPROXYTUNNEL, 1) c.setopt(c.HEADERFUNCTION, header.write) c.setopt(c.WRITEFUNCTION, buffer.write) c.perform() #c.close() return buffer.getvalue()
Previous articles from bottom(start) to top(end)
http://www.techshinobi.com/index.php/actionscript-pycurl-socks-part-3/
http://www.techshinobi.com/index.php/actionscript-pycurl-socks-part-2/
http://www.techshinobi.com/index.php/actionscript-pycurl-and-socks/
http://www.techshinobi.com/index.php/java-socks-proxy-in-applets-tor/