Package uses listener authentication mechanism to provide handy interface for collecting detailed connection data and performing following actions with listeners:
- Accept connection
- Accept & move listener to another mounpoint
- Decline connection
- Require credentials
- Redirect to given url
To start run npm install icecast-auth
command, configure icecast to enable listener authentication and create executable file with following content. It will log listener's information & accept connections:
#!/usr/bin/nodejs
var fs = require('fs');
var AuthHandler = require('icecast-auth');
var handler = new AuthHandler();
handler.on('connection', function(data) {
// Log data somewhere
fs.appendFileSync('/tmp/icecast-auth.log', JSON.stringify(data, null, ' '));
// Accept connection
handler.accept();
});
Is emitted when data parsing is finished (received empty line from icecast). Provides following parameters:
Parameter | Type | Description |
---|---|---|
mountpoint |
String | Requested mount name |
user |
String | Basic HTTP auth provided username |
pass |
String | Basic HTTP auth povided password |
ip |
String | Listener's ip address |
agent |
String | Listener's user agent |
referer |
String | Url, where listener came from |
Accepts listener connection. Allows to specify mount, where user should be moved instead of requested one (icecast internal redirect will be used, HTTP redirect is not performed in this case).
Parameter | Type | Required | Description |
---|---|---|---|
mount |
String | No | Mount, where user should be moved |
// Accept user to requested mount
handler.on('connection', function(data) {
handler.accept();
});
// Accept user to another mount
handler.on('connection', function(data) {
handler.accept('/other-mount');
});
Requires listener to perform basic HTTP authentication (401 HTTP request).
// Only users with "user" login and "secret" password will be allowed to stream
handler.on('connection', function(data) {
if (data.user !== 'user' && password !== 'secret') {
handler.requireCredentials();
} else {
handler.accept();
}
});
Performs HTTP redirect to specified url.
Parameter | Type | Required | Description |
---|---|---|---|
url |
String | Yes | Url, where listener should be redirected |
handler.on('connection', function(data) {
handler.redirect('http://example.com/');
});
Declines listener with 403 HTTP code. Custom message can be specified.
Parameter | Type | Required | Description |
---|---|---|---|
message |
String | No | Message, that will be sent to user, defaults to Forbidden |
handler.on('connection', function(data) {
handler.decline('You shall not pass!');
});
To enable icecast listener command-script authentication it is necessary to add following code in mount
section for required mounts in your icecast configuration file:
<authentication type="command">
<option name="listener_add" value="/path/to/your/script.js"/>
<option name="handlers" value="1"/>
</authentication>
It is also possible to add authentication handler using wildcards, but there is a trick: by default icecast executes authentication handler for all requests. To use authentication handler only for mountpoints use following snippet:
<mount>
<mount-name>/*.xml</mount-name>
</mount>
<mount>
<mount-name>/*.xsl</mount-name>
</mount>
<mount>
<mount-name>/*.html</mount-name>
</mount>
<mount>
<mount-name>/*.css</mount-name>
</mount>
<mount>
<mount-name>/*.jpg</mount-name>
</mount>
<mount>
<mount-name>/*.png</mount-name>
</mount>
<mount>
<mount-name>/*.ico</mount-name>
</mount>
<mount>
<mount-name>/*.m3u</mount-name>
</mount>
<mount>
<mount-name>/*</mount-name>
<authentication type="command">
<option name="listener_add" value="/path/to/your/script.js"/>
<option name="handlers" value="1"/>
</authentication>
</mount>