Unverified Commit 46744e8f authored by 老广's avatar 老广 Committed by GitHub

Ws (#38)

* [Update] 修改ws库

* [Update] 完成on token

* [Update] 使用新的ws

* [update] 去掉注释的代码

* [Update] 修改go mod

* [Update] 修改一些信息
parent d80a7d05
var __extends=this&&this.__extends||function(){var a=function(c,d){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var b in c)c.hasOwnProperty(b)&&(a[b]=c[b])},a(c,d)};return function(c,d){function b(){this.constructor=c}a(c,d),c.prototype=null===d?Object.create(d):(b.prototype=d.prototype,new b)}}(),__awaiter=this&&this.__awaiter||function(a,b,c,d){return new(c||(c=Promise))(function(e,f){function g(a){try{i(d.next(a))}catch(a){f(a)}}function h(a){try{i(d["throw"](a))}catch(a){f(a)}}function i(a){a.done?e(a.value):new c(function(b){b(a.value)}).then(g,h)}i((d=d.apply(a,b||[])).next())})},__generator=this&&this.__generator||function(a,b){function c(a){return function(b){return d([a,b])}}function d(c){if(e)throw new TypeError("Generator is already executing.");for(;k;)try{if(e=1,h&&(i=2&c[0]?h["return"]:c[0]?h["throw"]||((i=h["return"])&&i.call(h),0):h.next)&&!(i=i.call(h,c[1])).done)return i;switch((h=0,i)&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return k.label++,{value:c[1],done:!1};case 5:k.label++,h=c[1],c=[0];continue;case 7:c=k.ops.pop(),k.trys.pop();continue;default:if((i=k.trys,!(i=0<i.length&&i[i.length-1]))&&(6===c[0]||2===c[0])){k=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]<i[3])){k.label=c[1];break}if(6===c[0]&&k.label<i[1]){k.label=i[1],i=c;break}if(i&&k.label<i[2]){k.label=i[2],k.ops.push(c);break}i[2]&&k.ops.pop(),k.trys.pop();continue;}c=b.call(a,k)}catch(a){c=[6,a],h=0}finally{e=i=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}var e,h,i,j,k={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return j={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(j[Symbol.iterator]=function(){return this}),j},isBrowser="undefined"!=typeof window,_fetch="undefined"==typeof fetch?void 0:fetch;isBrowser?WebSocket=window.WebSocket:(WebSocket=require("ws"),_fetch=require("node-fetch"));var OnNamespaceConnect="_OnNamespaceConnect",OnNamespaceConnected="_OnNamespaceConnected",OnNamespaceDisconnect="_OnNamespaceDisconnect",OnRoomJoin="_OnRoomJoin",OnRoomJoined="_OnRoomJoined",OnRoomLeave="_OnRoomLeave",OnRoomLeft="_OnRoomLeft",OnAnyEvent="_OnAnyEvent",OnNativeMessage="_OnNativeMessage",ackBinary="M",ackIDBinary="A",ackNotOKBinary="H",waitIsConfirmationPrefix="#",waitComesFromClientPrefix="$";function isSystemEvent(a){return!(a!==OnNamespaceConnect&&a!==OnNamespaceConnected&&a!==OnNamespaceDisconnect&&a!==OnRoomJoin&&a!==OnRoomJoined&&a!==OnRoomLeave&&a!==OnRoomLeft)}function isEmpty(a){return!(void 0!==a)||!(null!==a)||(""==a||"string"==typeof a||a instanceof String?0===a.length||""===a:!!(a instanceof Error)&&isEmpty(a.message))}var Message=function(){function a(){}return a.prototype.isConnect=function(){return this.Event==OnNamespaceConnect||!1},a.prototype.isDisconnect=function(){return this.Event==OnNamespaceDisconnect||!1},a.prototype.isRoomJoin=function(){return this.Event==OnRoomJoin||!1},a.prototype.isRoomLeft=function(){return this.Event==OnRoomLeft||!1},a.prototype.isWait=function(){return!isEmpty(this.wait)&&(this.wait[0]==waitIsConfirmationPrefix||this.wait[0]==waitComesFromClientPrefix||!1)},a.prototype.unmarshal=function(){return JSON.parse(this.Body)},a}();function marshal(a){return JSON.stringify(a)}var messageSeparator=";",messageFieldSeparatorReplacement="@%!semicolon@%!",validMessageSepCount=7,trueString="1",falseString="0",escapeRegExp=/;/g;function escapeMessageField(a){return isEmpty(a)?"":a.replace(escapeRegExp,messageFieldSeparatorReplacement)}var unescapeRegExp=new RegExp(messageFieldSeparatorReplacement,"g");function unescapeMessageField(a){return isEmpty(a)?"":a.replace(unescapeRegExp,messageSeparator)}var replyError=function(a){function b(c){var d=a.call(this,c)||this;return d.name="replyError",Error.captureStackTrace(d,b),Object.setPrototypeOf(d,b.prototype),d}return __extends(b,a),b}(Error);function reply(a){return new replyError(a)}function isReply(a){return a instanceof replyError}function serializeMessage(a){if(a.IsNative&&isEmpty(a.wait))return a.Body;var b=falseString,c=falseString,d=a.Body||"";return isEmpty(a.Err)||(d=a.Err.message,!isReply(a.Err)&&(b=trueString)),a.isNoOp&&(c=trueString),[a.wait||"",escapeMessageField(a.Namespace),escapeMessageField(a.Room),escapeMessageField(a.Event),b,c,d].join(messageSeparator)}function splitN(a,b,c){if(0==c)return[a];var d=a.split(b,c);if(d.length==c){var e=d.join(b)+b;return d.push(a.substr(e.length)),d}return[a]}function deserializeMessage(a,b){var c=new Message;if(0==a.length)return c.isInvalid=!0,c;var d=splitN(a,messageSeparator,validMessageSepCount-1);if(d.length!=validMessageSepCount)return b?(c.Event=OnNativeMessage,c.Body=a):c.isInvalid=!0,c;c.wait=d[0],c.Namespace=unescapeMessageField(d[1]),c.Room=unescapeMessageField(d[2]),c.Event=unescapeMessageField(d[3]),c.isError=d[4]==trueString||!1,c.isNoOp=d[5]==trueString||!1;var e=d[6];return isEmpty(e)?c.Body="":c.isError?c.Err=new Error(e):c.Body=e,c.isInvalid=!1,c.IsForced=!1,c.IsLocal=!1,c.IsNative=b&&c.Event==OnNativeMessage||!1,c}function genWait(){if(!isBrowser){var a=process.hrtime();return waitComesFromClientPrefix+1e9*a[0]+a[1]}var b=window.performance.now();return waitComesFromClientPrefix+b.toString()}function genWaitConfirmation(a){return waitIsConfirmationPrefix+a}function genEmptyReplyToWait(a){return a+messageSeparator.repeat(validMessageSepCount-1)}var Room=function(){function a(a,b){this.nsConn=a,this.name=b}return a.prototype.emit=function(a,b){var c=new Message;return c.Namespace=this.nsConn.namespace,c.Room=this.name,c.Event=a,c.Body=b,this.nsConn.conn.write(c)},a.prototype.leave=function(){var a=new Message;return a.Namespace=this.nsConn.namespace,a.Room=this.name,a.Event=OnRoomLeave,this.nsConn.askRoomLeave(a)},a}(),NSConn=function(){function a(a,b,c){this.conn=a,this.namespace=b,this.events=c,this.rooms=new Map}return a.prototype.emit=function(a,b){var c=new Message;return c.Namespace=this.namespace,c.Event=a,c.Body=b,this.conn.write(c)},a.prototype.ask=function(a,b){var c=new Message;return c.Namespace=this.namespace,c.Event=a,c.Body=b,this.conn.ask(c)},a.prototype.joinRoom=function(a){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(b){switch(b.label){case 0:return[4,this.askRoomJoin(a)];case 1:return[2,b.sent()];}})})},a.prototype.room=function(a){return this.rooms.get(a)},a.prototype.leaveAll=function(){return __awaiter(this,void 0,void 0,function(){var a,b=this;return __generator(this,function(){return a=new Message,a.Namespace=this.namespace,a.Event=OnRoomLeft,a.IsLocal=!0,this.rooms.forEach(function(c,d){return __awaiter(b,void 0,void 0,function(){var b;return __generator(this,function(c){switch(c.label){case 0:a.Room=d,c.label=1;case 1:return c.trys.push([1,3,,4]),[4,this.askRoomLeave(a)];case 2:return c.sent(),[3,4];case 3:return b=c.sent(),[2,b];case 4:return[2];}})})}),[2,null]})})},a.prototype.forceLeaveAll=function(a){var b=this,c=new Message;c.Namespace=this.namespace,c.Event=OnRoomLeave,c.IsForced=!0,c.IsLocal=a,this.rooms.forEach(function(a,d){c.Room=d,fireEvent(b,c),b.rooms.delete(d),c.Event=OnRoomLeft,fireEvent(b,c),c.Event=OnRoomLeave})},a.prototype.disconnect=function(){var a=new Message;return a.Namespace=this.namespace,a.Event=OnNamespaceDisconnect,this.conn.askDisconnect(a)},a.prototype.askRoomJoin=function(a){var b=this;return new Promise(function(c,d){return __awaiter(b,void 0,void 0,function(){var b,e,f,g;return __generator(this,function(h){switch(h.label){case 0:if(b=this.rooms.get(a),void 0!==b)return c(b),[2];e=new Message,e.Namespace=this.namespace,e.Room=a,e.Event=OnRoomJoin,e.IsLocal=!0,h.label=1;case 1:return h.trys.push([1,3,,4]),[4,this.conn.ask(e)];case 2:return h.sent(),[3,4];case 3:return f=h.sent(),d(f),[2];case 4:return(g=fireEvent(this,e),!isEmpty(g))?(d(g),[2]):(b=new Room(this,a),this.rooms.set(a,b),e.Event=OnRoomJoined,fireEvent(this,e),c(b),[2]);}})})})},a.prototype.askRoomLeave=function(a){return __awaiter(this,void 0,void 0,function(){var b,c;return __generator(this,function(d){switch(d.label){case 0:if(!this.rooms.has(a.Room))return[2,ErrBadRoom];d.label=1;case 1:return d.trys.push([1,3,,4]),[4,this.conn.ask(a)];case 2:return d.sent(),[3,4];case 3:return b=d.sent(),[2,b];case 4:return(c=fireEvent(this,a),!isEmpty(c))?[2,c]:(this.rooms.delete(a.Room),a.Event=OnRoomLeft,fireEvent(this,a),[2,null]);}})})},a.prototype.replyRoomJoin=function(a){if(!(isEmpty(a.wait)||a.isNoOp)){if(!this.rooms.has(a.Room)){var b=fireEvent(this,a);if(!isEmpty(b))return a.Err=b,void this.conn.write(a);this.rooms.set(a.Room,new Room(this,a.Room)),a.Event=OnRoomJoined,fireEvent(this,a)}this.conn.writeEmptyReply(a.wait)}},a.prototype.replyRoomLeave=function(a){return isEmpty(a.wait)||a.isNoOp?void 0:this.rooms.has(a.Room)?void(fireEvent(this,a),this.rooms.delete(a.Room),this.conn.writeEmptyReply(a.wait),a.Event=OnRoomLeft,fireEvent(this,a)):void this.conn.writeEmptyReply(a.wait)},a}();function fireEvent(a,b){return a.events.has(b.Event)?a.events.get(b.Event)(a,b):a.events.has(OnAnyEvent)?a.events.get(OnAnyEvent)(a,b):null}function isNull(a){return null===a||a===void 0||"undefined"==typeof a}function resolveNamespaces(a,b){if(isNull(a))return isNull(b)||b("connHandler is empty."),null;var c=new Map,d=new Map,e=0;if(Object.keys(a).forEach(function(b){e++;var f=a[b];if(f instanceof Function)d.set(b,f);else if(f instanceof Map)c.set(b,f);else{var g=new Map;Object.keys(f).forEach(function(a){g.set(a,f[a])}),c.set(b,g)}}),0<d.size){if(e!=d.size)return isNull(b)||b("all keys of connHandler should be events, mix of namespaces and event callbacks is not supported "+d.size+" vs total "+e),null;c.set("",d)}return c}function getEvents(a,b){return a.has(b)?a.get(b):null}var URLParamAsHeaderPrefix="X-Websocket-Header-";function parseHeadersAsURLParameters(a,b){if(isNull(a))return b;for(var c in a)if(a.hasOwnProperty(c)){var d=a[c];c=encodeURIComponent(URLParamAsHeaderPrefix+c),d=encodeURIComponent(d);var e=c+"="+d;b=-1==b.indexOf("?")?-1==b.indexOf("#")?b+"?"+e:b.split("#")[0]+"?"+e+"#"+b.split("#")[1]:b.split("?")[0]+"?"+e+"&"+b.split("?")[1]}return b}function dial(a,b,c){return _dial(a,b,0,c)}var websocketReconnectHeaderKey="X-Websocket-Reconnect";function _dial(a,b,c,d){if(isBrowser&&0==a.indexOf("/")){var e="https:"==document.location.protocol?"wss":"ws",f=document.location.port?":"+document.location.port:"";a=e+"://"+document.location.hostname+f+a}return-1==a.indexOf("ws")&&(a="ws://"+a),new Promise(function(e,f){WebSocket||f("WebSocket is not accessible through this browser.");var g=resolveNamespaces(b,f);if(!isNull(g)){isNull(d)&&(d={}),isNull(d.headers)&&(d.headers={});var h=d.reconnect?d.reconnect:0;0<c&&0<h?d.headers[websocketReconnectHeaderKey]=c.toString():!isNull(d.headers[websocketReconnectHeaderKey])&&delete d.headers[websocketReconnectHeaderKey];var i=makeWebsocketConnection(a,d),j=new Conn(i,g);j.reconnectTries=c,i.binaryType="arraybuffer",i.onmessage=function(a){var b=j.handle(a);return isEmpty(b)?void(j.isAcknowledged()&&e(j)):void f(b)},i.onopen=function(){i.send(ackBinary)},i.onerror=function(a){j.close(),f(a)},i.onclose=function(){if(j.isClosed());else{if(i.onmessage=void 0,i.onopen=void 0,i.onerror=void 0,i.onclose=void 0,0>=h)return j.close(),null;var c=new Map;j.connectedNamespaces.forEach(function(a,b){var d=[];!isNull(a.rooms)&&0<a.rooms.size&&a.rooms.forEach(function(a,b){d.push(b)}),c.set(b,d)}),j.close(),whenResourceOnline(a,h,function(g){_dial(a,b,g,d).then(function(a){return isNull(e)||"function () { [native code] }"==e.toString()?void c.forEach(function(b,c){a.connect(c).then(function(a){return function(b){a.forEach(function(a){b.joinRoom(a)})}}(b))}):void e(a)}).catch(f)})}return null}}})}function makeWebsocketConnection(a,b){return isBrowser&&!isNull(b)?(b.headers&&(a=parseHeadersAsURLParameters(b.headers,a)),b.protocols?new WebSocket(a,b.protocols):new WebSocket(a)):new WebSocket(a,b)}function whenResourceOnline(a,b,c){var d=a.replace(/(ws)(s)?\:\/\//,"http$2://"),e=1,f={method:"HEAD",mode:"no-cors"},g=function(){_fetch(d,f).then(function(){c(e)}).catch(function(){e++,setTimeout(function(){g()},b)})};setTimeout(g,b)}var ErrInvalidPayload=new Error("invalid payload"),ErrBadNamespace=new Error("bad namespace"),ErrBadRoom=new Error("bad room"),ErrClosed=new Error("use of closed connection"),ErrWrite=new Error("write closed");function isCloseError(a){return!(!a||isEmpty(a.message))&&0<=a.message.indexOf("[-1] write closed")}var Conn=function(){function a(a,b){this.conn=a,this.reconnectTries=0,this._isAcknowledged=!1,this.namespaces=b;var c=b.has("");this.allowNativeMessages=c&&b.get("").has(OnNativeMessage),this.queue=[],this.waitingMessages=new Map,this.connectedNamespaces=new Map,this.closed=!1}return a.prototype.wasReconnected=function(){return 0<this.reconnectTries},a.prototype.isAcknowledged=function(){return this._isAcknowledged},a.prototype.handle=function(a){if(!this._isAcknowledged){var b=this.handleAck(a.data);return null==b?(this._isAcknowledged=!0,this.handleQueue()):this.conn.close(),b}return this.handleMessage(a.data)},a.prototype.handleAck=function(a){var b=a[0];switch(b){case ackIDBinary:var c=a.slice(1);this.ID=c;break;case ackNotOKBinary:var d=a.slice(1);return new Error(d);default:return this.queue.push(a),null;}},a.prototype.handleQueue=function(){var a=this;null==this.queue||0==this.queue.length||this.queue.forEach(function(b,c){a.queue.splice(c,1),a.handleMessage(b)})},a.prototype.handleMessage=function(a){var b=deserializeMessage(a,this.allowNativeMessages);if(b.isInvalid)return ErrInvalidPayload;if(b.IsNative&&this.allowNativeMessages){var c=this.namespace("");return fireEvent(c,b)}if(b.isWait()){var d=this.waitingMessages.get(b.wait);if(null!=d)return void d(b)}var e=this.namespace(b.Namespace);switch(b.Event){case OnNamespaceConnect:this.replyConnect(b);break;case OnNamespaceDisconnect:this.replyDisconnect(b);break;case OnRoomJoin:if(void 0!==e){e.replyRoomJoin(b);break}case OnRoomLeave:if(void 0!==e){e.replyRoomLeave(b);break}default:if(void 0===e)return ErrBadNamespace;b.IsLocal=!1;var f=fireEvent(e,b);if(!isEmpty(f))return b.Err=f,this.write(b),f;}return null},a.prototype.connect=function(a){return this.askConnect(a)},a.prototype.waitServerConnect=function(a){var b=this;return isNull(this.waitServerConnectNotifiers)&&(this.waitServerConnectNotifiers=new Map),new Promise(function(c){return __awaiter(b,void 0,void 0,function(){var b=this;return __generator(this,function(){return this.waitServerConnectNotifiers.set(a,function(){b.waitServerConnectNotifiers.delete(a),c(b.namespace(a))}),[2]})})})},a.prototype.namespace=function(a){return this.connectedNamespaces.get(a)},a.prototype.replyConnect=function(a){if(!(isEmpty(a.wait)||a.isNoOp)){var b=this.namespace(a.Namespace);if(void 0!==b)return void this.writeEmptyReply(a.wait);var c=getEvents(this.namespaces,a.Namespace);return isNull(c)?(a.Err=ErrBadNamespace,void this.write(a)):void(b=new NSConn(this,a.Namespace,c),this.connectedNamespaces.set(a.Namespace,b),this.writeEmptyReply(a.wait),a.Event=OnNamespaceConnected,fireEvent(b,a),!isNull(this.waitServerConnectNotifiers)&&0<this.waitServerConnectNotifiers.size&&this.waitServerConnectNotifiers.has(a.Namespace)&&this.waitServerConnectNotifiers.get(a.Namespace)())}},a.prototype.replyDisconnect=function(a){if(!(isEmpty(a.wait)||a.isNoOp)){var b=this.namespace(a.Namespace);return void 0===b?void this.writeEmptyReply(a.wait):void(b.forceLeaveAll(!0),this.connectedNamespaces.delete(a.Namespace),this.writeEmptyReply(a.wait),fireEvent(b,a))}},a.prototype.ask=function(a){var b=this;return new Promise(function(c,d){return b.isClosed()?void d(ErrClosed):(a.wait=genWait(),b.waitingMessages.set(a.wait,function(a){return a.isError?void d(a.Err):void c(a)}),!b.write(a))?void d(ErrWrite):void 0})},a.prototype.askConnect=function(a){var b=this;return new Promise(function(c,d){return __awaiter(b,void 0,void 0,function(){var b,e,f,g,h;return __generator(this,function(i){switch(i.label){case 0:if(b=this.namespace(a),void 0!==b)return c(b),[2];if(e=getEvents(this.namespaces,a),isNull(e))return d(ErrBadNamespace),[2];if(f=new Message,f.Namespace=a,f.Event=OnNamespaceConnect,f.IsLocal=!0,b=new NSConn(this,a,e),g=fireEvent(b,f),!isEmpty(g))return d(g),[2];i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.ask(f)];case 2:return i.sent(),[3,4];case 3:return h=i.sent(),d(h),[2];case 4:return this.connectedNamespaces.set(a,b),f.Event=OnNamespaceConnected,fireEvent(b,f),c(b),[2];}})})})},a.prototype.askDisconnect=function(a){return __awaiter(this,void 0,void 0,function(){var b,c;return __generator(this,function(d){switch(d.label){case 0:if(b=this.namespace(a.Namespace),void 0===b)return[2,ErrBadNamespace];d.label=1;case 1:return d.trys.push([1,3,,4]),[4,this.ask(a)];case 2:return d.sent(),[3,4];case 3:return c=d.sent(),[2,c];case 4:return b.forceLeaveAll(!0),this.connectedNamespaces.delete(a.Namespace),a.IsLocal=!0,[2,fireEvent(b,a)];}})})},a.prototype.isClosed=function(){return this.closed},a.prototype.write=function(a){if(this.isClosed())return!1;if(!a.isConnect()&&!a.isDisconnect()){var b=this.namespace(a.Namespace);if(void 0===b)return!1;if(!isEmpty(a.Room)&&!a.isRoomJoin()&&!a.isRoomLeft()&&!b.rooms.has(a.Room))return!1}return this.conn.send(serializeMessage(a)),!0},a.prototype.writeEmptyReply=function(a){this.conn.send(genEmptyReplyToWait(a))},a.prototype.close=function(){var a=this;if(!this.closed){var b=new Message;b.Event=OnNamespaceDisconnect,b.IsForced=!0,b.IsLocal=!0,this.connectedNamespaces.forEach(function(c){c.forceLeaveAll(!0),b.Namespace=c.namespace,fireEvent(c,b),a.connectedNamespaces.delete(c.namespace)}),this.waitingMessages.clear(),this.closed=!0,this.conn.readyState===this.conn.OPEN&&this.conn.close()}},a}();(function(){var a={dial:dial,isSystemEvent:isSystemEvent,OnNamespaceConnect:OnNamespaceConnect,OnNamespaceConnected:OnNamespaceConnected,OnNamespaceDisconnect:OnNamespaceDisconnect,OnRoomJoin:OnRoomJoin,OnRoomJoined:OnRoomJoined,OnRoomLeave:OnRoomLeave,OnRoomLeft:OnRoomLeft,OnAnyEvent:OnAnyEvent,OnNativeMessage:OnNativeMessage,Message:Message,Room:Room,NSConn:NSConn,Conn:Conn,ErrInvalidPayload:ErrInvalidPayload,ErrBadNamespace:ErrBadNamespace,ErrBadRoom:ErrBadRoom,ErrClosed:ErrClosed,ErrWrite:ErrWrite,isCloseError:isCloseError,reply:reply,marshal:marshal};if("undefined"!=typeof exports)exports=a,module.exports=a;else{var b="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global;b.neffos=a}})();
\ No newline at end of file
...@@ -2,21 +2,39 @@ ...@@ -2,21 +2,39 @@
<body style="margin: 0"> <body style="margin: 0">
<script type="text/javascript" src="/static/js/jquery-2.1.1.js"></script> <script type="text/javascript" src="/static/js/jquery-2.1.1.js"></script>
<script type="text/javascript" src="/static/js/jquery-ui-1.10.4.min.js"></script> <script type="text/javascript" src="/static/js/jquery-ui-1.10.4.min.js"></script>
<script type="text/javascript" src="/static/js/socket.io.js"></script> <script type="text/javascript" src="/static/js/neffos.min.js"></script>
<script type="text/javascript" src="/static/plugins/elfinder/elfinder.full.js"></script> <script type="text/javascript" src="/static/plugins/elfinder/elfinder.full.js"></script>
<script type="text/javascript" src="/static/plugins/elfinder/i18n/elfinder.pl.js"></script> <script type="text/javascript" src="/static/plugins/elfinder/i18n/elfinder.pl.js"></script>
<link rel="stylesheet" type="text/css" media="screen" href="/static/plugins/elfinder/css/elfinder.min.css"> <link rel="stylesheet" type="text/css" media="screen" href="/static/plugins/elfinder/css/elfinder.min.css">
<link rel="stylesheet" type="text/css" media="screen" href="/static/plugins/elfinder/css/theme-gray.css"> <link rel="stylesheet" type="text/css" media="screen" href="/static/plugins/elfinder/css/theme-gray.css">
<script type="text/javascript" charset="utf-8"> <script type="text/javascript" charset="utf-8">
var socket = io.connect('/elfinder'); var scheme = document.location.protocol == "https:" ? "wss" : "ws";
socket.on('connect', function () { var port = document.location.port ? ":" + document.location.port : "";
console.log("Connect websocket done") var wsURL = scheme + "://" + document.location.hostname + port + "/socket.io/";
}); dial(wsURL, {
socket.on('data', function (msg) { "elfinder": {
var sid = msg.sid; _OnNamespaceConnected: function (nsConn, msg) {
init_elfinder(sid); console.log("Connect websocket done")
},
data: function (nsConn, msg) {
var data = msg.unmarshal();
var sid = data.sid;
initElfinder(sid);
}
}
}).then(conn => {
conn.connect("elfinder");
}); });
function init_elfinder(sid) {
// var socket = io.connect('/elfinder');
// socket.on('connect', function () {
// console.log("Connect websocket done")
// });
// socket.on('data', function (msg) {
// var sid = msg.sid;
// initElfinder(sid);
// });
function initElfinder(sid) {
var elf; var elf;
var opts = { var opts = {
uiOptions : { uiOptions : {
......
...@@ -5,16 +5,19 @@ go 1.12 ...@@ -5,16 +5,19 @@ go 1.12
require ( require (
github.com/Azure/azure-pipeline-go v0.1.9 // indirect github.com/Azure/azure-pipeline-go v0.1.9 // indirect
github.com/Azure/azure-storage-blob-go v0.6.0 github.com/Azure/azure-storage-blob-go v0.6.0
github.com/LeeEirc/elfinder v0.0.0-20190718024942-8893ec7a969f github.com/BurntSushi/toml v0.3.1 // indirect
github.com/LeeEirc/elfinder v0.0.0-20190718023636-5679c8bdb7bf
github.com/aliyun/aliyun-oss-go-sdk v1.9.8 github.com/aliyun/aliyun-oss-go-sdk v1.9.8
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect
github.com/aws/aws-sdk-go v1.19.46 github.com/aws/aws-sdk-go v1.19.46
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
github.com/elastic/go-elasticsearch v0.0.0 github.com/elastic/go-elasticsearch v0.0.0
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect
github.com/gliderlabs/ssh v0.2.3-0.20190711180243-866d0ddf7991 github.com/gliderlabs/ssh v0.2.3-0.20190711180243-866d0ddf7991
github.com/go-playground/form v3.1.4+incompatible // indirect github.com/go-playground/form v3.1.4+incompatible // indirect
github.com/googollee/go-socket.io v1.4.2-0.20190317095603-ed07a7212e28
github.com/gorilla/mux v1.7.2 github.com/gorilla/mux v1.7.2
github.com/jarcoal/httpmock v1.0.4 github.com/jarcoal/httpmock v1.0.4
github.com/kataras/neffos v0.0.7
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
github.com/kr/fs v0.1.0 // indirect github.com/kr/fs v0.1.0 // indirect
github.com/leonelquinteros/gotext v1.4.0 github.com/leonelquinteros/gotext v1.4.0
...@@ -24,8 +27,10 @@ require ( ...@@ -24,8 +27,10 @@ require (
github.com/pkg/sftp v1.10.0 github.com/pkg/sftp v1.10.0
github.com/satori/go.uuid v1.2.0 github.com/satori/go.uuid v1.2.0
github.com/sirupsen/logrus v1.4.2 github.com/sirupsen/logrus v1.4.2
github.com/stretchr/testify v1.3.0 // indirect
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 // indirect
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3
...@@ -34,7 +39,5 @@ require ( ...@@ -34,7 +39,5 @@ require (
replace ( replace (
github.com/gliderlabs/ssh v0.2.3-0.20190711180243-866d0ddf7991 => github.com/ibuler/ssh v0.1.6-0.20190509065047-1c00c8e8b607 github.com/gliderlabs/ssh v0.2.3-0.20190711180243-866d0ddf7991 => github.com/ibuler/ssh v0.1.6-0.20190509065047-1c00c8e8b607
github.com/googollee/go-engine.io v1.4.1 => github.com/ibuler/go-engine.io v1.4.2-0.20190529094538-7786d3a289b9 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 => github.com/ibuler/crypto v0.0.0-20190509101200-a7099eef26a7
github.com/googollee/go-socket.io v1.4.2-0.20190317095603-ed07a7212e28 => github.com/LeeEirc/go-socket.io v1.4.2-0.20190610105739-e344e8b5a55a
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 => github.com/ibuler/crypto v0.0.0-20190715092645-911d13b3bf6e
) )
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.36.0/go.mod h1:RUoy9p/M4ge0HzT8L+SDZ8jg+Q6fth0CiBuhFJpSV40=
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg=
github.com/Azure/azure-pipeline-go v0.1.9 h1:u7JFb9fFTE6Y/j8ae2VK33ePrRqJqoCM/IWkQdAZ+rg= github.com/Azure/azure-pipeline-go v0.1.9 h1:u7JFb9fFTE6Y/j8ae2VK33ePrRqJqoCM/IWkQdAZ+rg=
github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg=
...@@ -17,10 +9,6 @@ github.com/LeeEirc/elfinder v0.0.0-20190604073433-f4f8357e9220 h1:U865EO8YNrjZIG ...@@ -17,10 +9,6 @@ github.com/LeeEirc/elfinder v0.0.0-20190604073433-f4f8357e9220 h1:U865EO8YNrjZIG
github.com/LeeEirc/elfinder v0.0.0-20190604073433-f4f8357e9220/go.mod h1:ApL/XFs34Gvqinex9Z1sZdsp3Jeu26nNuEsf1wQFx8s= github.com/LeeEirc/elfinder v0.0.0-20190604073433-f4f8357e9220/go.mod h1:ApL/XFs34Gvqinex9Z1sZdsp3Jeu26nNuEsf1wQFx8s=
github.com/LeeEirc/elfinder v0.0.0-20190718023636-5679c8bdb7bf h1:dZipr1cwienSKNTXsveMmyd7VFY3v/eMHNl/vueN10s= github.com/LeeEirc/elfinder v0.0.0-20190718023636-5679c8bdb7bf h1:dZipr1cwienSKNTXsveMmyd7VFY3v/eMHNl/vueN10s=
github.com/LeeEirc/elfinder v0.0.0-20190718023636-5679c8bdb7bf/go.mod h1:ApL/XFs34Gvqinex9Z1sZdsp3Jeu26nNuEsf1wQFx8s= github.com/LeeEirc/elfinder v0.0.0-20190718023636-5679c8bdb7bf/go.mod h1:ApL/XFs34Gvqinex9Z1sZdsp3Jeu26nNuEsf1wQFx8s=
github.com/LeeEirc/elfinder v0.0.0-20190718024942-8893ec7a969f h1:xhKgvkrt+lR8IRL+YzmeebV0dlrOiFj1i4UfwSEPVSc=
github.com/LeeEirc/elfinder v0.0.0-20190718024942-8893ec7a969f/go.mod h1:ApL/XFs34Gvqinex9Z1sZdsp3Jeu26nNuEsf1wQFx8s=
github.com/LeeEirc/go-socket.io v1.4.2-0.20190610105739-e344e8b5a55a h1:l5fhBUD24xuw9S4yCUd6hD7OFjYXiJiALT1aqQ4LLfA=
github.com/LeeEirc/go-socket.io v1.4.2-0.20190610105739-e344e8b5a55a/go.mod h1:yjlQxKcAZXZjpGwQVW/y1sgyL1ou+DdCpkswURDCRrU=
github.com/aliyun/aliyun-oss-go-sdk v1.9.8 h1:BOflvK0Zs/zGmoabyFIzTg5c3kguktWTXEwewwbuba0= github.com/aliyun/aliyun-oss-go-sdk v1.9.8 h1:BOflvK0Zs/zGmoabyFIzTg5c3kguktWTXEwewwbuba0=
github.com/aliyun/aliyun-oss-go-sdk v1.9.8/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-oss-go-sdk v1.9.8/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
...@@ -29,153 +17,74 @@ github.com/aws/aws-sdk-go v1.19.46 h1:lRqljzjkGmEeiawkw4z1QgtCnU/S5Jw8lNeUuvmydU ...@@ -29,153 +17,74 @@ github.com/aws/aws-sdk-go v1.19.46 h1:lRqljzjkGmEeiawkw4z1QgtCnU/S5Jw8lNeUuvmydU
github.com/aws/aws-sdk-go v1.19.46/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.19.46/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/elastic/go-elasticsearch v0.0.0 h1:Pd5fqOuBxKxv83b0+xOAJDAkziWYwFinWnBO0y+TZaA= github.com/elastic/go-elasticsearch v0.0.0 h1:Pd5fqOuBxKxv83b0+xOAJDAkziWYwFinWnBO0y+TZaA=
github.com/elastic/go-elasticsearch v0.0.0/go.mod h1:TkBSJBuTyFdBnrNqoPc54FN0vKf5c04IdM4zuStJ7xg= github.com/elastic/go-elasticsearch v0.0.0/go.mod h1:TkBSJBuTyFdBnrNqoPc54FN0vKf5c04IdM4zuStJ7xg=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-playground/form v3.1.4+incompatible h1:lvKiHVxE2WvzDIoyMnWcjyiBxKt2+uFJyZcPYWsLnjI= github.com/go-playground/form v3.1.4+incompatible h1:lvKiHVxE2WvzDIoyMnWcjyiBxKt2+uFJyZcPYWsLnjI=
github.com/go-playground/form v3.1.4+incompatible/go.mod h1:lhcKXfTuhRtIZCIKUeJ0b5F207aeQCPbZU09ScKjwWg= github.com/go-playground/form v3.1.4+incompatible/go.mod h1:lhcKXfTuhRtIZCIKUeJ0b5F207aeQCPbZU09ScKjwWg=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
github.com/golang/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I= github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/ibuler/crypto v0.0.0-20190509101200-a7099eef26a7 h1:1wAr7VKNYJw3mhTTU1Ztu5lyJKHzHmjlA9n+LV09z8E=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/ibuler/crypto v0.0.0-20190509101200-a7099eef26a7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
github.com/ibuler/crypto v0.0.0-20190715092645-911d13b3bf6e h1:QnLvABxtQH9BFja0P/wEjeTPABqvvwIz+to52VNn170=
github.com/ibuler/crypto v0.0.0-20190715092645-911d13b3bf6e/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
github.com/ibuler/go-engine.io v1.4.2-0.20190529094538-7786d3a289b9 h1:8vjRBcvQ50mYr5y9jQWbYXOew3nn3+eF2YNpaAcFrAU=
github.com/ibuler/go-engine.io v1.4.2-0.20190529094538-7786d3a289b9/go.mod h1:26oFqHsnuWIzNOM0T08x21eQOydBosKOCgK3tyhzPPI=
github.com/ibuler/ssh v0.1.6-0.20190509065047-1c00c8e8b607 h1:FMGGB1fr8jroqo0LUUVRcgxkPlczXaWdmv9BSB+PhGo= github.com/ibuler/ssh v0.1.6-0.20190509065047-1c00c8e8b607 h1:FMGGB1fr8jroqo0LUUVRcgxkPlczXaWdmv9BSB+PhGo=
github.com/ibuler/ssh v0.1.6-0.20190509065047-1c00c8e8b607/go.mod h1:OC6P2JzT5kNhTLlU1N+zEw9Nxj+23dj/OhE72g8JyD8= github.com/ibuler/ssh v0.1.6-0.20190509065047-1c00c8e8b607/go.mod h1:OC6P2JzT5kNhTLlU1N+zEw9Nxj+23dj/OhE72g8JyD8=
github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE=
github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0=
github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA= github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA=
github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kataras/neffos v0.0.7 h1:o7zNRcN4fazOzi5j9kKG4IykgKZ37Y7gh0xcrY59wug=
github.com/kataras/neffos v0.0.7/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/leonelquinteros/gotext v1.4.0 h1:2NHPCto5IoMXbrT0bldPrxj0qM5asOCwtb1aUQZ1tys= github.com/leonelquinteros/gotext v1.4.0 h1:2NHPCto5IoMXbrT0bldPrxj0qM5asOCwtb1aUQZ1tys=
github.com/leonelquinteros/gotext v1.4.0/go.mod h1:yZGXREmoGTtBvZHNcc+Yfug49G/2spuF/i/Qlsvz1Us= github.com/leonelquinteros/gotext v1.4.0/go.mod h1:yZGXREmoGTtBvZHNcc+Yfug49G/2spuF/i/Qlsvz1Us=
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ=
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM=
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88= github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88=
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.0 h1:DGA1KlA9esU6WcicH+P8PxFZOl15O6GYtab1cIJdOlE= github.com/pkg/sftp v1.10.0 h1:DGA1KlA9esU6WcicH+P8PxFZOl15O6GYtab1cIJdOlE=
github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI=
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
...@@ -183,41 +92,14 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w ...@@ -183,41 +92,14 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190214204934-8dcb7bc8c7fe/go.mod h1:E6PF97AdD6v0s+fPshSmumCW1S1Ne85RbPQxELkKa44=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405 h1:829vOVxxusYHC+IqBtkX5mbKtsY9fheQiQn0MZRVLfQ= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405 h1:829vOVxxusYHC+IqBtkX5mbKtsY9fheQiQn0MZRVLfQ=
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 h1:AFxeG48hTWHhDTQDk/m2gorfVHUEa9vo3tp3D7TzwjI= gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 h1:AFxeG48hTWHhDTQDk/m2gorfVHUEa9vo3tp3D7TzwjI=
gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
package httpd package httpd
import ( import (
"encoding/json"
"io" "io"
"sync" "sync"
"github.com/gliderlabs/ssh" "github.com/gliderlabs/ssh"
socketio "github.com/googollee/go-socket.io" "github.com/kataras/neffos"
"github.com/jumpserver/koko/pkg/logger"
"github.com/jumpserver/koko/pkg/model" "github.com/jumpserver/koko/pkg/model"
) )
type Client struct { type Client struct {
Uuid string Uuid string
Cid string Cid string
...@@ -18,10 +21,10 @@ type Client struct { ...@@ -18,10 +21,10 @@ type Client struct {
WinChan chan ssh.Window WinChan chan ssh.Window
UserRead io.Reader UserRead io.Reader
UserWrite io.WriteCloser UserWrite io.WriteCloser
Conn socketio.Conn Conn *neffos.NSConn
Closed bool Closed bool
pty ssh.Pty pty ssh.Pty
lock *sync.RWMutex mu *sync.RWMutex
} }
func (c *Client) WinCh() <-chan ssh.Window { func (c *Client) WinCh() <-chan ssh.Window {
...@@ -41,14 +44,23 @@ func (c *Client) Read(p []byte) (n int, err error) { ...@@ -41,14 +44,23 @@ func (c *Client) Read(p []byte) (n int, err error) {
} }
func (c *Client) Write(p []byte) (n int, err error) { func (c *Client) Write(p []byte) (n int, err error) {
c.lock.RLock() c.mu.RLock()
defer c.lock.RUnlock() defer c.mu.RUnlock()
if c.Closed { if c.Closed {
return return
} }
data := DataMsg{Data: string(p), Room: c.Uuid} data := DataMsg{Data: string(p)}
msg, err := json.Marshal(data)
if err != nil {
return
}
n = len(p) n = len(p)
c.Conn.Emit("data", data) room := c.Conn.Room(c.Uuid)
if room == nil {
logger.Error("room not found: ", c.Uuid)
return
}
room.Emit("data", msg)
return return
} }
...@@ -57,11 +69,17 @@ func (c *Client) Pty() ssh.Pty { ...@@ -57,11 +69,17 @@ func (c *Client) Pty() ssh.Pty {
} }
func (c *Client) Close() (err error) { func (c *Client) Close() (err error) {
c.lock.Lock() c.mu.Lock()
defer c.lock.Unlock() defer c.mu.Unlock()
if c.Closed { if c.Closed {
return return
} }
c.Closed = true c.Closed = true
return c.UserWrite.Close() return c.UserWrite.Close()
} }
func (c *Client) SetWinSize(size ssh.Window) {
c.mu.RLock()
defer c.mu.RUnlock()
c.WinChan <- size
}
package httpd
import (
"fmt"
"sync"
"github.com/jumpserver/koko/pkg/logger"
)
var conns = &Connections{container: make(map[string][]string), mu: new(sync.RWMutex)}
var clients = &Clients{container: make(map[string]*Client), mu: new(sync.RWMutex)}
type Clients struct {
container map[string]*Client
mu *sync.RWMutex
}
func (c *Clients) GetClient(cID string) (client *Client) {
c.mu.RLock()
defer c.mu.RUnlock()
client = c.container[cID]
return
}
func (c *Clients) DeleteClient(cID string) {
c.mu.RLock()
client, ok := c.container[cID]
c.mu.RUnlock()
if !ok {
return
}
_ = client.Close()
c.mu.Lock()
defer c.mu.Unlock()
delete(c.container, cID)
logger.Debug("Remain clients count: ", len(c.container))
}
func (c *Clients) AddClient(cID string, conn *Client) {
fmt.Println("Add Client id: ", cID)
c.mu.Lock()
defer c.mu.Unlock()
c.container[cID] = conn
logger.Debug("Now clients count: ", len(c.container))
}
type Connections struct {
container map[string][]string
mu *sync.RWMutex
}
func (c *Connections) AddClient(cID, clientID string) {
c.mu.Lock()
defer c.mu.Unlock()
clients, ok := c.container[cID]
if ok {
clients = append(clients, clientID)
} else {
clients = []string{clientID}
}
c.container[cID] = clients
}
func (c *Connections) GetClients(cID string) (clients []string) {
c.mu.Lock()
defer c.mu.Unlock()
return c.container[cID]
}
func (c *Connections) DeleteClients(cID string) {
if clientIDs := c.GetClients(cID); clientIDs != nil{
for _, clientID := range clientIDs {
clients.DeleteClient(clientID)
}
}
c.mu.Lock()
defer c.mu.Unlock()
delete(c.container, cID)
}
package httpd
import (
"sync"
"github.com/gliderlabs/ssh"
socketio "github.com/googollee/go-socket.io"
"github.com/jumpserver/koko/pkg/model"
)
var conns = &connections{container: make(map[string]*WebConn), mu: new(sync.RWMutex)}
type connections struct {
container map[string]*WebConn
mu *sync.RWMutex
}
func (c *connections) GetWebConn(conID string) (conn *WebConn) {
c.mu.RLock()
defer c.mu.RUnlock()
conn = c.container[conID]
return
}
func (c *connections) DeleteWebConn(conID string) {
c.mu.RLock()
webC, ok := c.container[conID]
c.mu.RUnlock()
if !ok {
return
}
webC.Close()
c.mu.Lock()
defer c.mu.Unlock()
delete(c.container, conID)
}
func (c *connections) AddWebConn(conID string, conn *WebConn) {
c.mu.Lock()
defer c.mu.Unlock()
c.container[conID] = conn
}
func newWebConn(id string, sock socketio.Conn, addr string, user *model.User) *WebConn {
conn := &WebConn{Cid: id, Sock: sock, Addr: addr, User: user, mu: new(sync.RWMutex), Clients: make(map[string]*Client)}
return conn
}
type WebConn struct {
Cid string
Sock socketio.Conn
Addr string
User *model.User
Clients map[string]*Client
mu *sync.RWMutex
}
func (w *WebConn) GetClient(clientID string) (conn *Client) {
w.mu.RLock()
defer w.mu.RUnlock()
return w.Clients[clientID]
}
func (w *WebConn) DeleteClient(clientID string) {
w.mu.Lock()
defer w.mu.Unlock()
delete(w.Clients, clientID)
}
func (w *WebConn) AddClient(clientID string, conn *Client) {
w.mu.Lock()
defer w.mu.Unlock()
w.Clients[clientID] = conn
}
func (w *WebConn) GetAllClients() (clients []string) {
clients = make([]string, 0)
w.mu.RLock()
defer w.mu.RUnlock()
for k := range w.Clients {
clients = append(clients, k)
}
return clients
}
func (w *WebConn) SetWinSize(winSize ssh.Window) {
w.mu.RLock()
defer w.mu.RUnlock()
for _, client := range w.Clients {
client.WinChan <- winSize
}
}
func (w *WebConn) Close() {
w.mu.Lock()
defer w.mu.Unlock()
clientsCopy := make(map[string]*Client)
for k, v := range w.Clients {
clientsCopy[k] = v
}
for k, client := range clientsCopy {
_ = client.Close()
delete(w.Clients, k)
}
}
...@@ -4,6 +4,6 @@ import "github.com/jumpserver/koko/pkg/model" ...@@ -4,6 +4,6 @@ import "github.com/jumpserver/koko/pkg/model"
type WebContext struct { type WebContext struct {
User *model.User User *model.User
Connection *WebConn Connection *Client
Client *Client Client *Client
} }
...@@ -20,7 +20,6 @@ type TokenMsg struct { ...@@ -20,7 +20,6 @@ type TokenMsg struct {
type DataMsg struct { type DataMsg struct {
Data string `json:"data"` Data string `json:"data"`
Room string `json:"room"`
} }
type RoomMsg struct { type RoomMsg struct {
......
...@@ -8,7 +8,6 @@ import ( ...@@ -8,7 +8,6 @@ import (
"strings" "strings"
"github.com/LeeEirc/elfinder" "github.com/LeeEirc/elfinder"
socketio "github.com/googollee/go-socket.io"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/jumpserver/koko/pkg/cctx" "github.com/jumpserver/koko/pkg/cctx"
...@@ -49,17 +48,7 @@ func AuthDecorator(handler http.HandlerFunc) http.HandlerFunc { ...@@ -49,17 +48,7 @@ func AuthDecorator(handler http.HandlerFunc) http.HandlerFunc {
} }
} }
func OnELFinderConnect(s socketio.Conn) error {
data := EmitSidMsg{Sid: s.ID()}
s.Emit("data", data)
return nil
}
func OnELFinderDisconnect(s socketio.Conn, msg string) {
logger.Debug("disconnect: ", s.ID())
logger.Debug("disconnect msg ", msg)
removeUserVolume(s.ID())
}
func sftpHostFinder(wr http.ResponseWriter, req *http.Request) { func sftpHostFinder(wr http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req) vars := mux.Vars(req)
...@@ -102,7 +91,7 @@ func sftpHostConnectorView(wr http.ResponseWriter, req *http.Request) { ...@@ -102,7 +91,7 @@ func sftpHostConnectorView(wr http.ResponseWriter, req *http.Request) {
} }
addUserVolume(sid, userV) addUserVolume(sid, userV)
} }
logger.Debugf("sid: %s", sid) logger.Debugf("Elfinder connector sid: %s", sid)
con := elfinder.NewElFinderConnector([]elfinder.Volume{userV}) conn := elfinder.NewElFinderConnector([]elfinder.Volume{userV})
con.ServeHTTP(wr, req) conn.ServeHTTP(wr, req)
} }
package httpd
import (
"github.com/kataras/neffos"
"github.com/jumpserver/koko/pkg/logger"
)
func OnELFinderConnect(c *neffos.NSConn, msg neffos.Message) error {
data := EmitSidMsg{Sid: c.Conn.ID()}
c.Emit("data", neffos.Marshal(data))
return nil
}
func OnELFinderDisconnect(c *neffos.NSConn, msg neffos.Message) (error) {
logger.Debug("disconnect: ", c.Conn.ID())
removeUserVolume(c.Conn.ID())
return nil
}
...@@ -5,8 +5,9 @@ import ( ...@@ -5,8 +5,9 @@ import (
"net/http" "net/http"
"path/filepath" "path/filepath"
"github.com/googollee/go-socket.io"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/kataras/neffos"
"github.com/kataras/neffos/gorilla"
"github.com/jumpserver/koko/pkg/config" "github.com/jumpserver/koko/pkg/config"
"github.com/jumpserver/koko/pkg/logger" "github.com/jumpserver/koko/pkg/logger"
...@@ -16,35 +17,43 @@ var ( ...@@ -16,35 +17,43 @@ var (
httpServer *http.Server httpServer *http.Server
) )
var wsEvents = neffos.Namespaces{
"ssh": neffos.Events{
neffos.OnNamespaceConnected: OnNamespaceConnected,
neffos.OnNamespaceDisconnect: OnNamespaceDisconnect,
neffos.OnRoomJoined: func(c *neffos.NSConn, msg neffos.Message) error {
return nil
},
neffos.OnRoomLeft: func(c *neffos.NSConn, msg neffos.Message) error {
return nil
},
"data": OnDataHandler,
"resize": OnResizeHandler,
"host": OnHostHandler,
"logout": OnLogoutHandler,
"token": OnTokenHandler,
},
"elfinder": neffos.Events{
neffos.OnNamespaceConnected: OnELFinderConnect,
neffos.OnNamespaceDisconnect: OnELFinderDisconnect,
},
}
func StartHTTPServer() { func StartHTTPServer() {
conf := config.GetConf() conf := config.GetConf()
server, err := socketio.NewServer(nil) sshWs := neffos.New(gorilla.DefaultUpgrader, wsEvents)
if err != nil { sshWs.IDGenerator = func(w http.ResponseWriter, r *http.Request) string {
logger.Fatal(err) return neffos.DefaultIDGenerator(w, r)
}
sshWs.OnUpgradeError = func(err error) {
} }
server.OnConnect("/ssh", OnConnectHandler)
server.OnDisconnect("/ssh", OnDisconnect)
server.OnError("/ssh", OnErrorHandler)
server.OnEvent("/ssh", "host", OnHostHandler)
server.OnEvent("/ssh", "token", OnTokenHandler)
server.OnEvent("/ssh", "data", OnDataHandler)
server.OnEvent("/ssh", "resize", OnResizeHandler)
server.OnEvent("/ssh", "logout", OnLogoutHandler)
server.OnConnect("/elfinder", OnELFinderConnect)
server.OnDisconnect("/elfinder", OnELFinderDisconnect)
server.OnError("/elfiner", OnErrorHandler)
server.OnDisconnect("", SocketDisconnect)
server.OnError("", OnErrorHandler)
go server.Serve()
defer server.Close()
router := mux.NewRouter() router := mux.NewRouter()
fs := http.FileServer(http.Dir(filepath.Join(conf.RootPath, "static"))) fs := http.FileServer(http.Dir(filepath.Join(conf.RootPath, "static")))
router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs)) router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
router.Handle("/socket.io/", server) router.Handle("/socket.io/", sshWs)
router.HandleFunc("/coco/elfinder/sftp/{host}/", AuthDecorator(sftpHostFinder)) router.HandleFunc("/coco/elfinder/sftp/{host}/", AuthDecorator(sftpHostFinder))
router.HandleFunc("/coco/elfinder/sftp/", AuthDecorator(sftpFinder)) router.HandleFunc("/coco/elfinder/sftp/", AuthDecorator(sftpFinder))
router.HandleFunc("/coco/elfinder/sftp/connector/{host}/", router.HandleFunc("/coco/elfinder/sftp/connector/{host}/",
...@@ -60,8 +69,4 @@ func StopHTTPServer() { ...@@ -60,8 +69,4 @@ func StopHTTPServer() {
_ = httpServer.Close() _ = httpServer.Close()
} }
func SocketDisconnect(s socketio.Conn, msg string) {
removeUserVolume(s.ID())
conns.DeleteWebConn(s.ID())
logger.Debug("clean disconnect")
}
package httpd package httpd
import ( import (
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"github.com/jumpserver/koko/pkg/model"
"io" "io"
"net" "net"
"strings" "strings"
"sync" "sync"
"github.com/gliderlabs/ssh" "github.com/gliderlabs/ssh"
socketio "github.com/googollee/go-socket.io" "github.com/kataras/neffos"
uuid "github.com/satori/go.uuid"
"github.com/satori/go.uuid"
"github.com/jumpserver/koko/pkg/logger" "github.com/jumpserver/koko/pkg/logger"
"github.com/jumpserver/koko/pkg/proxy" "github.com/jumpserver/koko/pkg/proxy"
"github.com/jumpserver/koko/pkg/service" "github.com/jumpserver/koko/pkg/service"
) )
// OnConnectHandler 当websocket连接后触发 // OnConnectHandler 当websocket连接后触发
func OnConnectHandler(s socketio.Conn) error { func OnNamespaceConnected(c *neffos.NSConn, msg neffos.Message) error {
// 首次连接 1.获取当前用户的信息 // 首次连接 1.获取当前用户的信息
logger.Debug("Web terminal on connect event trigger") cc := c.Conn
cookies := strings.Split(s.RemoteHeader().Get("Cookie"), ";") if cc.WasReconnected() {
logger.Debugf("Web terminal redirected, with tries: %d", cc.ID(), cc.ReconnectTries)
} else {
logger.Debug("Web terminal on connect event trigger")
}
request := cc.Socket().Request()
header := request.Header
cookies := strings.Split(header.Get("Cookie"), ";")
var csrfToken, sessionID, remoteIP string var csrfToken, sessionID, remoteIP string
for _, line := range cookies { for _, line := range cookies {
if strings.Contains(line, "csrftoken") { if strings.Contains(line, "csrftoken") {
...@@ -37,17 +51,21 @@ func OnConnectHandler(s socketio.Conn) error { ...@@ -37,17 +51,21 @@ func OnConnectHandler(s socketio.Conn) error {
logger.Error(msg) logger.Error(msg)
return errors.New(strings.ToLower(msg)) return errors.New(strings.ToLower(msg))
} }
remoteAddr := s.RemoteHeader().Get("X-Forwarded-For") cc.Set("currentUser", user)
remoteAddr := header.Get("X-Forwarded-For")
if remoteAddr == "" { if remoteAddr == "" {
remoteIP = s.RemoteAddr().String() remoteAddr = request.RemoteAddr
} else {
remoteIP = strings.Split(remoteAddr, ",")[0]
} }
remoteIP = strings.Split(remoteAddr, ",")[0]
logger.Infof("Accepted %s connect websocket from %s", user.Username, remoteIP) logger.Infof("Accepted %s connect websocket from %s", user.Username, remoteIP)
conn := newWebConn(s.ID(), s, remoteIP, user) return nil
ctx := WebContext{User: user, Connection: conn} }
s.SetContext(ctx)
conns.AddWebConn(s.ID(), conn)
// OnDisconnect websocket断开后触发
func OnNamespaceDisconnect(c *neffos.NSConn, msg neffos.Message) (err error){
logger.Debug("On disconnect event trigger")
conns.DeleteClients(c.Conn.ID())
return nil return nil
} }
...@@ -57,8 +75,15 @@ func OnErrorHandler(e error) { ...@@ -57,8 +75,15 @@ func OnErrorHandler(e error) {
} }
// OnHostHandler 当用户连接Host时触发 // OnHostHandler 当用户连接Host时触发
func OnHostHandler(s socketio.Conn, message HostMsg) { func OnHostHandler(c *neffos.NSConn, msg neffos.Message) (err error) {
logger.Debug("Web terminal on host event trigger") logger.Debug("Web terminal on host event trigger")
cc := c.Conn
var message HostMsg
err = msg.Unmarshal(&message)
if err != nil {
return
}
fmt.Println("Host msg: ", message)
win := ssh.Window{Height: 24, Width: 80} win := ssh.Window{Height: 24, Width: 80}
assetID := message.Uuid assetID := message.Uuid
systemUserID := message.UserID systemUserID := message.UserID
...@@ -70,141 +95,151 @@ func OnHostHandler(s socketio.Conn, message HostMsg) { ...@@ -70,141 +95,151 @@ func OnHostHandler(s socketio.Conn, message HostMsg) {
if height != 0 { if height != 0 {
win.Height = height win.Height = height
} }
clientID := uuid.NewV4().String() roomID := uuid.NewV4().String()
emitMsg := RoomMsg{clientID, secret} emitMsg := RoomMsg{roomID, secret}
s.Emit("room", emitMsg) joinRoomMsg, _ := json.Marshal(emitMsg)
c.Emit("room", joinRoomMsg)
if err != nil {
logger.Debug("Join room error occur: ", err)
return
}
asset := service.GetAsset(assetID) asset := service.GetAsset(assetID)
systemUser := service.GetSystemUser(systemUserID) systemUser := service.GetSystemUser(systemUserID)
if asset.ID == "" || systemUser.ID == "" { if asset.ID == "" || systemUser.ID == "" {
logger.Debug("No asset id or system user id found, exit")
return return
} }
logger.Debug("Web terminal want to connect host: ", asset.Hostname) logger.Debug("Web terminal want to connect host: ", asset.Hostname)
currentUser, ok := cc.Get("currentUser").(*model.User)
if !ok {
return errors.New("not found current user")
}
ctx := s.Context().(WebContext)
userR, userW := io.Pipe() userR, userW := io.Pipe()
conn := conns.GetWebConn(s.ID()) addr, _, _ := net.SplitHostPort(cc.Socket().Request().RemoteAddr)
addr, _, _ := net.SplitHostPort(s.RemoteAddr().String())
client := &Client{ client := &Client{
Uuid: clientID, Cid: conn.Cid, user: conn.User, addr: addr, Uuid: roomID, user: currentUser, addr: addr,
WinChan: make(chan ssh.Window, 100), Conn: s, WinChan: make(chan ssh.Window, 100), Conn: c,
UserRead: userR, UserWrite: userW, lock: new(sync.RWMutex), UserRead: userR, UserWrite: userW, mu: new(sync.RWMutex),
pty: ssh.Pty{Term: "xterm", Window: win}, pty: ssh.Pty{Term: "xterm", Window: win},
} }
user := cc.Get("currentUser").(*model.User)
client.WinChan <- win client.WinChan <- win
conn.AddClient(clientID, client) clients.AddClient(roomID, client)
conns.AddClient(cc.ID(), roomID)
proxySrv := proxy.ProxyServer{ proxySrv := proxy.ProxyServer{
UserConn: client, User: ctx.User, UserConn: client, User: user,
Asset: &asset, SystemUser: &systemUser, Asset: &asset, SystemUser: &systemUser,
} }
go func() { go func() {
defer logger.Debug("web proxy end") defer logger.Debug("web proxy end")
logger.Debug("Start proxy")
proxySrv.Proxy() proxySrv.Proxy()
s.Emit("logout", RoomMsg{Room: clientID}) logoutMsg, _ := json.Marshal(RoomMsg{Room: roomID})
c.Emit("logout", logoutMsg)
clients.DeleteClient(roomID)
}() }()
return nil
} }
// OnTokenHandler 当使用token连接时触发 // OnTokenHandler 当使用token连接时触发
func OnTokenHandler(s socketio.Conn, message TokenMsg) { func OnTokenHandler(c *neffos.NSConn, msg neffos.Message) (err error) {
logger.Debug("Web terminal on token event trigger") logger.Debug("Web terminal on token event trigger")
win := ssh.Window{Height: 24, Width: 80} cc := c.Conn
var message TokenMsg
err = msg.Unmarshal(&message)
if err != nil {
return
}
token := message.Token token := message.Token
secret := message.Secret secret := message.Secret
width, height := message.Size[0], message.Size[1]
if width != 0 {
win.Width = width
}
if height != 0 {
win.Height = height
}
clientID := uuid.NewV4().String() clientID := uuid.NewV4().String()
emitMs := RoomMsg{clientID, secret} roomMsg := RoomMsg{clientID, secret}
s.Emit("room", emitMs) c.Emit("room", neffos.Marshal(roomMsg))
// check token // check token
if token == "" || secret == "" { if token == "" || secret == "" {
msg := fmt.Sprintf("Token or secret is None: %s %s", token, secret) msg := fmt.Sprintf("Token or secret is None: %s %s", token, secret)
dataMsg := EmitDataMsg{Data: msg, Room: clientID} dataMsg := EmitDataMsg{Data: msg, Room: clientID}
s.Emit("data", dataMsg) c.Emit("data", neffos.Marshal(dataMsg))
s.Emit("disconnect") c.Emit("disconnect", nil)
} }
tokenUser := service.GetTokenAsset(token) tokenUser := service.GetTokenAsset(token)
if tokenUser.UserID == "" { if tokenUser.UserID == "" {
msg := "Token info is none, maybe token expired" msg := "Token info is none, maybe token expired"
dataMsg := EmitDataMsg{Data: msg, Room: clientID} dataMsg := EmitDataMsg{Data: msg, Room: clientID}
s.Emit("data", dataMsg) c.Emit("data", neffos.Marshal(dataMsg))
s.Emit("disconnect") c.Emit("disconnect", nil)
} }
currentUser := service.GetUserDetail(tokenUser.UserID) currentUser := service.GetUserDetail(tokenUser.UserID)
asset := service.GetAsset(tokenUser.AssetID)
systemUser := service.GetSystemUser(tokenUser.SystemUserID)
if asset.ID == "" || systemUser.ID == "" { if currentUser == nil {
return msg := "User id error"
dataMsg := EmitDataMsg{Data: msg, Room: clientID}
c.Emit("data", neffos.Marshal(dataMsg))
c.Emit("disconnect", nil)
} }
userR, userW := io.Pipe() cc.Set("currentUser", currentUser)
conn := conns.GetWebConn(s.ID()) hostMsg := HostMsg{
conn.User = currentUser Uuid: tokenUser.AssetID, UserID: tokenUser.SystemUserID,
client := Client{ Size: message.Size, Secret:secret,
Uuid: clientID, Cid: conn.Cid, user: conn.User,
WinChan: make(chan ssh.Window, 100), Conn: s,
UserRead: userR, UserWrite: userW, lock: new(sync.RWMutex),
pty: ssh.Pty{Term: "xterm", Window: win},
} }
client.WinChan <- win fmt.Println("Host msg: ", hostMsg)
conn.AddClient(clientID, &client) hostWsMsg := neffos.Message{
Body:neffos.Marshal(hostMsg),
proxySrv := proxy.ProxyServer{
UserConn: &client, User: currentUser,
Asset: &asset, SystemUser: &systemUser,
} }
go func() { return OnHostHandler(c, hostWsMsg)
defer logger.Debug("web proxy end")
proxySrv.Proxy()
s.Emit("logout", RoomMsg{Room: clientID})
}()
} }
// OnDataHandler 收发数据时触发 // OnDataHandler 收发数据时触发
func OnDataHandler(s socketio.Conn, message DataMsg) { func OnDataHandler(c *neffos.NSConn, msg neffos.Message) (err error) {
cid := message.Room roomID := msg.Room
conn := conns.GetWebConn(s.ID()) client := clients.GetClient(roomID)
client := conn.GetClient(cid)
if client == nil { if client == nil {
return return
} }
_, _ = client.UserWrite.Write([]byte(message.Data))
var message DataMsg
err = msg.Unmarshal(&message)
if err != nil {
return
}
_, err = client.UserWrite.Write([]byte(message.Data))
return err
} }
// OnResizeHandler 用户窗口改变时触发 // OnResizeHandler 用户窗口改变时触发
func OnResizeHandler(s socketio.Conn, message ResizeMsg) { func OnResizeHandler(c *neffos.NSConn, msg neffos.Message) (err error) {
var message ResizeMsg
err = msg.Unmarshal(&message)
if err != nil {
return
}
logger.Debugf("Web terminal on resize event trigger: %d*%d", message.Width, message.Height) logger.Debugf("Web terminal on resize event trigger: %d*%d", message.Width, message.Height)
winSize := ssh.Window{Height: message.Height, Width: message.Width} winSize := ssh.Window{Height: message.Height, Width: message.Width}
conn := conns.GetWebConn(s.ID()) for _, room := range c.Rooms() {
conn.SetWinSize(winSize) roomID := room.Name
client := clients.GetClient(roomID)
if client != nil {
client.SetWinSize(winSize)
}
}
return nil
} }
// OnLogoutHandler 用户登出一个会话时触发 // OnLogoutHandler 用户登出一个会话时触发
func OnLogoutHandler(s socketio.Conn, message string) { func OnLogoutHandler(c *neffos.NSConn, msg neffos.Message) (err error){
logger.Debug("Web terminal on logout event trigger") logger.Debug("Web terminal on logout event trigger: ", msg.Room)
conn := conns.GetWebConn(s.ID()) var message RoomMsg
if conn == nil { err = msg.Unmarshal(&message)
logger.Error("No conn found") if err != nil {
return
}
client := conn.GetClient(message)
if client == nil {
logger.Error("No client found")
return return
} }
_ = client.Close() roomID := message.Room
clients.DeleteClient(roomID)
return
} }
// OnDisconnect websocket断开后触发
func OnDisconnect(s socketio.Conn, msg string) {
logger.Debug("On disconnect event trigger")
conn := conns.GetWebConn(s.ID())
conn.Close()
}
...@@ -46,12 +46,12 @@ func FinishSession(data map[string]interface{}) { ...@@ -46,12 +46,12 @@ func FinishSession(data map[string]interface{}) {
var res map[string]interface{} var res map[string]interface{}
if sid, ok := data["id"]; ok { if sid, ok := data["id"]; ok {
playborad := map[string]interface{}{ payload := map[string]interface{}{
"is_finished": true, "is_finished": true,
"date_end": data["date_end"], "date_end": data["date_end"],
} }
Url := fmt.Sprintf(SessionDetailURL, sid) Url := fmt.Sprintf(SessionDetailURL, sid)
err := authClient.Patch(Url, playborad, &res) err := authClient.Patch(Url, payload, &res)
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
} }
......
...@@ -23,7 +23,7 @@ func StartServer() { ...@@ -23,7 +23,7 @@ func StartServer() {
} }
addr := net.JoinHostPort(conf.BindHost, conf.SSHPort) addr := net.JoinHostPort(conf.BindHost, conf.SSHPort)
logger.Infof("Start ssh server at %s", addr) logger.Infof("Start SSH server at %s", addr)
sshServer = &ssh.Server{ sshServer = &ssh.Server{
Addr: addr, Addr: addr,
KeyboardInteractiveHandler: auth.CheckMFA, KeyboardInteractiveHandler: auth.CheckMFA,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment