diff --git a/backend/submission.go b/backend/submission.go index 9fe31665..ce266ef0 100644 --- a/backend/submission.go +++ b/backend/submission.go @@ -11,6 +11,7 @@ import ( "math/rand" "os" "path" + "regexp" "strconv" "srs.epita.fr/fic-server/libfic" @@ -33,9 +34,15 @@ func treatSubmission(pathname string, team_id string, exercice_id string) { } else if err := json.Unmarshal(cnt_raw, &keys); err != nil { log.Println(id, "[ERR]", err) } else if exercice_id == "name" { - team.Name = keys["newName"] - if _, err := team.Update(); err != nil { - log.Println(id, "[WRN] Unable to change team name:", err) + if match, err := regexp.MatchString("^[A-Za-z0-9 àéèêëîïôùûü_-]{1,32}$", keys["newName"]); err == nil && match { + team.Name = keys["newName"] + if _, err := team.Update(); err != nil { + log.Println(id, "[WRN] Unable to change team name:", err) + } + genTeamMyFile(team) + } + if err := os.Remove(pathname); err != nil { + log.Println(id, "[ERR]", err) } } else if eid, err := strconv.Atoi(exercice_id); err != nil { log.Println(id, "[ERR]", err) diff --git a/frontend/static/index.html b/frontend/static/index.html index b4bb25ff..0839a211 100644 --- a/frontend/static/index.html +++ b/frontend/static/index.html @@ -70,8 +70,8 @@
- {{ teams[my.team_id].name }} - edit

+ {{ my.name }} + edit

{{ teams[my.team_id].rank }}e sur {{ teams_count }} – {{ my.score }} points diff --git a/frontend/static/js/app.js b/frontend/static/js/app.js index a566958c..3b323062 100644 --- a/frontend/static/js/app.js +++ b/frontend/static/js/app.js @@ -195,10 +195,66 @@ angular.module("FICApp") $scope.my.exercices[$rootScope.current_exercice].submitted = true; }; }) - .controller("MyTeamController", function($scope, $rootScope) { + .controller("MyTeamController", function($scope, $http, $rootScope, $timeout) { $rootScope.current_theme = 0; $rootScope.current_exercice = 0; - $rootScope.title = "Edit team"; + if ($scope.my) { + $rootScope.title = $scope.my.name; + $rootScope.authors = $scope.my.members.map(function (cur) { + return cur.firstname.capitalize() + " " + cur.lastname.capitalize(); + }).join(", "); + } + $scope.newName = ""; + $rootScope.message = ""; + $rootScope.sberr = ""; + + $scope.tsubmit = function() { + $rootScope.sberr = ""; + if ($scope.newName.length < 1) { + $rootScope.messageClass = {"text-danger": true}; + $rootScope.sberr = "Nom d'équipe invalide: pas d'entrée."; + return false; + } + else if ($scope.newName.length > 32) { + $rootScope.messageClass = {"text-danger": true}; + $rootScope.sberr = "Nom d'équipe invalide: pas plus de 32 caractères."; + return false; + } + else if (!$scope.newName.match(/^[A-Za-z0-9 àéèêëîïôùûü_-]+$/)) { + $rootScope.messageClass = {"text-danger": true}; + $rootScope.sberr = "Nom d'équipe invalide: seuls les caractères alpha-numériques sont autorisés."; + return false; + } + + $http({ + url: "/submit/name", + method: "POST", + data: {newName: $scope.newName} + }).success(function(data, status, header, config) { + $rootScope.messageClass = {"text-success": true}; + $rootScope.message = data.errmsg; + + var checkDiff = function() { + $http.get("/my.json").success(function(my) { + console.log(my.name); + if ($scope.my.name != my.name) { + $scope.newName = ""; + $rootScope.message = ""; + $rootScope.refresh(); + } else { + $timeout(checkDiff, 750); + } + }); + }; + checkDiff(); + }).error(function(data, status, header, config) { + $rootScope.messageClass = {"text-danger": true}; + $rootScope.message = data.errmsg; + if (status != 402) { + $rootScope.sberr = "Une erreur est survenue lors de l'envoi. Veuillez réessayer dans quelques instants."; + } + }); + }; }) .controller("RankController", function($scope, $rootScope) { $rootScope.current_theme = 0; diff --git a/frontend/static/views/home.html b/frontend/static/views/home.html index 40a1c778..9a853eca 100644 --- a/frontend/static/views/home.html +++ b/frontend/static/views/home.html @@ -1,5 +1,15 @@
-

Bienvenue !

+

Bienvenue et , {{ member.firstname | capitalize }} {{ member.lastname | capitalize }} !

+

+ Félicitations ! vous êtes actuellement connecté à l'espace de votre + équipe {{ teams[my.team_id].name }}. Vous pouvez changer ce nom + dès maintenant en vous rendant sur la page de votre + équipe. +

+

+ Les membres de votre équipes ne sont pas encore enregistrés. + Passez voir l'équipe serveur pour corriger cela. +

Compromissions, défauts de configuration, utilisations malveillantes, contournements des règles de sécurité, … tous les jours nous mettons diff --git a/frontend/static/views/team-edit.html b/frontend/static/views/team-edit.html new file mode 100644 index 00000000..e04a8749 --- /dev/null +++ b/frontend/static/views/team-edit.html @@ -0,0 +1,37 @@ +

+
Votre équipe est composée de :
+
+ Passez voir l'équipe serveur pour compléter ces informations. +
+
    +
  • + {{ member.firstname | capitalize }} + {{ member.nickname }} + {{ member.lastname | capitalize }} + - {{ member.company}} +
  • +
+
+ +
+
Changer de nom d'équipe
+
+

Votre demande a bien été envoyée !{{ sberr }} {{ message }}

+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
diff --git a/frontend/submit.go b/frontend/submit.go index ca0bbdaa..adf4491a 100644 --- a/frontend/submit.go +++ b/frontend/submit.go @@ -32,7 +32,7 @@ func (s SubmissionHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Extract URL arguments var sURL = strings.Split(r.URL.Path, "/") - if len(sURL) != 3 && len(sURL) != 4 { + if len(sURL) != 3 { http.Error(w, "{\"errmsg\":\"Requête invalide.\"}", http.StatusBadRequest) return } @@ -46,10 +46,11 @@ func (s SubmissionHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if team, err := strconv.Atoi(sURL[1]); err != nil { http.Error(w, "{\"errmsg\":\"Requête invalide.\"}", http.StatusBadRequest) return - } else if exercice, err := strconv.Atoi(sURL[2]); err != nil { + } else if _, err := strconv.Atoi(sURL[2]); sURL[2] != "name" && err != nil { http.Error(w, "{\"errmsg\":\"Requête invalide.\"}", http.StatusBadRequest) return } else { + exercice := sURL[2] if _, err := os.Stat(path.Join(SubmissionDir, fmt.Sprintf("%d", team))); os.IsNotExist(err) { log.Println("Creating submission directory for", team) if err := os.MkdirAll(path.Join(SubmissionDir, fmt.Sprintf("%d", team)), 0777); err != nil { @@ -60,8 +61,8 @@ func (s SubmissionHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Previous submission not treated - if _, err := os.Stat(path.Join(SubmissionDir, fmt.Sprintf("%d", team), fmt.Sprintf("%d", exercice))); !os.IsNotExist(err) { - http.Error(w, "{\"errmsg\":\"Du calme ! une tentative est déjà en cours de traitement.\"}", http.StatusPaymentRequired) + if _, err := os.Stat(path.Join(SubmissionDir, fmt.Sprintf("%d", team), exercice)); !os.IsNotExist(err) { + http.Error(w, "{\"errmsg\":\"Du calme ! une requête est déjà en cours de traitement.\"}", http.StatusPaymentRequired) return } @@ -81,7 +82,7 @@ func (s SubmissionHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Store content in file - if file, err := os.Create(path.Join(SubmissionDir, fmt.Sprintf("%d", team), fmt.Sprintf("%d", exercice))); err != nil { + if file, err := os.Create(path.Join(SubmissionDir, fmt.Sprintf("%d", team), exercice)); err != nil { log.Println("Unable to open exercice file:", err) http.Error(w, "{\"errmsg\":\"Internal server error. Please retry in few seconds.\"}", http.StatusInternalServerError) return diff --git a/libfic/team_my.go b/libfic/team_my.go index 7d9fc946..fad85c4c 100644 --- a/libfic/team_my.go +++ b/libfic/team_my.go @@ -25,6 +25,7 @@ type myTeamExercice struct { } type myTeam struct { Id int64 `json:"team_id"` + Name string `json:"name"` Points int64 `json:"score"` Members []Member `json:"members"` Exercices map[string]myTeamExercice `json:"exercices"` @@ -35,6 +36,7 @@ func MyJSONTeam(t *Team, started bool) (interface{}, error) { if t == nil { ret.Id = 0 } else { + ret.Name = t.Name ret.Id = t.Id ret.Points, _ = t.GetPoints() if members, err := t.GetMembers(); err == nil {