Skip to content

Instantly share code, notes, and snippets.

@1beb
Forked from withr/server.R
Last active December 4, 2015 23:51

Revisions

  1. 1beb revised this gist Dec 4, 2015. 1 changed file with 5 additions and 1 deletion.
    6 changes: 5 additions & 1 deletion www\style.css
    Original file line number Diff line number Diff line change
    @@ -26,7 +26,11 @@ body {
    visibility: hidden;
    }


    #passwd {
    display: block;
    width: 100%;
    height: 34px;
    }



  2. @tianhuidong tianhuidong revised this gist Feb 14, 2014. 2 changed files with 0 additions and 0 deletions.
    File renamed without changes.
    File renamed without changes.
  3. @tianhuidong tianhuidong revised this gist Feb 14, 2014. 2 changed files with 3 additions and 2 deletions.
    1 change: 0 additions & 1 deletion style.css
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,3 @@

    div.login {
    text-align: left;
    position:absolute;
    4 changes: 3 additions & 1 deletion www\Login.R
    Original file line number Diff line number Diff line change
    @@ -21,7 +21,8 @@ output$uiLogin <- renderUI({

    output$pass <- renderText({
    if (USER$Logged == FALSE) {
    if (input$Login > 0) {
    if (!is.null(input$Login)) {
    if (input$Login > 0) {
    Username <- isolate(input$userName)
    Password <- isolate(input$passwd)
    Id.username <- which(PASSWORD$Brukernavn == Username)
    @@ -34,6 +35,7 @@ output$pass <- renderText({
    "User name or password failed!"
    }
    }
    }
    }
    })

  4. @tianhuidong tianhuidong created this gist Feb 14, 2014.
    37 changes: 37 additions & 0 deletions passwdInputBinding.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,37 @@
    jQuery(function($) {
    // Password Input
    var passwordInputBinding = new Shiny.InputBinding();
    $.extend(passwordInputBinding, {
    find: function(scope) {
    return $(scope).find('input[type="password"]');
    },
    getId: function(el) {
    return Shiny.InputBinding.prototype.getId.call(this, el) || el.name;
    },
    getValue: function(el) {
    return md5(el.value);
    },
    setValue: function(el, value) {
    el.value = value;
    },
    subscribe: function(el, callback) {
    $(el).on('keyup.passwordInputBinding input.passwordInputBinding', function(event) {
    callback(true);
    });
    $(el).on('change.passwordInputBinding', function(event) {
    callback(false);
    });
    },
    unsubscribe: function(el) {
    $(el).off('.passwordInputBinding');
    },
    getRatePolicy: function() {
    return {
    policy: 'debounce',
    delay: 250
    };
    }
    });
    Shiny.inputBindings.register(passwordInputBinding, 'shiny.passwordInput');
    })

    24 changes: 24 additions & 0 deletions server.R
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,24 @@
    library(shiny)
    library(datasets)
    Logged = FALSE;
    PASSWORD <- data.frame(Brukernavn = "withr", Passord = "25d55ad283aa400af464c76d713c07ad")
    # Define server logic required to summarize and view the selected dataset
    shinyServer(function(input, output) {
    source("www/Login.R", local = TRUE)

    observe({
    if (USER$Logged == TRUE) {
    output$obs <- renderUI({
    sliderInput("obs", "Number of observations:",
    min = 10000, max = 90000,
    value = 50000, step = 10000)
    })

    output$distPlot <- renderPlot({
    dist <- NULL
    dist <- rnorm(input$obs)
    hist(dist, breaks = 100, main = paste("Your password:", input$passwd))
    })
    }
    })
    })
    37 changes: 37 additions & 0 deletions style.css
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,37 @@

    div.login {
    text-align: left;
    position:absolute;
    top: 40%;
    left: 50%;
    margin-top: -100px;
    margin-left: -150px;
    }

    div#pass {
    text-align: left;
    font-weight:bold;
    padding-left:2px;
    }

    input#Password {
    -webkit-text-security: disc;
    }

    body {
    margin:1cm;
    font-size: 12px;
    }

    .shiny-output-error {
    visibility: hidden;
    }









    20 changes: 20 additions & 0 deletions ui.R
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,20 @@
    shinyUI(bootstrapPage(
    # Add custom CSS & Javascript;
    tagList(
    tags$head(
    tags$link(rel="stylesheet", type="text/css",href="style.css"),
    tags$script(type="text/javascript", src = "md5.js"),
    tags$script(type="text/javascript", src = "passwdInputBinding.js")
    )
    ),

    ## Login module;
    div(class = "login",
    uiOutput("uiLogin"),
    textOutput("pass")
    ),

    div(class = "span4", uiOutput("obs")),
    div(class = "span8", plotOutput("distPlot"))

    ))
    39 changes: 39 additions & 0 deletions www\Login.R
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,39 @@
    #### Log in module ###
    USER <- reactiveValues(Logged = Logged)

    passwdInput <- function(inputId, label) {
    tagList(
    tags$label(label),
    tags$input(id = inputId, type="password", value="")
    )
    }

    output$uiLogin <- renderUI({
    if (USER$Logged == FALSE) {
    wellPanel(
    textInput("userName", "User Name:"),
    passwdInput("passwd", "Pass word:"),
    br(),
    actionButton("Login", "Log in")
    )
    }
    })

    output$pass <- renderText({
    if (USER$Logged == FALSE) {
    if (input$Login > 0) {
    Username <- isolate(input$userName)
    Password <- isolate(input$passwd)
    Id.username <- which(PASSWORD$Brukernavn == Username)
    Id.password <- which(PASSWORD$Passord == Password)
    if (length(Id.username) > 0 & length(Id.password) > 0) {
    if (Id.username == Id.password) {
    USER$Logged <- TRUE
    }
    } else {
    "User name or password failed!"
    }
    }
    }
    })

    165 changes: 165 additions & 0 deletions www\md5.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,165 @@
    // Downloaded from: http://www.myersdaily.org/joseph/javascript/md5.js;

    function md5cycle(x, k) {
    var a = x[0], b = x[1], c = x[2], d = x[3];

    a = ff(a, b, c, d, k[0], 7, -680876936);
    d = ff(d, a, b, c, k[1], 12, -389564586);
    c = ff(c, d, a, b, k[2], 17, 606105819);
    b = ff(b, c, d, a, k[3], 22, -1044525330);
    a = ff(a, b, c, d, k[4], 7, -176418897);
    d = ff(d, a, b, c, k[5], 12, 1200080426);
    c = ff(c, d, a, b, k[6], 17, -1473231341);
    b = ff(b, c, d, a, k[7], 22, -45705983);
    a = ff(a, b, c, d, k[8], 7, 1770035416);
    d = ff(d, a, b, c, k[9], 12, -1958414417);
    c = ff(c, d, a, b, k[10], 17, -42063);
    b = ff(b, c, d, a, k[11], 22, -1990404162);
    a = ff(a, b, c, d, k[12], 7, 1804603682);
    d = ff(d, a, b, c, k[13], 12, -40341101);
    c = ff(c, d, a, b, k[14], 17, -1502002290);
    b = ff(b, c, d, a, k[15], 22, 1236535329);

    a = gg(a, b, c, d, k[1], 5, -165796510);
    d = gg(d, a, b, c, k[6], 9, -1069501632);
    c = gg(c, d, a, b, k[11], 14, 643717713);
    b = gg(b, c, d, a, k[0], 20, -373897302);
    a = gg(a, b, c, d, k[5], 5, -701558691);
    d = gg(d, a, b, c, k[10], 9, 38016083);
    c = gg(c, d, a, b, k[15], 14, -660478335);
    b = gg(b, c, d, a, k[4], 20, -405537848);
    a = gg(a, b, c, d, k[9], 5, 568446438);
    d = gg(d, a, b, c, k[14], 9, -1019803690);
    c = gg(c, d, a, b, k[3], 14, -187363961);
    b = gg(b, c, d, a, k[8], 20, 1163531501);
    a = gg(a, b, c, d, k[13], 5, -1444681467);
    d = gg(d, a, b, c, k[2], 9, -51403784);
    c = gg(c, d, a, b, k[7], 14, 1735328473);
    b = gg(b, c, d, a, k[12], 20, -1926607734);

    a = hh(a, b, c, d, k[5], 4, -378558);
    d = hh(d, a, b, c, k[8], 11, -2022574463);
    c = hh(c, d, a, b, k[11], 16, 1839030562);
    b = hh(b, c, d, a, k[14], 23, -35309556);
    a = hh(a, b, c, d, k[1], 4, -1530992060);
    d = hh(d, a, b, c, k[4], 11, 1272893353);
    c = hh(c, d, a, b, k[7], 16, -155497632);
    b = hh(b, c, d, a, k[10], 23, -1094730640);
    a = hh(a, b, c, d, k[13], 4, 681279174);
    d = hh(d, a, b, c, k[0], 11, -358537222);
    c = hh(c, d, a, b, k[3], 16, -722521979);
    b = hh(b, c, d, a, k[6], 23, 76029189);
    a = hh(a, b, c, d, k[9], 4, -640364487);
    d = hh(d, a, b, c, k[12], 11, -421815835);
    c = hh(c, d, a, b, k[15], 16, 530742520);
    b = hh(b, c, d, a, k[2], 23, -995338651);

    a = ii(a, b, c, d, k[0], 6, -198630844);
    d = ii(d, a, b, c, k[7], 10, 1126891415);
    c = ii(c, d, a, b, k[14], 15, -1416354905);
    b = ii(b, c, d, a, k[5], 21, -57434055);
    a = ii(a, b, c, d, k[12], 6, 1700485571);
    d = ii(d, a, b, c, k[3], 10, -1894986606);
    c = ii(c, d, a, b, k[10], 15, -1051523);
    b = ii(b, c, d, a, k[1], 21, -2054922799);
    a = ii(a, b, c, d, k[8], 6, 1873313359);
    d = ii(d, a, b, c, k[15], 10, -30611744);
    c = ii(c, d, a, b, k[6], 15, -1560198380);
    b = ii(b, c, d, a, k[13], 21, 1309151649);
    a = ii(a, b, c, d, k[4], 6, -145523070);
    d = ii(d, a, b, c, k[11], 10, -1120210379);
    c = ii(c, d, a, b, k[2], 15, 718787259);
    b = ii(b, c, d, a, k[9], 21, -343485551);

    x[0] = add32(a, x[0]);
    x[1] = add32(b, x[1]);
    x[2] = add32(c, x[2]);
    x[3] = add32(d, x[3]);

    }

    function cmn(q, a, b, x, s, t) {
    a = add32(add32(a, q), add32(x, t));
    return add32((a << s) | (a >>> (32 - s)), b);
    }

    function ff(a, b, c, d, x, s, t) {
    return cmn((b & c) | ((~b) & d), a, b, x, s, t);
    }

    function gg(a, b, c, d, x, s, t) {
    return cmn((b & d) | (c & (~d)), a, b, x, s, t);
    }

    function hh(a, b, c, d, x, s, t) {
    return cmn(b ^ c ^ d, a, b, x, s, t);
    }

    function ii(a, b, c, d, x, s, t) {
    return cmn(c ^ (b | (~d)), a, b, x, s, t);
    }

    function md51(s) {
    txt = '';
    var n = s.length,
    state = [1732584193, -271733879, -1732584194, 271733878], i;
    for (i=64; i<=s.length; i+=64) {
    md5cycle(state, md5blk(s.substring(i-64, i)));
    }
    s = s.substring(i-64);
    var tail = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0];
    for (i=0; i<s.length; i++)
    tail[i>>2] |= s.charCodeAt(i) << ((i%4) << 3);
    tail[i>>2] |= 0x80 << ((i%4) << 3);
    if (i > 55) {
    md5cycle(state, tail);
    for (i=0; i<16; i++) tail[i] = 0;
    }
    tail[14] = n*8;
    md5cycle(state, tail);
    return state;
    }

    function md5blk(s) { /* I figured global was faster. */
    var md5blks = [], i; /* Andy King said do it this way. */
    for (i=0; i<64; i+=4) {
    md5blks[i>>2] = s.charCodeAt(i)
    + (s.charCodeAt(i+1) << 8)
    + (s.charCodeAt(i+2) << 16)
    + (s.charCodeAt(i+3) << 24);
    }
    return md5blks;
    }

    var hex_chr = '0123456789abcdef'.split('');

    function rhex(n)
    {
    var s='', j=0;
    for(; j<4; j++)
    s += hex_chr[(n >> (j * 8 + 4)) & 0x0F]
    + hex_chr[(n >> (j * 8)) & 0x0F];
    return s;
    }

    function hex(x) {
    for (var i=0; i<x.length; i++)
    x[i] = rhex(x[i]);
    return x.join('');
    }

    function md5(s) {
    return hex(md51(s));
    }

    function add32(a, b) {
    return (a + b) & 0xFFFFFFFF;
    }

    if (md5('hello') != '5d41402abc4b2a76b9719d911017c592') {
    function add32(x, y) {
    var lsw = (x & 0xFFFF) + (y & 0xFFFF),
    msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    return (msw << 16) | (lsw & 0xFFFF);
    }
    }