func getSignerPublicKeyBlobref() (signerRef blob.Ref, armored string, ok bool) { configOnce.Do(parseConfig) key := "keyId" keyId, ok := config[key].(string) if !ok { log.Printf("No key %q in JSON configuration file %q; have you run \"camput init\"?", key, osutil.UserClientConfigPath()) return } keyRing, hasKeyRing := config["secretRing"].(string) if !hasKeyRing { if fn := osutil.IdentitySecretRing(); fileExists(fn) { keyRing = fn } else if fn := jsonsign.DefaultSecRingPath(); fileExists(fn) { keyRing = fn } else { log.Printf("Couldn't find keyId %q; no 'secretRing' specified in config file, and no standard secret ring files exist.") return } } entity, err := jsonsign.EntityFromSecring(keyId, keyRing) if err != nil { log.Printf("Couldn't find keyId %q in secret ring: %v", keyId, err) return } armored, err = jsonsign.ArmoredPublicKey(entity) if err != nil { log.Printf("Error serializing public key: %v", err) return } // TODO(mpl): integrate with getSelfPubKeyDir if possible. selfPubKeyDir, ok := config["selfPubKeyDir"].(string) if !ok { selfPubKeyDir = osutil.KeyBlobsDir() log.Printf("No 'selfPubKeyDir' defined in %q, defaulting to %v", osutil.UserClientConfigPath(), selfPubKeyDir) } fi, err := os.Stat(selfPubKeyDir) if err != nil || !fi.IsDir() { log.Printf("selfPubKeyDir of %q doesn't exist or not a directory", selfPubKeyDir) return } br := blob.SHA1FromString(armored) pubFile := filepath.Join(selfPubKeyDir, br.String()+".camli") fi, err = os.Stat(pubFile) if err != nil { err = ioutil.WriteFile(pubFile, []byte(armored), 0644) if err != nil { log.Printf("Error writing public key to %q: %v", pubFile, err) return } } return br, armored, true }
func (c *Client) initSelfPubKeyDir() { if e := os.Getenv("CAMLI_DEV_KEYBLOBS"); e != "" { c.selfPubKeyDir = e return } configOnce.Do(parseConfig) v, ok := config[selfPubKeyDir].(string) if !ok { c.selfPubKeyDir = osutil.KeyBlobsDir() log.Printf("selfPubKeyDir: was expecting a string, got %T. Defaulting to %v", v, c.selfPubKeyDir) return } c.selfPubKeyDir = v }
func (c *Client) initSignerPublicKeyBlobref() { configOnce.Do(parseConfig) keyId := config.identity if keyId == "" { log.Fatalf("No 'identity' key in JSON configuration file %q; have you run \"camput init\"?", osutil.UserClientConfigPath()) } keyRing := c.SecretRingFile() if !fileExists(keyRing) { log.Fatalf("Could not find keyId %q, because secret ring file %q does not exist.", keyId, keyRing) } entity, err := jsonsign.EntityFromSecring(keyId, keyRing) if err != nil { log.Fatalf("Couldn't find keyId %q in secret ring %v: %v", keyId, keyRing, err) } armored, err := jsonsign.ArmoredPublicKey(entity) if err != nil { log.Fatalf("Error serializing public key: %v", err) } // TODO(mpl): completely get rid of it if possible // http://camlistore.org/issue/377 selfPubKeyDir := osutil.KeyBlobsDir() fi, err := os.Stat(selfPubKeyDir) if err != nil || !fi.IsDir() { log.Fatalf("selfPubKeyDir as %q doesn't exist or not a directory", selfPubKeyDir) } br := blob.SHA1FromString(armored) pubFile := filepath.Join(selfPubKeyDir, br.String()+".camli") fi, err = os.Stat(pubFile) if err != nil { if !os.IsNotExist(err) { log.Fatalf("Could not stat %q: %v", pubFile, err) } err = ioutil.WriteFile(pubFile, []byte(armored), 0644) if err != nil { log.Fatalf("Error writing public key to %q: %v", pubFile, err) } } c.signerPublicKeyRef = br c.publicKeyArmored = armored }
func (c *initCmd) RunCommand(args []string) error { if len(args) > 0 { return cmdmain.ErrUsage } if c.newKey && c.gpgkey != "" { log.Fatal("--newkey and --gpgkey are mutually exclusive") } blobDir := osutil.KeyBlobsDir() if err := os.MkdirAll(blobDir, 0700); err != nil { return err } var keyId string var err error secRing := osutil.IdentitySecretRing() if c.newKey { keyId, err = jsonsign.GenerateNewSecRing(secRing) if err != nil { return err } } else { keyId, err = c.keyId(secRing) if err != nil { return err } } pubArmor, err := c.getPublicKeyArmored(keyId) if err != nil { return err } bref := blob.SHA1FromString(string(pubArmor)) keyBlobPath := path.Join(blobDir, bref.String()+".camli") if err = ioutil.WriteFile(keyBlobPath, pubArmor, 0644); err != nil { log.Fatalf("Error writing public key blob to %q: %v", keyBlobPath, err) } if ok, err := jsonsign.VerifyPublicKeyFile(keyBlobPath, keyId); !ok { log.Fatalf("Error verifying public key at %q: %v", keyBlobPath, err) } log.Printf("Your Camlistore identity (your GPG public key's blobref) is: %s", bref.String()) if c.noconfig { return nil } configFilePath := osutil.UserClientConfigPath() _, err = os.Stat(configFilePath) if err == nil { log.Fatalf("Config file %q already exists; quitting without touching it.", configFilePath) } if f, err := os.OpenFile(configFilePath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600); err == nil { defer f.Close() m := &clientconfig.Config{ Servers: map[string]*clientconfig.Server{ "localhost": { Server: "http://localhost:3179", IsDefault: true, Auth: "localhost", }, }, Identity: keyId, IgnoredFiles: []string{".DS_Store"}, } jsonBytes, err := json.MarshalIndent(m, "", " ") if err != nil { log.Fatalf("JSON serialization error: %v", err) } _, err = f.Write(jsonBytes) if err != nil { log.Fatalf("Error writing to %q: %v", configFilePath, err) } log.Printf("Wrote %q; modify as necessary.", configFilePath) } return nil }
func (c *initCmd) RunCommand(args []string) error { if len(args) > 0 { return cmdmain.ErrUsage } if c.newKey && c.gpgkey != "" { log.Fatal("--newkey and --gpgkey are mutually exclusive") } blobDir := osutil.KeyBlobsDir() if err := os.MkdirAll(blobDir, 0700); err != nil { return err } var keyId string var err error secRing := osutil.IdentitySecretRing() if c.newKey { keyId, err = jsonsign.GenerateNewSecRing(secRing) if err != nil { return err } } else { keyId, err = c.keyId(secRing) if err != nil { return err } } if os.Getenv("GPG_AGENT_INFO") == "" { log.Printf("No GPG_AGENT_INFO found in environment; you should setup gnupg-agent. camput might be annoying otherwise, if your private key is encrypted.") } pubArmor, err := c.getPublicKeyArmored(keyId) if err != nil { return err } bref := blob.SHA1FromString(string(pubArmor)) keyBlobPath := path.Join(blobDir, bref.String()+".camli") if err = ioutil.WriteFile(keyBlobPath, pubArmor, 0644); err != nil { log.Fatalf("Error writing public key blob to %q: %v", keyBlobPath, err) } if ok, err := jsonsign.VerifyPublicKeyFile(keyBlobPath, keyId); !ok { log.Fatalf("Error verifying public key at %q: %v", keyBlobPath, err) } log.Printf("Your Camlistore identity (your GPG public key's blobref) is: %s", bref.String()) if c.noconfig { return nil } configFilePath := osutil.UserClientConfigPath() _, err = os.Stat(configFilePath) if err == nil { log.Fatalf("Config file %q already exists; quitting without touching it.", configFilePath) } if f, err := os.OpenFile(configFilePath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600); err == nil { defer f.Close() m := make(map[string]interface{}) m["keyId"] = keyId // TODO(bradfitz): make this 'identity' to match server config? m["publicKeyBlobref"] = bref.String() // TODO(bradfitz): not used anymore? m["server"] = "http://localhost:3179/" m["selfPubKeyDir"] = blobDir m["auth"] = "localhost" m["ignoredFiles"] = []string{".DS_Store"} jsonBytes, err := json.MarshalIndent(m, "", " ") if err != nil { log.Fatalf("JSON serialization error: %v", err) } _, err = f.Write(jsonBytes) if err != nil { log.Fatalf("Error writing to %q: %v", configFilePath, err) } log.Printf("Wrote %q; modify as necessary.", configFilePath) } return nil }
func NewConfigDirFetcher() *DirFetcher { return NewSimpleDirectoryFetcher(osutil.KeyBlobsDir()) }