Fix uid management and websocket closure before shell exit

This commit is contained in:
Florian Mounier
2014-03-03 19:44:54 +01:00
parent 7d34dc6ba1
commit 30108a5ff3
3 changed files with 15 additions and 22 deletions

View File

@@ -14,7 +14,7 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
__version__ = '1.2.7'
__version__ = '1.2.8'
import os

View File

@@ -196,7 +196,6 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler):
return
self.socket = utils.Socket(self.ws_connection.stream.socket)
self.errors = 0
self.set_nodelay(True)
self.log.info('Websocket opened %r' % self.socket)
self.path = path
@@ -209,7 +208,7 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler):
if field[0][0] == 'commonName':
self.user = self.callee = field[0][1]
if self.socket.local:
if self.socket.local and self.socket.uid is not None:
self.caller = utils.User(uid=self.socket.uid)
else:
# We don't know uid is on the other machine
@@ -231,6 +230,7 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler):
def on_message(self, message):
if not hasattr(self, 'writer'):
self.on_close()
self.close()
return
if message[0] == 'R':
@@ -245,25 +245,21 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler):
def shell_handler(self, fd, events):
if events & ioloop.READ:
self.errors = 0
try:
read = self.reader.read()
except IOError:
pass
else:
self.log.info('READ>%r' % read)
self.write_message('DIE')
return
self.log.info('READ>%r' % read)
self.write_message(read.decode('utf-8', 'replace'))
if self.ws_connection:
self.write_message(read.decode('utf-8', 'replace'))
else:
events = ioloop.ERROR
if events & ioloop.ERROR:
self.errors += 1
if self.errors >= 10:
self.log.info(
'Too many errors, the shell must have been closed')
# Terminated
self.on_close()
self.close()
self.log.info('Error on fd, closing')
# Terminated
self.on_close()
self.close()
def on_close(self):
if getattr(self, 'pid', 0) == 0:

View File

@@ -26,15 +26,12 @@ log = getLogger('butterfly')
class User(object):
def __init__(self, uid=None, name=None):
if not uid and not name:
if uid is None and not name:
uid = os.getuid()
if uid is not None:
self.pw = pwd.getpwuid(uid)
else:
try:
self.pw = pwd.getpwnam(name)
except:
self.pw = pwd.getpwnam('daemon')
self.pw = pwd.getpwnam(name)
if self.pw is None:
raise LookupError('Unknown user')