19 changed files with 464 additions and 439 deletions
@ -0,0 +1,72 @@
|
||||
package db |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"errors" |
||||
"log" |
||||
"time" |
||||
|
||||
"go.etcd.io/bbolt" |
||||
) |
||||
|
||||
var ( |
||||
collectiveBucket = []byte("collective") |
||||
) |
||||
|
||||
type collective struct { |
||||
Name string |
||||
CreationDate time.Time |
||||
} |
||||
|
||||
// AddCollective stores in the db the collective that was created by host
|
||||
func (db *DB) AddCollective(name string, host string) error { |
||||
var collectives []collective |
||||
err := db.get(collectiveBucket, host, &collectives) |
||||
if err != nil && !errors.Is(err, notFoundError{}) { |
||||
return err |
||||
} |
||||
|
||||
collectives = append(collectives, collective{name, time.Now()}) |
||||
return db.put(collectiveBucket, host, collectives) |
||||
} |
||||
|
||||
// CountCollectives returns the nubmer of collectives created by host
|
||||
func (db *DB) CountCollectives(host string) (int, error) { |
||||
var collectives []collective |
||||
err := db.get(collectiveBucket, host, &collectives) |
||||
if errors.Is(err, notFoundError{}) { |
||||
return 0, nil |
||||
} |
||||
return len(collectives), err |
||||
} |
||||
|
||||
// ExpireCollectives older than duration
|
||||
func (db *DB) ExpireCollectives(duration time.Duration) error { |
||||
return db.bolt.Update(func(tx *bbolt.Tx) error { |
||||
b := tx.Bucket(collectiveBucket) |
||||
return b.ForEach(func(k, v []byte) error { |
||||
var collectives []collective |
||||
err := json.Unmarshal(v, &collectives) |
||||
if err != nil { |
||||
log.Printf("Error unmarshalling %s: %v", string(k), err) |
||||
return nil |
||||
} |
||||
|
||||
newCollectives := []collective{} |
||||
for _, c := range collectives { |
||||
if c.CreationDate.Add(duration).After(time.Now()) { |
||||
newCollectives = append(newCollectives, c) |
||||
} |
||||
} |
||||
if len(newCollectives) == len(collectives) { |
||||
return nil |
||||
} |
||||
|
||||
encodedValue, err := json.Marshal(newCollectives) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
return b.Put(k, encodedValue) |
||||
}) |
||||
}) |
||||
} |
@ -0,0 +1,85 @@
|
||||
package db |
||||
|
||||
import ( |
||||
"testing" |
||||
"time" |
||||
) |
||||
|
||||
const ( |
||||
collectiveName = "collective" |
||||
collectiveHost = "host" |
||||
) |
||||
|
||||
func TestAddCountCollective(t *testing.T) { |
||||
db := initTestDB(t) |
||||
defer delTestDB(db) |
||||
|
||||
count, err := db.CountCollectives(collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting collectives: %v", err) |
||||
} |
||||
if count != 0 { |
||||
t.Errorf("Got an unexpected number of collectives: %d", count) |
||||
} |
||||
|
||||
err = db.AddCollective(collectiveName, collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a collective: %v", err) |
||||
} |
||||
|
||||
count, err = db.CountCollectives(collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting collectives: %v", err) |
||||
} |
||||
if count != 1 { |
||||
t.Errorf("Got an unexpected number of collectives: %d", count) |
||||
} |
||||
|
||||
err = db.AddCollective(collectiveName+"1", collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a collective: %v", err) |
||||
} |
||||
err = db.AddCollective(collectiveName+"2", collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a collective: %v", err) |
||||
} |
||||
|
||||
count, err = db.CountCollectives(collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting collectives: %v", err) |
||||
} |
||||
if count != 3 { |
||||
t.Errorf("Got an unexpected number of collectives: %d", count) |
||||
} |
||||
} |
||||
|
||||
func TestExpireCollectives(t *testing.T) { |
||||
db := initTestDB(t) |
||||
defer delTestDB(db) |
||||
|
||||
err := db.AddCollective(collectiveName, collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a collective: %v", err) |
||||
} |
||||
|
||||
count, err := db.CountCollectives(collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting collectives: %v", err) |
||||
} |
||||
if count != 1 { |
||||
t.Errorf("Got an unexpected number of collectives: %d", count) |
||||
} |
||||
|
||||
err = db.ExpireCollectives(time.Microsecond) |
||||
if err != nil { |
||||
t.Fatalf("Got an error expiring invites: %v", err) |
||||
} |
||||
|
||||
count, err = db.CountCollectives(collectiveHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting collectives: %v", err) |
||||
} |
||||
if count != 0 { |
||||
t.Errorf("Got an unexpected number of collectives: %d", count) |
||||
} |
||||
} |
@ -1,72 +0,0 @@
|
||||
package db |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"errors" |
||||
"log" |
||||
"time" |
||||
|
||||
"go.etcd.io/bbolt" |
||||
) |
||||
|
||||
var ( |
||||
communityBucket = []byte("community") |
||||
) |
||||
|
||||
type community struct { |
||||
Name string |
||||
CreationDate time.Time |
||||
} |
||||
|
||||
// AddCommunity stores in the db the community that was created by host
|
||||
func (db *DB) AddCommunity(name string, host string) error { |
||||
var communities []community |
||||
err := db.get(communityBucket, host, &communities) |
||||
if err != nil && !errors.Is(err, notFoundError{}) { |
||||
return err |
||||
} |
||||
|
||||
communities = append(communities, community{name, time.Now()}) |
||||
return db.put(communityBucket, host, communities) |
||||
} |
||||
|
||||
// CountCommunities returns the nubmer of communities created by host
|
||||
func (db *DB) CountCommunities(host string) (int, error) { |
||||
var communities []community |
||||
err := db.get(communityBucket, host, &communities) |
||||
if errors.Is(err, notFoundError{}) { |
||||
return 0, nil |
||||
} |
||||
return len(communities), err |
||||
} |
||||
|
||||
// ExpireCommunities older than duration
|
||||
func (db *DB) ExpireCommunities(duration time.Duration) error { |
||||
return db.bolt.Update(func(tx *bbolt.Tx) error { |
||||
b := tx.Bucket(communityBucket) |
||||
return b.ForEach(func(k, v []byte) error { |
||||
var communities []community |
||||
err := json.Unmarshal(v, &communities) |
||||
if err != nil { |
||||
log.Printf("Error unmarshalling %s: %v", string(k), err) |
||||
return nil |
||||
} |
||||
|
||||
newCommunities := []community{} |
||||
for _, c := range communities { |
||||
if c.CreationDate.Add(duration).After(time.Now()) { |
||||
newCommunities = append(newCommunities, c) |
||||
} |
||||
} |
||||
if len(newCommunities) == len(communities) { |
||||
return nil |
||||
} |
||||
|
||||
encodedValue, err := json.Marshal(newCommunities) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
return b.Put(k, encodedValue) |
||||
}) |
||||
}) |
||||
} |
@ -1,85 +0,0 @@
|
||||
package db |
||||
|
||||
import ( |
||||
"testing" |
||||
"time" |
||||
) |
||||
|
||||
const ( |
||||
communityName = "community" |
||||
communityHost = "host" |
||||
) |
||||
|
||||
func TestAddCountCommunity(t *testing.T) { |
||||
db := initTestDB(t) |
||||
defer delTestDB(db) |
||||
|
||||
count, err := db.CountCommunities(communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting communities: %v", err) |
||||
} |
||||
if count != 0 { |
||||
t.Errorf("Got an unexpected number of communities: %d", count) |
||||
} |
||||
|
||||
err = db.AddCommunity(communityName, communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a community: %v", err) |
||||
} |
||||
|
||||
count, err = db.CountCommunities(communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting communities: %v", err) |
||||
} |
||||
if count != 1 { |
||||
t.Errorf("Got an unexpected number of communities: %d", count) |
||||
} |
||||
|
||||
err = db.AddCommunity(communityName+"1", communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a community: %v", err) |
||||
} |
||||
err = db.AddCommunity(communityName+"2", communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a community: %v", err) |
||||
} |
||||
|
||||
count, err = db.CountCommunities(communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting communities: %v", err) |
||||
} |
||||
if count != 3 { |
||||
t.Errorf("Got an unexpected number of communities: %d", count) |
||||
} |
||||
} |
||||
|
||||
func TestExpireCommunities(t *testing.T) { |
||||
db := initTestDB(t) |
||||
defer delTestDB(db) |
||||
|
||||
err := db.AddCommunity(communityName, communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error adding a community: %v", err) |
||||
} |
||||
|
||||
count, err := db.CountCommunities(communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting communities: %v", err) |
||||
} |
||||
if count != 1 { |
||||
t.Errorf("Got an unexpected number of communities: %d", count) |
||||
} |
||||
|
||||
err = db.ExpireCommunities(time.Microsecond) |
||||
if err != nil { |
||||
t.Fatalf("Got an error expiring invites: %v", err) |
||||
} |
||||
|
||||
count, err = db.CountCommunities(communityHost) |
||||
if err != nil { |
||||
t.Fatalf("Got an error counting communities: %v", err) |
||||
} |
||||
if count != 0 { |
||||
t.Errorf("Got an unexpected number of communities: %d", count) |
||||
} |
||||
} |
@ -0,0 +1,215 @@
|
||||
package server |
||||
|
||||
import ( |
||||
"errors" |
||||
"log" |
||||
"net/http" |
||||
|
||||
"git.sindominio.net/sindominio/lowry/ldap" |
||||
"github.com/gorilla/mux" |
||||
) |
||||
|
||||
const ( |
||||
maxCollectives = 4 |
||||
) |
||||
|
||||
func (s *server) addCollectiveHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("add_collective", w, r) |
||||
ok, err := s.canCreateCollective(response) |
||||
if err != nil { |
||||
log.Println("An error ocurred checking if can create collective: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
status := "" |
||||
if !ok { |
||||
status = "quota" |
||||
} |
||||
response.execute(status) |
||||
} |
||||
|
||||
func (s *server) postAddCollectiveHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("add_collective", w, r) |
||||
ok, err := s.canCreateCollective(response) |
||||
if err != nil { |
||||
log.Println("An error ocurred checking if can create collective: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
if !ok { |
||||
response.execute("quota") |
||||
return |
||||
} |
||||
|
||||
collectiveName := r.FormValue("collective") |
||||
if !validUserName(collectiveName) { |
||||
log.Println("Can't create collective ", collectiveName, ": invalid name") |
||||
response.execute("invalid") |
||||
return |
||||
} |
||||
description := r.FormValue("description") |
||||
err = s.ldap.AddGroup(collectiveName, description) |
||||
if err != nil { |
||||
if errors.Is(err, ldap.ErrAlreadyExist) { |
||||
response.execute("exists") |
||||
} else { |
||||
log.Println("An error ocurred adding collective '", collectiveName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
} |
||||
return |
||||
} |
||||
|
||||
err = s.ldap.AddUserGroup(response.User, collectiveName) |
||||
if err != nil { |
||||
log.Println("An error ocurred adding user ", response.User, " to collective '", collectiveName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/collective/"+collectiveName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) delCollectiveHandler(w http.ResponseWriter, r *http.Request) { |
||||
collectiveName := r.FormValue("collective") |
||||
|
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, collectiveName) { |
||||
log.Println(response.User, "don't have rights to delete", collectiveName, "collective") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
err := s.ldap.EmptyGroup(collectiveName) |
||||
if err != nil { |
||||
log.Println("An error ocurred deleting collective '", collectiveName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/collectives/mine/", http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) collectivesHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("collectives", w, r) |
||||
if !response.IsAdmin { |
||||
log.Println("Non admin attemp to list collectives") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
collectives, err := s.ldap.ListGroups() |
||||
if err != nil { |
||||
log.Println("An error ocurred retrieving collective list: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
response.execute(collectives) |
||||
} |
||||
|
||||
func (s *server) userCollectivesHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("collectives", w, r) |
||||
if response.User == "" { |
||||
log.Println("Attemp to list own collective without being logged") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
collectives, err := s.ldap.UserGroups(response.User) |
||||
if err != nil { |
||||
log.Println("An error ocurred retrieving collective list: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
response.execute(collectives) |
||||
} |
||||
|
||||
func (s *server) collectiveHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
collectiveName := vars["name"] |
||||
response := s.newResponse("collective", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, collectiveName) { |
||||
log.Println("Attemp to list collective without rights") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
collective, err := s.ldap.GetGroup(collectiveName) |
||||
if err != nil { |
||||
log.Println("An error ocurred retrieving collective '", collectiveName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
response.execute(collective) |
||||
} |
||||
|
||||
func (s *server) addUserCollectiveHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
collectiveName := vars["name"] |
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, collectiveName) { |
||||
log.Println("Attemp to add user to collective without rights") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
user := r.FormValue("user") |
||||
err := s.ldap.AddUserGroup(user, collectiveName) |
||||
if err != nil { |
||||
log.Println("An error ocurred adding user '", user, "' to ", collectiveName, ": ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/collective/"+collectiveName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) delUserCollectiveHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
collectiveName := vars["name"] |
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, collectiveName) { |
||||
log.Println("Attemp to del user to collective without rights") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
user := r.FormValue("user") |
||||
err := s.ldap.DelUserGroup(user, collectiveName) |
||||
if err != nil { |
||||
log.Println("An error ocurred del user '", user, "' to ", collectiveName, ": ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/collective/"+collectiveName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) descriptionCollectiveHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
collectiveName := vars["name"] |
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, collectiveName) { |
||||
log.Println("Attemp to edit description without rights of collective", collectiveName) |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
description := r.FormValue("description") |
||||
err := s.ldap.UpdateGroupDescription(collectiveName, description) |
||||
if err != nil { |
||||
log.Println("An error ocurred to set description to ", collectiveName, ": ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/collective/"+collectiveName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) canCreateCollective(r responseT) (bool, error) { |
||||
if r.User == "" { |
||||
return false, nil |
||||
} |
||||
if r.Role == ldap.Sindominante { |
||||
return true, nil |
||||
} |
||||
|
||||
count, err := s.db.CountCollectives(r.User) |
||||
return count <= maxCollectives, err |
||||
} |
@ -1,215 +0,0 @@
|
||||
package server |
||||
|
||||
import ( |
||||
"errors" |
||||
"log" |
||||
"net/http" |
||||
|
||||
"git.sindominio.net/sindominio/lowry/ldap" |
||||
"github.com/gorilla/mux" |
||||
) |
||||
|
||||
const ( |
||||
maxCommunities = 4 |
||||
) |
||||
|
||||
func (s *server) addCommunityHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("add_community", w, r) |
||||
ok, err := s.canCreateCommunity(response) |
||||
if err != nil { |
||||
log.Println("An error ocurred checking if can create community: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
status := "" |
||||
if !ok { |
||||
status = "quota" |
||||
} |
||||
response.execute(status) |
||||
} |
||||
|
||||
func (s *server) postAddCommunityHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("add_community", w, r) |
||||
ok, err := s.canCreateCommunity(response) |
||||
if err != nil { |
||||
log.Println("An error ocurred checking if can create community: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
if !ok { |
||||
response.execute("quota") |
||||
return |
||||
} |
||||
|
||||
communityName := r.FormValue("community") |
||||
if !validUserName(communityName) { |
||||
log.Println("Can't create community ", communityName, ": invalid name") |
||||
response.execute("invalid") |
||||
return |
||||
} |
||||
description := r.FormValue("description") |
||||
err = s.ldap.AddGroup(communityName, description) |
||||
if err != nil { |
||||
if errors.Is(err, ldap.ErrAlreadyExist) { |
||||
response.execute("exists") |
||||
} else { |
||||
log.Println("An error ocurred adding community '", communityName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
} |
||||
return |
||||
} |
||||
|
||||
err = s.ldap.AddUserGroup(response.User, communityName) |
||||
if err != nil { |
||||
log.Println("An error ocurred adding user ", response.User, " to community '", communityName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/community/"+communityName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) delCommunityHandler(w http.ResponseWriter, r *http.Request) { |
||||
communityName := r.FormValue("community") |
||||
|
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, communityName) { |
||||
log.Println(response.User, "don't have rights to delete", communityName, "community") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
err := s.ldap.DelGroup(communityName) |
||||
if err != nil { |
||||
log.Println("An error ocurred deleting community '", communityName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/communities/mine/", http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) communitiesHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("communities", w, r) |
||||
if !response.IsAdmin { |
||||
log.Println("Non admin attemp to list communities") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
communities, err := s.ldap.ListGroups() |
||||
if err != nil { |
||||
log.Println("An error ocurred retrieving community list: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
response.execute(communities) |
||||
} |
||||
|
||||
func (s *server) userCommunitiesHandler(w http.ResponseWriter, r *http.Request) { |
||||
response := s.newResponse("communities", w, r) |
||||
if response.User == "" { |
||||
log.Println("Attemp to list own community without being logged") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
communities, err := s.ldap.UserGroups(response.User) |
||||
if err != nil { |
||||
log.Println("An error ocurred retrieving community list: ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
response.execute(communities) |
||||
} |
||||
|
||||
func (s *server) communityHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
communityName := vars["name"] |
||||
response := s.newResponse("community", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, communityName) { |
||||
log.Println("Attemp to list community without rights") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
community, err := s.ldap.GetGroup(communityName) |
||||
if err != nil { |
||||
log.Println("An error ocurred retrieving community '", communityName, "': ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
response.execute(community) |
||||
} |
||||
|
||||
func (s *server) addUserCommunityHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
communityName := vars["name"] |
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, communityName) { |
||||
log.Println("Attemp to add user to community without rights") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
user := r.FormValue("user") |
||||
err := s.ldap.AddUserGroup(user, communityName) |
||||
if err != nil { |
||||
log.Println("An error ocurred adding user '", user, "' to ", communityName, ": ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/community/"+communityName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) delUserCommunityHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
communityName := vars["name"] |
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, communityName) { |
||||
log.Println("Attemp to del user to community without rights") |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
user := r.FormValue("user") |
||||
err := s.ldap.DelUserGroup(user, communityName) |
||||
if err != nil { |
||||
log.Println("An error ocurred del user '", user, "' to ", communityName, ": ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/community/"+communityName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) descriptionCommunityHandler(w http.ResponseWriter, r *http.Request) { |
||||
vars := mux.Vars(r) |
||||
communityName := vars["name"] |
||||
response := s.newResponse("", w, r) |
||||
if !response.IsAdmin && !s.ldap.InGroup(response.User, communityName) { |
||||
log.Println("Attemp to edit description without rights of community", communityName) |
||||
s.forbiddenHandler(w, r) |
||||
return |
||||
} |
||||
|
||||
description := r.FormValue("description") |
||||
err := s.ldap.UpdateGroupDescription(communityName, description) |
||||
if err != nil { |
||||
log.Println("An error ocurred to set description to ", communityName, ": ", err) |
||||
s.errorHandler(w, r) |
||||
return |
||||
} |
||||
http.Redirect(w, r, "/community/"+communityName, http.StatusFound) |
||||
} |
||||
|
||||
func (s *server) canCreateCommunity(r responseT) (bool, error) { |
||||
if r.User == "" { |
||||
return false, nil |
||||
} |
||||
if r.Role == ldap.Sindominante { |
||||
return true, nil |
||||
} |
||||
|
||||
count, err := s.db.CountCommunities(r.User) |
||||
return count <= maxCommunities, err |
||||
} |
@ -0,0 +1,30 @@
|
||||
{{template "header.html"}} |
||||
{{template "header_close.html"}} |
||||
{{template "navbar.html" .}} |
||||
|
||||
<div class="container"> |
||||
<br /> |
||||
{{if eq .Data "quota"}} |
||||
<p>Has excedido el maximo de colectivos que puedes crear. Solo se pueden crear 4 colectivos cada 3 meses. Si tienes alguna razón importante para crear mas contacta con la asamblea de sindominio para ver si pueden hacer algo. O si no esperate unas semanas a ver si vuelves a poder crear colectivos.</p> |
||||
|
||||
{{else}} |
||||
<h3>Añade un colectivo</h3> |
||||
<form action="/collectives/add/" method="post"> |
||||
<div class="form-group"> |
||||
<label for="collective">Nombre:</label> |
||||
<input type="text" class="form-control {{if eq .Data "exists" "invalid"}}is-invalid{{end}}" id="collective" name="collective" placeholder="Nombre"> |
||||
{{if eq .Data "invalid"}}<div class="invalid-feedback">El nombre del colectivo es invalido. Tiene que tener al menos 3 caracteres, empezar por letra o numero y solo puede contener letras minusculas, numeros, '_', '-' o '.'.</div>{{end}} |
||||
{{if eq .Data "exists"}}<div class="invalid-feedback">Este nombre ya existe en sindominio como una cuenta o colectivo, elige otro diferente.</div>{{end}} |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="collective">Description:</label> |
||||
<textarea class="form-control" id="description" name="description"></textarea> |
||||
</div> |
||||
<div class="form-group"> |
||||
<button type="submit" class="btn btn-primary">añadir</button> |
||||
</div> |
||||
</form> |
||||
{{end}} |
||||
</div> |
||||
|
||||
{{template "footer.html"}} |
@ -1,30 +0,0 @@
|
||||
{{template "header.html"}} |
||||
{{template "header_close.html"}} |
||||
{{template "navbar.html" .}} |
||||
|
||||
<div class="container"> |
||||
<br /> |
||||
{{if eq .Data "quota"}} |
||||
<p>Has excedido el maximo de colectividades que puedes crear. Solo se pueden crear 4 colectividades cada 3 meses. Si tienes alguna razón importante para crear mas contacta con la asamblea de sindominio para ver si pueden hacer algo. O si no esperate unas semanas a ver si vuelves a poder crear colectividades.</p> |
||||
|
||||
{{else}} |
||||
<h3>Añade una colectividad</h3> |
||||
<form action="/communities/add/" method="post"> |
||||
<div class="form-group"> |
||||
<label for="community">Nombre:</label> |
||||
<input type="text" class="form-control {{if eq .Data "exists" "invalid"}}is-invalid{{end}}" id="community" name="community" placeholder="Nombre"> |
||||
{{if eq .Data "invalid"}}<div class="invalid-feedback">El nombre de la colectividad es invalido. Tiene que tener al menos 3 caracteres, empezar por letra o numero y solo puede contener letras minusculas, numeros, '_', '-' o '.'.</div>{{end}} |
||||
{{if eq .Data "exists"}}<div class="invalid-feedback">Este nombre ya existe en sindominio como una cuenta o colectividad, elige otro diferente.</div>{{end}} |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="community">Description:</label> |
||||
<textarea class="form-control" id="description" name="description"></textarea> |
||||
</div> |
||||
<div class="form-group"> |
||||
<button type="submit" class="btn btn-primary">añadir</button> |
||||
</div> |
||||
</form> |
||||
{{end}} |
||||
</div> |
||||
|
||||
{{template "footer.html"}} |
Loading…
Reference in new issue