mirror of
https://github.com/mainflux/mainflux.git
synced 2025-04-27 13:48:49 +08:00

* Move Things and Users to Clients Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * NOISSUE - Update Add and Delete Policies (#1792) * Remove Policy Action Ranks Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Rebase Issues Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix CI Test Errors Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Adding Check on Subject For Clients Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Remove Check Client Exists Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Check When Sharing Clients Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Only Add User to Group When Sharing Things Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Remove clientType Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Minor Fix on ShareClient and Fix Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Policies Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Clean Up Things Authorization Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Tests on RetrieveAll Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Test ShareThing Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Merge Conflicts Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Remove Adding Policies. Only Use Ownership Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Check If Subject is same as Object Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Move Back To Union As Sometimes Policy is Empty and Fails to Evaluate on Ownership Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Entity Type For Failing Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix BUG in policy evaluation Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Comments Regarding checkAdmin Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Tests On Rebase Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Combine Authorize For Things and Users Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Tests On Rebase Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Error on Things SVC `unsupported protocol scheme` Signed-off-by: rodneyosodo <blackd0t@protonmail.com> --------- Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Fix Bug on Things Authorization Cache (#1810) Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Use Password instead of username in MQTT handler Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Simplify MQTT authorization Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Fix MQTT tests Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * NOISSUE - Add More Functions to SDK (#1811) * Add More Functions to SDK Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Examples to GoDoc Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Update Unassign Interface Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Pass Subject as ID and Not Token on List Channels By Thing Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Bootstrap Errors For Element Check Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add empty line Before Return Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Reorder URLS in things mux Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Listing Things Policies Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Share Thing Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Examples to CLI Docs Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Update Identity To Update Another User Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Identify an Update Policies on Things Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Update Things Policies Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix GoDocs on Disconnect Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Change Authorize To Use AccessRequest Signed-off-by: rodneyosodo <blackd0t@protonmail.com> --------- Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * For Evaluate Policy Use AccessRequest (#1814) Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * NOISSUE - Add SDK Tests (#1812) * Add Things Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Channel Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Certs Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Consumer Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Enrich Group Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Tests For Health Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Tests For Tokens Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Rename SDK for Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Policies Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Linter Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Fix Tests Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Make Variable Defination Inline Signed-off-by: rodneyosodo <blackd0t@protonmail.com> --------- Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * NOISSUE - Make Cache Key Duration Configurable (#1815) * Make Cache Key Duration Configurable Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Rename ENV Var Signed-off-by: rodneyosodo <blackd0t@protonmail.com> --------- Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * NOISSUE - Update GoDocs (#1816) * Add GoDocs Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add Missing GoDoc Files Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Enable godot Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Add License Information Signed-off-by: rodneyosodo <blackd0t@protonmail.com> --------- Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * NOISSUE - Add Call Home Client to Mainflux services (#1751) * Move Things and Users to Clients Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: SammyOina <sammyoina@gmail.com> * collect and send data package Signed-off-by: SammyOina <sammyoina@gmail.com> * create telemetry migrations Signed-off-by: SammyOina <sammyoina@gmail.com> * add telemetry endpoints Signed-off-by: SammyOina <sammyoina@gmail.com> * add transport Signed-off-by: SammyOina <sammyoina@gmail.com> * create service Signed-off-by: SammyOina <sammyoina@gmail.com> * remove homing server Signed-off-by: SammyOina <sammyoina@gmail.com> * add call home to adapters Signed-off-by: SammyOina <sammyoina@gmail.com> * add last seen Signed-off-by: SammyOina <sammyoina@gmail.com> * rename logger Signed-off-by: SammyOina <sammyoina@gmail.com> * remove homing client Signed-off-by: SammyOina <sammyoina@gmail.com> * use unmerged repo Signed-off-by: SammyOina <sammyoina@gmail.com> * use renamed module Signed-off-by: SammyOina <sammyoina@gmail.com> * update call home version Signed-off-by: SammyOina <sammyoina@gmail.com> * edit documentation Signed-off-by: SammyOina <sammyoina@gmail.com> * align table Signed-off-by: SammyOina <sammyoina@gmail.com> * use alias for call home client Signed-off-by: SammyOina <sammyoina@gmail.com> * update callhome Signed-off-by: SammyOina <sammyoina@gmail.com> * update call home pkg Signed-off-by: SammyOina <sammyoina@gmail.com> * update call home Signed-off-by: SammyOina <sammyoina@gmail.com> * fix modules Signed-off-by: SammyOina <sammyoina@gmail.com> * use mf build version Signed-off-by: SammyOina <sammyoina@gmail.com> * use mf build version Signed-off-by: SammyOina <sammyoina@gmail.com> * restore default Signed-off-by: SammyOina <sammyoina@gmail.com> * add call home for users and things Signed-off-by: SammyOina <sammyoina@gmail.com> * enable opting on call home Signed-off-by: SammyOina <sammyoina@gmail.com> * remove full stops Signed-off-by: SammyOina <sammyoina@gmail.com> * update callhome client Signed-off-by: SammyOina <sammyoina@gmail.com> * add call home to all services Signed-off-by: SammyOina <sammyoina@gmail.com> * fix build Signed-off-by: SammyOina <sammyoina@gmail.com> * restore sdk tests Signed-off-by: SammyOina <sammyoina@gmail.com> * remove unnecessary changes Signed-off-by: SammyOina <sammyoina@gmail.com> * restore health_test.go Signed-off-by: SammyOina <sammyoina@gmail.com> --------- Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: SammyOina <sammyoina@gmail.com> Co-authored-by: b1ackd0t <blackd0t@protonmail.com> Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> --------- Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> Signed-off-by: rodneyosodo <blackd0t@protonmail.com> Signed-off-by: SammyOina <sammyoina@gmail.com> Co-authored-by: b1ackd0t <blackd0t@protonmail.com> Co-authored-by: Sammy Kerata Oina <44265300+SammyOina@users.noreply.github.com>
267 lines
5.6 KiB
Go
267 lines
5.6 KiB
Go
package terminfo
|
|
|
|
import (
|
|
"sort"
|
|
)
|
|
|
|
const (
|
|
// maxFileLength is the max file length.
|
|
maxFileLength = 4096
|
|
|
|
// magic is the file magic for terminfo files.
|
|
magic = 0432
|
|
|
|
// magicExtended is the file magic for terminfo files with the extended number format.
|
|
magicExtended = 01036
|
|
)
|
|
|
|
// header fields.
|
|
const (
|
|
fieldMagic = iota
|
|
fieldNameSize
|
|
fieldBoolCount
|
|
fieldNumCount
|
|
fieldStringCount
|
|
fieldTableSize
|
|
)
|
|
|
|
// header extended fields.
|
|
const (
|
|
fieldExtBoolCount = iota
|
|
fieldExtNumCount
|
|
fieldExtStringCount
|
|
fieldExtOffsetCount
|
|
fieldExtTableSize
|
|
)
|
|
|
|
// hasInvalidCaps determines if the capabilities in h are invalid.
|
|
func hasInvalidCaps(h []int) bool {
|
|
return h[fieldBoolCount] > CapCountBool ||
|
|
h[fieldNumCount] > CapCountNum ||
|
|
h[fieldStringCount] > CapCountString
|
|
}
|
|
|
|
// capLength returns the total length of the capabilities in bytes.
|
|
func capLength(h []int) int {
|
|
return h[fieldNameSize] +
|
|
h[fieldBoolCount] +
|
|
(h[fieldNameSize]+h[fieldBoolCount])%2 + // account for word align
|
|
h[fieldNumCount]*2 +
|
|
h[fieldStringCount]*2 +
|
|
h[fieldTableSize]
|
|
}
|
|
|
|
// hasInvalidExtOffset determines if the extended offset field is valid.
|
|
func hasInvalidExtOffset(h []int) bool {
|
|
return h[fieldExtBoolCount]+
|
|
h[fieldExtNumCount]+
|
|
h[fieldExtStringCount]*2 != h[fieldExtOffsetCount]
|
|
}
|
|
|
|
// extCapLength returns the total length of extended capabilities in bytes.
|
|
func extCapLength(h []int, numWidth int) int {
|
|
return h[fieldExtBoolCount] +
|
|
h[fieldExtBoolCount]%2 + // account for word align
|
|
h[fieldExtNumCount]*(numWidth/8) +
|
|
h[fieldExtOffsetCount]*2 +
|
|
h[fieldExtTableSize]
|
|
}
|
|
|
|
// findNull finds the position of null in buf.
|
|
func findNull(buf []byte, i int) int {
|
|
for ; i < len(buf); i++ {
|
|
if buf[i] == 0 {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
// readStrings decodes n strings from string data table buf using the indexes in idx.
|
|
func readStrings(idx []int, buf []byte, n int) (map[int][]byte, int, error) {
|
|
var last int
|
|
m := make(map[int][]byte)
|
|
for i := 0; i < n; i++ {
|
|
start := idx[i]
|
|
if start < 0 {
|
|
continue
|
|
}
|
|
if end := findNull(buf, start); end != -1 {
|
|
m[i], last = buf[start:end], end+1
|
|
} else {
|
|
return nil, 0, ErrInvalidStringTable
|
|
}
|
|
}
|
|
return m, last, nil
|
|
}
|
|
|
|
// decoder holds state info while decoding a terminfo file.
|
|
type decoder struct {
|
|
buf []byte
|
|
pos int
|
|
len int
|
|
}
|
|
|
|
// readBytes reads the next n bytes of buf, incrementing pos by n.
|
|
func (d *decoder) readBytes(n int) ([]byte, error) {
|
|
if d.len < d.pos+n {
|
|
return nil, ErrUnexpectedFileEnd
|
|
}
|
|
n, d.pos = d.pos, d.pos+n
|
|
return d.buf[n:d.pos], nil
|
|
}
|
|
|
|
// readInts reads n number of ints with width w.
|
|
func (d *decoder) readInts(n, w int) ([]int, error) {
|
|
w /= 8
|
|
l := n * w
|
|
|
|
buf, err := d.readBytes(l)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// align
|
|
d.pos += d.pos % 2
|
|
|
|
z := make([]int, n)
|
|
for i, j := 0, 0; i < l; i, j = i+w, j+1 {
|
|
switch w {
|
|
case 1:
|
|
z[i] = int(buf[i])
|
|
case 2:
|
|
z[j] = int(int16(buf[i+1])<<8 | int16(buf[i]))
|
|
case 4:
|
|
z[j] = int(buf[i+3])<<24 | int(buf[i+2])<<16 | int(buf[i+1])<<8 | int(buf[i])
|
|
}
|
|
}
|
|
|
|
return z, nil
|
|
}
|
|
|
|
// readBools reads the next n bools.
|
|
func (d *decoder) readBools(n int) (map[int]bool, map[int]bool, error) {
|
|
buf, err := d.readInts(n, 8)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// process
|
|
bools, boolsM := make(map[int]bool), make(map[int]bool)
|
|
for i, b := range buf {
|
|
bools[i] = b == 1
|
|
if int8(b) == -2 {
|
|
boolsM[i] = true
|
|
}
|
|
}
|
|
|
|
return bools, boolsM, nil
|
|
}
|
|
|
|
// readNums reads the next n nums.
|
|
func (d *decoder) readNums(n, w int) (map[int]int, map[int]bool, error) {
|
|
buf, err := d.readInts(n, w)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// process
|
|
nums, numsM := make(map[int]int), make(map[int]bool)
|
|
for i := 0; i < n; i++ {
|
|
nums[i] = buf[i]
|
|
if buf[i] == -2 {
|
|
numsM[i] = true
|
|
}
|
|
}
|
|
|
|
return nums, numsM, nil
|
|
}
|
|
|
|
// readStringTable reads the string data for n strings and the accompanying data
|
|
// table of length sz.
|
|
func (d *decoder) readStringTable(n, sz int) ([][]byte, []int, error) {
|
|
buf, err := d.readInts(n, 16)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// read string data table
|
|
data, err := d.readBytes(sz)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// align
|
|
d.pos += d.pos % 2
|
|
|
|
// process
|
|
s := make([][]byte, n)
|
|
var m []int
|
|
for i := 0; i < n; i++ {
|
|
start := buf[i]
|
|
if start == -2 {
|
|
m = append(m, i)
|
|
} else if start >= 0 {
|
|
if end := findNull(data, start); end != -1 {
|
|
s[i] = data[start:end]
|
|
} else {
|
|
return nil, nil, ErrInvalidStringTable
|
|
}
|
|
}
|
|
}
|
|
|
|
return s, m, nil
|
|
}
|
|
|
|
// readStrings reads the next n strings and processes the string data table of
|
|
// length sz.
|
|
func (d *decoder) readStrings(n, sz int) (map[int][]byte, map[int]bool, error) {
|
|
s, m, err := d.readStringTable(n, sz)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
strs := make(map[int][]byte)
|
|
for k, v := range s {
|
|
if k == AcsChars {
|
|
v = canonicalizeAscChars(v)
|
|
}
|
|
strs[k] = v
|
|
}
|
|
|
|
strsM := make(map[int]bool, len(m))
|
|
for _, k := range m {
|
|
strsM[k] = true
|
|
}
|
|
|
|
return strs, strsM, nil
|
|
}
|
|
|
|
// canonicalizeAscChars reorders chars to be unique, in order.
|
|
//
|
|
// see repair_ascc in ncurses-6.0/progs/dump_entry.c
|
|
func canonicalizeAscChars(z []byte) []byte {
|
|
var c chars
|
|
enc := make(map[byte]byte, len(z)/2)
|
|
for i := 0; i < len(z); i += 2 {
|
|
if _, ok := enc[z[i]]; !ok {
|
|
a, b := z[i], z[i+1]
|
|
//log.Printf(">>> a: %d %c, b: %d %c", a, a, b, b)
|
|
c, enc[a] = append(c, b), b
|
|
}
|
|
}
|
|
sort.Sort(c)
|
|
|
|
r := make([]byte, 2*len(c))
|
|
for i := 0; i < len(c); i++ {
|
|
r[i*2], r[i*2+1] = c[i], enc[c[i]]
|
|
}
|
|
return r
|
|
}
|
|
|
|
type chars []byte
|
|
|
|
func (c chars) Len() int { return len(c) }
|
|
func (c chars) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
|
|
func (c chars) Less(i, j int) bool { return c[i] < c[j] }
|