38
vendor/github.com/status-im/status-go/services/permissions/README.md
generated
vendored
Normal file
38
vendor/github.com/status-im/status-go/services/permissions/README.md
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
Dapps permissions service
|
||||
=========================
|
||||
|
||||
To enable:
|
||||
|
||||
```json
|
||||
{
|
||||
"PermissionsConfig": {
|
||||
"Enabled": true,
|
||||
},
|
||||
APIModules: "permissions"
|
||||
}
|
||||
```
|
||||
|
||||
API
|
||||
---
|
||||
|
||||
#### permissions_addDappPermissions
|
||||
|
||||
Stores provided permissions for dapp. On update replaces previous version of the object.
|
||||
|
||||
```json
|
||||
{
|
||||
"dapp": "first",
|
||||
"permissions": [
|
||||
"r",
|
||||
"x"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### permissions_getDappPermissions
|
||||
|
||||
Returns all permissions for dapps. Order is not deterministic.
|
||||
|
||||
#### permissions_deleteDappPermissions
|
||||
|
||||
Delete dapp by a name.
|
||||
30
vendor/github.com/status-im/status-go/services/permissions/api.go
generated
vendored
Normal file
30
vendor/github.com/status-im/status-go/services/permissions/api.go
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
package permissions
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
func NewAPI(db *Database) *API {
|
||||
return &API{db}
|
||||
}
|
||||
|
||||
// API is class with methods available over RPC.
|
||||
type API struct {
|
||||
db *Database
|
||||
}
|
||||
|
||||
func (api *API) AddDappPermissions(ctx context.Context, perms DappPermissions) error {
|
||||
return api.db.AddPermissions(perms)
|
||||
}
|
||||
|
||||
func (api *API) GetDappPermissions(ctx context.Context) ([]DappPermissions, error) {
|
||||
return api.db.GetPermissions()
|
||||
}
|
||||
|
||||
func (api *API) DeleteDappPermissions(ctx context.Context, name string) error {
|
||||
return api.db.DeletePermission(name, "")
|
||||
}
|
||||
|
||||
func (api *API) DeleteDappPermissionsByNameAndAddress(ctx context.Context, name string, address string) error {
|
||||
return api.db.DeletePermission(name, address)
|
||||
}
|
||||
168
vendor/github.com/status-im/status-go/services/permissions/database.go
generated
vendored
Normal file
168
vendor/github.com/status-im/status-go/services/permissions/database.go
generated
vendored
Normal file
@@ -0,0 +1,168 @@
|
||||
package permissions
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
)
|
||||
|
||||
// Database sql wrapper for operations with browser objects.
|
||||
type Database struct {
|
||||
db *sql.DB
|
||||
}
|
||||
|
||||
// Close closes database.
|
||||
func (db Database) Close() error {
|
||||
return db.db.Close()
|
||||
}
|
||||
|
||||
func NewDB(db *sql.DB) *Database {
|
||||
return &Database{db: db}
|
||||
}
|
||||
|
||||
type DappPermissions struct {
|
||||
ID int
|
||||
Name string `json:"dapp"`
|
||||
Permissions []string `json:"permissions,omitempty"`
|
||||
Address string `json:"address,omitempty"`
|
||||
}
|
||||
|
||||
func (db *Database) AddPermissions(perms DappPermissions) (err error) {
|
||||
tx, err := db.db.Begin()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
if err == nil {
|
||||
err = tx.Commit()
|
||||
return
|
||||
}
|
||||
_ = tx.Rollback()
|
||||
}()
|
||||
dRows, err := tx.Query("SELECT id FROM dapps where name = ? AND address = ?", perms.Name, perms.Address)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer dRows.Close()
|
||||
|
||||
var id int64
|
||||
if dRows.Next() {
|
||||
err = dRows.Scan(&id)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
dInsert, err := tx.Prepare("INSERT INTO dapps(name, address) VALUES(?, ?)")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
res, err := dInsert.Exec(perms.Name, perms.Address)
|
||||
dInsert.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
id, err = res.LastInsertId()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
pDelete, err := tx.Prepare("DELETE FROM permissions WHERE dapp_id = ?")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer pDelete.Close()
|
||||
_, err = pDelete.Exec(id)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(perms.Permissions) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
pInsert, err := tx.Prepare("INSERT INTO permissions(dapp_id, permission) VALUES(?, ?)")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer pInsert.Close()
|
||||
for _, perm := range perms.Permissions {
|
||||
_, err = pInsert.Exec(id, perm)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (db *Database) GetPermissions() (rst []DappPermissions, err error) {
|
||||
tx, err := db.db.Begin()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
if err == nil {
|
||||
err = tx.Commit()
|
||||
return
|
||||
}
|
||||
_ = tx.Rollback()
|
||||
}()
|
||||
|
||||
// FULL and RIGHT joins are not supported
|
||||
dRows, err := tx.Query("SELECT id, name, address FROM dapps")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer dRows.Close()
|
||||
dapps := map[int]*DappPermissions{}
|
||||
for dRows.Next() {
|
||||
perms := DappPermissions{}
|
||||
err = dRows.Scan(&perms.ID, &perms.Name, &perms.Address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dapps[perms.ID] = &perms
|
||||
}
|
||||
|
||||
pRows, err := tx.Query("SELECT dapp_id, permission from permissions")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer pRows.Close()
|
||||
var (
|
||||
id int
|
||||
permission string
|
||||
)
|
||||
for pRows.Next() {
|
||||
err = pRows.Scan(&id, &permission)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
dapps[id].Permissions = append(dapps[id].Permissions, permission)
|
||||
}
|
||||
rst = make([]DappPermissions, 0, len(dapps))
|
||||
for key := range dapps {
|
||||
rst = append(rst, *dapps[key])
|
||||
}
|
||||
|
||||
return rst, nil
|
||||
}
|
||||
|
||||
func (db *Database) DeletePermission(name string, address string) error {
|
||||
_, err := db.db.Exec("DELETE FROM dapps WHERE name = ? AND address = ?", name, address)
|
||||
return err
|
||||
}
|
||||
|
||||
func (db *Database) HasPermission(dappName string, address string, permission string) (bool, error) {
|
||||
var id int64
|
||||
err := db.db.QueryRow("SELECT id FROM dapps where name = ? AND address = ?", dappName, address).Scan(&id)
|
||||
if err != nil {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
var count uint64
|
||||
err = db.db.QueryRow(
|
||||
`SELECT COUNT(1) FROM permissions WHERE dapp_id = ? AND permission = ?`,
|
||||
id, permission,
|
||||
).Scan(&count)
|
||||
return count > 0, err
|
||||
}
|
||||
41
vendor/github.com/status-im/status-go/services/permissions/service.go
generated
vendored
Normal file
41
vendor/github.com/status-im/status-go/services/permissions/service.go
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
package permissions
|
||||
|
||||
import (
|
||||
"github.com/ethereum/go-ethereum/p2p"
|
||||
"github.com/ethereum/go-ethereum/rpc"
|
||||
)
|
||||
|
||||
// NewService initializes service instance.
|
||||
func NewService(db *Database) *Service {
|
||||
return &Service{db: db}
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
db *Database
|
||||
}
|
||||
|
||||
// Start a service.
|
||||
func (s *Service) Start() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Stop a service.
|
||||
func (s *Service) Stop() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// APIs returns list of available RPC APIs.
|
||||
func (s *Service) APIs() []rpc.API {
|
||||
return []rpc.API{
|
||||
{
|
||||
Namespace: "permissions",
|
||||
Version: "0.1.0",
|
||||
Service: NewAPI(s.db),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// Protocols returns list of p2p protocols.
|
||||
func (s *Service) Protocols() []p2p.Protocol {
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user