Esempio n. 1
0
File: client.py Progetto: sammdot/S3
	async def start(self):
		try:
			self.loop = asyncio.get_event_loop()
			self.reader, self.writer = await asyncio.open_connection(
				host=self.host, port=self.port, ssl=self.ssl)
		except Exception as e:
			raise ClientError(*e.args)

		while True:
			line = (await self.reader.readline()).decode("utf-8").strip()
			if line == "":
				break

			msg = Message.from_line(line)
			self.notify_observers(msg)
Esempio n. 2
0
File: server.py Progetto: sammdot/S3
	async def on_client_connect(self, reader, writer):
		addr = Server.address(writer)
		sess = Session(self, reader, writer)
		sess.send(Message("001", self.name))

		while True:
			line = (await reader.readline()).decode("utf-8").strip()
			if line == "":
				break

			msg = Message.from_line(line)
			cmd = msg.command.upper()

			if cmd == "LOGIN":
				if sess.token is not None:
					sess.send(Message("093", "Already logged in"))
					continue
				if sess.mode is not None:
					sess.send(Message("094", "Must send LOGIN before MODE"))
					break
				data = self.login_provider.authenticate(msg.params)
				if "error" in data:
					sess.send(Message("091", data["error"]))
					break
				sess.token = data["token"]
				sess.level = data["level"]

				if sess.level < 25:
					sess.send(Message("092", "Insufficient permissions"))
					break

				if sess.token not in self.clients:
					self.clients[sess.token] = []
				self.clients[sess.token].append(sess)

				sess.send(Message("002", sess.token))
			elif cmd == "MODE":
				if sess.mode is not None:
					sess.send(Message("090", "Session mode already set"))
					continue
				if sess.token is None:
					sess.send(Message("094", "Must send LOGIN before MODE"))
					break
				if len(msg.params) != 1:
					sess.send(Message("095", "Wrong number of parameters"))
				mode = msg.params[0].upper()
				if mode == "NX":
					sess.mode = SessionMode.ENTRANCE_EXIT
				elif mode == "LEVER":
					sess.mode = SessionMode.LEVER
				elif mode == "OBSERVE":
					sess.mode = SessionMode.OBSERVE
				elif mode == "OPER":
					sess.mode = SessionMode.OPERATOR
				else:
					sess.send(Message("096", "Invalid parameter to MODE"))
					continue	
				sess.send(Message("003", mode, "Session mode set"))
				await self.send_data(sess)
			else:
				if sess.token is None and sess.mode is None:
					sess.send(Message("097", "Must be logged in"))
				ret = await sess.handle(msg)
				if ret == 0:
					if sess.dlserver1 is not None:
						sess.dlserver1.close()
					if sess.dlserver2 is not None:
						sess.dlserver2.close()
					return

		self.close(sess)