forked from External/grumble
Update for Go 1.
This commit is contained in:
parent
4114a83d64
commit
e46a65109f
31 changed files with 901 additions and 202 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -22,6 +22,5 @@ _testmain.go
|
|||
build.out
|
||||
test.out
|
||||
goinstall.log
|
||||
*.pb.go
|
||||
*.sqlite
|
||||
build/
|
||||
13
channel.go
13
channel.go
|
|
@ -10,15 +10,14 @@ import (
|
|||
|
||||
// A Mumble channel
|
||||
type Channel struct {
|
||||
Id int
|
||||
Name string
|
||||
Position int
|
||||
|
||||
Id int
|
||||
Name string
|
||||
Position int
|
||||
|
||||
temporary bool
|
||||
clients map[uint32]*Client
|
||||
parent *Channel
|
||||
children map[int]*Channel
|
||||
clients map[uint32]*Client
|
||||
parent *Channel
|
||||
children map[int]*Channel
|
||||
|
||||
// ACL
|
||||
ACL []*ChannelACL
|
||||
|
|
|
|||
16
client.go
16
client.go
|
|
@ -7,16 +7,16 @@ package main
|
|||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"code.google.com/p/goprotobuf/proto"
|
||||
"crypto/tls"
|
||||
"encoding/binary"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"grumble/blobstore"
|
||||
"grumble/cryptstate"
|
||||
"grumble/mumbleproto"
|
||||
"github.com/mkrautz/grumble/pkg/blobstore"
|
||||
"github.com/mkrautz/grumble/pkg/cryptstate"
|
||||
"github.com/mkrautz/grumble/pkg/mumbleproto"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"packetdatastream"
|
||||
"github.com/mkrautz/grumble/pkg/packetdatastream"
|
||||
"runtime"
|
||||
"time"
|
||||
)
|
||||
|
|
@ -567,11 +567,11 @@ func (client *Client) sendChannelTree(channel *Channel) {
|
|||
|
||||
// Try to do a crypto resync
|
||||
func (client *Client) cryptResync() {
|
||||
goodElapsed := time.Seconds() - client.crypt.LastGoodTime
|
||||
goodElapsed := time.Now().Unix() - client.crypt.LastGoodTime
|
||||
if goodElapsed > 5 {
|
||||
requestElapsed := time.Seconds() - client.lastResync
|
||||
requestElapsed := time.Now().Unix() - client.lastResync
|
||||
if requestElapsed > 5 {
|
||||
client.lastResync = time.Seconds()
|
||||
client.lastResync = time.Now().Unix()
|
||||
cryptsetup := &mumbleproto.CryptSetup{}
|
||||
err := client.sendMessage(cryptsetup)
|
||||
if err != nil {
|
||||
|
|
|
|||
23
freeze.go
23
freeze.go
|
|
@ -5,12 +5,12 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"code.google.com/p/goprotobuf/proto"
|
||||
"errors"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"grumble/ban"
|
||||
"grumble/freezer"
|
||||
"grumble/mumbleproto"
|
||||
"grumble/serverconf"
|
||||
"github.com/mkrautz/grumble/pkg/ban"
|
||||
"github.com/mkrautz/grumble/pkg/freezer"
|
||||
"github.com/mkrautz/grumble/pkg/mumbleproto"
|
||||
"github.com/mkrautz/grumble/pkg/serverconf"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
|
|
@ -36,7 +36,7 @@ func (server *Server) FreezeToFile() (err error) {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
f, err := ioutil.TempFile(filepath.Join(Args.DataDir, "servers", strconv.Itoa64(server.Id)), ".main.fz_")
|
||||
f, err := ioutil.TempFile(filepath.Join(Args.DataDir, "servers", strconv.FormatInt(server.Id, 10)), ".main.fz_")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -56,7 +56,7 @@ func (server *Server) FreezeToFile() (err error) {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Rename(f.Name(), filepath.Join(Args.DataDir, "servers", strconv.Itoa64(server.Id), "main.fz"))
|
||||
err = os.Rename(f.Name(), filepath.Join(Args.DataDir, "servers", strconv.FormatInt(server.Id, 10), "main.fz"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -72,7 +72,7 @@ func (server *Server) FreezeToFile() (err error) {
|
|||
|
||||
// Open a new freeze log
|
||||
func (server *Server) openFreezeLog() (err error) {
|
||||
logfn := filepath.Join(Args.DataDir, "servers", strconv.Itoa64(server.Id), "log.fz")
|
||||
logfn := filepath.Join(Args.DataDir, "servers", strconv.FormatInt(server.Id, 10), "log.fz")
|
||||
err = os.Remove(logfn)
|
||||
if pe, ok := err.(*os.PathError); ok && pe.Err == os.ENOENT {
|
||||
// OK. File does not exist...
|
||||
|
|
@ -399,7 +399,7 @@ func (group *Group) Freeze() (fgrp *freezer.Group, err error) {
|
|||
// in memory, a new full seralized server will be written and synced to
|
||||
// disk, and the existing log file will be removed.
|
||||
func NewServerFromFrozen(name string) (s *Server, err error) {
|
||||
id, err := strconv.Atoi64(name)
|
||||
id, err := strconv.ParseInt(name, 10, 64)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -695,7 +695,7 @@ func (server *Server) UpdateFrozenUser(client *Client, state *mumbleproto.UserSt
|
|||
// Full sync If there's no userstate messgae provided, or if there is one, and
|
||||
// it includes a registration operation.
|
||||
user := client.user
|
||||
nanos := time.Nanoseconds()
|
||||
nanos := time.Now().Unix()
|
||||
if state == nil || state.UserId != nil {
|
||||
fu, err := user.Freeze()
|
||||
if err != nil {
|
||||
|
|
@ -735,7 +735,7 @@ func (server *Server) UpdateFrozenUserLastChannel(client *Client) {
|
|||
fu := &freezer.User{}
|
||||
fu.Id = proto.Uint32(user.Id)
|
||||
fu.LastChannelId = proto.Uint32(uint32(client.Channel.Id))
|
||||
fu.LastActive = proto.Uint64(uint64(time.Nanoseconds()))
|
||||
fu.LastActive = proto.Uint64(uint64(time.Now().Unix()))
|
||||
|
||||
err := server.freezelog.Put(fu)
|
||||
if err != nil {
|
||||
|
|
@ -746,7 +746,6 @@ func (server *Server) UpdateFrozenUserLastChannel(client *Client) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Mark a user as deleted in the datstore.
|
||||
func (server *Server) DeleteFrozenUser(user *User) {
|
||||
err := server.freezelog.Put(&freezer.UserRemove{Id: proto.Uint32(user.Id)})
|
||||
|
|
|
|||
|
|
@ -21,14 +21,15 @@ import (
|
|||
// certificate. Output PEM-encoded DER representations of the resulting
|
||||
// certificate and private key to certpath and keypath.
|
||||
func GenerateSelfSignedCert(certpath, keypath string) (err error) {
|
||||
now := time.Seconds()
|
||||
now := time.Now()
|
||||
tmpl := &x509.Certificate{
|
||||
SerialNumber: big.NewInt(0),
|
||||
Subject: pkix.Name{
|
||||
CommonName: "Grumble Autogenerated Certificate",
|
||||
},
|
||||
NotBefore: time.SecondsToUTC(now - 300),
|
||||
NotAfter: time.SecondsToUTC(now + 60*60*24*365), // valid for 1 year.
|
||||
NotBefore: now.Add(-300 * time.Second),
|
||||
// Valid for 1 year.
|
||||
NotAfter: now.Add(24 * time.Hour * 365),
|
||||
|
||||
SubjectKeyId: []byte{1, 2, 3, 4},
|
||||
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@ package main
|
|||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"grumble/blobstore"
|
||||
"grumble/logtarget"
|
||||
"github.com/mkrautz/grumble/pkg/blobstore"
|
||||
"github.com/mkrautz/grumble/pkg/logtarget"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
|
|
|||
12
message.go
12
message.go
|
|
@ -5,14 +5,14 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"code.google.com/p/goprotobuf/proto"
|
||||
"crypto/aes"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"grumble/ban"
|
||||
"grumble/blobstore"
|
||||
"grumble/freezer"
|
||||
"grumble/mumbleproto"
|
||||
"github.com/mkrautz/grumble/pkg/ban"
|
||||
"github.com/mkrautz/grumble/pkg/blobstore"
|
||||
"github.com/mkrautz/grumble/pkg/freezer"
|
||||
"github.com/mkrautz/grumble/pkg/mumbleproto"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
|
@ -519,7 +519,7 @@ func (server *Server) handleUserRemoveMessage(client *Client, msg *Message) {
|
|||
}
|
||||
ban.Username = removeClient.ShownName()
|
||||
ban.CertHash = removeClient.CertHash
|
||||
ban.Start = time.Seconds()
|
||||
ban.Start = time.Now().Unix()
|
||||
ban.Duration = 0
|
||||
|
||||
server.banlock.Lock()
|
||||
|
|
|
|||
112
murmurdb.go
112
murmurdb.go
|
|
@ -11,9 +11,9 @@ package main
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"grumble/ban"
|
||||
"grumble/blobstore"
|
||||
"grumble/sqlite"
|
||||
"github.com/mkrautz/grumble/pkg/ban"
|
||||
"github.com/mkrautz/grumble/pkg/blobstore"
|
||||
"database/sql"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
|
|
@ -39,20 +39,23 @@ const SQLiteSupport = true
|
|||
|
||||
// Import the structure of an existing Murmur SQLite database.
|
||||
func MurmurImport(filename string) (err error) {
|
||||
db, err := sqlite.Open(filename)
|
||||
db, err := sql.Open("sqlite", filename)
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
|
||||
stmt, err := db.Prepare("SELECT server_id FROM servers")
|
||||
rows, err := db.Query("SELECT server_id FROM servers")
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
|
||||
var serverids []int64
|
||||
var sid int64
|
||||
for stmt.Next() {
|
||||
stmt.Scan(&sid)
|
||||
for rows.Next() {
|
||||
err = rows.Scan(&sid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
serverids = append(serverids, sid)
|
||||
}
|
||||
|
||||
|
|
@ -64,7 +67,7 @@ func MurmurImport(filename string) (err error) {
|
|||
return err
|
||||
}
|
||||
|
||||
err = os.Mkdir(filepath.Join(Args.DataDir, strconv.Itoa64(sid)), 0750)
|
||||
err = os.Mkdir(filepath.Join(Args.DataDir, strconv.FormatInt(sid, 10)), 0750)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -81,8 +84,8 @@ func MurmurImport(filename string) (err error) {
|
|||
}
|
||||
|
||||
// Create a new Server from a Murmur SQLite database
|
||||
func NewServerFromSQLite(id int64, db *sqlite.Conn) (s *Server, err error) {
|
||||
s, err = NewServer(id, "", int(DefaultPort+id-1))
|
||||
func NewServerFromSQLite(id int64, db *sql.DB) (s *Server, err error) {
|
||||
s, err = NewServer(id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -126,19 +129,20 @@ func NewServerFromSQLite(id int64, db *sqlite.Conn) (s *Server, err error) {
|
|||
}
|
||||
|
||||
// Add channel metadata (channel_info table from SQLite) by reading the SQLite database.
|
||||
func populateChannelInfoFromDatabase(server *Server, c *Channel, db *sqlite.Conn) error {
|
||||
func populateChannelInfoFromDatabase(server *Server, c *Channel, db *sql.DB) error {
|
||||
stmt, err := db.Prepare("SELECT value FROM channel_info WHERE server_id=? AND channel_id=? AND key=?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Fetch description
|
||||
if err := stmt.Exec(server.Id, c.Id, ChannelInfoDescription); err != nil {
|
||||
rows, err := stmt.Query(server.Id, c.Id, ChannelInfoDescription)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var description string
|
||||
err = stmt.Scan(&description)
|
||||
err = rows.Scan(&description)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -152,17 +156,14 @@ func populateChannelInfoFromDatabase(server *Server, c *Channel, db *sqlite.Conn
|
|||
}
|
||||
}
|
||||
|
||||
if err := stmt.Reset(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Fetch position
|
||||
if err := stmt.Exec(server.Id, c.Id, ChannelInfoPosition); err != nil {
|
||||
rows, err = stmt.Query(server.Id, c.Id, ChannelInfoPosition)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var pos int
|
||||
if err := stmt.Scan(&pos); err != nil {
|
||||
if err := rows.Scan(&pos); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -173,17 +174,18 @@ func populateChannelInfoFromDatabase(server *Server, c *Channel, db *sqlite.Conn
|
|||
}
|
||||
|
||||
// Populate channel with its ACLs by reading the SQLite databse.
|
||||
func populateChannelACLFromDatabase(server *Server, c *Channel, db *sqlite.Conn) error {
|
||||
func populateChannelACLFromDatabase(server *Server, c *Channel, db *sql.DB) error {
|
||||
stmt, err := db.Prepare("SELECT user_id, group_name, apply_here, apply_sub, grantpriv, revokepriv FROM acl WHERE server_id=? AND channel_id=? ORDER BY priority")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := stmt.Exec(server.Id, c.Id); err != nil {
|
||||
rows, err := stmt.Query(server.Id, c.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
UserId string
|
||||
Group string
|
||||
|
|
@ -192,7 +194,7 @@ func populateChannelACLFromDatabase(server *Server, c *Channel, db *sqlite.Conn)
|
|||
Allow int64
|
||||
Deny int64
|
||||
)
|
||||
if err := stmt.Scan(&UserId, &Group, &ApplyHere, &ApplySub, &Allow, &Deny); err != nil {
|
||||
if err := rows.Scan(&UserId, &Group, &ApplyHere, &ApplySub, &Allow, &Deny); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -219,19 +221,20 @@ func populateChannelACLFromDatabase(server *Server, c *Channel, db *sqlite.Conn)
|
|||
}
|
||||
|
||||
// Populate channel with groups by reading the SQLite database.
|
||||
func populateChannelGroupsFromDatabase(server *Server, c *Channel, db *sqlite.Conn) error {
|
||||
func populateChannelGroupsFromDatabase(server *Server, c *Channel, db *sql.DB) error {
|
||||
stmt, err := db.Prepare("SELECT group_id, name, inherit, inheritable FROM groups WHERE server_id=? AND channel_id=?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := stmt.Exec(server.Id, c.Id); err != nil {
|
||||
rows, err := stmt.Query(server.Id, c.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
groups := make(map[int64]*Group)
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
GroupId int64
|
||||
Name string
|
||||
|
|
@ -239,7 +242,7 @@ func populateChannelGroupsFromDatabase(server *Server, c *Channel, db *sqlite.Co
|
|||
Inheritable bool
|
||||
)
|
||||
|
||||
if err := stmt.Scan(&GroupId, &Name, &Inherit, &Inheritable); err != nil {
|
||||
if err := rows.Scan(&GroupId, &Name, &Inherit, &Inheritable); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -256,17 +259,18 @@ func populateChannelGroupsFromDatabase(server *Server, c *Channel, db *sqlite.Co
|
|||
}
|
||||
|
||||
for gid, grp := range groups {
|
||||
if err = stmt.Exec(server.Id, gid); err != nil {
|
||||
rows, err = stmt.Query(server.Id, gid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
UserId int64
|
||||
Add bool
|
||||
)
|
||||
|
||||
if err := stmt.Scan(&UserId, &Add); err != nil {
|
||||
if err := rows.Scan(&UserId, &Add); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -282,7 +286,7 @@ func populateChannelGroupsFromDatabase(server *Server, c *Channel, db *sqlite.Co
|
|||
}
|
||||
|
||||
// Populate the Server with Channels from the database.
|
||||
func populateChannelsFromDatabase(server *Server, db *sqlite.Conn, parentId int) error {
|
||||
func populateChannelsFromDatabase(server *Server, db *sql.DB, parentId int) error {
|
||||
parent, exists := server.Channels[parentId]
|
||||
if !exists {
|
||||
return errors.New("Non-existant parent")
|
||||
|
|
@ -293,18 +297,18 @@ func populateChannelsFromDatabase(server *Server, db *sqlite.Conn, parentId int)
|
|||
return err
|
||||
}
|
||||
|
||||
err = stmt.Exec(server.Id, parentId)
|
||||
rows, err := stmt.Query(server.Id, parentId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
name string
|
||||
chanid int
|
||||
inherit bool
|
||||
)
|
||||
err = stmt.Scan(&chanid, &name, &inherit)
|
||||
err = rows.Scan(&chanid, &name, &inherit)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -351,22 +355,23 @@ func populateChannelsFromDatabase(server *Server, db *sqlite.Conn, parentId int)
|
|||
}
|
||||
|
||||
// Link a Server's channels together
|
||||
func populateChannelLinkInfo(server *Server, db *sqlite.Conn) (err error) {
|
||||
func populateChannelLinkInfo(server *Server, db *sql.DB) (err error) {
|
||||
stmt, err := db.Prepare("SELECT channel_id, link_id FROM channel_links WHERE server_id=?")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := stmt.Exec(server.Id); err != nil {
|
||||
rows, err := stmt.Query(server.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
ChannelId int
|
||||
LinkId int
|
||||
)
|
||||
if err := stmt.Scan(&ChannelId, &LinkId); err != nil {
|
||||
if err := rows.Scan(&ChannelId, &LinkId); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -386,19 +391,19 @@ func populateChannelLinkInfo(server *Server, db *sqlite.Conn) (err error) {
|
|||
return nil
|
||||
}
|
||||
|
||||
func populateUsers(server *Server, db *sqlite.Conn) (err error) {
|
||||
func populateUsers(server *Server, db *sql.DB) (err error) {
|
||||
// Populate the server with regular user data
|
||||
stmt, err := db.Prepare("SELECT user_id, name, pw, lastchannel, texture, strftime('%s', last_active) FROM users WHERE server_id=?")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = stmt.Exec(server.Id)
|
||||
rows, err := stmt.Query(server.Id)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
UserId int64
|
||||
UserName string
|
||||
|
|
@ -408,7 +413,7 @@ func populateUsers(server *Server, db *sqlite.Conn) (err error) {
|
|||
LastActive int64
|
||||
)
|
||||
|
||||
err = stmt.Scan(&UserId, &UserName, &SHA1Password, &LastChannel, &Texture, &LastActive)
|
||||
err = rows.Scan(&UserId, &UserName, &SHA1Password, &LastChannel, &Texture, &LastActive)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
|
@ -443,23 +448,18 @@ func populateUsers(server *Server, db *sqlite.Conn) (err error) {
|
|||
|
||||
// Populate users with any new-style UserInfo records
|
||||
for uid, user := range server.Users {
|
||||
err = stmt.Reset()
|
||||
rows, err = stmt.Query(server.Id, uid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = stmt.Exec(server.Id, uid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
Key int
|
||||
Value string
|
||||
)
|
||||
|
||||
err = stmt.Scan(&Key, &Value)
|
||||
err = rows.Scan(&Key, &Value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -489,18 +489,18 @@ func populateUsers(server *Server, db *sqlite.Conn) (err error) {
|
|||
}
|
||||
|
||||
// Populate bans
|
||||
func populateBans(server *Server, db *sqlite.Conn) (err error) {
|
||||
func populateBans(server *Server, db *sql.DB) (err error) {
|
||||
stmt, err := db.Prepare("SELECT base, mask, name, hash, reason, start, duration FROM bans WHERE server_id=?")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = stmt.Exec(server.Id)
|
||||
rows, err := stmt.Query(server.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for stmt.Next() {
|
||||
for rows.Next() {
|
||||
var (
|
||||
Ban ban.Ban
|
||||
IP []byte
|
||||
|
|
@ -508,7 +508,7 @@ func populateBans(server *Server, db *sqlite.Conn) (err error) {
|
|||
Duration int64
|
||||
)
|
||||
|
||||
err = stmt.Scan(&IP, &Ban.Mask, &Ban.Username, &Ban.CertHash, &Ban.Reason, &StartDate, &Duration)
|
||||
err = rows.Scan(&IP, &Ban.Mask, &Ban.Username, &Ban.CertHash, &Ban.Reason, &StartDate, &Duration)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
// Copyright (c) 2011 The Grumble Authors
|
||||
// The use of this source code is goverened by a BSD-style
|
||||
// license that can be found in the LICENSE-file.
|
||||
|
||||
package main
|
||||
|
||||
import "errors"
|
||||
|
||||
const SQLiteSupport = false
|
||||
|
||||
func MurmurImport(filename string) (err error) {
|
||||
return errors.New("no sqlite support built in")
|
||||
}
|
||||
|
|
@ -54,14 +54,14 @@ func (ban *Ban) SetISOStartDate(isodate string) {
|
|||
if err != nil {
|
||||
ban.Start = 0
|
||||
} else {
|
||||
ban.Start = startTime.Seconds()
|
||||
ban.Start = startTime.Unix()
|
||||
}
|
||||
}
|
||||
|
||||
// Return the currently set start date as an ISO 8601-formatted
|
||||
// date (in UTC).
|
||||
func (ban Ban) ISOStartDate() string {
|
||||
startTime := time.SecondsToUTC(ban.Start)
|
||||
startTime := time.Unix(ban.Start, 0).UTC()
|
||||
return startTime.Format(ISODate)
|
||||
}
|
||||
|
||||
|
|
@ -74,7 +74,7 @@ func (ban Ban) IsExpired() bool {
|
|||
|
||||
// Expiry check
|
||||
expiryTime := ban.Start + int64(ban.Duration)
|
||||
if time.Seconds() > expiryTime {
|
||||
if time.Now().Unix() > expiryTime {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ func TestMaksPowerOf2(t *testing.T) {
|
|||
func TestMatchV4(t *testing.T) {
|
||||
b := Ban{}
|
||||
b.IP = net.ParseIP("192.168.1.1")
|
||||
b.Mask = 24+96 // ipv4 /24
|
||||
b.Mask = 24 + 96 // ipv4 /24
|
||||
if len(b.IP) == 0 {
|
||||
t.Errorf("Invalid IP")
|
||||
}
|
||||
|
|
@ -46,7 +46,7 @@ func TestMatchV4(t *testing.T) {
|
|||
func TestMismatchV4(t *testing.T) {
|
||||
b := Ban{}
|
||||
b.IP = net.ParseIP("192.168.1.1")
|
||||
b.Mask = 24+96 // ipv4 /24
|
||||
b.Mask = 24 + 96 // ipv4 /24
|
||||
if len(b.IP) == 0 {
|
||||
t.Errorf("Invalid IP")
|
||||
}
|
||||
|
|
@ -62,7 +62,7 @@ func TestMismatchV4(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestMatchV6(t *testing.T) {
|
||||
b := Ban {}
|
||||
b := Ban{}
|
||||
b.IP = net.ParseIP("2a00:1450:400b:c00::63")
|
||||
b.Mask = 64
|
||||
if len(b.IP) == 0 {
|
||||
|
|
@ -109,7 +109,7 @@ func TestISODate(t *testing.T) {
|
|||
|
||||
func TestInfiniteExpiry(t *testing.T) {
|
||||
b := Ban{}
|
||||
b.Start = time.Seconds()-10
|
||||
b.Start = time.Now().Add(-10 * time.Second).Unix()
|
||||
b.Duration = 0
|
||||
|
||||
if b.IsExpired() {
|
||||
|
|
@ -119,7 +119,7 @@ func TestInfiniteExpiry(t *testing.T) {
|
|||
|
||||
func TestExpired(t *testing.T) {
|
||||
b := Ban{}
|
||||
b.Start = time.Seconds()-10
|
||||
b.Start = time.Now().Add(-10 * time.Second).Unix()
|
||||
b.Duration = 9
|
||||
|
||||
if !b.IsExpired() {
|
||||
|
|
@ -129,8 +129,8 @@ func TestExpired(t *testing.T) {
|
|||
|
||||
func TestNotExpired(t *testing.T) {
|
||||
b := Ban{}
|
||||
b.Start = time.Seconds()
|
||||
b.Duration = 60*60*24
|
||||
b.Start = time.Now().Unix()
|
||||
b.Duration = 60 * 60 * 24
|
||||
|
||||
if b.IsExpired() {
|
||||
t.Errorf("Should expire in 24 hours")
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ func (r *blobReader) Read(b []byte) (n int, err error) {
|
|||
if err != io.EOF {
|
||||
return
|
||||
}
|
||||
if !bytes.Equal(r.sum, r.hash.Sum()) {
|
||||
if !bytes.Equal(r.sum, r.hash.Sum(nil)) {
|
||||
err = ErrHashMismatch
|
||||
}
|
||||
return
|
||||
|
|
|
|||
|
|
@ -14,11 +14,12 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
type BlobStore struct {
|
||||
dir string
|
||||
lockfn string
|
||||
dir string
|
||||
lockfn string
|
||||
}
|
||||
|
||||
const (
|
||||
|
|
@ -117,8 +118,9 @@ func NewBlobStore(path string) (bs *BlobStore, err error) {
|
|||
dirStructureExists = false
|
||||
}
|
||||
}
|
||||
} else {
|
||||
bsf.Close()
|
||||
}
|
||||
bsf.Close()
|
||||
|
||||
if !dirStructureExists {
|
||||
for i := 0; i < 256; i++ {
|
||||
|
|
@ -132,7 +134,7 @@ func NewBlobStore(path string) (bs *BlobStore, err error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !fi.IsDirectory() {
|
||||
if !fi.IsDir() {
|
||||
return nil, ErrBadFile
|
||||
}
|
||||
} else if e.Err == os.ENOTDIR {
|
||||
|
|
@ -152,7 +154,7 @@ func NewBlobStore(path string) (bs *BlobStore, err error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !fi.IsDirectory() {
|
||||
if !fi.IsDir() {
|
||||
return nil, ErrBadFile
|
||||
}
|
||||
} else if e.Err == os.ENOTDIR {
|
||||
|
|
@ -174,8 +176,8 @@ func NewBlobStore(path string) (bs *BlobStore, err error) {
|
|||
}
|
||||
|
||||
bs = &BlobStore{
|
||||
dir: path,
|
||||
lockfn: lockfn,
|
||||
dir: path,
|
||||
lockfn: lockfn,
|
||||
}
|
||||
return bs, nil
|
||||
}
|
||||
|
|
@ -256,7 +258,7 @@ func (bs *BlobStore) Put(buf []byte) (key string, err error) {
|
|||
// disk.
|
||||
h := sha1.New()
|
||||
h.Write(buf)
|
||||
key = hex.EncodeToString(h.Sum())
|
||||
key = hex.EncodeToString(h.Sum(nil))
|
||||
|
||||
// Get the components that make up the on-disk
|
||||
// path for the blob.
|
||||
|
|
@ -319,7 +321,7 @@ func (bs *BlobStore) Put(buf []byte) (key string, err error) {
|
|||
// On Unix, it checks for EEXIST. On Windows, it checks for EEXIST
|
||||
// and Errno code 183 (ERROR_ALREADY_EXISTS)
|
||||
func isExistError(err *os.PathError) (exists bool) {
|
||||
if e, ok := err.Err.(os.Errno); ok && e == win32AlreadyExists {
|
||||
if e, ok := err.Err.(syscall.Errno); ok && e == win32AlreadyExists {
|
||||
exists = true
|
||||
}
|
||||
if err.Err == os.EEXIST {
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ func TestMakeAllCreateAll(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !fi.IsDirectory() {
|
||||
if !fi.IsDir() {
|
||||
t.Errorf("Not a directory")
|
||||
}
|
||||
}
|
||||
|
|
@ -145,7 +145,7 @@ func TestReadNonExistantKey(t *testing.T) {
|
|||
|
||||
h := sha1.New()
|
||||
h.Write([]byte{0x42})
|
||||
key := hex.EncodeToString(h.Sum())
|
||||
key := hex.EncodeToString(h.Sum(nil))
|
||||
buf, err := bs.Get(key)
|
||||
if err != ErrNoSuchKey {
|
||||
t.Error("Expected no such key %v, found it anyway. (buf=%v, err=%v)", key, buf, err)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ func AcquireLockFile(path string) error {
|
|||
|
||||
pid, err := strconv.Atoi(string(content))
|
||||
if err == nil {
|
||||
if syscall.Kill(pid, 0) == 0 {
|
||||
err = syscall.Kill(pid, 0)
|
||||
if err != nil {
|
||||
return ErrLocked
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ func (cs *CryptState) Decrypt(dst, src []byte) (err error) {
|
|||
cs.Lost = uint32(-lost)
|
||||
}
|
||||
|
||||
cs.LastGoodTime = time.Seconds()
|
||||
cs.LastGoodTime = time.Now().Unix()
|
||||
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@ package freezer
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"code.google.com/p/goprotobuf/proto"
|
||||
"encoding/binary"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"hash/crc32"
|
||||
"io"
|
||||
"math"
|
||||
|
|
|
|||
129
pkg/freezer/types.pb.go
Normal file
129
pkg/freezer/types.pb.go
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
// Code generated by protoc-gen-go from "types.proto"
|
||||
// DO NOT EDIT!
|
||||
|
||||
package freezer
|
||||
|
||||
import proto "code.google.com/p/goprotobuf/proto"
|
||||
import "math"
|
||||
|
||||
// Reference proto & math imports to suppress error if they are not otherwise used.
|
||||
var _ = proto.GetString
|
||||
var _ = math.Inf
|
||||
|
||||
type Server struct {
|
||||
Config []*ConfigKeyValuePair `protobuf:"bytes,2,rep,name=config" json:"config,omitempty"`
|
||||
BanList *BanList `protobuf:"bytes,3,opt,name=ban_list" json:"ban_list,omitempty"`
|
||||
Channels []*Channel `protobuf:"bytes,4,rep,name=channels" json:"channels,omitempty"`
|
||||
Users []*User `protobuf:"bytes,5,rep,name=users" json:"users,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Server) Reset() { *this = Server{} }
|
||||
func (this *Server) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ConfigKeyValuePair struct {
|
||||
Key *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"`
|
||||
Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ConfigKeyValuePair) Reset() { *this = ConfigKeyValuePair{} }
|
||||
func (this *ConfigKeyValuePair) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type Ban struct {
|
||||
Ip []byte `protobuf:"bytes,1,opt,name=ip" json:"ip,omitempty"`
|
||||
Mask *uint32 `protobuf:"varint,2,opt,name=mask" json:"mask,omitempty"`
|
||||
Username *string `protobuf:"bytes,3,opt,name=username" json:"username,omitempty"`
|
||||
CertHash *string `protobuf:"bytes,4,opt,name=cert_hash" json:"cert_hash,omitempty"`
|
||||
Reason *string `protobuf:"bytes,5,opt,name=reason" json:"reason,omitempty"`
|
||||
Start *int64 `protobuf:"varint,6,opt,name=start" json:"start,omitempty"`
|
||||
Duration *uint32 `protobuf:"varint,7,opt,name=duration" json:"duration,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Ban) Reset() { *this = Ban{} }
|
||||
func (this *Ban) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type BanList struct {
|
||||
Bans []*Ban `protobuf:"bytes,1,rep,name=bans" json:"bans,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *BanList) Reset() { *this = BanList{} }
|
||||
func (this *BanList) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type User struct {
|
||||
Id *uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
|
||||
Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||
Password *string `protobuf:"bytes,3,opt,name=password" json:"password,omitempty"`
|
||||
CertHash *string `protobuf:"bytes,4,opt,name=cert_hash" json:"cert_hash,omitempty"`
|
||||
Email *string `protobuf:"bytes,5,opt,name=email" json:"email,omitempty"`
|
||||
TextureBlob *string `protobuf:"bytes,6,opt,name=texture_blob" json:"texture_blob,omitempty"`
|
||||
CommentBlob *string `protobuf:"bytes,7,opt,name=comment_blob" json:"comment_blob,omitempty"`
|
||||
LastChannelId *uint32 `protobuf:"varint,8,opt,name=last_channel_id" json:"last_channel_id,omitempty"`
|
||||
LastActive *uint64 `protobuf:"varint,9,opt,name=last_active" json:"last_active,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *User) Reset() { *this = User{} }
|
||||
func (this *User) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type UserRemove struct {
|
||||
Id *uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UserRemove) Reset() { *this = UserRemove{} }
|
||||
func (this *UserRemove) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type Channel struct {
|
||||
Id *uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
|
||||
Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||
ParentId *uint32 `protobuf:"varint,3,opt,name=parent_id" json:"parent_id,omitempty"`
|
||||
Position *int64 `protobuf:"varint,4,opt,name=position" json:"position,omitempty"`
|
||||
InheritAcl *bool `protobuf:"varint,5,opt,name=inherit_acl" json:"inherit_acl,omitempty"`
|
||||
Links []uint32 `protobuf:"varint,6,rep,name=links" json:"links,omitempty"`
|
||||
Acl []*ACL `protobuf:"bytes,7,rep,name=acl" json:"acl,omitempty"`
|
||||
Groups []*Group `protobuf:"bytes,8,rep,name=groups" json:"groups,omitempty"`
|
||||
DescriptionBlob *string `protobuf:"bytes,9,opt,name=description_blob" json:"description_blob,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Channel) Reset() { *this = Channel{} }
|
||||
func (this *Channel) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ChannelRemove struct {
|
||||
Id *uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ChannelRemove) Reset() { *this = ChannelRemove{} }
|
||||
func (this *ChannelRemove) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ACL struct {
|
||||
UserId *uint32 `protobuf:"varint,1,opt,name=user_id" json:"user_id,omitempty"`
|
||||
Group *string `protobuf:"bytes,2,opt,name=group" json:"group,omitempty"`
|
||||
ApplyHere *bool `protobuf:"varint,3,opt,name=apply_here" json:"apply_here,omitempty"`
|
||||
ApplySubs *bool `protobuf:"varint,4,opt,name=apply_subs" json:"apply_subs,omitempty"`
|
||||
Allow *uint32 `protobuf:"varint,5,opt,name=allow" json:"allow,omitempty"`
|
||||
Deny *uint32 `protobuf:"varint,6,opt,name=deny" json:"deny,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ACL) Reset() { *this = ACL{} }
|
||||
func (this *ACL) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type Group struct {
|
||||
Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
||||
Inherit *bool `protobuf:"varint,2,opt,name=inherit" json:"inherit,omitempty"`
|
||||
Inheritable *bool `protobuf:"varint,3,opt,name=inheritable" json:"inheritable,omitempty"`
|
||||
Add []uint32 `protobuf:"varint,4,rep,name=add" json:"add,omitempty"`
|
||||
Remove []uint32 `protobuf:"varint,5,rep,name=remove" json:"remove,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Group) Reset() { *this = Group{} }
|
||||
func (this *Group) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
func init() {
|
||||
}
|
||||
|
|
@ -6,7 +6,7 @@ package freezer
|
|||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"code.google.com/p/goprotobuf/proto"
|
||||
"hash"
|
||||
"hash/crc32"
|
||||
"io"
|
||||
|
|
|
|||
|
|
@ -17,8 +17,8 @@ package freezer
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"code.google.com/p/goprotobuf/proto"
|
||||
"encoding/binary"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"hash"
|
||||
"hash/crc32"
|
||||
"io"
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ func Filter(text string, options *Options) (filtered string, err error) {
|
|||
// Strip away all HTML
|
||||
out := bytes.NewBuffer(nil)
|
||||
buf := bytes.NewBufferString(text)
|
||||
parser := xml.NewParser(buf)
|
||||
parser := xml.NewDecoder(buf)
|
||||
parser.Strict = false
|
||||
parser.AutoClose = xml.HTMLAutoClose
|
||||
parser.Entity = xml.HTMLEntity
|
||||
|
|
@ -112,7 +112,7 @@ func Filter(text string, options *Options) (filtered string, err error) {
|
|||
// Simplify the received HTML data by stripping away data URIs
|
||||
out := bytes.NewBuffer(nil)
|
||||
buf := bytes.NewBufferString(text)
|
||||
parser := xml.NewParser(buf)
|
||||
parser := xml.NewDecoder(buf)
|
||||
parser.Strict = false
|
||||
parser.AutoClose = xml.HTMLAutoClose
|
||||
parser.Entity = xml.HTMLEntity
|
||||
|
|
|
|||
|
|
@ -16,10 +16,10 @@ import (
|
|||
// LogTarget multiplexes its incoming writes to multiple optional
|
||||
// output writers, and one main output writer (the log file).
|
||||
type LogTarget struct {
|
||||
mu sync.Mutex
|
||||
logfn string
|
||||
file *os.File
|
||||
memLog *bytes.Buffer
|
||||
mu sync.Mutex
|
||||
logfn string
|
||||
file *os.File
|
||||
memLog *bytes.Buffer
|
||||
}
|
||||
|
||||
var Target LogTarget
|
||||
|
|
|
|||
576
pkg/mumbleproto/Mumble.pb.go
Normal file
576
pkg/mumbleproto/Mumble.pb.go
Normal file
|
|
@ -0,0 +1,576 @@
|
|||
// Code generated by protoc-gen-go from "Mumble.proto"
|
||||
// DO NOT EDIT!
|
||||
|
||||
package mumbleproto
|
||||
|
||||
import proto "code.google.com/p/goprotobuf/proto"
|
||||
import "math"
|
||||
|
||||
// Reference proto & math imports to suppress error if they are not otherwise used.
|
||||
var _ = proto.GetString
|
||||
var _ = math.Inf
|
||||
|
||||
type Reject_RejectType int32
|
||||
|
||||
const (
|
||||
Reject_None Reject_RejectType = 0
|
||||
Reject_WrongVersion Reject_RejectType = 1
|
||||
Reject_InvalidUsername Reject_RejectType = 2
|
||||
Reject_WrongUserPW Reject_RejectType = 3
|
||||
Reject_WrongServerPW Reject_RejectType = 4
|
||||
Reject_UsernameInUse Reject_RejectType = 5
|
||||
Reject_ServerFull Reject_RejectType = 6
|
||||
Reject_NoCertificate Reject_RejectType = 7
|
||||
)
|
||||
|
||||
var Reject_RejectType_name = map[int32]string{
|
||||
0: "None",
|
||||
1: "WrongVersion",
|
||||
2: "InvalidUsername",
|
||||
3: "WrongUserPW",
|
||||
4: "WrongServerPW",
|
||||
5: "UsernameInUse",
|
||||
6: "ServerFull",
|
||||
7: "NoCertificate",
|
||||
}
|
||||
var Reject_RejectType_value = map[string]int32{
|
||||
"None": 0,
|
||||
"WrongVersion": 1,
|
||||
"InvalidUsername": 2,
|
||||
"WrongUserPW": 3,
|
||||
"WrongServerPW": 4,
|
||||
"UsernameInUse": 5,
|
||||
"ServerFull": 6,
|
||||
"NoCertificate": 7,
|
||||
}
|
||||
|
||||
func NewReject_RejectType(x Reject_RejectType) *Reject_RejectType {
|
||||
e := Reject_RejectType(x)
|
||||
return &e
|
||||
}
|
||||
func (x Reject_RejectType) String() string {
|
||||
return proto.EnumName(Reject_RejectType_name, int32(x))
|
||||
}
|
||||
|
||||
type PermissionDenied_DenyType int32
|
||||
|
||||
const (
|
||||
PermissionDenied_Text PermissionDenied_DenyType = 0
|
||||
PermissionDenied_Permission PermissionDenied_DenyType = 1
|
||||
PermissionDenied_SuperUser PermissionDenied_DenyType = 2
|
||||
PermissionDenied_ChannelName PermissionDenied_DenyType = 3
|
||||
PermissionDenied_TextTooLong PermissionDenied_DenyType = 4
|
||||
PermissionDenied_H9K PermissionDenied_DenyType = 5
|
||||
PermissionDenied_TemporaryChannel PermissionDenied_DenyType = 6
|
||||
PermissionDenied_MissingCertificate PermissionDenied_DenyType = 7
|
||||
PermissionDenied_UserName PermissionDenied_DenyType = 8
|
||||
PermissionDenied_ChannelFull PermissionDenied_DenyType = 9
|
||||
)
|
||||
|
||||
var PermissionDenied_DenyType_name = map[int32]string{
|
||||
0: "Text",
|
||||
1: "Permission",
|
||||
2: "SuperUser",
|
||||
3: "ChannelName",
|
||||
4: "TextTooLong",
|
||||
5: "H9K",
|
||||
6: "TemporaryChannel",
|
||||
7: "MissingCertificate",
|
||||
8: "UserName",
|
||||
9: "ChannelFull",
|
||||
}
|
||||
var PermissionDenied_DenyType_value = map[string]int32{
|
||||
"Text": 0,
|
||||
"Permission": 1,
|
||||
"SuperUser": 2,
|
||||
"ChannelName": 3,
|
||||
"TextTooLong": 4,
|
||||
"H9K": 5,
|
||||
"TemporaryChannel": 6,
|
||||
"MissingCertificate": 7,
|
||||
"UserName": 8,
|
||||
"ChannelFull": 9,
|
||||
}
|
||||
|
||||
func NewPermissionDenied_DenyType(x PermissionDenied_DenyType) *PermissionDenied_DenyType {
|
||||
e := PermissionDenied_DenyType(x)
|
||||
return &e
|
||||
}
|
||||
func (x PermissionDenied_DenyType) String() string {
|
||||
return proto.EnumName(PermissionDenied_DenyType_name, int32(x))
|
||||
}
|
||||
|
||||
type ContextActionModify_Context int32
|
||||
|
||||
const (
|
||||
ContextActionModify_Server ContextActionModify_Context = 1
|
||||
ContextActionModify_Channel ContextActionModify_Context = 2
|
||||
ContextActionModify_User ContextActionModify_Context = 4
|
||||
)
|
||||
|
||||
var ContextActionModify_Context_name = map[int32]string{
|
||||
1: "Server",
|
||||
2: "Channel",
|
||||
4: "User",
|
||||
}
|
||||
var ContextActionModify_Context_value = map[string]int32{
|
||||
"Server": 1,
|
||||
"Channel": 2,
|
||||
"User": 4,
|
||||
}
|
||||
|
||||
func NewContextActionModify_Context(x ContextActionModify_Context) *ContextActionModify_Context {
|
||||
e := ContextActionModify_Context(x)
|
||||
return &e
|
||||
}
|
||||
func (x ContextActionModify_Context) String() string {
|
||||
return proto.EnumName(ContextActionModify_Context_name, int32(x))
|
||||
}
|
||||
|
||||
type ContextActionModify_Operation int32
|
||||
|
||||
const (
|
||||
ContextActionModify_Add ContextActionModify_Operation = 0
|
||||
ContextActionModify_Remove ContextActionModify_Operation = 1
|
||||
)
|
||||
|
||||
var ContextActionModify_Operation_name = map[int32]string{
|
||||
0: "Add",
|
||||
1: "Remove",
|
||||
}
|
||||
var ContextActionModify_Operation_value = map[string]int32{
|
||||
"Add": 0,
|
||||
"Remove": 1,
|
||||
}
|
||||
|
||||
func NewContextActionModify_Operation(x ContextActionModify_Operation) *ContextActionModify_Operation {
|
||||
e := ContextActionModify_Operation(x)
|
||||
return &e
|
||||
}
|
||||
func (x ContextActionModify_Operation) String() string {
|
||||
return proto.EnumName(ContextActionModify_Operation_name, int32(x))
|
||||
}
|
||||
|
||||
type Version struct {
|
||||
Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"`
|
||||
Release *string `protobuf:"bytes,2,opt,name=release" json:"release,omitempty"`
|
||||
Os *string `protobuf:"bytes,3,opt,name=os" json:"os,omitempty"`
|
||||
OsVersion *string `protobuf:"bytes,4,opt,name=os_version" json:"os_version,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Version) Reset() { *this = Version{} }
|
||||
func (this *Version) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type UDPTunnel struct {
|
||||
Packet []byte `protobuf:"bytes,1,req,name=packet" json:"packet,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UDPTunnel) Reset() { *this = UDPTunnel{} }
|
||||
func (this *UDPTunnel) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type Authenticate struct {
|
||||
Username *string `protobuf:"bytes,1,opt,name=username" json:"username,omitempty"`
|
||||
Password *string `protobuf:"bytes,2,opt,name=password" json:"password,omitempty"`
|
||||
Tokens []string `protobuf:"bytes,3,rep,name=tokens" json:"tokens,omitempty"`
|
||||
CeltVersions []int32 `protobuf:"varint,4,rep,name=celt_versions" json:"celt_versions,omitempty"`
|
||||
Opus *bool `protobuf:"varint,5,opt,name=opus,def=0" json:"opus,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Authenticate) Reset() { *this = Authenticate{} }
|
||||
func (this *Authenticate) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_Authenticate_Opus bool = false
|
||||
|
||||
type Ping struct {
|
||||
Timestamp *uint64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"`
|
||||
Good *uint32 `protobuf:"varint,2,opt,name=good" json:"good,omitempty"`
|
||||
Late *uint32 `protobuf:"varint,3,opt,name=late" json:"late,omitempty"`
|
||||
Lost *uint32 `protobuf:"varint,4,opt,name=lost" json:"lost,omitempty"`
|
||||
Resync *uint32 `protobuf:"varint,5,opt,name=resync" json:"resync,omitempty"`
|
||||
UdpPackets *uint32 `protobuf:"varint,6,opt,name=udp_packets" json:"udp_packets,omitempty"`
|
||||
TcpPackets *uint32 `protobuf:"varint,7,opt,name=tcp_packets" json:"tcp_packets,omitempty"`
|
||||
UdpPingAvg *float32 `protobuf:"fixed32,8,opt,name=udp_ping_avg" json:"udp_ping_avg,omitempty"`
|
||||
UdpPingVar *float32 `protobuf:"fixed32,9,opt,name=udp_ping_var" json:"udp_ping_var,omitempty"`
|
||||
TcpPingAvg *float32 `protobuf:"fixed32,10,opt,name=tcp_ping_avg" json:"tcp_ping_avg,omitempty"`
|
||||
TcpPingVar *float32 `protobuf:"fixed32,11,opt,name=tcp_ping_var" json:"tcp_ping_var,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Ping) Reset() { *this = Ping{} }
|
||||
func (this *Ping) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type Reject struct {
|
||||
Type *Reject_RejectType `protobuf:"varint,1,opt,name=type,enum=mumbleproto.Reject_RejectType" json:"type,omitempty"`
|
||||
Reason *string `protobuf:"bytes,2,opt,name=reason" json:"reason,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *Reject) Reset() { *this = Reject{} }
|
||||
func (this *Reject) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ServerConfig struct {
|
||||
MaxBandwidth *uint32 `protobuf:"varint,1,opt,name=max_bandwidth" json:"max_bandwidth,omitempty"`
|
||||
WelcomeText *string `protobuf:"bytes,2,opt,name=welcome_text" json:"welcome_text,omitempty"`
|
||||
AllowHtml *bool `protobuf:"varint,3,opt,name=allow_html" json:"allow_html,omitempty"`
|
||||
MessageLength *uint32 `protobuf:"varint,4,opt,name=message_length" json:"message_length,omitempty"`
|
||||
ImageMessageLength *uint32 `protobuf:"varint,5,opt,name=image_message_length" json:"image_message_length,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ServerConfig) Reset() { *this = ServerConfig{} }
|
||||
func (this *ServerConfig) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ServerSync struct {
|
||||
Session *uint32 `protobuf:"varint,1,opt,name=session" json:"session,omitempty"`
|
||||
MaxBandwidth *uint32 `protobuf:"varint,2,opt,name=max_bandwidth" json:"max_bandwidth,omitempty"`
|
||||
WelcomeText *string `protobuf:"bytes,3,opt,name=welcome_text" json:"welcome_text,omitempty"`
|
||||
Permissions *uint64 `protobuf:"varint,4,opt,name=permissions" json:"permissions,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ServerSync) Reset() { *this = ServerSync{} }
|
||||
func (this *ServerSync) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ChannelRemove struct {
|
||||
ChannelId *uint32 `protobuf:"varint,1,req,name=channel_id" json:"channel_id,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ChannelRemove) Reset() { *this = ChannelRemove{} }
|
||||
func (this *ChannelRemove) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ChannelState struct {
|
||||
ChannelId *uint32 `protobuf:"varint,1,opt,name=channel_id" json:"channel_id,omitempty"`
|
||||
Parent *uint32 `protobuf:"varint,2,opt,name=parent" json:"parent,omitempty"`
|
||||
Name *string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"`
|
||||
Links []uint32 `protobuf:"varint,4,rep,name=links" json:"links,omitempty"`
|
||||
Description *string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"`
|
||||
LinksAdd []uint32 `protobuf:"varint,6,rep,name=links_add" json:"links_add,omitempty"`
|
||||
LinksRemove []uint32 `protobuf:"varint,7,rep,name=links_remove" json:"links_remove,omitempty"`
|
||||
Temporary *bool `protobuf:"varint,8,opt,name=temporary,def=0" json:"temporary,omitempty"`
|
||||
Position *int32 `protobuf:"varint,9,opt,name=position,def=0" json:"position,omitempty"`
|
||||
DescriptionHash []byte `protobuf:"bytes,10,opt,name=description_hash" json:"description_hash,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ChannelState) Reset() { *this = ChannelState{} }
|
||||
func (this *ChannelState) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_ChannelState_Temporary bool = false
|
||||
const Default_ChannelState_Position int32 = 0
|
||||
|
||||
type UserRemove struct {
|
||||
Session *uint32 `protobuf:"varint,1,req,name=session" json:"session,omitempty"`
|
||||
Actor *uint32 `protobuf:"varint,2,opt,name=actor" json:"actor,omitempty"`
|
||||
Reason *string `protobuf:"bytes,3,opt,name=reason" json:"reason,omitempty"`
|
||||
Ban *bool `protobuf:"varint,4,opt,name=ban" json:"ban,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UserRemove) Reset() { *this = UserRemove{} }
|
||||
func (this *UserRemove) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type UserState struct {
|
||||
Session *uint32 `protobuf:"varint,1,opt,name=session" json:"session,omitempty"`
|
||||
Actor *uint32 `protobuf:"varint,2,opt,name=actor" json:"actor,omitempty"`
|
||||
Name *string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"`
|
||||
UserId *uint32 `protobuf:"varint,4,opt,name=user_id" json:"user_id,omitempty"`
|
||||
ChannelId *uint32 `protobuf:"varint,5,opt,name=channel_id" json:"channel_id,omitempty"`
|
||||
Mute *bool `protobuf:"varint,6,opt,name=mute" json:"mute,omitempty"`
|
||||
Deaf *bool `protobuf:"varint,7,opt,name=deaf" json:"deaf,omitempty"`
|
||||
Suppress *bool `protobuf:"varint,8,opt,name=suppress" json:"suppress,omitempty"`
|
||||
SelfMute *bool `protobuf:"varint,9,opt,name=self_mute" json:"self_mute,omitempty"`
|
||||
SelfDeaf *bool `protobuf:"varint,10,opt,name=self_deaf" json:"self_deaf,omitempty"`
|
||||
Texture []byte `protobuf:"bytes,11,opt,name=texture" json:"texture,omitempty"`
|
||||
PluginContext []byte `protobuf:"bytes,12,opt,name=plugin_context" json:"plugin_context,omitempty"`
|
||||
PluginIdentity *string `protobuf:"bytes,13,opt,name=plugin_identity" json:"plugin_identity,omitempty"`
|
||||
Comment *string `protobuf:"bytes,14,opt,name=comment" json:"comment,omitempty"`
|
||||
Hash *string `protobuf:"bytes,15,opt,name=hash" json:"hash,omitempty"`
|
||||
CommentHash []byte `protobuf:"bytes,16,opt,name=comment_hash" json:"comment_hash,omitempty"`
|
||||
TextureHash []byte `protobuf:"bytes,17,opt,name=texture_hash" json:"texture_hash,omitempty"`
|
||||
PrioritySpeaker *bool `protobuf:"varint,18,opt,name=priority_speaker" json:"priority_speaker,omitempty"`
|
||||
Recording *bool `protobuf:"varint,19,opt,name=recording" json:"recording,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UserState) Reset() { *this = UserState{} }
|
||||
func (this *UserState) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type BanList struct {
|
||||
Bans []*BanList_BanEntry `protobuf:"bytes,1,rep,name=bans" json:"bans,omitempty"`
|
||||
Query *bool `protobuf:"varint,2,opt,name=query,def=0" json:"query,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *BanList) Reset() { *this = BanList{} }
|
||||
func (this *BanList) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_BanList_Query bool = false
|
||||
|
||||
type BanList_BanEntry struct {
|
||||
Address []byte `protobuf:"bytes,1,req,name=address" json:"address,omitempty"`
|
||||
Mask *uint32 `protobuf:"varint,2,req,name=mask" json:"mask,omitempty"`
|
||||
Name *string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"`
|
||||
Hash *string `protobuf:"bytes,4,opt,name=hash" json:"hash,omitempty"`
|
||||
Reason *string `protobuf:"bytes,5,opt,name=reason" json:"reason,omitempty"`
|
||||
Start *string `protobuf:"bytes,6,opt,name=start" json:"start,omitempty"`
|
||||
Duration *uint32 `protobuf:"varint,7,opt,name=duration" json:"duration,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *BanList_BanEntry) Reset() { *this = BanList_BanEntry{} }
|
||||
func (this *BanList_BanEntry) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type TextMessage struct {
|
||||
Actor *uint32 `protobuf:"varint,1,opt,name=actor" json:"actor,omitempty"`
|
||||
Session []uint32 `protobuf:"varint,2,rep,name=session" json:"session,omitempty"`
|
||||
ChannelId []uint32 `protobuf:"varint,3,rep,name=channel_id" json:"channel_id,omitempty"`
|
||||
TreeId []uint32 `protobuf:"varint,4,rep,name=tree_id" json:"tree_id,omitempty"`
|
||||
Message *string `protobuf:"bytes,5,req,name=message" json:"message,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *TextMessage) Reset() { *this = TextMessage{} }
|
||||
func (this *TextMessage) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type PermissionDenied struct {
|
||||
Permission *uint32 `protobuf:"varint,1,opt,name=permission" json:"permission,omitempty"`
|
||||
ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id" json:"channel_id,omitempty"`
|
||||
Session *uint32 `protobuf:"varint,3,opt,name=session" json:"session,omitempty"`
|
||||
Reason *string `protobuf:"bytes,4,opt,name=reason" json:"reason,omitempty"`
|
||||
Type *PermissionDenied_DenyType `protobuf:"varint,5,opt,name=type,enum=mumbleproto.PermissionDenied_DenyType" json:"type,omitempty"`
|
||||
Name *string `protobuf:"bytes,6,opt,name=name" json:"name,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *PermissionDenied) Reset() { *this = PermissionDenied{} }
|
||||
func (this *PermissionDenied) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ACL struct {
|
||||
ChannelId *uint32 `protobuf:"varint,1,req,name=channel_id" json:"channel_id,omitempty"`
|
||||
InheritAcls *bool `protobuf:"varint,2,opt,name=inherit_acls,def=1" json:"inherit_acls,omitempty"`
|
||||
Groups []*ACL_ChanGroup `protobuf:"bytes,3,rep,name=groups" json:"groups,omitempty"`
|
||||
Acls []*ACL_ChanACL `protobuf:"bytes,4,rep,name=acls" json:"acls,omitempty"`
|
||||
Query *bool `protobuf:"varint,5,opt,name=query,def=0" json:"query,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ACL) Reset() { *this = ACL{} }
|
||||
func (this *ACL) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_ACL_InheritAcls bool = true
|
||||
const Default_ACL_Query bool = false
|
||||
|
||||
type ACL_ChanGroup struct {
|
||||
Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
|
||||
Inherited *bool `protobuf:"varint,2,opt,name=inherited,def=1" json:"inherited,omitempty"`
|
||||
Inherit *bool `protobuf:"varint,3,opt,name=inherit,def=1" json:"inherit,omitempty"`
|
||||
Inheritable *bool `protobuf:"varint,4,opt,name=inheritable,def=1" json:"inheritable,omitempty"`
|
||||
Add []uint32 `protobuf:"varint,5,rep,name=add" json:"add,omitempty"`
|
||||
Remove []uint32 `protobuf:"varint,6,rep,name=remove" json:"remove,omitempty"`
|
||||
InheritedMembers []uint32 `protobuf:"varint,7,rep,name=inherited_members" json:"inherited_members,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ACL_ChanGroup) Reset() { *this = ACL_ChanGroup{} }
|
||||
func (this *ACL_ChanGroup) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_ACL_ChanGroup_Inherited bool = true
|
||||
const Default_ACL_ChanGroup_Inherit bool = true
|
||||
const Default_ACL_ChanGroup_Inheritable bool = true
|
||||
|
||||
type ACL_ChanACL struct {
|
||||
ApplyHere *bool `protobuf:"varint,1,opt,name=apply_here,def=1" json:"apply_here,omitempty"`
|
||||
ApplySubs *bool `protobuf:"varint,2,opt,name=apply_subs,def=1" json:"apply_subs,omitempty"`
|
||||
Inherited *bool `protobuf:"varint,3,opt,name=inherited,def=1" json:"inherited,omitempty"`
|
||||
UserId *uint32 `protobuf:"varint,4,opt,name=user_id" json:"user_id,omitempty"`
|
||||
Group *string `protobuf:"bytes,5,opt,name=group" json:"group,omitempty"`
|
||||
Grant *uint32 `protobuf:"varint,6,opt,name=grant" json:"grant,omitempty"`
|
||||
Deny *uint32 `protobuf:"varint,7,opt,name=deny" json:"deny,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ACL_ChanACL) Reset() { *this = ACL_ChanACL{} }
|
||||
func (this *ACL_ChanACL) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_ACL_ChanACL_ApplyHere bool = true
|
||||
const Default_ACL_ChanACL_ApplySubs bool = true
|
||||
const Default_ACL_ChanACL_Inherited bool = true
|
||||
|
||||
type QueryUsers struct {
|
||||
Ids []uint32 `protobuf:"varint,1,rep,name=ids" json:"ids,omitempty"`
|
||||
Names []string `protobuf:"bytes,2,rep,name=names" json:"names,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *QueryUsers) Reset() { *this = QueryUsers{} }
|
||||
func (this *QueryUsers) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type CryptSetup struct {
|
||||
Key []byte `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"`
|
||||
ClientNonce []byte `protobuf:"bytes,2,opt,name=client_nonce" json:"client_nonce,omitempty"`
|
||||
ServerNonce []byte `protobuf:"bytes,3,opt,name=server_nonce" json:"server_nonce,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *CryptSetup) Reset() { *this = CryptSetup{} }
|
||||
func (this *CryptSetup) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ContextActionModify struct {
|
||||
Action *string `protobuf:"bytes,1,req,name=action" json:"action,omitempty"`
|
||||
Text *string `protobuf:"bytes,2,opt,name=text" json:"text,omitempty"`
|
||||
Context *uint32 `protobuf:"varint,3,opt,name=context" json:"context,omitempty"`
|
||||
Operation *ContextActionModify_Operation `protobuf:"varint,4,opt,name=operation,enum=mumbleproto.ContextActionModify_Operation" json:"operation,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ContextActionModify) Reset() { *this = ContextActionModify{} }
|
||||
func (this *ContextActionModify) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type ContextAction struct {
|
||||
Session *uint32 `protobuf:"varint,1,opt,name=session" json:"session,omitempty"`
|
||||
ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id" json:"channel_id,omitempty"`
|
||||
Action *string `protobuf:"bytes,3,req,name=action" json:"action,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *ContextAction) Reset() { *this = ContextAction{} }
|
||||
func (this *ContextAction) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type UserList struct {
|
||||
Users []*UserList_User `protobuf:"bytes,1,rep,name=users" json:"users,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UserList) Reset() { *this = UserList{} }
|
||||
func (this *UserList) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type UserList_User struct {
|
||||
UserId *uint32 `protobuf:"varint,1,req,name=user_id" json:"user_id,omitempty"`
|
||||
Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UserList_User) Reset() { *this = UserList_User{} }
|
||||
func (this *UserList_User) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type VoiceTarget struct {
|
||||
Id *uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
|
||||
Targets []*VoiceTarget_Target `protobuf:"bytes,2,rep,name=targets" json:"targets,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *VoiceTarget) Reset() { *this = VoiceTarget{} }
|
||||
func (this *VoiceTarget) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type VoiceTarget_Target struct {
|
||||
Session []uint32 `protobuf:"varint,1,rep,name=session" json:"session,omitempty"`
|
||||
ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id" json:"channel_id,omitempty"`
|
||||
Group *string `protobuf:"bytes,3,opt,name=group" json:"group,omitempty"`
|
||||
Links *bool `protobuf:"varint,4,opt,name=links,def=0" json:"links,omitempty"`
|
||||
Children *bool `protobuf:"varint,5,opt,name=children,def=0" json:"children,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *VoiceTarget_Target) Reset() { *this = VoiceTarget_Target{} }
|
||||
func (this *VoiceTarget_Target) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_VoiceTarget_Target_Links bool = false
|
||||
const Default_VoiceTarget_Target_Children bool = false
|
||||
|
||||
type PermissionQuery struct {
|
||||
ChannelId *uint32 `protobuf:"varint,1,opt,name=channel_id" json:"channel_id,omitempty"`
|
||||
Permissions *uint32 `protobuf:"varint,2,opt,name=permissions" json:"permissions,omitempty"`
|
||||
Flush *bool `protobuf:"varint,3,opt,name=flush,def=0" json:"flush,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *PermissionQuery) Reset() { *this = PermissionQuery{} }
|
||||
func (this *PermissionQuery) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_PermissionQuery_Flush bool = false
|
||||
|
||||
type CodecVersion struct {
|
||||
Alpha *int32 `protobuf:"varint,1,req,name=alpha" json:"alpha,omitempty"`
|
||||
Beta *int32 `protobuf:"varint,2,req,name=beta" json:"beta,omitempty"`
|
||||
PreferAlpha *bool `protobuf:"varint,3,req,name=prefer_alpha,def=1" json:"prefer_alpha,omitempty"`
|
||||
Opus *bool `protobuf:"varint,4,opt,name=opus,def=0" json:"opus,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *CodecVersion) Reset() { *this = CodecVersion{} }
|
||||
func (this *CodecVersion) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_CodecVersion_PreferAlpha bool = true
|
||||
const Default_CodecVersion_Opus bool = false
|
||||
|
||||
type UserStats struct {
|
||||
Session *uint32 `protobuf:"varint,1,opt,name=session" json:"session,omitempty"`
|
||||
StatsOnly *bool `protobuf:"varint,2,opt,name=stats_only,def=0" json:"stats_only,omitempty"`
|
||||
Certificates [][]byte `protobuf:"bytes,3,rep,name=certificates" json:"certificates,omitempty"`
|
||||
FromClient *UserStats_Stats `protobuf:"bytes,4,opt,name=from_client" json:"from_client,omitempty"`
|
||||
FromServer *UserStats_Stats `protobuf:"bytes,5,opt,name=from_server" json:"from_server,omitempty"`
|
||||
UdpPackets *uint32 `protobuf:"varint,6,opt,name=udp_packets" json:"udp_packets,omitempty"`
|
||||
TcpPackets *uint32 `protobuf:"varint,7,opt,name=tcp_packets" json:"tcp_packets,omitempty"`
|
||||
UdpPingAvg *float32 `protobuf:"fixed32,8,opt,name=udp_ping_avg" json:"udp_ping_avg,omitempty"`
|
||||
UdpPingVar *float32 `protobuf:"fixed32,9,opt,name=udp_ping_var" json:"udp_ping_var,omitempty"`
|
||||
TcpPingAvg *float32 `protobuf:"fixed32,10,opt,name=tcp_ping_avg" json:"tcp_ping_avg,omitempty"`
|
||||
TcpPingVar *float32 `protobuf:"fixed32,11,opt,name=tcp_ping_var" json:"tcp_ping_var,omitempty"`
|
||||
Version *Version `protobuf:"bytes,12,opt,name=version" json:"version,omitempty"`
|
||||
CeltVersions []int32 `protobuf:"varint,13,rep,name=celt_versions" json:"celt_versions,omitempty"`
|
||||
Address []byte `protobuf:"bytes,14,opt,name=address" json:"address,omitempty"`
|
||||
Bandwidth *uint32 `protobuf:"varint,15,opt,name=bandwidth" json:"bandwidth,omitempty"`
|
||||
Onlinesecs *uint32 `protobuf:"varint,16,opt,name=onlinesecs" json:"onlinesecs,omitempty"`
|
||||
Idlesecs *uint32 `protobuf:"varint,17,opt,name=idlesecs" json:"idlesecs,omitempty"`
|
||||
StrongCertificate *bool `protobuf:"varint,18,opt,name=strong_certificate,def=0" json:"strong_certificate,omitempty"`
|
||||
Opus *bool `protobuf:"varint,19,opt,name=opus,def=0" json:"opus,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UserStats) Reset() { *this = UserStats{} }
|
||||
func (this *UserStats) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
const Default_UserStats_StatsOnly bool = false
|
||||
const Default_UserStats_StrongCertificate bool = false
|
||||
const Default_UserStats_Opus bool = false
|
||||
|
||||
type UserStats_Stats struct {
|
||||
Good *uint32 `protobuf:"varint,1,opt,name=good" json:"good,omitempty"`
|
||||
Late *uint32 `protobuf:"varint,2,opt,name=late" json:"late,omitempty"`
|
||||
Lost *uint32 `protobuf:"varint,3,opt,name=lost" json:"lost,omitempty"`
|
||||
Resync *uint32 `protobuf:"varint,4,opt,name=resync" json:"resync,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *UserStats_Stats) Reset() { *this = UserStats_Stats{} }
|
||||
func (this *UserStats_Stats) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type SuggestConfig struct {
|
||||
Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"`
|
||||
Positional *bool `protobuf:"varint,2,opt,name=positional" json:"positional,omitempty"`
|
||||
PushToTalk *bool `protobuf:"varint,3,opt,name=push_to_talk" json:"push_to_talk,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *SuggestConfig) Reset() { *this = SuggestConfig{} }
|
||||
func (this *SuggestConfig) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
type RequestBlob struct {
|
||||
SessionTexture []uint32 `protobuf:"varint,1,rep,name=session_texture" json:"session_texture,omitempty"`
|
||||
SessionComment []uint32 `protobuf:"varint,2,rep,name=session_comment" json:"session_comment,omitempty"`
|
||||
ChannelDescription []uint32 `protobuf:"varint,3,rep,name=channel_description" json:"channel_description,omitempty"`
|
||||
XXX_unrecognized []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (this *RequestBlob) Reset() { *this = RequestBlob{} }
|
||||
func (this *RequestBlob) String() string { return proto.CompactTextString(this) }
|
||||
|
||||
func init() {
|
||||
proto.RegisterEnum("mumbleproto.Reject_RejectType", Reject_RejectType_name, Reject_RejectType_value)
|
||||
proto.RegisterEnum("mumbleproto.PermissionDenied_DenyType", PermissionDenied_DenyType_name, PermissionDenied_DenyType_value)
|
||||
proto.RegisterEnum("mumbleproto.ContextActionModify_Context", ContextActionModify_Context_name, ContextActionModify_Context_value)
|
||||
proto.RegisterEnum("mumbleproto.ContextActionModify_Operation", ContextActionModify_Operation_name, ContextActionModify_Operation_value)
|
||||
}
|
||||
|
|
@ -90,13 +90,13 @@ func (cfg *Config) IntValue(key string) (intval int) {
|
|||
// Get the value of a specific config key as a uint32
|
||||
func (cfg *Config) Uint32Value(key string) (uint32val uint32) {
|
||||
str := cfg.StringValue(key)
|
||||
uintval, _ := strconv.Atoui(str)
|
||||
uintval, _ := strconv.ParseUint(str, 10, 0)
|
||||
return uint32(uintval)
|
||||
}
|
||||
|
||||
// Get the value fo a sepcific config key as a bool
|
||||
func (cfg *Config) BoolValue(key string) (boolval bool) {
|
||||
str := cfg.StringValue(key)
|
||||
boolval, _ = strconv.Atob(str)
|
||||
boolval, _ = strconv.ParseBool(str)
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ func (c *Conn) Prepare(cmd string) (*Stmt, error) {
|
|||
if rv != 0 {
|
||||
return nil, c.error(rv)
|
||||
}
|
||||
return &Stmt{c: c, stmt: stmt, sql: cmd, t0: time.Nanoseconds()}, nil
|
||||
return &Stmt{c: c, stmt: stmt, sql: cmd, t0: time.Now()}, nil
|
||||
}
|
||||
|
||||
func (s *Stmt) Exec(args ...interface{}) error {
|
||||
|
|
@ -356,13 +356,13 @@ func (s *Stmt) Scan(args ...interface{}) error {
|
|||
}
|
||||
*v = x
|
||||
case *int64:
|
||||
x, err := strconv.Atoi64(string(data))
|
||||
x, err := strconv.ParseInt(string(data), 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("arg " + strconv.Itoa(i) + " as int64: " + err.Error())
|
||||
}
|
||||
*v = x
|
||||
case *float64:
|
||||
x, err := strconv.Atof64(string(data))
|
||||
x, err := strconv.ParseFloat(string(data), 64)
|
||||
if err != nil {
|
||||
return errors.New("arg " + strconv.Itoa(i) + " as float64: " + err.Error())
|
||||
}
|
||||
|
|
@ -379,7 +379,7 @@ func (s *Stmt) SQL() string {
|
|||
}
|
||||
|
||||
func (s *Stmt) Nanoseconds() int64 {
|
||||
return time.Nanoseconds() - s.t0
|
||||
return time.Now().Sub(s.t0)
|
||||
}
|
||||
|
||||
func (s *Stmt) Finalize() error {
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ func (server *Server) RegisterPublicServer() {
|
|||
|
||||
hasher := sha1.New()
|
||||
hasher.Write(config.Certificates[0].Certificate[0])
|
||||
digest := hex.EncodeToString(hasher.Sum())
|
||||
digest := hex.EncodeToString(hasher.Sum(nil))
|
||||
|
||||
// Render registration XML template
|
||||
reg := Register{
|
||||
|
|
@ -93,7 +93,7 @@ func (server *Server) RegisterPublicServer() {
|
|||
Release: "Grumble Git",
|
||||
}
|
||||
buf := bytes.NewBuffer(nil)
|
||||
err := xml.Marshal(buf, reg)
|
||||
err := xml.NewEncoder(buf).Encode(reg)
|
||||
if err != nil {
|
||||
server.Printf("register: unable to marshal xml: %v", err)
|
||||
return
|
||||
|
|
|
|||
60
server.go
60
server.go
|
|
@ -7,6 +7,7 @@ package main
|
|||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"code.google.com/p/goprotobuf/proto"
|
||||
"crypto/rand"
|
||||
"crypto/sha1"
|
||||
"crypto/tls"
|
||||
|
|
@ -14,16 +15,15 @@ import (
|
|||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"grumble/ban"
|
||||
"grumble/blobstore"
|
||||
"grumble/cryptstate"
|
||||
"grumble/freezer"
|
||||
"grumble/htmlfilter"
|
||||
"grumble/logtarget"
|
||||
"grumble/mumbleproto"
|
||||
"grumble/serverconf"
|
||||
"grumble/sessionpool"
|
||||
"github.com/mkrautz/grumble/pkg/ban"
|
||||
"github.com/mkrautz/grumble/pkg/blobstore"
|
||||
"github.com/mkrautz/grumble/pkg/cryptstate"
|
||||
"github.com/mkrautz/grumble/pkg/freezer"
|
||||
"github.com/mkrautz/grumble/pkg/htmlfilter"
|
||||
"github.com/mkrautz/grumble/pkg/logtarget"
|
||||
"github.com/mkrautz/grumble/pkg/mumbleproto"
|
||||
"github.com/mkrautz/grumble/pkg/serverconf"
|
||||
"github.com/mkrautz/grumble/pkg/sessionpool"
|
||||
"hash"
|
||||
"log"
|
||||
"net"
|
||||
|
|
@ -59,7 +59,7 @@ type Server struct {
|
|||
Id int64
|
||||
|
||||
tcpl *net.TCPListener
|
||||
tlsl *tls.Listener
|
||||
tlsl net.Listener
|
||||
udpconn *net.UDPConn
|
||||
tlscfg *tls.Config
|
||||
bye chan bool
|
||||
|
|
@ -178,7 +178,7 @@ func (server *Server) SetSuperUserPassword(password string) {
|
|||
hasher := sha1.New()
|
||||
hasher.Write(saltBytes)
|
||||
hasher.Write([]byte(password))
|
||||
digest := hex.EncodeToString(hasher.Sum())
|
||||
digest := hex.EncodeToString(hasher.Sum(nil))
|
||||
|
||||
// Could be racy, but shouldn't really matter...
|
||||
key := "SuperUserPassword"
|
||||
|
|
@ -219,7 +219,7 @@ func (server *Server) CheckSuperUserPassword(password string) bool {
|
|||
// password
|
||||
h.Write([]byte(password))
|
||||
|
||||
sum := hex.EncodeToString(h.Sum())
|
||||
sum := hex.EncodeToString(h.Sum(nil))
|
||||
if parts[2] == sum {
|
||||
return true
|
||||
}
|
||||
|
|
@ -267,7 +267,7 @@ func (server *Server) handleIncomingClient(conn net.Conn) (err error) {
|
|||
if len(state.PeerCertificates) > 0 {
|
||||
hash := sha1.New()
|
||||
hash.Write(state.PeerCertificates[0].Raw)
|
||||
sum := hash.Sum()
|
||||
sum := hash.Sum(nil)
|
||||
client.CertHash = hex.EncodeToString(sum)
|
||||
}
|
||||
|
||||
|
|
@ -360,7 +360,7 @@ func (server *Server) UnlinkChannels(channel *Channel, other *Channel) {
|
|||
// Important control channel messages are routed through this Goroutine
|
||||
// to keep server state synchronized.
|
||||
func (server *Server) handlerLoop() {
|
||||
regtick := time.Tick((3600 + ((server.Id * 60) % 600)) * 1e9)
|
||||
regtick := time.Tick(time.Hour)
|
||||
for {
|
||||
select {
|
||||
// We're done. Stop the server's event handler
|
||||
|
|
@ -391,7 +391,7 @@ func (server *Server) handlerLoop() {
|
|||
target.SendVoiceBroadcast(vb)
|
||||
}
|
||||
// Remove a temporary channel
|
||||
case tempChannel := <- server.tempRemove:
|
||||
case tempChannel := <-server.tempRemove:
|
||||
if tempChannel.IsEmpty() {
|
||||
server.RemoveChannel(tempChannel)
|
||||
}
|
||||
|
|
@ -517,7 +517,7 @@ func (server *Server) handleAuthenticate(client *Client, msg *Message) {
|
|||
|
||||
// Send CryptState information to the client so it can establish an UDP connection,
|
||||
// if it wishes.
|
||||
client.lastResync = time.Seconds()
|
||||
client.lastResync = time.Now().Unix()
|
||||
err = client.sendMessage(&mumbleproto.CryptSetup{
|
||||
Key: client.crypt.RawKey[0:],
|
||||
ClientNonce: client.crypt.DecryptIV[0:],
|
||||
|
|
@ -1335,20 +1335,24 @@ func (server *Server) Start() (err error) {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = server.udpconn.SetReadTimeout(1e9)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
/*
|
||||
err = server.udpconn.SetReadTimeout(1e9)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*/
|
||||
|
||||
// Set up our TCP connection
|
||||
server.tcpl, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP(host), port})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = server.tcpl.SetTimeout(1e9)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
/*
|
||||
err = server.tcpl.SetTimeout(1e9)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*/
|
||||
|
||||
// Wrap a TLS listener around the TCP connection
|
||||
certFn := filepath.Join(Args.DataDir, "cert.pem")
|
||||
|
|
@ -1358,8 +1362,8 @@ func (server *Server) Start() (err error) {
|
|||
return err
|
||||
}
|
||||
server.tlscfg = &tls.Config{
|
||||
Certificates: []tls.Certificate{cert},
|
||||
AuthenticateClient: true,
|
||||
Certificates: []tls.Certificate{cert},
|
||||
ClientAuth: tls.RequestClientCert,
|
||||
}
|
||||
server.tlsl = tls.NewListener(server.tcpl, server.tlscfg)
|
||||
|
||||
|
|
@ -1392,7 +1396,7 @@ func (server *Server) Start() (err error) {
|
|||
|
||||
// Schedule a server registration update (if needed)
|
||||
go func() {
|
||||
time.Sleep((60 + server.Id*10) * 1e9)
|
||||
time.Sleep(1 * time.Minute)
|
||||
server.RegisterPublicServer()
|
||||
}()
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,18 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"exp/signal"
|
||||
"fmt"
|
||||
"grumble/logtarget"
|
||||
"github.com/mkrautz/grumble/pkg/logtarget"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func SignalHandler() {
|
||||
for {
|
||||
sig := <-signal.Incoming
|
||||
|
||||
if sig == os.SIGUSR2 {
|
||||
if sig == os.UnixSignal(syscall.SIGUSR2) {
|
||||
err := logtarget.Target.Rotate()
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Unable to rotate log file: %v", err)
|
||||
|
|
@ -23,7 +24,7 @@ func SignalHandler() {
|
|||
continue
|
||||
}
|
||||
|
||||
if sig == os.SIGINT || sig == os.SIGTERM {
|
||||
if sig == os.UnixSignal(syscall.SIGINT) || sig == os.UnixSignal(syscall.SIGTERM) {
|
||||
os.Exit(0)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
19
ssh.go
19
ssh.go
|
|
@ -2,9 +2,10 @@ package main
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"code.google.com/p/go.crypto/ssh"
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
"exp/ssh"
|
||||
"exp/terminal"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
|
|
@ -133,7 +134,7 @@ func RunSSH() {
|
|||
func handleChannel(channel ssh.Channel) {
|
||||
if channel.ChannelType() == "session" {
|
||||
channel.Accept()
|
||||
shell := ssh.NewServerShell(channel, "G> ")
|
||||
shell := terminal.NewTerminal(channel, "> ")
|
||||
go func() {
|
||||
defer channel.Close()
|
||||
for {
|
||||
|
|
@ -225,7 +226,7 @@ func StartServerCmd(reply SshCmdReply, args []string) error {
|
|||
return errors.New("argument count mismatch")
|
||||
}
|
||||
|
||||
serverId, err := strconv.Atoi64(args[1])
|
||||
serverId, err := strconv.ParseInt(args[1], 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("bad server id")
|
||||
}
|
||||
|
|
@ -250,7 +251,7 @@ func StopServerCmd(reply SshCmdReply, args []string) error {
|
|||
return errors.New("argument count mismatch")
|
||||
}
|
||||
|
||||
serverId, err := strconv.Atoi64(args[1])
|
||||
serverId, err := strconv.ParseInt(args[1], 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("bad server id")
|
||||
}
|
||||
|
|
@ -275,7 +276,7 @@ func RestartServerCmd(reply SshCmdReply, args []string) error {
|
|||
return errors.New("argument count mismatch")
|
||||
}
|
||||
|
||||
serverId, err := strconv.Atoi64(args[1])
|
||||
serverId, err := strconv.ParseInt(args[1], 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("bad server id")
|
||||
}
|
||||
|
|
@ -307,7 +308,7 @@ func SetSuperUserPasswordCmd(reply SshCmdReply, args []string) error {
|
|||
return errors.New("argument count mismatch")
|
||||
}
|
||||
|
||||
serverId, err := strconv.Atoi64(args[1])
|
||||
serverId, err := strconv.ParseInt(args[1], 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("bad server id")
|
||||
}
|
||||
|
|
@ -328,7 +329,7 @@ func SetConfCmd(reply SshCmdReply, args []string) error {
|
|||
return errors.New("argument count mismatch")
|
||||
}
|
||||
|
||||
serverId, err := strconv.Atoi64(args[1])
|
||||
serverId, err := strconv.ParseInt(args[1], 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("bad server id")
|
||||
}
|
||||
|
|
@ -352,7 +353,7 @@ func GetConfCmd(reply SshCmdReply, args []string) error {
|
|||
return errors.New("argument count mismatch")
|
||||
}
|
||||
|
||||
serverId, err := strconv.Atoi64(args[1])
|
||||
serverId, err := strconv.ParseInt(args[1], 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("bad server id")
|
||||
}
|
||||
|
|
@ -374,7 +375,7 @@ func ClearConfCmd(reply SshCmdReply, args []string) error {
|
|||
return errors.New("argument count mismatch")
|
||||
}
|
||||
|
||||
serverId, err := strconv.Atoi64(args[1])
|
||||
serverId, err := strconv.ParseInt(args[1], 10, 64)
|
||||
if err != nil {
|
||||
return errors.New("bad server id")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue