2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-03 13:45:36 +00:00

Optional evaluation of portpassword and basicauth:

Now we can use the fritzbox builtin password


git-svn-id: https://svn.fhem.de/fhem/trunk@1635 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2012-06-20 22:59:18 +00:00
parent e6b50f4a43
commit f0e8a2b509
7 changed files with 102 additions and 10 deletions

View File

@ -47,6 +47,7 @@
- feature: time and internet helper routines added to fhem.pl (Boris) - feature: time and internet helper routines added to fhem.pl (Boris)
- change: separating common functions used by the FHEM modules into - change: separating common functions used by the FHEM modules into
*Utils.pm files from fhem.pl *Utils.pm files from fhem.pl
- feature: portpassword and basicAuth may use evaluated functions
- 2011-12-31 (5.2) - 2011-12-31 (5.2)
- bugfix: applying smallscreen attributes to firefox/opera - bugfix: applying smallscreen attributes to firefox/opera

View File

@ -0,0 +1,49 @@
##############################################
# $Id: FritzBoxUtils.pm 1148 2011-12-28 19:21:19Z rudolfkoenig $
package main;
use strict;
use warnings;
use Digest::MD5 "md5_hex";
use HttpUtils;
my ($lastOkPw, $lastOkTime) =("", 0);
sub
FB_getPage($$$)
{
my ($host, $pw, $page) = @_;
my $data = GetFileFromURL("http://$host".
"/cgi-bin/webcm?getpage=../html/login_sid.xml", undef, undef, 1);
return undef if(!$data);
my $chl;
$chl = $1 if($data =~ /<Challenge>(\w+)<\/Challenge>/i);
my $chlAnsw .= "$chl-$pw";
$chlAnsw =~ s/(.)/$1.chr(0)/eg; # works probably only with ascii
$chlAnsw = "$chl-".lc(md5_hex($chlAnsw));
my @d = ( "login:command/response=$chlAnsw", "getpage=$page" );
$data = join("&", map {join("=", map {urlEncode($_)} split("=",$_,2))} @d);
return GetFileFromURL("http://$host/cgi-bin/webcm", undef, $data, 1);
}
sub
FB_checkPw($$)
{
my ($host, $pw) = @_;
my $now = time();
return 1 if($lastOkPw eq $pw && ($now - $lastOkTime) < 300); # 5min cache
my $data = FB_getPage($host, $pw, "../html/de/internet/connect_status.txt");
if(defined($data) && $data =~ m/"checkStatus":/) {
$lastOkPw = $pw; $lastOkTime = $now;
return 1;
} else {
return 0;
}
}
1;

View File

