/******************************************************************************
* *
* Copyright 2017 Subterranean Security *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*****************************************************************************/
package com.subterranean_security.crimson.server.net.exe;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.subterranean_security.crimson.core.net.Connector;
import com.subterranean_security.crimson.core.platform.LocalFS;
import com.subterranean_security.crimson.core.proto.FileManager.RQ_FileListing;
import com.subterranean_security.crimson.core.proto.FileManager.RS_Delete;
import com.subterranean_security.crimson.core.proto.FileManager.RS_FileHandle;
import com.subterranean_security.crimson.core.proto.FileManager.RS_FileListing;
import com.subterranean_security.crimson.core.proto.MSG.Message;
import com.subterranean_security.crimson.core.proto.Misc.Outcome;
import com.subterranean_security.crimson.core.store.FileManagerStore;
import com.subterranean_security.crimson.server.store.ProfileStore;
import com.subterranean_security.crimson.sv.permissions.Perm;
import com.subterranean_security.crimson.sv.profile.ViewerProfile;
public final class FileManagerExe {
private static final Logger log = LoggerFactory.getLogger(FileManagerExe.class);
private FileManagerExe() {
}
public static void rq_file_listing(Connector receptor, Message m) {
ViewerProfile vp = ProfileStore.getViewer(receptor.getCvid());
if (!vp.getPermissions().getFlag(Perm.server.fs.read)) {
log.warn("Denied unauthorized file access to server from viewer: {}", receptor.getCvid());
return;
}
RQ_FileListing rq = m.getRqFileListing();
LocalFS lf = FileManagerStore.get(rq.getFmid());
if (rq.hasUp() && rq.getUp()) {
lf.up();
} else if (rq.hasDown()) {
lf.down(rq.getDown());
}
try {
receptor.write(Message.newBuilder().setId(m.getId())
.setRsFileListing(RS_FileListing.newBuilder().setPath(lf.pwd()).addAllListing(lf.list())).build());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void rs_file_listing(Connector receptor, Message m) {
}
public static void rs_file_handle(Connector receptor, Message m) {
}
public static void rq_file_handle(Connector receptor, Message m) {
ViewerProfile vp = ProfileStore.getViewer(receptor.getCvid());
if (!vp.getPermissions().getFlag(Perm.server.fs.read)) {
log.warn("Denied unauthorized file access to server from viewer: {}", receptor.getCvid());
return;
}
receptor.write(Message.newBuilder().setId(m.getId())
.setRsFileHandle(RS_FileHandle.newBuilder().setFmid(FileManagerStore.add(new LocalFS(true, true))))
.build());
}
public static void rq_delete(Connector receptor, Message m) {
// check permissions
if (!ProfileStore.getViewer(receptor.getCvid()).getPermissions().getFlag(Perm.server.fs.write)) {
receptor.write(Message.newBuilder().setId(m.getId())
.setRsDelete(RS_Delete.newBuilder()
.setOutcome(Outcome.newBuilder().setResult(false).setComment("Insufficient permissions")))
.build());
return;
}
receptor.write(Message.newBuilder().setId(m.getId())
.setRsDelete(RS_Delete.newBuilder()
.setOutcome(LocalFS.delete(m.getRqDelete().getTargetList(), m.getRqDelete().getOverwrite())))
.build());
}
public static void rq_advanced_file_info(Connector receptor, Message m) {
receptor.write(Message.newBuilder().setId(m.getId()).setRid(m.getSid()).setSid(m.getRid())
.setRsAdvancedFileInfo(LocalFS.getInfo(m.getRqAdvancedFileInfo().getFile())).build());
}
}