R/login.r

Defines functions check.email.domain lop.check.login lop.default.failed.login lop.login.btn.click lop.reset.btn.click lop.signup.btn.click lop.login.handlers login.default.ui show.login.ui

show.login.ui = function(lop,...) {
  restore.point("show.login.ui")

  # login directly
  if (!lop$need.userid & !lop$need.password) {
    init.userid = lop$init.userid
    if (is.function(init.userid)) init.userid = init.userid()

    lop$login.fun(userid=init.userid, password=lop$init.password, lop=lop, login.mode="direct",...)
    return()
  }

  setUI(lop$container.id, lop$login.ui.fun(lop=lop,...))
  show.html.message(lop$ns("loginAlert"),"")
}

login.default.ui = function(lop=NULL,ns=lop$ns, init.userid=lop$init.userid, init.password=lop$init.password, title.html = lop$login.title,help.text= if(!is.null(lop[["login.help"]])) lop$login.help else lop$help.text ,lang = lop$lang,...) {
  restore.point("login.default.ui")
  sel = ids2sel(c(ns("loginUser"),ns("loginPassword")))

  if (is.function(init.userid)) init.userid = init.userid()

  if (identical(lang,"de")) {
    widgets = list(
      HTML(title.html),
      if (lop$need.userid) textInput(ns("loginUser"), "Nutzer", value = init.userid),
      if (lop$need.password) passwordInput(ns("loginPassword"), "Passwort", value = init.password),
      actionButton(ns("loginBtn"), "Anmelden", "data-form-selector"=sel),
      if (lop$use.signup) actionButton(ns("loginSignupBtn"), "Registrieren"),
      if (lop$use.signup) actionButton(ns("loginResetBtn"), "Passwort vergessen"),
      uiOutput(ns("loginAlert")),
      HTML(help.text)
    )
  } else {
    widgets = list(
      HTML(title.html),
      if (lop$need.userid) textInput(ns("loginUser"), "User", value = init.userid),
      if (lop$need.password) passwordInput(ns("loginPassword"), "Password", value = init.password),
      actionButton(ns("loginBtn"), "log in", "data-form-selector"=sel),
      if (lop$use.signup) actionButton(ns("loginSignupBtn"), "sign up"),
      if (lop$use.signup) actionButton(ns("loginResetBtn"), "reset password"),
      uiOutput(ns("loginAlert")),
      HTML(help.text)
    )
  }
  setUI("loginAlert","")
  ui = wellPanel(widgets)
  ui
}

lop.login.handlers = function(lop, ns=lop$ns,...) {
  restore.point("lop.login.handlers")

  buttonHandler(ns("loginBtn"),lop.login.btn.click,lop=lop,no.authentication.required = TRUE)
  buttonHandler(ns("loginSignupBtn"),lop.signup.btn.click,lop=lop,no.authentication.required = TRUE)
  buttonHandler(ns("loginResetBtn"),lop.reset.btn.click,lop=lop,no.authentication.required = TRUE)

}


lop.signup.btn.click = function(app=getApp(),lop,...) {
  if (!is.null(lop$signup.fun)) {
    lop$signup.fun(lop=lop,...)
  }
}

lop.reset.btn.click = function(app=getApp(),lop,...) {
  if (!is.null(lop$reset.fun)) {
    lop$reset.fun(lop=lop,...)
  }
}

lop.login.btn.click = function(app=getApp(),lop,formValues,ns=lop$ns,...) {
  userid = formValues[[ns("loginUser")]]
  if (isTRUE(lop$only.lowercase)) {
    userid = tolower(userid)
  }


  password = formValues[[ns("loginPassword")]]

  cat("userid = ", userid, " password = ", password)

  res = lop.check.login(userid=userid,password = password, lop=lop)
  restore.point("lop.login.btn.click")
  if (res$ok==TRUE) {
    app$is.authenticated = TRUE
    lop$login.fun(userid=userid, password=password, lop=lop,login.mode="manual",...)
  } else {
    app$is.authenticated = FALSE
    lop$login.failed.fun(userid=userid, password=password, msg=res$msg, lop=lop,...)
  }
}

lop.default.failed.login = function(app=getApp(),lop=get.lop(),msg="Log-in failed.",ns=lop$ns,...) {
  if (lop$login.by.query.key=="require") {
    cat("\nlog-in failed: ",msg)
    setUI(lop$container.id, HTML(colored.html(msg)))
    return()
  }
  show.html.warning(ns("loginAlert"),msg)
  cat("\nlog-in failed: ",msg)
}

lop.check.login = function(userid, password, lop=get.lop()) {
  restore.point("lop.check.login")

  # only a fixed list of users is allowed to login
  if (!is.null(lop$allowed.userids)) {
    if (!isTRUE(userid %in% lop$allowed.userids)) {
      return(list(ok=FALSE, msg=paste0("The user ",userid," has no access to this application.")))
    }
  }


  # login via a fixed password
  if (lop$use.fixed.password) {
    if (!identical(password, lop$fixed.password)) {
      return(list(ok=FALSE,msg="Wrong password."))
    }
    return(list(ok=TRUE,msg=""))
  }



  # just pick a username without any password
  if (!lop$use.signup) {
    return(lop$validate.userid.fun(userid))
  }

  if (nchar(userid)==0)
    return(list(ok=FALSE,msg="No user name entered."))


  user = lop.get.user(userid=userid, lop=lop)
  if (NROW(user)==0) {
    return(list(ok=FALSE,msg="User does not exist."))
  }
  ok = check.password(password = password, salt=user$salt,hash=user$hash)
  if (ok) {
    return(list(ok=TRUE,msg=""))
  }
  return(list(ok=FALSE,msg="Wrong password."))
}


check.email.domain = function(email, domain) {
  ok = str.ends.with(email, domain)
  if (!ok) {
    return(list(ok=ok, msg=paste0("You can only create an account with an email that ends with ", domain)))
  }
  return(list(ok=ok, msg=""))
}
skranz/shinyEventsLogin documentation built on May 20, 2023, 9:54 a.m.