Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
ConnectionConditions.data_connection_made,
wait=True,
fail_code="425",
fail_info="Can't open data connection")
@worker
async def stor_worker(self, connection, rest):
stream = connection.data_connection
del connection.data_connection
if connection.restart_offset:
file_mode = "r+b"
else:
file_mode = mode
file_out = connection.path_io.open(real_path, mode=file_mode)
async with file_out, stream:
if connection.restart_offset:
await file_out.seek(connection.restart_offset)
async for data in stream.iter_by_block(connection.block_size):
@ConnectionConditions(
ConnectionConditions.data_connection_made,
wait=True,
fail_code="425",
fail_info="Can't open data connection")
@worker
async def retr_worker(self, connection, rest):
stream = connection.data_connection
del connection.data_connection
file_in = connection.path_io.open(real_path, mode="rb")
async with file_in, stream:
if connection.restart_offset:
await file_in.seek(connection.restart_offset)
async for data in file_in.iter_by_block(connection.block_size):
await stream.write(data)
connection.response("226", "data transfer done")
return True
@ConnectionConditions(ConnectionConditions.login_required)
@PathConditions(
PathConditions.path_must_exists,
PathConditions.path_must_be_file)
@PathPermissions(PathPermissions.writable)
async def dele(self, connection, rest):
real_path, virtual_path = self.get_paths(connection, rest)
await connection.path_io.unlink(real_path)
connection.response("250", "")
return True
@ConnectionConditions(ConnectionConditions.user_required)
async def pass_(self, connection, rest):
if connection.future.logged.done():
code, info = "503", "already logged in"
elif await self.user_manager.authenticate(connection.user, rest):
connection.logged = True
code, info = "230", "normal login"
else:
code, info = "530", "wrong password"
connection.response(code, info)
return True
@ConnectionConditions(
ConnectionConditions.data_connection_made,
wait=True,
fail_code="425",
fail_info="Can't open data connection")
@worker
async def list_worker(self, connection, rest):
stream = connection.data_connection
del connection.data_connection
async with stream:
async for path in connection.path_io.list(real_path):
s = await self.build_list_string(connection, path)
b = (s + END_OF_LINE).encode(encoding=self.encoding)
await stream.write(b)
connection.response("226", "list transfer done")
return True
ConnectionConditions.rename_from_required)
@PathConditions(PathConditions.path_must_not_exists)
@PathPermissions(PathPermissions.writable)
async def rnto(self, connection, rest):
real_path, virtual_path = self.get_paths(connection, rest)
rename_from = connection.rename_from
del connection.rename_from
await connection.path_io.rename(rename_from, real_path)
connection.response("250", "")
return True
@ConnectionConditions(ConnectionConditions.login_required)
async def type(self, connection, rest):
if rest in ("I", "A"):
connection.transfer_type = rest
code, info = "200", ""
else:
code, info = "502", f"type {rest!r} not implemented"
connection.response(code, info)
return True
@ConnectionConditions(
ConnectionConditions.login_required,
ConnectionConditions.rename_from_required)
@PathConditions(PathConditions.path_must_not_exists)
@PathPermissions(PathPermissions.writable)
async def rnto(self, connection, rest):
real_path, virtual_path = self.get_paths(connection, rest)
rename_from = connection.rename_from
del connection.rename_from
await connection.path_io.rename(rename_from, real_path)
connection.response("250", "")
return True
@ConnectionConditions(
ConnectionConditions.login_required,
ConnectionConditions.passive_server_started)
@PathConditions(
PathConditions.path_must_exists,
PathConditions.path_must_be_file)
@PathPermissions(PathPermissions.readable)
async def retr(self, connection, rest):
@ConnectionConditions(
ConnectionConditions.data_connection_made,
wait=True,
fail_code="425",
fail_info="Can't open data connection")
@worker
async def retr_worker(self, connection, rest):
stream = connection.data_connection