2011-01-28 07:07:18 +00:00
/ *
Copyright 2011 Google Inc .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
2011-01-18 02:28:38 +00:00
package main
import (
"crypto/sha1"
"exec"
"flag"
"os"
"io/ioutil"
"path"
"json"
"log"
2011-04-02 05:26:33 +00:00
"camli/blobref"
"camli/client"
"camli/jsonsign"
"camli/osutil"
2011-01-18 02:28:38 +00:00
)
var flagGpgKey = flag . String ( "gpgkey" , "" , "(init option only) GPG key to use for signing." )
func doInit ( ) {
2011-04-02 05:26:33 +00:00
blobDir := path . Join ( osutil . CamliConfigDir ( ) , "keyblobs" )
os . Mkdir ( osutil . CamliConfigDir ( ) , 0700 )
2011-01-18 02:28:38 +00:00
os . Mkdir ( blobDir , 0700 )
keyId := * flagGpgKey
if keyId == "" {
keyId = os . Getenv ( "GPGKEY" )
}
if keyId == "" {
// TODO: run and parse gpg --list-secret-keys and see if there's just one and suggest that? Or show
// a list of them?
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Initialization requires your public GPG key. Set --gpgkey=<pubid> or set $GPGKEY in your environment. Run gpg --list-secret-keys to find their key IDs." )
2011-01-18 02:28:38 +00:00
}
if os . Getenv ( "GPG_AGENT_INFO" ) == "" {
log . Printf ( "No GPG_AGENT_INFO found in environment; you should setup gnupg-agent. camput will be annoying otherwise." )
}
// TODO: use same command-line flag as the jsonsign package.
// unify them into a shared package just for gpg-related stuff?
gpgBinary , err := exec . LookPath ( "gpg" )
if err != nil {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Failed to find gpg binary in your path." )
2011-01-18 02:28:38 +00:00
}
cmd , err := exec . Run ( gpgBinary ,
[ ] string { "gpg" , "--export" , "--armor" , keyId } ,
os . Environ ( ) ,
"/" ,
exec . DevNull ,
exec . Pipe ,
exec . DevNull )
if err != nil {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Error running gpg to export public key: %v" , err )
2011-01-18 02:28:38 +00:00
}
keyBytes , err := ioutil . ReadAll ( cmd . Stdout )
if err != nil {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Error read from gpg to export public key: %v" , err )
2011-01-18 02:28:38 +00:00
}
hash := sha1 . New ( )
hash . Write ( keyBytes )
bref := blobref . FromHash ( "sha1" , hash )
keyBlobPath := path . Join ( blobDir , bref . String ( ) + ".camli" )
if err = ioutil . WriteFile ( keyBlobPath , keyBytes , 0644 ) ; err != nil {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Error writing public key blob to %q: %v" , keyBlobPath , err )
2011-01-18 02:28:38 +00:00
}
if ok , err := jsonsign . VerifyPublicKeyFile ( keyBlobPath , keyId ) ; ! ok {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Error verifying public key at %q: %v" , keyBlobPath , err )
2011-01-18 02:28:38 +00:00
}
log . Printf ( "Your Camlistore identity (your GPG public key's blobref) is: %s" , bref . String ( ) )
_ , err = os . Stat ( client . ConfigFilePath ( ) )
if err == nil {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Config file %q already exists; quitting without touching it." , client . ConfigFilePath ( ) )
2011-01-18 02:28:38 +00:00
}
2011-04-07 17:58:29 +00:00
if f , err := os . OpenFile ( client . ConfigFilePath ( ) , os . O_CREATE | os . O_EXCL | os . O_WRONLY , 0600 ) ; err == nil {
2011-01-18 02:28:38 +00:00
defer f . Close ( )
m := make ( map [ string ] interface { } )
m [ "publicKeyBlobref" ] = bref . String ( )
2011-01-18 18:29:38 +00:00
blobPut := make ( [ ] map [ string ] string , 1 )
blobPut [ 0 ] = map [ string ] string {
"alias" : "local" ,
"host" : "http://localhost:3179/" ,
"password" : "test" ,
}
m [ "blobPut" ] = blobPut
blobGet := make ( [ ] map [ string ] string , 2 )
blobGet [ 0 ] = map [ string ] string {
"alias" : "keyblobs" ,
"path" : "$HOME/.camli/keyblobs" ,
}
blobGet [ 1 ] = map [ string ] string {
"alias" : "local" ,
"host" : "http://localhost:3179/" ,
"password" : "test" ,
}
m [ "blobGet" ] = blobGet
2011-01-18 02:28:38 +00:00
jsonBytes , err := json . MarshalIndent ( m , "" , " " )
if err != nil {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "JSON serialization error: %v" , err )
2011-01-18 02:28:38 +00:00
}
_ , err = f . Write ( jsonBytes )
if err != nil {
2011-02-02 20:27:30 +00:00
log . Fatalf ( "Error writing to %q: %v" , client . ConfigFilePath ( ) , err )
2011-01-18 02:28:38 +00:00
}
log . Printf ( "Wrote %q; modify as necessary." , client . ConfigFilePath ( ) )
}
2011-02-02 20:27:30 +00:00
}