TOTP authentication with the TOTP module
I am trying a simple TOTP authentication with the TOTP module. The idea is that the user only has to enter the OTP via Radius and is authenticated. Freeradius starts but the authentication does not work. See below config and output. Thanks itdeb ############################################################################ #clients.conf File client pc1 { ipaddr = 192.168.65.161 secret = testing12345 } #users File bw TOTP-Secret := "JBSWY3DPEHPK3PXP" #default File Auth-Type CHAP { totp } #totp File totp { time_step = 30 otp_length = 6 lookback_steps = 1 lookback_interval = 30 } ############################################################################ ############################################################################ Ready to process requests (0) Received Access-Request Id 23 from 192.168.65.161:60716 to 192.168.65.160:1812 length 72 (0) NAS-Identifier = "vncserver" (0) User-Name = "bw" (0) CHAP-Password = 0x00549ccaa7d52c08fd1655bce475bdd1d9 (0) Message-Authenticator = 0x30156802c7f5b5504b3d1fdd42943c0b (0) # Executing section authorize from file /etc/freeradius/3.0/sites-enabled/default (0) authorize { (0) policy filter_username { (0) if (&User-Name) { (0) if (&User-Name) -> TRUE (0) if (&User-Name) { (0) if (&User-Name =~ / /) { (0) if (&User-Name =~ / /) -> FALSE (0) if (&User-Name =~ /@[^@]*@/ ) { (0) if (&User-Name =~ /@[^@]*@/ ) -> FALSE (0) if (&User-Name =~ /\.\./ ) { (0) if (&User-Name =~ /\.\./ ) -> FALSE (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) { (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) -> FALSE (0) if (&User-Name =~ /\.$/) { (0) if (&User-Name =~ /\.$/) -> FALSE (0) if (&User-Name =~ /@\./) { (0) if (&User-Name =~ /@\./) -> FALSE (0) } # if (&User-Name) = notfound (0) } # policy filter_username = notfound (0) [preprocess] = ok (0) chap: &control:Auth-Type := CHAP (0) [chap] = ok (0) [mschap] = noop (0) [digest] = noop (0) suffix: Checking for suffix after "@" (0) suffix: No '@' in User-Name = "bw", looking up realm NULL (0) suffix: No such realm "NULL" (0) [suffix] = noop (0) eap: No EAP-Message, not doing EAP (0) [eap] = noop (0) files: users: Matched entry bw at line 1 (0) [files] = ok (0) [expiration] = noop (0) [logintime] = noop Not doing PAP as Auth-Type is already set. (0) [pap] = noop (0) } # authorize = ok (0) Found Auth-Type = CHAP (0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default (0) Auth-Type CHAP { (0) [totp] = noop (0) } # Auth-Type CHAP = noop (0) Failed to authenticate the user (0) Using Post-Auth-Type Reject (0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default (0) Post-Auth-Type REJECT { (0) attr_filter.access_reject: EXPAND %{User-Name} (0) attr_filter.access_reject: --> bw (0) attr_filter.access_reject: Matched entry DEFAULT at line 11 (0) [attr_filter.access_reject] = updated (0) [eap] = noop (0) policy remove_reply_message_if_eap { (0) if (&reply:EAP-Message && &reply:Reply-Message) { (0) if (&reply:EAP-Message && &reply:Reply-Message) -> FALSE (0) else { (0) [noop] = noop (0) } # else = noop (0) } # policy remove_reply_message_if_eap = noop (0) } # Post-Auth-Type REJECT = updated (0) Delaying response for 1.000000 seconds Waking up in 0.3 seconds. Waking up in 0.6 seconds. (0) Sending delayed response (0) Sent Access-Reject Id 23 from 192.168.65.160:1812 to 192.168.65.161:60716 length 20 Waking up in 3.9 seconds. (0) Sending duplicate reply to client pc1 port 60716 - ID: 23 Waking up in 8.9 seconds. (0) Cleaning up request packet ID 23 with timestamp +34 due to cleanup_delay was reached Ready to process requests ############################################################################
On Mar 7, 2025, at 7:40 AM, IT DEB <itdebbw.p@gmail.com> wrote:
I am trying a simple TOTP authentication with the TOTP module. The idea is that the user only has to enter the OTP via Radius and is authenticated.
Freeradius starts but the authentication does not work. See below config and output.
#clients.conf File
Please don't post configuration files. The documentation makes it VERY clear that this isn't needed.
Ready to process requests (0) Received Access-Request Id 23 from 192.168.65.161:60716 to 192.168.65.160:1812 length 72 (0) NAS-Identifier = "vncserver" (0) User-Name = "bw" (0) CHAP-Password = 0x00549ccaa7d52c08fd1655bce475bdd1d9
You can't use CHAP with TOTP. It has to be used with PAP authentication. i.e. User-Password.
(0) Auth-Type CHAP { (0) [totp] = noop
Yup. I'll add an error message describing why it doesn't work. There isn't a lot of point in doing TOTP with CHAP. The TOTP is a one-time password, so "hiding" it inside of CHAP doesn't add any security. Alan DeKok.
Hi Alan Thanks. Sorry im absolutely new to freeradius. Now i changed in the config to Auth-Type PAP { totp } and reconfigured the vncserver to use PAP and now I got this error: Ready to process requests (0) Received Access-Request Id 83 from 192.168.65.161:58717 to 192.168.65.160:1812 length 71 (0) NAS-Identifier = "vncserver" (0) User-Name = "bw" (0) User-Password = "302427" (0) Message-Authenticator = 0xa8aeb49defe09e2a13087975576d4754 (0) # Executing section authorize from file /etc/freeradius/3.0/sites-enabled/default (0) authorize { (0) policy filter_username { (0) if (&User-Name) { (0) if (&User-Name) -> TRUE (0) if (&User-Name) { (0) if (&User-Name =~ / /) { (0) if (&User-Name =~ / /) -> FALSE (0) if (&User-Name =~ /@[^@]*@/ ) { (0) if (&User-Name =~ /@[^@]*@/ ) -> FALSE (0) if (&User-Name =~ /\.\./ ) { (0) if (&User-Name =~ /\.\./ ) -> FALSE (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) { (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) -> FALSE (0) if (&User-Name =~ /\.$/) { (0) if (&User-Name =~ /\.$/) -> FALSE (0) if (&User-Name =~ /@\./) { (0) if (&User-Name =~ /@\./) -> FALSE (0) } # if (&User-Name) = notfound (0) } # policy filter_username = notfound (0) [preprocess] = ok (0) [chap] = noop (0) [mschap] = noop (0) [digest] = noop (0) suffix: Checking for suffix after "@" (0) suffix: No '@' in User-Name = "bw", looking up realm NULL (0) suffix: No such realm "NULL" (0) [suffix] = noop (0) eap: No EAP-Message, not doing EAP (0) [eap] = noop (0) files: users: Matched entry bw at line 1 (0) [files] = ok (0) [expiration] = noop (0) [logintime] = noop (0) pap: WARNING: No "known good" password found for the user. Not setting Auth-Type (0) pap: WARNING: Authentication will fail unless a "known good" password is available (0) [pap] = noop (0) } # authorize = ok (0) ERROR: No Auth-Type found: rejecting the user via Post-Auth-Type = Reject (0) Failed to authenticate the user (0) Using Post-Auth-Type Reject (0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default (0) Post-Auth-Type REJECT { (0) attr_filter.access_reject: EXPAND %{User-Name} (0) attr_filter.access_reject: --> bw (0) attr_filter.access_reject: Matched entry DEFAULT at line 11 (0) [attr_filter.access_reject] = updated (0) [eap] = noop (0) policy remove_reply_message_if_eap { (0) if (&reply:EAP-Message && &reply:Reply-Message) { (0) if (&reply:EAP-Message && &reply:Reply-Message) -> FALSE (0) else { (0) [noop] = noop (0) } # else = noop (0) } # policy remove_reply_message_if_eap = noop (0) } # Post-Auth-Type REJECT = updated (0) Delaying response for 1.000000 seconds Waking up in 0.3 seconds. Waking up in 0.6 seconds. (0) Sending delayed response (0) Sent Access-Reject Id 83 from 192.168.65.160:1812 to 192.168.65.161:58717 length 20 Waking up in 3.9 seconds. (0) Sending duplicate reply to client pc1 port 58717 - ID: 83 Waking up in 8.9 seconds. (0) Cleaning up request packet ID 83 with timestamp +61 due to cleanup_delay was reached Am Fr., 7. März 2025 um 13:55 Uhr schrieb Alan DeKok < aland@deployingradius.com>:
On Mar 7, 2025, at 7:40 AM, IT DEB <itdebbw.p@gmail.com> wrote:
I am trying a simple TOTP authentication with the TOTP module. The idea is that the user only has to enter the OTP via Radius and is authenticated.
Freeradius starts but the authentication does not work. See below config and output.
#clients.conf File
Please don't post configuration files. The documentation makes it VERY clear that this isn't needed.
Ready to process requests (0) Received Access-Request Id 23 from 192.168.65.161:60716 to 192.168.65.160:1812 length 72 (0) NAS-Identifier = "vncserver" (0) User-Name = "bw" (0) CHAP-Password = 0x00549ccaa7d52c08fd1655bce475bdd1d9
You can't use CHAP with TOTP. It has to be used with PAP authentication. i.e. User-Password.
(0) Auth-Type CHAP { (0) [totp] = noop
Yup.
I'll add an error message describing why it doesn't work.
There isn't a lot of point in doing TOTP with CHAP. The TOTP is a one-time password, so "hiding" it inside of CHAP doesn't add any security.
Alan DeKok.
- List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
On Mar 11, 2025, at 8:56 AM, IT DEB <itdebbw.p@gmail.com> wrote:
Thanks. Sorry im absolutely new to freeradius.
That's fine.
Now i changed in the config to
Why? You can't make random changes to the configuration, and get them to do what you want. The PAP module checks passwords, and not TOTP. The PAP module sets "Auth-Type := PAP", and the default configuration has the PAP module running inside of "Auth-Type = PAP. You don't want to change the PAP module to use TOTP. You want to use TOTP *instead* of the PAP module. If all users are being authenticated using TOTP, you can just edit the "authorize" section, and add: update control { Auth-Type := TOTP } And then edit the "authentication" section, and add: Auth-Type TOTP { totp } It should then work. Alan DeKok.
Hi Alan Thanks for your help. It doesn't work yet. Now I get this output. Ready to process requests (0) Received Access-Request Id 17 from 192.168.65.161:59586 to 192.168.65.160:1812 length 71 (0) NAS-Identifier = "vncserver" (0) User-Name = "bw" (0) User-Password = "961473" (0) Message-Authenticator = 0xe83db7a48eb5d19f6170f913a5eca38e (0) # Executing section authorize from file /etc/freeradius/3.0/sites-enabled/default (0) authorize { (0) update control { (0) Auth-Type := TOTP (0) } # update control = noop (0) policy filter_username { (0) if (&User-Name) { (0) if (&User-Name) -> TRUE (0) if (&User-Name) { (0) if (&User-Name =~ / /) { (0) if (&User-Name =~ / /) -> FALSE (0) if (&User-Name =~ /@[^@]*@/ ) { (0) if (&User-Name =~ /@[^@]*@/ ) -> FALSE (0) if (&User-Name =~ /\.\./ ) { (0) if (&User-Name =~ /\.\./ ) -> FALSE (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) { (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) -> FALSE (0) if (&User-Name =~ /\.$/) { (0) if (&User-Name =~ /\.$/) -> FALSE (0) if (&User-Name =~ /@\./) { (0) if (&User-Name =~ /@\./) -> FALSE (0) } # if (&User-Name) = noop (0) } # policy filter_username = noop (0) [preprocess] = ok (0) [chap] = noop (0) [mschap] = noop (0) [digest] = noop (0) suffix: Checking for suffix after "@" (0) suffix: No '@' in User-Name = "bw", looking up realm NULL (0) suffix: No such realm "NULL" (0) [suffix] = noop (0) eap: No EAP-Message, not doing EAP (0) [eap] = noop (0) files: users: Matched entry bw at line 1 (0) [files] = ok (0) [expiration] = noop (0) [logintime] = noop Not doing PAP as Auth-Type is already set. (0) [pap] = noop (0) } # authorize = ok (0) Found Auth-Type = TOTP (0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default (0) Auth-Type TOTP { (0) [totp] = noop (0) } # Auth-Type TOTP = noop (0) Failed to authenticate the user (0) Using Post-Auth-Type Reject (0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default (0) Post-Auth-Type REJECT { (0) attr_filter.access_reject: EXPAND %{User-Name} (0) attr_filter.access_reject: --> bw (0) attr_filter.access_reject: Matched entry DEFAULT at line 11 (0) [attr_filter.access_reject] = updated (0) [eap] = noop (0) policy remove_reply_message_if_eap { (0) if (&reply:EAP-Message && &reply:Reply-Message) { (0) if (&reply:EAP-Message && &reply:Reply-Message) -> FALSE (0) else { (0) [noop] = noop (0) } # else = noop (0) } # policy remove_reply_message_if_eap = noop (0) } # Post-Auth-Type REJECT = updated (0) Delaying response for 1.000000 seconds Waking up in 0.3 seconds. Waking up in 0.6 seconds. (0) Sending delayed response (0) Sent Access-Reject Id 17 from 192.168.65.160:1812 to 192.168.65.161:59586 length 20 Waking up in 3.9 seconds. (0) Sending duplicate reply to client pc1 port 59586 - ID: 17 Waking up in 8.9 seconds. (0) Cleaning up request packet ID 17 with timestamp +12 due to cleanup_delay was reached Am Do., 13. März 2025 um 10:20 Uhr schrieb Alan DeKok < aland@deployingradius.com>:
On Mar 11, 2025, at 8:56 AM, IT DEB <itdebbw.p@gmail.com> wrote:
Thanks. Sorry im absolutely new to freeradius.
That's fine.
Now i changed in the config to
Why?
You can't make random changes to the configuration, and get them to do what you want. The PAP module checks passwords, and not TOTP. The PAP module sets "Auth-Type := PAP", and the default configuration has the PAP module running inside of "Auth-Type = PAP.
You don't want to change the PAP module to use TOTP. You want to use TOTP *instead* of the PAP module.
If all users are being authenticated using TOTP, you can just edit the "authorize" section, and add:
update control { Auth-Type := TOTP }
And then edit the "authentication" section, and add:
Auth-Type TOTP { totp }
It should then work.
Alan DeKok.
- List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
On Mar 14, 2025, at 1:13 PM, IT DEB <itdebbw.p@gmail.com> wrote:
It doesn't work yet. Now I get this output. ,.. (0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default (0) Auth-Type TOTP { (0) [totp] = noop (0) } # Auth-Type TOTP = noop
The TOTP module needs to know the TOTP key. You didn't read mods-available/totp and follow the instructions. Go do that. The server comes with substantial amounts of documentation. It is very difficult to configure it when the documentation isn't followed. Alan DeKok.
Hi Alan The TOTP Key is configured in the user file. Its differently for every single user. bw TOTP-Secret := "JBSWY3DPEHPK3PXP" I read the documentation several times but i am stucking... Thanks Deb Am Fr., 14. März 2025 um 12:34 Uhr schrieb Alan DeKok < aland@deployingradius.com>:
On Mar 14, 2025, at 1:13 PM, IT DEB <itdebbw.p@gmail.com> wrote:
It doesn't work yet. Now I get this output. ,.. (0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default (0) Auth-Type TOTP { (0) [totp] = noop (0) } # Auth-Type TOTP = noop
The TOTP module needs to know the TOTP key.
You didn't read mods-available/totp and follow the instructions. Go do that.
The server comes with substantial amounts of documentation. It is very difficult to configure it when the documentation isn't followed.
Alan DeKok.
- List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
On Mar 14, 2025, at 7:50 PM, IT DEB <itdebbw.p@gmail.com> wrote:
The TOTP Key is configured in the user file. Its differently for every single user.
bw TOTP-Secret := "JBSWY3DPEHPK3PXP"
I read the documentation several times but i am stucking...
It should work. Perhaps use 3.2.7, as it prints out more messages in debug mode. i.e. if it returns "noop", it will also print a message explaining what is wrong, and what you need to do in order to fix it. Alan DeKok.
Hi Now tested with version 3.2.7. Also not working.... Ready to process requests !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BlastRADIUS check: Received packet with Message-Authenticator. Setting "require_message_authenticator = true" for client pc1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! It looks like the client has been updated to protect from the BlastRADIUS attack. Please set "require_message_authenticator = true" for client pc1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (0) Received Access-Request Id 162 from 192.168.65.161:56966 to 192.168.65.160:1812 length 71 (0) NAS-Identifier = "vncserver" (0) User-Name = "bw" (0) User-Password = "383716" (0) Message-Authenticator = 0xb5dd014235fda329b187b71671751094 (0) # Executing section authorize from file /etc/freeradius/sites-enabled/default (0) authorize { (0) update control { (0) Auth-Type := TOTP (0) } # update control = noop (0) policy filter_username { (0) if (&User-Name) { (0) if (&User-Name) -> TRUE (0) if (&User-Name) { (0) if (&User-Name =~ / /) { (0) if (&User-Name =~ / /) -> FALSE (0) if (&User-Name =~ /@[^@]*@/ ) { (0) if (&User-Name =~ /@[^@]*@/ ) -> FALSE (0) if (&User-Name =~ /\.\./ ) { (0) if (&User-Name =~ /\.\./ ) -> FALSE (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) { (0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) -> FALSE (0) if (&User-Name =~ /\.$/) { (0) if (&User-Name =~ /\.$/) -> FALSE (0) if (&User-Name =~ /@\./) { (0) if (&User-Name =~ /@\./) -> FALSE (0) } # if (&User-Name) = noop (0) } # policy filter_username = noop (0) [preprocess] = ok (0) [chap] = noop (0) [mschap] = noop (0) [digest] = noop (0) suffix: Checking for suffix after "@" (0) suffix: No '@' in User-Name = "bw", looking up realm NULL (0) suffix: No such realm "NULL" (0) [suffix] = noop (0) eap: No EAP-Message, not doing EAP (0) [eap] = noop (0) files: users: Matched entry bw at line 1 (0) [files] = ok (0) [expiration] = noop (0) [logintime] = noop Not doing PAP as Auth-Type is already set. (0) [pap] = noop (0) } # authorize = ok (0) Found Auth-Type = TOTP (0) # Executing group from file /etc/freeradius/sites-enabled/default (0) Auth-Type TOTP { (0) [totp] = noop (0) } # Auth-Type TOTP = noop (0) Failed to authenticate the user (0) Using Post-Auth-Type Reject (0) # Executing group from file /etc/freeradius/sites-enabled/default (0) Post-Auth-Type REJECT { (0) attr_filter.access_reject: EXPAND %{User-Name} (0) attr_filter.access_reject: --> bw (0) attr_filter.access_reject: Matched entry DEFAULT at line 11 (0) [attr_filter.access_reject] = updated (0) [eap] = noop (0) policy remove_reply_message_if_eap { (0) if (&reply:EAP-Message && &reply:Reply-Message) { (0) if (&reply:EAP-Message && &reply:Reply-Message) -> FALSE (0) else { (0) [noop] = noop (0) } # else = noop (0) } # policy remove_reply_message_if_eap = noop (0) } # Post-Auth-Type REJECT = updated (0) Delaying response for 1.000000 seconds Waking up in 0.3 seconds. Waking up in 0.6 seconds. (0) Sending delayed response (0) Sent Access-Reject Id 162 from 192.168.65.160:1812 to 192.168.65.161:56966 length 38 Waking up in 3.9 seconds. (0) Sending duplicate reply to client pc1 port 56966 - ID: 162 Waking up in 8.9 seconds. (0) Cleaning up request packet ID 162 with timestamp +20 due to cleanup_delay was reached Ready to process requests Thanks, deb Am Mo., 17. März 2025 um 03:50 Uhr schrieb Alan DeKok < aland@deployingradius.com>:
On Mar 14, 2025, at 7:50 PM, IT DEB <itdebbw.p@gmail.com> wrote:
The TOTP Key is configured in the user file. Its differently for every single user.
bw TOTP-Secret := "JBSWY3DPEHPK3PXP"
I read the documentation several times but i am stucking...
It should work. Perhaps use 3.2.7, as it prints out more messages in debug mode.
i.e. if it returns "noop", it will also print a message explaining what is wrong, and what you need to do in order to fix it.
Alan DeKok. - List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
On Apr 14, 2025, at 10:43 AM, IT DEB <itdebbw.p@gmail.com> wrote:
Now tested with version 3.2.7. Also not working....
The issue is really simple. You have not configured the module as described in the documentation for the TOTP module. Follow the documentation, and it will work.
... (0) files: users: Matched entry bw at line 1 (0) [files] = ok
Does that entry set the attributes correctly? Likely not. The "files" module puts attributes into the "control" list. This is documented in the "files" module documentation. Follow the documentation. If all else fails, use the "update" keyword to manually add the TOTP-* attributes. Add them to the lists where the documentation says to add them. It will work. It does work. It's tested to work. But only when the documentation is followed. Alan DeKok.
Hi Alan Thanks for your help, but unfortunately I just can't get any further. You always say: Read the documentation, so far so good. But now in the documentation of the “totp” module there is nothing about the “Files” module which I apparently also have to configure... Unfortunately I don't know freeradius at all and it is difficult to recognize the connections between the individual modules. Unfortunately, I no longer have the time to “try out” what else might work. We are now looking for another solution. Thank you very much. Best regards deb Am Mo., 14. Apr. 2025 um 17:02 Uhr schrieb Alan DeKok < aland@deployingradius.com>:
On Apr 14, 2025, at 10:43 AM, IT DEB <itdebbw.p@gmail.com> wrote:
Now tested with version 3.2.7. Also not working....
The issue is really simple. You have not configured the module as described in the documentation for the TOTP module.
Follow the documentation, and it will work.
... (0) files: users: Matched entry bw at line 1 (0) [files] = ok
Does that entry set the attributes correctly? Likely not. The "files" module puts attributes into the "control" list. This is documented in the "files" module documentation.
Follow the documentation. If all else fails, use the "update" keyword to manually add the TOTP-* attributes. Add them to the lists where the documentation says to add them.
It will work. It does work. It's tested to work. But only when the documentation is followed.
Alan DeKok.
- List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
On Apr 16, 2025, at 3:02 AM, IT DEB <itdebbw.p@gmail.com> wrote:
Thanks for your help, but unfortunately I just can't get any further. You always say: Read the documentation, so far so good. But now in the documentation of the “totp” module there is nothing about the “Files” module which I apparently also have to configure...
This is the problem. I explicitly told you that the "files" module doesn't do what the TOTP module needs. I suggest to use the "update" keyword instead. Despite that, you still believe that you "have" to configure the "files" module. So this isn't a documentation issue. Alan DeKok.
participants (2)
-
Alan DeKok -
IT DEB