Merge "identity: Fix displayed blessing name on add caveats page."
diff --git a/services/identity/identityd/main.go b/services/identity/identityd/main.go
index 1639b9d..1c57547 100644
--- a/services/identity/identityd/main.go
+++ b/services/identity/identityd/main.go
@@ -73,11 +73,6 @@
 		vlog.Fatalf("Failed to start RevocationManager: %v", err)
 	}
 
-	bname, _, err := util.RootCertificateDetails(v23.GetPrincipal(ctx).BlessingStore().Default())
-	if err != nil {
-		vlog.Fatalf("Failed to get root Blessings name: %v", err)
-	}
-
 	listenSpec := v23.GetListenSpec(ctx)
 	s := server.NewIdentityServer(
 		googleoauth,
@@ -85,7 +80,7 @@
 		reader,
 		revocationManager,
 		googleOAuthBlesserParams(googleoauth, revocationManager),
-		caveats.NewBrowserCaveatSelector(*assetsPrefix, bname),
+		caveats.NewBrowserCaveatSelector(*assetsPrefix),
 		&emailClassifier,
 		*assetsPrefix,
 		*mountPrefix)
diff --git a/services/identity/internal/caveats/browser_caveat_selector.go b/services/identity/internal/caveats/browser_caveat_selector.go
index 37e1079..cbb0400 100644
--- a/services/identity/internal/caveats/browser_caveat_selector.go
+++ b/services/identity/internal/caveats/browser_caveat_selector.go
@@ -17,19 +17,18 @@
 
 type browserCaveatSelector struct {
 	assetsPrefix string
-	blessingName string
 }
 
 // NewBrowserCaveatSelector returns a caveat selector that renders a form in the
 // to accept user caveat selections.
-func NewBrowserCaveatSelector(assetsPrefix, blessingName string) CaveatSelector {
-	return &browserCaveatSelector{assetsPrefix, blessingName}
+func NewBrowserCaveatSelector(assetsPrefix string) CaveatSelector {
+	return &browserCaveatSelector{assetsPrefix}
 }
 
-func (s *browserCaveatSelector) Render(blessingExtension, state, redirectURL string, w http.ResponseWriter, r *http.Request) error {
+func (s *browserCaveatSelector) Render(blessingName, state, redirectURL string, w http.ResponseWriter, r *http.Request) error {
 	tmplargs := struct {
-		Email, Macaroon, MacaroonURL, AssetsPrefix, BlessingName string
-	}{blessingExtension, state, redirectURL, s.assetsPrefix, s.blessingName}
+		BlessingName, Macaroon, MacaroonURL, AssetsPrefix string
+	}{blessingName, state, redirectURL, s.assetsPrefix}
 	w.Header().Set("Context-Type", "text/html")
 	if err := templates.SelectCaveats.Execute(w, tmplargs); err != nil {
 		return err
diff --git a/services/identity/internal/caveats/caveat_selector.go b/services/identity/internal/caveats/caveat_selector.go
index f0746b1..487c5a6 100644
--- a/services/identity/internal/caveats/caveat_selector.go
+++ b/services/identity/internal/caveats/caveat_selector.go
@@ -13,10 +13,10 @@
 type CaveatSelector interface {
 	// Render renders the caveat input form. When the user has completed inputing caveats,
 	// Render should redirect to the specified redirect route.
-	// blessingExtension is the extension used for the blessings that is being caveated.
+	// blessingName is the name used for the blessings that is being caveated.
 	// state is any state passed by the caller (e.g., for CSRF mitigation) and is returned by ParseSelections.
 	// redirectRoute is the route to be returned to.
-	Render(blessingExtension, state, redirectURL string, w http.ResponseWriter, r *http.Request) error
+	Render(blessingName, state, redirectURL string, w http.ResponseWriter, r *http.Request) error
 	// ParseSelections parse the users choices of Caveats, and returns the information needed to create them,
 	// the state passed to Render, and any additionalExtension selected by the user to further extend the blessing.
 	ParseSelections(r *http.Request) (caveats []CaveatInfo, state string, additionalExtension string, err error)
diff --git a/services/identity/internal/identityd_test/main.go b/services/identity/internal/identityd_test/main.go
index 77672a5..f7977de 100644
--- a/services/identity/internal/identityd_test/main.go
+++ b/services/identity/internal/identityd_test/main.go
@@ -78,11 +78,7 @@
 
 	caveatSelector := caveats.NewMockCaveatSelector()
 	if *browser {
-		bname, _, err := util.RootCertificateDetails(v23.GetPrincipal(ctx).BlessingStore().Default())
-		if err != nil {
-			vlog.Fatalf("Failed to get root Blessings name: %v", err)
-		}
-		caveatSelector = caveats.NewBrowserCaveatSelector(*assetsPrefix, bname)
+		caveatSelector = caveats.NewBrowserCaveatSelector(*assetsPrefix)
 	}
 
 	listenSpec := v23.GetListenSpec(ctx)
diff --git a/services/identity/internal/oauth/handler.go b/services/identity/internal/oauth/handler.go
index fcb6c41..c2de6ab 100644
--- a/services/identity/internal/oauth/handler.go
+++ b/services/identity/internal/oauth/handler.go
@@ -381,7 +381,19 @@
 		util.HTTPServerError(w, fmt.Errorf("failed to create new token: %v", err))
 		return
 	}
-	if err := h.args.CaveatSelector.Render(email, outputMacaroon, redirectURL(h.args.Addr, sendMacaroonRoute), w, r); err != nil {
+	localBlessings := security.DefaultBlessingPatterns(h.args.Principal)
+	if len(localBlessings) == 0 {
+		vlog.Infof("server principal has no blessings: %v", h.args.Principal)
+		util.HTTPServerError(w, fmt.Errorf("failed to get server blessings"))
+		return
+	}
+	parts := []string{
+		string(localBlessings[0]),
+		h.args.EmailClassifier.Classify(email),
+		email,
+	}
+	fullBlessingName := strings.Join(parts, security.ChainSeparator)
+	if err := h.args.CaveatSelector.Render(fullBlessingName, outputMacaroon, redirectURL(h.args.Addr, sendMacaroonRoute), w, r); err != nil {
 		vlog.Errorf("Unable to invoke render caveat selector: %v", err)
 		util.HTTPServerError(w, err)
 	}
diff --git a/services/identity/internal/templates/caveats.go b/services/identity/internal/templates/caveats.go
index d5b8e3b..eef93ad 100644
--- a/services/identity/internal/templates/caveats.go
+++ b/services/identity/internal/templates/caveats.go
@@ -25,7 +25,7 @@
       <span class="service-name">Identity Provider</span>
     </nav>
     <nav class="right">
-      <a href="#">{{.Email}}</a>
+      <a href="#">{{.BlessingName}}</a>
     </nav>
   </header>
 
@@ -59,7 +59,7 @@
 
       <label for="blessingExtension">Blessing name</label>
       <div class="value">
-        {{.BlessingName}}/{{.Email}}/
+        {{.BlessingName}}/
         <input name="blessingExtension" type="text" placeholder="extension">
         <input type="hidden" id="timezoneOffset" name="timezoneOffset">
       </div>