@ -22,7 +22,7 @@ sub
GetFileFromURL($@) GetFileFromURL($@)
{ {
my ($url, $timeout, $data, $noshutdown) = @_; my ($url, $timeout, $data, $noshutdown) = @_;
$timeout = 2.0 if(!defined($timeout)); $timeout = 4.0 if(!defined($timeout));
if($url !~ /^(http):\/\/([^:\/]+)(:\d+)?(\/.*)$/) { if($url !~ /^(http):\/\/([^:\/]+)(:\d+)?(\/.*)$/) {
Log 1, "GetFileFromURL $url: malformed URL"; Log 1, "GetFileFromURL $url: malformed URL";

View File

@ -1,4 +1,8 @@
FHEM: FHEM:
- FHEMWEB warning
- finish updatefhem
- autoload commands -> rename updatefhem, CULflash, etc
- FHEM2FHEM reconnect - FHEM2FHEM reconnect
- HomeMatic set log 2 - HomeMatic set log 2
- implement wiki decisions - implement wiki decisions

View File

@ -1340,7 +1340,15 @@ A line ending with \ will be concatenated with the next one, so long lines
<a name="portpassword"></a> <a name="portpassword"></a>
<li>portpassword<br> <li>portpassword<br>
Specify a port password, which has to be entered as the very first Specify a port password, which has to be entered as the very first
string after the connection is established. string after the connection is established. If the argument is enclosed
in {}, then it will be evaluated, and the $password variable will be
set to the password entered. If the return value is true, then the
password will be accepted.
Example:<br>
<code>
attr global portpassword secret<br>
attr global portpassword {use FritzBoxUtils;;FB_checkPw("localhost","$password") }
</code>
</li><br> </li><br>
@ -8519,7 +8527,19 @@ KlikAanKlikUit, NEXA, CHACON, HomeEasy UK. <br> You need to define an RFXtrx433
</ul> </ul>
You can of course use other means of base64 encoding, e.g. online You can of course use other means of base64 encoding, e.g. online
Base64 encoders. If basicAuthMsg is set, it will be displayed in the Base64 encoders. If basicAuthMsg is set, it will be displayed in the
popup window when requesting the username/password. popup window when requesting the username/password.<br>
<br>
If the argument of basicAuth is enclosed in {}, then it will be
evaluated, and the $user and $password variable will be set to the
values entered. If the return value is true, then the password will be
accepted.
Example:<br>
<code>
attr WEB basicAuth { "$user:$password" eq "admin:secret" }<br>
attr WEB basicAuth {use FritzBoxUtils;;FB_checkPw("localhost","$password") }
</code>
</li><br> </li><br>
<a name="HTTPS"></a> <a name="HTTPS"></a>

View File

@ -652,7 +652,15 @@ AnalyzeInput($)
if($attr{global}{portpassword} && !$client{$c}{pwEntered}) { if($attr{global}{portpassword} && !$client{$c}{pwEntered}) {
syswrite($client{$c}{fd}, sprintf("%c%c%c\r\n", 255, 252, 1)); # WONT ECHO syswrite($client{$c}{fd}, sprintf("%c%c%c\r\n", 255, 252, 1)); # WONT ECHO
if($attr{global}{portpassword} eq $cmd) {
my $ret = ($attr{global}{portpassword} eq $cmd);
if($attr{global}{portpassword} =~ m/^{.*}$/) { # Expression as pw
my $password = $cmd;
$ret = eval $attr{global}{portpassword};
Log 1, "portpasswd expression: $@" if($@);
}
if($ret) {
$client{$c}{pwEntered} = 1; $client{$c}{pwEntered} = 1;
next; next;
} else { } else {

View File

@ -268,15 +268,27 @@ FW_Read($)
$hash->{BUF} .= $buf; $hash->{BUF} .= $buf;
return if($hash->{BUF} !~ m/\n\n$/ && $hash->{BUF} !~ m/\r\n\r\n$/); return if($hash->{BUF} !~ m/\n\n$/ && $hash->{BUF} !~ m/\r\n\r\n$/);
#Log 0, "Got: >$hash->{BUF}<";
@FW_httpheader = split("[\r\n]", $hash->{BUF}); @FW_httpheader = split("[\r\n]", $hash->{BUF});
############################# #############################
# BASIC HTTP AUTH # BASIC HTTP AUTH
my $basicAuth = AttrVal($FW_wname, "basicAuth", undef); my $basicAuth = AttrVal($FW_wname, "basicAuth", undef);
if($basicAuth) { if($basicAuth) {
my @auth = grep /^Authorization: Basic $basicAuth/, @FW_httpheader; $hash->{BUF} =~ m/^Authorization: Basic (.*)/m;
if(!@auth) { my $secret = $1;
my $pwok = ($secret && $secret eq $basicAuth);
if($secret && $basicAuth =~ m/^{.*}$/) {
eval "use MIME::Base64";
if($@) {
Log 1, $@;
} else {
my ($user, $password) = split(":", decode_base64($secret));
$pwok = eval $basicAuth;
Log 1, "basicAuth expression: $@" if($@);
}
}
if(!$pwok) {
my $msg = AttrVal($FW_wname, "basicAuthMsg", "Fhem: login required"); my $msg = AttrVal($FW_wname, "basicAuthMsg", "Fhem: login required");
print $c "HTTP/1.1 401 Authorization Required\r\n", print $c "HTTP/1.1 401 Authorization Required\r\n",
"WWW-Authenticate: Basic realm=\"$msg\"\r\n", "WWW-Authenticate: Basic realm=\"$msg\"\r\n",
@ -628,7 +640,6 @@ FW_makeTable($$@)
next if($r && ($r ne "HASH" || !defined($hash->{$n}{VAL}))); next if($r && ($r ne "HASH" || !defined($hash->{$n}{VAL})));
pF "<tr class=\"%s\">", ($row&1)?"odd":"even"; pF "<tr class=\"%s\">", ($row&1)?"odd":"even";
$row++; $row++;
my $val = $hash->{$n}; my $val = $hash->{$n};
if($n eq "DEF" && !$FW_hiddenroom{input}) { if($n eq "DEF" && !$FW_hiddenroom{input}) {
@ -1542,8 +1553,7 @@ FW_style($$)
my @fl = ("fhem.cfg"); my @fl = ("fhem.cfg");
push(@fl, ""); push(@fl, "");
#push(@fl, FW_fileList("$FW_dir/.*(sh|Util.*|cfg|holiday)")); push(@fl, FW_fileList("$MW_dir/.*(sh|[0-9].*Util.*|cfg|holiday)"));
push(@fl, FW_fileList("$MW_dir/.*(sh|Util.*|cfg|holiday)"));
push(@fl, ""); push(@fl, "");
push(@fl, FW_fileList("$FW_dir/.*.(css|svg)")); push(@fl, FW_fileList("$FW_dir/.*.(css|svg)"));
push(@fl, ""); push(@fl, "");