diff options
Diffstat (limited to 'www/js/rdp-start.js')
-rw-r--r-- | www/js/rdp-start.js | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/www/js/rdp-start.js b/www/js/rdp-start.js new file mode 100644 index 0000000..ee509e1 --- /dev/null +++ b/www/js/rdp-start.js @@ -0,0 +1,262 @@ +'use strict'; + +/** BSD-2-Clause license + * + * Copyright (c) 2018-2023 NST <www.newinfosec.ru>, sss <sss at dark-alexandr dot net>, smake <smake at ya dot ru>. + * + */ + +function RDPStart(uri, title){ + uri = wsBase + document.querySelector('.rdp_connect_dialog').style.display = 'none'; + if (title === undefined) { + // title = "Portal rdp session " + $('rdphost').value.trim(); + title = "Portal remote session"; + } + if(!embedded){ + $('dvLoading').setStyles({'visibility':'visible'}); + } + var controls = document.querySelector('#extracommands'); + rdp = new webrdp.RDP(uri, $('screen'), controls, !RIMtablet, RIMtablet, vkbd); + + rdp.addEvent('alert', function(msg) { + popUpMessage('error', msg, 5); + }); + rdp.addEvent('connected', function() { + cleanPopUpDeck(); + document.title = title; + var button = $("rdpconnect"); + button.removeEvents(); + window.removeEvent('resize', OnDesktopSize); + button.value = 'Disconnect'; + button.addEvent('click', rdp.Disconnect.bind(rdp)); + window.addEvent("beforeunload", rdp.Disconnect.bind(rdp)); + }); + rdp.addEvent('disconnected', function() { + showDialog(true); + if(embedded){ + $('maindialog').addClass('invisible'); + noInstancePopUp() + } + var button = $("rdpconnect"); + button.removeEvents(); + button.value = 'Connect'; + button.addEvent('click', function(){RDPStart();}); + OnDesktopSize(); + window.addEvent('resize', OnDesktopSize); + if(!embedded) + { + document.querySelector('.rdp_connect_dialog').style.display = 'block'; + } + }); + rdp.addEvent('mouserelease', ResetRdpMouseFlags); + rdp.addEvent('touch2', function() { + ShowMouseHelper($('mousehelper').hasClass('invisible')); + }); + rdp.addEvent('touch3', function() { + vkbd.toggle(); + }); + rdp.addEvent('touch4', function() { + if (confirm('Are you sure you want to disconnect?')) { + rdp.Disconnect(); + } + }); + showDialog(false); + // rdp.log.loglevel = "debug"; + rdp.Run(); +} + +function SetRdpMouseFlags() { + var mf = { + 'r': $('rclick').checked, + 'm': $('mclick').checked, + 'a': $('aclick').checked, + 's': $('sclick').checked, + 'c': $('cclick').checked, + }; + rdp.SetArtificialMouseFlags(mf); +} +function ResetRdpMouseFlags() { + $('rclick').checked = false; + $('mclick').checked = false; + $('aclick').checked = false; + $('sclick').checked = false; + $('cclick').checked = false; + rdp.SetArtificialMouseFlags(null); +} +function ShowMouseHelper(show) { + var mh = $('mousehelper'); + inDrag = false; + if (show) { + mh.setStyles({'position':'absolute','top':mhy,'left':mhx,'z-index':999}); + mh.addEvent('mousedown',DragStart); + $('rclick').addEvent('change', SetRdpMouseFlags); + $('mclick').addEvent('change', SetRdpMouseFlags); + $('aclick').addEvent('change', SetRdpMouseFlags); + $('sclick').addEvent('change', SetRdpMouseFlags); + $('cclick').addEvent('change', SetRdpMouseFlags); + mh.removeClass('invisible'); + } else { + mh.removeEvents(); + mh.addClass('invisible'); + $('rclick').removeEvents(); + $('mclick').removeEvents(); + $('aclick').removeEvents(); + $('sclick').removeEvents(); + $('cclick').removeEvents(); + } +} + +function OnDesktopSize() { + ResizeCanvas($('dtsize').value); + DrawLogo(); +} + +function DragStart(evt) { + var mh = $('mousehelper'); + if (!mh.hasClass('invisible')) { + inDrag = true; + dragX = evt.page.x; + dragY = evt.page.y; + window.addEvent('mouseup',DragEnd); + window.addEvent('touchmove',DragMove); + } +} +function DragEnd(evt) { + inDrag = false; + var mh = $('mousehelper'); + window.removeEvent('touchmove',DragMove); + window.removeEvent('mouseup',DragEnd); +} +function DragMove(evt) { + if (inDrag) { + var dx = evt.page.x - dragX; + var dy = evt.page.y - dragY; + dragX = evt.page.x; + dragY = evt.page.y; + var mh = $('mousehelper'); + if (!mh.hasClass('invisible')) { + mhx += dx; + mhy += dy; + mh.setStyles({'top':mhy,'left':mhx}); + } + } +} + +function DrawLogo() { + var logo = new Element('img', {'src': 'c_none.png'}); + logo.addEvent('load', function() { + var screen = document.getElementById('screen'); + var scaleWCoeficient = 0.5; + var scaleHCoeficient = 0.5; + var iw = this.width * scaleWCoeficient; + var ih = this.height * scaleHCoeficient; + var scale = (screen.height - 20) / ih; + screen.getContext('2d').drawImage( + this, 10, 10, Math.round(iw * scale), Math.round(ih * scale) + ); + }.bind(logo)); +} + +function ResizeCanvas(sz) { + var w, h; + if (sz == 'auto') { + w = window.getCoordinates().width; + h = window.getCoordinates().height; + if (RIMtablet) { + // Toplevel bar not removable + h -= 31; + } + if (w % 2) { + w -= 1; + } + } else { + var sza = sz.split('x'); + var w = sza[0]; + var h = sza[1]; + } + $('screen').width = w - 10; + $('screen').height = h - 50; + $('screen').style["margin"] = "0 auto"; +} + +var sendDisconnect = function() { +if (confirm('Закончить сессию ?')) { + $('extracommands').setStyles({'visibility':'hidden'}); + rdp.Disconnect(); + window.close(); +} +} + +var altTabOn = false; +function altTabEvent(){ + if(altTabOn){ + altTabOn = false; + rdp.SendKey(2);//alt+tab release + $('alttab').removeClass('extracommandshold'); + } + else{ + altTabOn = true; + rdp.SendKey(1);//alt+tab + $('alttab').addClass('extracommandshold'); + } +} + +function showDialog(show) { + if (show) { + ShowMouseHelper(false); + var dlg = $('maindialog'); + var x = Math.round((window.getCoordinates().width - dlg.getCoordinates().width) / 2) + 'px'; + var y = Math.round((window.getCoordinates().height - dlg.getCoordinates().height) / 2) + 'px'; + $('extracommands').setStyles( + { + 'visibility':'hidden' + }); + $('dvLoading').setStyles( + { + 'visibility':'hidden' + }); + DrawLogo(); + dlg.setStyles({ + 'position': 'absolute', + 'top': y, + 'left': x, + 'z-index': 999 + }).removeClass('invisible'); + } else { + $('maindialog').addClass('invisible'); + $('extracommands').setStyles( + { + 'visibility':'visible' + }); + $('ctrlaltdelete').addEvent('click', function(){ rdp.SendKey(0); }); + $('alttab').addEvent('click', altTabEvent); + $('disconnect').addEvent('click', sendDisconnect); + } +} + +function settingsGetJSON(){ + var screen = document.getElementById('screen'); + return { + "backend_settings": { + "host" : $('rdphost').value.trim() + ,"port" : parseInt($('rdpport').value.trim()) + ,"pcb" : $('rdppcb').value.trim() + ,"user" : $('rdpuser').value.trim() + ,"password" : $('rdppass').value + ,"perf" : parseInt($('perf').value.trim()) + ,"fntlm" : parseInt($('fntlm').value.trim()) + ,"nowallp": parseInt($('nowallp').checked ? '1' : '0') + ,"nowdrag": parseInt($('nowdrag').checked ? '1' : '0') + ,"nomani" : parseInt($('nomani').checked ? '1' : '0') + ,"notheme": parseInt($('notheme').checked ? '1' : '0') + ,"nonla" : parseInt($('nonla').checked ? '1' : '0') + ,"notls" : parseInt($('notls').checked ? '1' : '0') + ,"dtsize" : screen.width + 'x' + screen.height + } + ,"session_settings": { + "token" : location.search.substring(1) + ,"proto" : "rdp" + } + }; +} |