Skip to content

Commit

Permalink
Showing relative file path while writing files
Browse files Browse the repository at this point in the history
  • Loading branch information
roblaszczak committed Jan 29, 2022
1 parent c3ca2f8 commit 59b07dd
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 5 deletions.
30 changes: 28 additions & 2 deletions trainings/files/write.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"os"
"path/filepath"
"strings"
"syscall"

"github.com/hexops/gotextdiff"
"github.com/hexops/gotextdiff/myers"
Expand All @@ -30,7 +31,7 @@ type savedFile struct {
Lines int
}

func (f Files) WriteExerciseFiles(filesToCreate []*genproto.File, trainingRootFs afero.Fs, exerciseDir string) error {
func (f Files) WriteExerciseFiles(filesToCreate []*genproto.File, trainingRootFs *afero.BasePathFs, exerciseDir string) error {
if !f.dirOrFileExists(trainingRootFs, exerciseDir) {
if err := trainingRootFs.MkdirAll(exerciseDir, 0755); err != nil {
return errors.Wrapf(err, "can't create %s", exerciseDir)
Expand Down Expand Up @@ -77,7 +78,13 @@ func (f Files) WriteExerciseFiles(filesToCreate []*genproto.File, trainingRootFs
}

for _, file := range savedFiles {
fmt.Fprintf(f.stdout, "+ %s (%d lines)\n", file.Name, file.Lines)
savedFileRelativePath, err := calculateSavedFileRelativePath(trainingRootFs, file.Name)
if err != nil {
logrus.WithError(err).Warn("Can't calculate savedFileRelativePath")
savedFileRelativePath = file.Name
}

fmt.Fprintf(f.stdout, "+ %s (%d lines)\n", savedFileRelativePath, file.Lines)
}

if len(savedFiles) > 0 {
Expand All @@ -87,6 +94,25 @@ func (f Files) WriteExerciseFiles(filesToCreate []*genproto.File, trainingRootFs
return nil
}

func calculateSavedFileRelativePath(trainingRootFs *afero.BasePathFs, fileName string) (string, error) {
realPath, err := trainingRootFs.RealPath(fileName)
if err != nil {
return "", errors.Wrapf(err, "can't get real path of %s", fileName)
}

wd, err := syscall.Getwd()
if err != nil {
return "", err
}

terminalPath, err := filepath.Rel(wd, realPath)
if err != nil {
return "", err
}

return terminalPath, nil
}

func (f Files) shouldWriteFile(fs afero.Fs, filePath string, file *genproto.File) (bool, error) {
if !f.dirOrFileExists(fs, filePath) {
return true, nil
Expand Down
6 changes: 3 additions & 3 deletions trainings/next.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (h *Handlers) nextExercise(ctx context.Context, currentExerciseID string) e
// For more info please check: https://owasp.org/www-community/attacks/Path_Traversal
//
// To avoid that we are using afero.BasePathFs with base on training root for all operations in trainings dir.
trainingRootFs := afero.NewBasePathFs(afero.NewOsFs(), trainingRoot)
trainingRootFs := afero.NewBasePathFs(afero.NewOsFs(), trainingRoot).(*afero.BasePathFs)

finished, resp, err := h.getNextExercise(ctx, currentExerciseID, trainingRootFs)
if err != nil {
Expand All @@ -46,7 +46,7 @@ func (h *Handlers) nextExercise(ctx context.Context, currentExerciseID string) e
return nil
}

func (h *Handlers) getNextExercise(ctx context.Context, currentExerciseID string, trainingRootFs afero.Fs) (finished bool, resp *genproto.NextExerciseResponse, err error) {
func (h *Handlers) getNextExercise(ctx context.Context, currentExerciseID string, trainingRootFs *afero.BasePathFs) (finished bool, resp *genproto.NextExerciseResponse, err error) {
resp, err = h.newGrpcClient(ctx).NextExercise(ctx, &genproto.NextExerciseRequest{
TrainingName: h.config.TrainingConfig(trainingRootFs).TrainingName,
CurrentExerciseId: currentExerciseID,
Expand All @@ -63,7 +63,7 @@ func (h *Handlers) getNextExercise(ctx context.Context, currentExerciseID string
return false, resp, nil
}

func (h *Handlers) writeExerciseFiles(resp *genproto.NextExerciseResponse, trainingRootFs afero.Fs) error {
func (h *Handlers) writeExerciseFiles(resp *genproto.NextExerciseResponse, trainingRootFs *afero.BasePathFs) error {
if err := files.NewFiles().WriteExerciseFiles(resp.FilesToCreate, trainingRootFs, resp.Dir); err != nil {
return err
}
Expand Down

0 comments on commit 59b07dd

Please sign in to comment.