github.com/argoproj/argo-cd/v3@v3.2.1/util/oidc/templates.go (about)

     1  package oidc
     2  
     3  import (
     4  	"errors"
     5  	"html/template"
     6  	"log"
     7  	"net/http"
     8  	"reflect"
     9  )
    10  
    11  type tokenTmplData struct {
    12  	IDToken      string
    13  	RefreshToken string
    14  	RedirectURL  string
    15  	Claims       string
    16  }
    17  
    18  var tokenTmpl = template.Must(template.New("token.html").Parse(`<html>
    19    <head>
    20      <style>
    21  /* make pre wrap */
    22  pre {
    23   white-space: pre-wrap;       /* css-3 */
    24   white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
    25   white-space: -pre-wrap;      /* Opera 4-6 */
    26   white-space: -o-pre-wrap;    /* Opera 7 */
    27   word-wrap: break-word;       /* Internet Explorer 5.5+ */
    28  }
    29      </style>
    30    </head>
    31    <body>
    32      <p> Token: <pre><code>{{ .IDToken }}</code></pre></p>
    33      <p> Claims: <pre><code>{{ .Claims }}</code></pre></p>
    34  	{{ if .RefreshToken }}
    35      <p> Refresh Token: <pre><code>{{ .RefreshToken }}</code></pre></p>
    36  	<form action="{{ .RedirectURL }}" method="post">
    37  	  <input type="hidden" name="refresh_token" value="{{ .RefreshToken }}">
    38  	  <input type="submit" value="Redeem refresh token">
    39      </form>
    40  	{{ end }}
    41    </body>
    42  </html>
    43  `))
    44  
    45  func renderToken(w http.ResponseWriter, redirectURL, idToken, refreshToken string, claims []byte) {
    46  	renderTemplate(w, tokenTmpl, tokenTmplData{
    47  		IDToken:      idToken,
    48  		RefreshToken: refreshToken,
    49  		RedirectURL:  redirectURL,
    50  		Claims:       string(claims),
    51  	})
    52  }
    53  
    54  func renderTemplate(w http.ResponseWriter, tmpl *template.Template, data any) {
    55  	err := tmpl.Execute(w, data)
    56  	if err == nil {
    57  		return
    58  	}
    59  
    60  	var templateErr *template.Error
    61  	switch {
    62  	case errors.As(err, &templateErr):
    63  		// An ExecError guarantees that Execute has not written to the underlying reader.
    64  		log.Printf("Error rendering template %s: %s", tmpl.Name(), reflect.TypeOf(err))
    65  
    66  		// TODO(ericchiang): replace with better internal server error.
    67  		http.Error(w, "Internal server error", http.StatusInternalServerError)
    68  	default:
    69  		// An error with the underlying write, such as the connection being
    70  		// dropped. Ignore for now.
    71  	}
    72  }