You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by jc...@apache.org on 2010/06/24 06:04:32 UTC
svn commit: r957407 - in /couchdb/trunk: share/Makefile.am
share/www/script/futon.js share/www/session.html share/www/style/layout.css
src/couchdb/couch_httpd.erl
Author: jchris
Date: Thu Jun 24 04:04:31 2010
New Revision: 957407
URL: http://svn.apache.org/viewvc?rev=957407&view=rev
Log:
send browsers to /_utils/session.html when they need to log in
Added:
couchdb/trunk/share/www/session.html
Modified:
couchdb/trunk/share/Makefile.am
couchdb/trunk/share/www/script/futon.js
couchdb/trunk/share/www/style/layout.css
couchdb/trunk/src/couchdb/couch_httpd.erl
Modified: couchdb/trunk/share/Makefile.am
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/Makefile.am?rev=957407&r1=957406&r2=957407&view=diff
==============================================================================
--- couchdb/trunk/share/Makefile.am (original)
+++ couchdb/trunk/share/Makefile.am Thu Jun 24 04:04:31 2010
@@ -42,6 +42,7 @@ nobase_dist_localdata_DATA = \
www/couch_tests.html \
www/custom_test.html \
www/database.html \
+ www/session.html \
www/dialog/_admin_party.html \
www/dialog/_compact_cleanup.html \
www/dialog/_create_admin.html \
Modified: couchdb/trunk/share/www/script/futon.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/futon.js?rev=957407&r1=957406&r2=957407&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/futon.js (original)
+++ couchdb/trunk/share/www/script/futon.js Thu Jun 24 04:04:31 2010
@@ -10,6 +10,18 @@
// License for the specific language governing permissions and limitations under
// the License.
+// $$ inspired by @wycats: http://yehudakatz.com/2009/04/20/evented-programming-with-jquery/
+function $$(node) {
+ var data = $(node).data("$$");
+ if (data) {
+ return data;
+ } else {
+ data = {};
+ $(node).data("$$", data);
+ return data;
+ }
+};
+
(function($) {
function Session() {
@@ -126,6 +138,7 @@
$.couch.session({
success : function(r) {
var userCtx = r.userCtx;
+ $$("#userCtx").userCtx = userCtx;
if (userCtx.name) {
$("#userCtx .name").text(userCtx.name).attr({href : "/_utils/document.html?"+encodeURIComponent(r.info.authentication_db)+"/org.couchdb.user%3A"+encodeURIComponent(userCtx.name)});
if (userCtx.roles.indexOf("_admin") != -1) {
Added: couchdb/trunk/share/www/session.html
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/session.html?rev=957407&view=auto
==============================================================================
--- couchdb/trunk/share/www/session.html (added)
+++ couchdb/trunk/share/www/session.html Thu Jun 24 04:04:31 2010
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<!--
+
+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.
+
+-->
+<html lang="en">
+ <head>
+ <title>Session</title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+ <link rel="stylesheet" href="style/layout.css?0.11.0" type="text/css">
+ <script src="script/json2.js"></script>
+ <script src="script/sha1.js"></script>
+ <script src="script/jquery.js?1.4.2"></script>
+ <script src="script/jquery.couch.js?0.11.0"></script>
+ <script src="script/jquery.dialog.js?0.11.0"></script>
+ <script src="script/futon.js?0.11.0"></script>
+ <script src="script/futon.browse.js?0.11.0"></script>
+ <script src="script/futon.format.js?0.11.0"></script>
+ <script>
+ $(function() {
+ var ret, reason, q = window.location.search, qps = q.split("&");
+ $.map(qps, function(qp) {
+ var m = qp.match(/return=(.*)/);
+ if (m) {
+ ret = decodeURIComponent(m[1]);
+ }
+ m = qp.match(/reason=(.*)/);
+ if (m) {
+ reason = decodeURIComponent(m[1]);
+ }
+ });
+ if (reason) {
+ $("#aboutSession").append('<p>The application says: <em>'+reason+'</em></p>');
+ }
+ if (ret) {
+ $("#aboutSession").append($('<p>Once you are logged in, click this link to return to your application: </p>').append($("<a></a>").attr("href", ret).text(ret)));
+ // todo this needs to look different if you are already logged in
+ // a note about you are logged in but you can't access this
+ }
+ // do the sidebar but in the middle without the sidebar
+ $.futon.storage.set("sidebar", "hidden");
+ setTimeout(function() {
+ var ctx = $$("#userCtx").userCtx;
+ $.futon.storage.set("sidebar", "show");
+ if (ctx && ctx.name) {
+ $("#aboutSession").append("<p>It looks like you are logged in, maybe you don't have access to that url.</p>");
+ }
+ },100);
+ });
+ </script>
+ </head>
+ <body>
+ <div id="wrap">
+ <h1><a href="index.html">Overview</a>
+ <strong>Session</strong></h1>
+ <div id="content">
+ <h2>Establish or Modify Your Session</h2>
+ <div id="loginSignup">
+ <div id="aboutSession"></div>
+ <span id="userCtx">
+ <span class="loggedout">
+ <a href="#" class="signup">Signup</a> or <a href="#" class="login">Login</a>
+ </span>
+ <span class="loggedin">
+ Welcome <a class="name">?</a>!
+ <br/>
+ <a href="#" class="logout">Logout</a>
+ </span>
+ <span class="loggedinadmin">
+ Welcome <a class="name">?</a>!
+ <br/>
+ <a href="#" class="createadmin">Setup more admins</a> or
+ <a href="#" class="logout">Logout</a>
+ </span>
+ <span class="adminparty">
+ Welcome to Admin Party!
+ <br/>
+ Everyone is admin. <a href="#" class="createadmin">Fix this</a>
+ </span>
+ </span>
+ </div>
+ </div>
+
+ </div>
+ </body>
+</html>
Modified: couchdb/trunk/share/www/style/layout.css
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/style/layout.css?rev=957407&r1=957406&r2=957407&view=diff
==============================================================================
--- couchdb/trunk/share/www/style/layout.css (original)
+++ couchdb/trunk/share/www/style/layout.css Thu Jun 24 04:04:31 2010
@@ -603,3 +603,9 @@ form#replicator p.actions { padding: 1px
font-family: "DejaVu Sans Mono",Menlo,Courier,monospace;
font-size: 11px;
}
+
+
+/* Session */
+#loginSignup {
+ font-size:200%;
+}
\ No newline at end of file
Modified: couchdb/trunk/src/couchdb/couch_httpd.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd.erl?rev=957407&r1=957406&r2=957407&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd.erl Thu Jun 24 04:04:31 2010
@@ -686,28 +686,46 @@ error_info({Error, Reason}) ->
error_info(Error) ->
{500, <<"unknown_error">>, couch_util:to_binary(Error)}.
-send_error(_Req, {already_sent, Resp, _Error}) ->
- {ok, Resp};
-
-send_error(#httpd{mochi_req=MochiReq}=Req, Error) ->
- {Code, ErrorStr, ReasonStr} = error_info(Error),
- Headers = if Code == 401 ->
+error_headers(#httpd{mochi_req=MochiReq}=Req, Code, ErrorStr, ReasonStr) ->
+ if Code == 401 ->
% this is where the basic auth popup is triggered
case MochiReq:get_header_value("X-CouchDB-WWW-Authenticate") of
undefined ->
case couch_config:get("httpd", "WWW-Authenticate", nil) of
nil ->
- [];
+ % If the client is a browser and the basic auth popup isn't turned on
+ % redirect to the session page.
+ case ErrorStr of
+ <<"unauthorized">> ->
+ % if the accept header matches html, then do the redirect. else proceed as usual.
+ case re:run(MochiReq:get_header_value("Accept"), "html", [{capture, none}]) of
+ nomatch ->
+ {Code, []};
+ match ->
+ UrlReturn = ?l2b(couch_util:url_encode(MochiReq:get(path))),
+ UrlReason = ?l2b(couch_util:url_encode(ReasonStr)),
+ {302, [{"Location", couch_httpd:absolute_uri(Req, <<"/_utils/session.html?return=",UrlReturn/binary,"&reason=",UrlReason/binary>>)}]}
+ end;
+ _Else ->
+ {Code, []}
+ end;
Type ->
- [{"WWW-Authenticate", Type}]
+ {Code, [{"WWW-Authenticate", Type}]}
end;
Type ->
- [{"WWW-Authenticate", Type}]
+ {Code, [{"WWW-Authenticate", Type}]}
end;
true ->
- []
- end,
- send_error(Req, Code, Headers, ErrorStr, ReasonStr).
+ {Code, []}
+ end.
+
+send_error(_Req, {already_sent, Resp, _Error}) ->
+ {ok, Resp};
+
+send_error(Req, Error) ->
+ {Code, ErrorStr, ReasonStr} = error_info(Error),
+ {Code1, Headers} = error_headers(Req, Code, ErrorStr, ReasonStr),
+ send_error(Req, Code1, Headers, ErrorStr, ReasonStr).
send_error(Req, Code, ErrorStr, ReasonStr) ->
send_error(Req, Code, [], ErrorStr, ReasonStr).