matrix-capnproto-fed

What if Matrix was written using Cap'n'proto and a RPC federation API?
git clone git://archive.git.mtrnord.blog/MTRNord/matrix-capnproto-fed.git
Log | Files | Refs | README | LICENSE

helper.go (3867B)


      1 package helpers
      2 
      3 import (
      4 	"context"
      5 	"log"
      6 
      7 	protocol "github.com/MTRNord/matrix_protobuf_fed/proto/federation/v1"
      8 	"github.com/MTRNord/matrix_protobuf_fed/proto/federation/v1/types"
      9 )
     10 
     11 func QuoteString(s string) string {
     12 	return "\"" + s + "\""
     13 }
     14 
     15 type KeyStreamCallback struct {
     16 }
     17 
     18 func NewKeyStreamCallback() KeyStreamCallback {
     19 	return KeyStreamCallback{}
     20 }
     21 
     22 func (k KeyStreamCallback) Write(ctx context.Context, call protocol.StreamCallback_write) error {
     23 	log.Println("StreamCallback.Write")
     24 	p := call.Args()
     25 
     26 	response_ptr, err := p.Value()
     27 	if err != nil {
     28 		return err
     29 	}
     30 	response := types.ServerKeysResponse(response_ptr.Struct())
     31 
     32 	if response.HasMetadata() {
     33 		metadata, err := response.Metadata()
     34 		if err != nil {
     35 			return err
     36 		}
     37 
     38 		servername, err := metadata.ServerName()
     39 		if err != nil {
     40 			return err
     41 		}
     42 		valid_until_ts := metadata.ValidUntilTS()
     43 
     44 		log.Println("Server keys metadata:\n", "servername:", QuoteString(servername), "valid_until_ts:", valid_until_ts)
     45 	} else if response.HasVerifyKeys() {
     46 		verify_keys, err := response.VerifyKeys()
     47 		if err != nil {
     48 			return err
     49 		}
     50 
     51 		entries, err := verify_keys.Entries()
     52 		if err != nil {
     53 			return err
     54 		}
     55 		len_of_entries := entries.Len()
     56 
     57 		// Print the verify keys
     58 		for i := 0; i < len_of_entries; i++ {
     59 			entry := entries.At(i)
     60 
     61 			key_id_ptr, err := entry.Key()
     62 			if err != nil {
     63 				return err
     64 			}
     65 
     66 			key_id := key_id_ptr.Text()
     67 
     68 			key_ptr, err := entry.Value()
     69 			if err != nil {
     70 				return err
     71 			}
     72 
     73 			key := key_ptr.Data()
     74 
     75 			log.Println("Server keys verify_keys entry:", "key_id:", QuoteString(key_id), "key:", key)
     76 		}
     77 	} else if response.HasOldVerifyKeys() {
     78 		old_verify_keys, err := response.OldVerifyKeys()
     79 		if err != nil {
     80 			return err
     81 		}
     82 
     83 		entries, err := old_verify_keys.Entries()
     84 		if err != nil {
     85 			return err
     86 		}
     87 		len_of_entries := entries.Len()
     88 
     89 		// Print the verify keys
     90 		for i := 0; i < len_of_entries; i++ {
     91 			entry := entries.At(i)
     92 
     93 			key_id_ptr, err := entry.Key()
     94 			if err != nil {
     95 				return err
     96 			}
     97 
     98 			key_id := key_id_ptr.Text()
     99 
    100 			key_ptr, err := entry.Value()
    101 			if err != nil {
    102 				return err
    103 			}
    104 
    105 			key_wrapper := types.ServerKeysResponse_OldVerifyKey(key_ptr.Struct())
    106 			key, err := key_wrapper.Key()
    107 			if err != nil {
    108 				return err
    109 			}
    110 
    111 			expired_ts := key_wrapper.ExpiredTS()
    112 
    113 			log.Println("Server keys old_verify_keys entry:", "key_id:", QuoteString(key_id), "key:", key, "expired_ts:", expired_ts)
    114 		}
    115 	} else {
    116 		log.Println("Server keys response has no metadata, verify_keys, or old_verify_keys")
    117 	}
    118 
    119 	// Print the signatures
    120 	if response.HasSignatures() {
    121 		signatures, err := response.Signatures()
    122 		if err != nil {
    123 			return err
    124 		}
    125 		len_of_signatures := signatures.Len()
    126 
    127 		for i := 0; i < len_of_signatures; i++ {
    128 			signature := signatures.At(i)
    129 
    130 			server, err := signature.Server()
    131 			if err != nil {
    132 				return err
    133 			}
    134 
    135 			signatures_map, err := signature.Signatures()
    136 			if err != nil {
    137 				return err
    138 			}
    139 			signatures_map_entries, err := signatures_map.Entries()
    140 			if err != nil {
    141 				return err
    142 			}
    143 			len_of_signatures_map_entries := signatures_map_entries.Len()
    144 
    145 			for j := 0; j < len_of_signatures_map_entries; j++ {
    146 				signature_entry := signatures_map_entries.At(j)
    147 
    148 				key_id_ptr, err := signature_entry.Key()
    149 				if err != nil {
    150 					return err
    151 				}
    152 				key_id := key_id_ptr.Text()
    153 
    154 				signature_ptr, err := signature_entry.Value()
    155 				if err != nil {
    156 					return err
    157 				}
    158 
    159 				signature := signature_ptr.Data()
    160 
    161 				log.Println("Server keys signature:", "server:", QuoteString(server), "key_id:", QuoteString(key_id), "signature:", signature)
    162 			}
    163 		}
    164 
    165 	} else {
    166 		log.Println("Server keys response has no signatures")
    167 	}
    168 	return nil
    169 }
    170 
    171 func (k KeyStreamCallback) Done(ctx context.Context, call protocol.StreamCallback_done) error {
    172 	log.Println("StreamCallback.Done")
    173 	return nil
    174 }