#include "url.h"
#include "mime.h"
#include "sendmail.h"
+#include "base64.h"
char *login_cookie;
const char *display;
};
+static const char nonce_base64_table[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-/*";
+
static const char *nonce(void) {
- static unsigned long count;
- char *s;
-
- byte_xasprintf(&s, "%lx%lx%lx",
- (unsigned long)time(0),
- (unsigned long)getpid(),
- count++);
- return s;
+ static uint32_t count;
+
+ struct ndata {
+ uint16_t count;
+ uint16_t pid;
+ uint32_t when;
+ } nd;
+
+ nd.count = count++;
+ nd.pid = (uint32_t)getpid();
+ nd.when = (uint32_t)time(0);
+ return generic_to_base64((void *)&nd, sizeof nd,
+ nonce_base64_table);
}
static int compare_entry(const void *a, const void *b) {
@if{@ne{@arg:directory@}{}@}{
<p class=directoryname>@navigate{@arg:directory@}{/<a
class=thisdirectory
- href="@url@?action=choose&directory=@urlquote{@fullname@}@&nonce=@nonce@">@basename@</a>}@:</p>
+ href="@url@?action=choose&directory=@urlquote{@fullname@}@&n=@nonce@">@basename@</a>}@:</p>
}@
@if{@isdirectories@}{
@choose{directories}{
<p class=directory>
<a class=directory
- href="@url@?action=choose&directory=@urlquote{@file@}@&nonce=@nonce@"
+ href="@url@?action=choose&directory=@urlquote{@file@}@&n=@nonce@"
title="@label:choose.directory@">
<img class=button
src="@image:directory@"
@choose{files}{
<p class=file>
@right{prefs}{<a class=imgprefs
- href="@url@?action=prefs&0_file=@urlquote{@resolve{@file@}@}@&nonce=@nonce@"
+ href="@url@?action=prefs&0_file=@urlquote{@resolve{@file@}@}@&n=@nonce@"
><img class=button
src="@image:edit@"
title="@label:choose.prefsverbose@"
alt="@label:choose.prefs@"></a>}@
<a class=file
- href="@url@?action=play&file=@urlquote{@file@}@&back=@urlquote{@thisurl@}@&nonce=@nonce@"
+ href="@url@?action=play&file=@urlquote{@file@}@&back=@urlquote{@thisurl@}@&n=@nonce@"
title="@label:choose.play@">@transform{@file@}{track}{display}@</a>
@if{@eq{@trackstate{@file@}@}{playing}@}{[<b>playing</b>]}@
@if{@eq{@trackstate{@file@}@}{queued}@}{[<b>queued</b>]}@
}@
<p class=allfiles>
@right{prefs}{<a class=imgprefs
- href="@url@?action=prefs&directory=@urlquote{@arg:directory@}@&nonce=@nonce@&back=@urlquote{@thisurl@}@"
+ href="@url@?action=prefs&directory=@urlquote{@arg:directory@}@&n=@nonce@&back=@urlquote{@thisurl@}@"
><img class=button
src="@image:edit@"
title="@label:choose.allprefsverbose@"
alt="@label:choose.allprefs@"></a>}@
- <a class=allfiles href="@url@?action=play&directory=@urlquote{@arg:directory@}@&nonce=@nonce@&back=@urlquote{@thisurl@}@">
+ <a class=allfiles href="@url@?action=play&directory=@urlquote{@arg:directory@}@&n=@nonce@&back=@urlquote{@thisurl@}@">
@label:choose.playall@
</a>
</p>
</table>
<p>This screen has two forms: <a
- href="@url@?action=choose&nonce=@nonce@">choose</a>, which give
+ href="@url@?action=choose&n=@nonce@">choose</a>, which give
you all the top-level directories at once, and <a
- href="@url@?action=choosealpha&nonce=@nonce@">choosealpha</a>,
+ href="@url@?action=choosealpha&n=@nonce@">choosealpha</a>,
which breaks them down by initial letter.</p>
<p>This screen will may not be available if you are not logged in
>@part{short}{album}@</span>}@</td>
<td class=title>@right{play}{<a class=file
title="@part{title}@"
- href="@url@?action=play&file=@urlquote{@file@}@&back=@urlquote{@thisurl@}@&nonce=@nonce@"
+ href="@url@?action=play&file=@urlquote{@file@}@&back=@urlquote{@thisurl@}@&n=@nonce@"
>@part{short}{title}@</a>}{<span class=file
title="@part{title}@"
>@part{short}{title}@</span>}@</td>
<td class=length>@length@</td>
@right{prefs}{
<td class=imgbutton><a class=imgbutton
- href="@url@?action=prefs&nonce=@nonce@&0_file=@urlquote{@file@}@"><img
+ href="@url@?action=prefs&n=@nonce@&0_file=@urlquote{@file@}@"><img
class=button src="@image:edit@"
title="@label:choose.prefsverbose@"
alt="@label:choose.prefs@"></a></td>
<!-- paused -->
<span class=button>
<a class=button
- href="@url@?action=resume&nonce=@nonce@&mgmt=true"
+ href="@url@?action=resume&n=@nonce@&mgmt=true"
title="@label:playing.resumeverbose@">@label:playing.pause@</a>
</a>
</span>
<!-- not paused -->
<span class=button>
<a class=button
- href="@url@?action=pause&nonce=@nonce@&mgmt=true"
+ href="@url@?action=pause&n=@nonce@&mgmt=true"
title="@label:playing.pauseverbose@">@label:playing.pause@</a>
</a>
</span>
<!-- random played enabled -->
<span class=button>
<a class=button
- href="@url@?action=random-disable&nonce=@nonce@&mgmt=true"
+ href="@url@?action=random-disable&n=@nonce@&mgmt=true"
title="@label:playing.randomdisableverbose@">@label:playing.random@</a>
</a>
</span>
<!-- random played disabled -->
<span class=button>
<a class=button
- href="@url@?action=random-enable&nonce=@nonce@&mgmt=true"
+ href="@url@?action=random-enable&n=@nonce@&mgmt=true"
title="@label:playing.randomenableverbose@">@label:playing.random@</a>
</a>
</span>
<!-- playing enabled -->
<span class=button>
<a class=button
- href="@url@?action=disable&nonce=@nonce@&mgmt=true"
+ href="@url@?action=disable&n=@nonce@&mgmt=true"
title="@label:playing.disableverbose@">@label:playing.playing@</a>
</a>
</span>
<!-- playing disabled -->
<span class=button>
<a class=button
- href="@url@?action=enable&nonce=@nonce@&mgmt=true"
+ href="@url@?action=enable&n=@nonce@&mgmt=true"
title="@label:playing.enableverbose@">@label:playing.playing@</a>
</a>
</span>
title="@part{title}@">@part{short}{title}@</span></td>
<td class=length>@length@</td>
<td class=imgbutton>@if{@scratchable@}{<a class=imgbutton
- href="@url@?action=scratch&nonce=@nonce@&id=@id@&mgmt=@arg:mgmt@"><img
+ href="@url@?action=scratch&n=@nonce@&id=@id@&mgmt=@arg:mgmt@"><img
class=button src="@image:scratch@"
title="@label:playing.scratchverbose@"
alt="@label:playing.scratch@"></a>}{<img
title="@part{title}@">@part{short}{title}@</span></td>
<td class=length>@length@</td>
<td class=imgbutton>@if{@removable@}{<a class=imgbutton
- href="@url@?action=remove&nonce=@nonce@&id=@id@&mgmt=@arg:mgmt@"><img
+ href="@url@?action=remove&n=@nonce@&id=@id@&mgmt=@arg:mgmt@"><img
class=button src="@image:scratch@"
title="@label:playing.removeverbose@"
alt="@label:playing.remove@"></a>}{<img
<!-- can move up -->
<td class=imgbutton>
<a class=imgbutton
- href="@url@?action=move&nonce=@nonce@&id=@id@&delta=2147483647&mgmt=true"><img
+ href="@url@?action=move&n=@nonce@&id=@id@&delta=2147483647&mgmt=true"><img
class=button src="@image:upall@"
title="@label:playing.upallverbose@"
alt="@label:playing.upall@"></a>
<td class=imgbutton>
<a class=imgbutton
- href="@url@?action=move&nonce=@nonce@&id=@id@&delta=1&mgmt=true"><img
+ href="@url@?action=move&n=@nonce@&id=@id@&delta=1&mgmt=true"><img
class=button src="@image:up@"
title="@label:playing.upverbose@" alt="@label:playing.up@"></a>
}@
<!-- can move down -->
<td class=imgbutton>
<a class=imgbutton
- href="@url@?action=move&nonce=@nonce@&id=@id@&delta=-2147483647&mgmt=true"><img
+ href="@url@?action=move&n=@nonce@&id=@id@&delta=-2147483647&mgmt=true"><img
class=button src="@image:downall@"
title="@label:playing.downallverbose@"
alt="@label:playing.downall@"></a>
<td class=imgbutton>
<a class=imgbutton
- href="@url@?action=move&nonce=@nonce@&id=@id@&delta=-1&mgmt=true"><img
+ href="@url@?action=move&n=@nonce@&id=@id@&delta=-1&mgmt=true"><img
class=button src="@image:down@"
title="@label:playing.downverbose@" alt="@label:playing.down@"></a>
}@
<td class=length>@length@</td>
@right{prefs}{
<td class=imgbutton><a class=imgbutton
- href="@url@?action=prefs&nonce=@nonce@&0_file=@urlquote{@file@}@"><img
+ href="@url@?action=prefs&n=@nonce@&0_file=@urlquote{@file@}@"><img
class=button src="@image:edit@"
title="@label:choose.prefsverbose@"
alt="@label:choose.prefs@"></a></td>
@search{title}{
<div class="search_title">
<p class="search_title">Title:
- <a href="@url@?action=play&file=@urlquote{@file@}@&back=@urlquote{@thisurl@}@&nonce=@nonce@">@part:title@</a>
+ <a href="@url@?action=play&file=@urlquote{@file@}@&back=@urlquote{@thisurl@}@&n=@nonce@">@part:title@</a>
@if{@eq{@trackstate{@file@}@}{playing}@}{[<b>playing</b>]}@
@if{@eq{@trackstate{@file@}@}{queued}@}{[<b>queued</b>]}@
</p>
href="@url@"
title="@label:sidebar.playingverbose@">@label:sidebar.playing@</a>
<a class=@if{@eq{@action@}{recent}@}{activemenu}{inactivemenu}@
- href="@url@?action=recent&nonce=@nonce@"
+ href="@url@?action=recent&n=@nonce@"
title="@label:sidebar.recentverbose@">@label:sidebar.recent@</a>
<a class=@if{@eq{@action@}{new}@}{activemenu}{inactivemenu}@
- href="@url@?action=new&nonce=@nonce@"
+ href="@url@?action=new&n=@nonce@"
title="@label:sidebar.newverbose@">@label:sidebar.new@</a>
@right{play}{
<a class=@if{@or{@eq{@action@}{choose}@}
{@eq{@action@}{choosealpha}@}@}
{activemenu}
{inactivemenu}@
- href="@url@?action=@label:sidebar.choosewhich@&nonce=@nonce@"
+ href="@url@?action=@label:sidebar.choosewhich@&n=@nonce@"
title="@label:sidebar.chooseverbose@">@label:sidebar.choose@</a>}{
<span class=invalidmenu
title="@label:sidebar.chooseverbose@">@label:sidebar.choose@</span>}@
@right{play}{
<a class=@if{@eq{@action@}{search}@}{activemenu}{inactivemenu}@
- href="@url@?action=search&nonce=@nonce@"
+ href="@url@?action=search&n=@nonce@"
title="@label:sidebar.searchverbose@">@label:sidebar.search@</a>}{
<span class=invalidmenu
title="@label:sidebar.searchverbose@">@label:sidebar.search@</span>}@
<!-- disabled by default since now available from 'manage'
<a class=@if{@eq{@action@}{volume}@}{activemenu}{inactivemenu}@
- href="@url@?action=volume&nonce=@nonce@"
+ href="@url@?action=volume&n=@nonce@"
title="@label:sidebar.volumeverbose@">@label:sidebar.volume@</a>
-->
<a class=@if{@eq{@action@}{manage}@}{activemenu}{inactivemenu}@
{@eq{@action@}{register}@}
{@eq{@action@}{reminder}@}
{@eq{@action@}{edituser}@}@}{activemenu}{inactivemenu}@
- href="@url@?action=login&nonce=@nonce@"
+ href="@url@?action=login&n=@nonce@"
title="@label:sidebar.loginverbose@">@label:sidebar.login@</a>
<a class=@if{@eq{@action@}{help}@}{activemenu}{inactivemenu}@
- href="@url@?action=help&nonce=@nonce@"
+ href="@url@?action=help&n=@nonce@"
title="@label:sidebar.helpverbose@">@label:sidebar.help@</a>
<a class=@if{@eq{@action@}{about}@}{activemenu}{inactivemenu}@
- href="@url@?action=about&nonce=@nonce@"
+ href="@url@?action=about&n=@nonce@"
title="@label:sidebar.aboutverbose@">@label:sidebar.about@</a>
</p>
<hr>