├── .dockerignore ├── .github └── workflows │ └── docker-publish.yml ├── .gitignore ├── CONTRIBUTING.md ├── Dockerfile ├── Gruntfile.js ├── LICENSE ├── NOTICE ├── README.md ├── app.js ├── auth.js ├── config-development.json ├── config-production.json ├── date_util.js ├── deployment ├── docker-compose │ ├── .env │ ├── README.md │ ├── config.json.template │ ├── docker-compose.yml │ └── traefik.toml ├── kubernetes │ ├── README.md │ ├── kubernetes-deploy.sh │ ├── kubernetes-undeploy.sh │ └── openhabcloud_ephemeral_k8_template.yml └── openshift │ ├── README.md │ ├── openhabcloud_ephemeral_os_template.yml │ ├── openhabcloud_os_template.yml │ ├── openshift-deploy.sh │ └── openshift-undeploy.sh ├── docs ├── AWS_1.png ├── AWS_10.png ├── AWS_11.png ├── AWS_12.png ├── AWS_13.png ├── AWS_2.png ├── AWS_3.png ├── AWS_4.png ├── AWS_5.png ├── AWS_6.png ├── AWS_7.1.png ├── AWS_7.png ├── AWS_8.png ├── AWS_9.png └── FunctionalArchitecture_openHAB-cloud_v1.0.png ├── etc ├── nginx-openhabcloud-lb-redirects.conf ├── nginx-openhabcloud-lb.conf ├── nginx_openhabcloud-production.conf ├── nginx_openhabcloud.conf ├── openhabcloud-main@.service ├── openhabcloud-web@.service └── openhabcloud.service ├── jobs └── every5minstat.js ├── logger.js ├── mailer.js ├── makeadmin.js ├── makeinvites.js ├── models ├── emailverification.js ├── enrollment.js ├── event.js ├── invitation.js ├── item.js ├── lostpassword.js ├── notification.js ├── oauth2client.js ├── oauth2code.js ├── oauth2scope.js ├── oauth2token.js ├── openhab.js ├── user.js ├── useraccount.js └── userdevice.js ├── notificationsender ├── aps-helper.js ├── firebase.js └── index.js ├── package-lock.json ├── package.json ├── public ├── bootstrap │ ├── css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── img │ │ ├── glyphicons-halflings-white.png │ │ └── glyphicons-halflings.png │ └── js │ │ ├── bootstrap-carousel.js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── with carousel │ │ ├── bootstrap.js │ │ └── bootstrap.min.js ├── css │ ├── bootstrap.min.css │ ├── colors.css │ └── layout.css ├── downloads │ └── org.openhab.io.myopenhab-1.3.0-SNAPSHOT.jar ├── font-icons │ └── custom-icons │ │ ├── BCk-safari-pc │ │ ├── LICENSE.txt │ │ ├── README.txt │ │ ├── config.json │ │ ├── css │ │ │ ├── animation.css │ │ │ ├── custom-icons-codes.css │ │ │ ├── custom-icons-embedded.css │ │ │ ├── custom-icons-ie7-codes.css │ │ │ ├── custom-icons-ie7.css │ │ │ └── custom-icons.css │ │ ├── demo.html │ │ └── font │ │ │ ├── custom-icons.eot │ │ │ ├── custom-icons.svg │ │ │ ├── custom-icons.ttf │ │ │ └── custom-icons.woff │ │ ├── LICENSE.txt │ │ ├── README.txt │ │ ├── config.json │ │ ├── css │ │ ├── custom-icons-codes.css │ │ ├── custom-icons-ie7-codes.css │ │ ├── custom-icons-ie7.css │ │ └── custom-icons.css │ │ ├── demo.html │ │ └── font │ │ ├── custom-icons.eot │ │ ├── custom-icons.svg │ │ ├── custom-icons.ttf │ │ └── custom-icons.woff ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── img │ ├── Sans-titre-2.png │ ├── apps │ │ ├── download-app-store.svg │ │ ├── google-play-badge.png │ │ ├── openhab-iphone.png │ │ └── openhab-iphone.pxm │ ├── big-logo.png │ ├── demo │ │ ├── dash1.png │ │ ├── dash2.png │ │ └── dash3.png │ ├── designer-rules.png │ ├── favicon.ico │ ├── features.png │ ├── icon-map.png │ ├── icons │ │ ├── ajax-loader.gif │ │ ├── main-nav-hoverstate.png │ │ └── main-nav-normalstate.png │ ├── img-404.jpg │ ├── img-fullwidth.jpg │ ├── map-trigger.png │ ├── oauth2 │ │ ├── alexa.png │ │ ├── google-assistant.png │ │ ├── ifttt-icon.png │ │ ├── instagram-icon.jpg │ │ └── twitter-icon.png │ ├── openhab-automation-rules.jpg │ ├── openhab-graphs.jpg │ ├── openhab-logo-small.png │ ├── openhab-logo-square.png │ ├── openhab-logo-top.png │ ├── openhab-raspberry.jpg │ ├── rs-arrows.png │ ├── slider │ │ └── rs │ │ │ └── thumb.png │ ├── slides │ │ ├── accordionswitch.png │ │ ├── badge.png │ │ ├── bg-floor.jpg │ │ ├── bgtile.jpg │ │ ├── bullets_boxed.png │ │ ├── bullets_round.png │ │ ├── bullets_square.png │ │ ├── burger.png │ │ ├── buynow.png │ │ ├── check.png │ │ ├── coke.png │ │ ├── coloredbg.png │ │ ├── company1.png │ │ ├── company2.png │ │ ├── company3.png │ │ ├── dragnotch.png │ │ ├── dragsliderbg.png │ │ ├── dude1.png │ │ ├── dude2.png │ │ ├── floor.png │ │ ├── girl1.png │ │ ├── glare.png │ │ ├── glare2.png │ │ ├── image1.jpg │ │ ├── image16.jpg │ │ ├── image17.jpg │ │ ├── image18.jpg │ │ ├── image20.jpg │ │ ├── image21.jpg │ │ ├── image22.jpg │ │ ├── logo.png │ │ ├── mainBg.png │ │ ├── minishadow.png │ │ ├── minishadow2.png │ │ ├── minishadow3.png │ │ ├── preview1.png │ │ ├── preview2.png │ │ ├── preview3.png │ │ ├── radio.png │ │ ├── selectpreview.png │ │ ├── shadow3_large.png │ │ ├── sliderconfigheadline.png │ │ ├── space.jpg │ │ ├── strawberries.png │ │ ├── thumb1.jpg │ │ ├── thumb2.jpg │ │ ├── thumb3.jpg │ │ ├── thumb4.jpg │ │ ├── transition_bg.png │ │ ├── transition_boxes.png │ │ ├── transition_curtainone.png │ │ ├── transition_curtainthree.png │ │ ├── transition_curtaintwo.png │ │ ├── transition_fade.png │ │ ├── transition_mixed.png │ │ ├── transition_slidedown.png │ │ ├── transition_slideleft.png │ │ ├── transition_slideright.png │ │ ├── transition_slideup.png │ │ ├── transition_slotfadehorizontal.png │ │ ├── transition_slotfadevertical.png │ │ ├── transition_slotslidehorizontal.png │ │ ├── transition_slotslidevertical.png │ │ ├── transition_slotzoomhorizontal.png │ │ ├── transition_slotzoomvertical.png │ │ ├── transparent.png │ │ ├── wideimage.jpg │ │ └── wideimage2.jpg │ ├── subtle-noise.png │ └── textures │ │ ├── Little-Neko-_0003_BOKEY-blue-green-light.jpg │ │ ├── Little-Neko-_0008_BOKEY-blue5.jpg │ │ ├── Little-Neko-_0017_BOKEY-orange8.jpg │ │ ├── Little-Neko-_0026_BOKEY-light7- (2).jpg │ │ ├── Little-Neko-_0026_BOKEY-light7.jpg │ │ ├── Little-Neko_0000_BLUR1.jpg │ │ ├── Little-Neko_0003_woody4.jpg │ │ ├── Little-Neko_0007_tree8.jpg │ │ ├── Little-Neko_pixel.jpg │ │ ├── bg-footer.png │ │ ├── bg-texture-grey-dark.png │ │ ├── bg-texture-grey.png │ │ ├── bg-texture-light-grey.png │ │ ├── bg-texture-orange.png │ │ ├── bg-texture-video.png │ │ ├── full-size │ │ ├── Little-Neko-_0003_BOKEY-blue-green-light.jpg │ │ ├── Little-Neko-_0008_BOKEY-blue5.jpg │ │ ├── Little-Neko-_0017_BOKEY-orange8.jpg │ │ ├── Little-Neko-_0026_BOKEY-light7.jpg │ │ ├── Little-Neko_0000_BLUR1.jpg │ │ ├── Little-Neko_0003_woody4.jpg │ │ ├── Little-Neko_0007_tree8.jpg │ │ ├── Little-Neko_pixel.jpg │ │ └── texture-pixel.png │ │ └── texture-pixel.png ├── js-plugin │ ├── ajax-contact-extend │ │ ├── assets │ │ │ ├── css │ │ │ │ └── contact.css │ │ │ ├── img │ │ │ │ ├── ajax-loader.gif │ │ │ │ ├── error.gif │ │ │ │ ├── success.gif │ │ │ │ └── verify │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ └── 3.png │ │ │ └── js │ │ │ │ └── jquery.jigowatt.js │ │ └── classes │ │ │ ├── contact.php │ │ │ ├── image.php │ │ │ ├── twitter.php │ │ │ └── twitter │ │ │ ├── EpiCurl.php │ │ │ ├── EpiOAuth.php │ │ │ └── EpiTwitter.php │ ├── bootstrap-select │ │ ├── README.md │ │ ├── bootstrap-select.css │ │ ├── bootstrap-select.js │ │ ├── bootstrap-select.min.css │ │ ├── bootstrap-select.min.js │ │ └── package.json │ ├── camera │ │ ├── camera.js │ │ ├── camera.min.js │ │ ├── css │ │ │ └── camera.css │ │ └── images │ │ │ ├── _notes │ │ │ └── dwsync.xml │ │ │ ├── blank.gif │ │ │ ├── camera-loader.gif │ │ │ ├── camera_skins.png │ │ │ ├── patterns │ │ │ ├── _notes │ │ │ │ └── dwsync.xml │ │ │ ├── overlay1.png │ │ │ ├── overlay10.png │ │ │ ├── overlay2.png │ │ │ ├── overlay3.png │ │ │ ├── overlay4.png │ │ │ ├── overlay5.png │ │ │ ├── overlay6.png │ │ │ ├── overlay7.png │ │ │ ├── overlay8.png │ │ │ └── overlay9.png │ │ │ └── slides │ │ │ ├── _notes │ │ │ └── dwsync.xml │ │ │ ├── big_bunny_fake.jpg │ │ │ ├── bridge.jpg │ │ │ ├── leaf.jpg │ │ │ ├── road.jpg │ │ │ ├── sea.jpg │ │ │ ├── shelter.jpg │ │ │ ├── thumbs │ │ │ ├── _notes │ │ │ │ └── dwsync.xml │ │ │ ├── big_bunny_fake.jpg │ │ │ ├── bridge.jpg │ │ │ ├── header_bg.png │ │ │ ├── leaf.jpg │ │ │ ├── road.jpg │ │ │ ├── sea.jpg │ │ │ ├── shelter.jpg │ │ │ └── tree.jpg │ │ │ └── tree.jpg │ ├── easing │ │ └── jquery.easing.1.3.js │ ├── flexslider │ │ ├── flexslider.css │ │ ├── images │ │ │ └── bg_direction_nav.png │ │ ├── jquery.flexslider-min.js │ │ ├── jquery.flexslider.js │ │ └── themes │ │ │ ├── himalaya-flexslider-theme.css │ │ │ └── slider-overlay.png │ ├── hoverdir │ │ ├── css │ │ │ └── style.css │ │ └── jquery.hoverdir.js │ ├── isotope │ │ ├── css │ │ │ └── style.css │ │ ├── jquery.isotope.js │ │ └── jquery.isotope.min.js │ ├── jquery-cookie │ │ └── jquery.cookie.js │ ├── jquery-ui │ │ └── jquery-ui-1.8.23.custom.min.js │ ├── jquery.sharrre-1.3.4 │ │ ├── README.md │ │ ├── index.html │ │ ├── jquery.sharrre-1.3.4.js │ │ ├── jquery.sharrre-1.3.4.min.js │ │ └── sharrre.php │ ├── pretty-photo │ │ ├── css │ │ │ └── prettyPhoto.css │ │ ├── images │ │ │ ├── fullscreen │ │ │ │ ├── 1.jpg │ │ │ │ ├── 2.jpg │ │ │ │ ├── 3.jpg │ │ │ │ ├── 4.jpg │ │ │ │ ├── 5.jpg │ │ │ │ ├── 6.jpg │ │ │ │ ├── high.gif │ │ │ │ ├── huge.gif │ │ │ │ └── wide.gif │ │ │ ├── prettyPhoto │ │ │ │ ├── dark_rounded │ │ │ │ │ ├── btnNext.png │ │ │ │ │ ├── btnPrevious.png │ │ │ │ │ ├── contentPattern.png │ │ │ │ │ ├── default_thumbnail.gif │ │ │ │ │ ├── loader.gif │ │ │ │ │ └── sprite.png │ │ │ │ ├── dark_square │ │ │ │ │ ├── btnNext.png │ │ │ │ │ ├── btnPrevious.png │ │ │ │ │ ├── contentPattern.png │ │ │ │ │ ├── default_thumbnail.gif │ │ │ │ │ ├── loader.gif │ │ │ │ │ └── sprite.png │ │ │ │ ├── default │ │ │ │ │ ├── default_thumb.png │ │ │ │ │ ├── loader.gif │ │ │ │ │ ├── sprite.png │ │ │ │ │ ├── sprite_next.png │ │ │ │ │ ├── sprite_prev.png │ │ │ │ │ ├── sprite_x.png │ │ │ │ │ └── sprite_y.png │ │ │ │ ├── facebook │ │ │ │ │ ├── btnNext.png │ │ │ │ │ ├── btnPrevious.png │ │ │ │ │ ├── contentPatternBottom.png │ │ │ │ │ ├── contentPatternLeft.png │ │ │ │ │ ├── contentPatternRight.png │ │ │ │ │ ├── contentPatternTop.png │ │ │ │ │ ├── default_thumbnail.gif │ │ │ │ │ ├── loader.gif │ │ │ │ │ └── sprite.png │ │ │ │ ├── light_rounded │ │ │ │ │ ├── btnNext.png │ │ │ │ │ ├── btnPrevious.png │ │ │ │ │ ├── default_thumbnail.gif │ │ │ │ │ ├── loader.gif │ │ │ │ │ └── sprite.png │ │ │ │ └── light_square │ │ │ │ │ ├── btnNext.png │ │ │ │ │ ├── btnPrevious.png │ │ │ │ │ ├── default_thumbnail.gif │ │ │ │ │ ├── loader.gif │ │ │ │ │ └── sprite.png │ │ │ └── thumbnails │ │ │ │ ├── flash-logo.png │ │ │ │ ├── quicktime-logo.gif │ │ │ │ ├── t_1.jpg │ │ │ │ ├── t_2.jpg │ │ │ │ ├── t_3.jpg │ │ │ │ ├── t_4.jpg │ │ │ │ └── t_5.jpg │ │ └── js │ │ │ └── jquery.prettyPhoto.js │ ├── respond │ │ ├── respond.min.js │ │ └── respond.src.js │ ├── rs-plugin │ │ ├── assets │ │ │ ├── arrow_large_left.png │ │ │ ├── arrow_large_right.png │ │ │ ├── arrow_left.png │ │ │ ├── arrow_left2.png │ │ │ ├── arrow_right.png │ │ │ ├── arrow_right2.png │ │ │ ├── arrowleft.png │ │ │ ├── arrowright.png │ │ │ ├── arrows.psd │ │ │ ├── black50.png │ │ │ ├── boxed_bgtile.png │ │ │ ├── bullet.png │ │ │ ├── bullet_boxed.png │ │ │ ├── bullets.png │ │ │ ├── bullets.psd │ │ │ ├── bullets2.png │ │ │ ├── coloredbg.png │ │ │ ├── grain.png │ │ │ ├── large_left.png │ │ │ ├── large_right.png │ │ │ ├── loader.gif │ │ │ ├── loader2.gif │ │ │ ├── navigdots.png │ │ │ ├── navigdots_bgtile.png │ │ │ ├── shadow1.png │ │ │ ├── shadow2.png │ │ │ ├── shadow3.png │ │ │ ├── small_arrows.psd │ │ │ ├── small_left.png │ │ │ ├── small_left_boxed.png │ │ │ ├── small_right.png │ │ │ ├── small_right_boxed.png │ │ │ ├── timer.png │ │ │ ├── timerdot.png │ │ │ └── white50.png │ │ ├── css │ │ │ ├── settings-bck.css │ │ │ └── settings.css │ │ ├── images │ │ │ ├── decor_inside.png │ │ │ ├── decor_inside_white.png │ │ │ ├── decor_testimonial.png │ │ │ └── gradient │ │ │ │ ├── g30.png │ │ │ │ └── g40.png │ │ └── js │ │ │ ├── jquery.themepunch.plugins.min.js │ │ │ ├── jquery.themepunch.revolution.js │ │ │ └── jquery.themepunch.revolution.min.js │ └── sequence │ │ ├── css │ │ └── sequence.css │ │ ├── images │ │ ├── bg-sequence.jpg │ │ ├── bt-next.png │ │ ├── bt-prev.png │ │ ├── model1.png │ │ ├── model2.png │ │ ├── model3.png │ │ ├── pause-icon.png │ │ ├── sequence-logo.png │ │ ├── tn-model1.png │ │ ├── tn-model2.png │ │ └── tn-model3.png │ │ └── js │ │ ├── sequence.jquery-min.js │ │ └── sequence.jquery.js ├── js │ ├── Chart.min.js │ ├── bootstrap.min.js │ ├── custom.js │ ├── jquery.js │ ├── modernizr-2.6.1.min.js │ └── styleswitcher.js └── stylesheets │ └── style.less ├── redis-helper.js ├── requesttracker └── index.js ├── routes ├── account.js ├── api.js ├── appleRegistrationService.js ├── applications.js ├── devices.js ├── events.js ├── fcmRegistrationService.js ├── health.js ├── homepage.js ├── ifttt.js ├── index.js ├── invitations.js ├── items.js ├── notifications.js ├── oauth2.js ├── setTimezone.js ├── staff.js ├── user.js └── users.js ├── run-app.sh ├── scripts └── deleteDuplicateUserDevices.js ├── sendmail.js ├── socket-io.js ├── system ├── index.js └── mongoconnect.js ├── templates ├── activation-email │ └── html.ejs ├── enroll-email │ └── html.ejs ├── invitation-email │ └── html.ejs ├── invitation-inactive │ └── html.ejs ├── lostpassword-email │ └── html.ejs ├── new-version │ └── html.ejs └── openhaboffline │ └── html.ejs ├── testclient └── testclient.js ├── tests ├── Testing.md ├── lib.js ├── mocha │ ├── integration │ │ ├── account.js │ │ ├── applications.js │ │ ├── devices.js │ │ ├── event.js │ │ ├── items.js │ │ ├── login.js │ │ ├── mainpage.js │ │ └── notification.js │ ├── login.js │ ├── mainpage.js │ └── unit │ │ ├── models │ │ ├── emailVerification.js │ │ ├── invitation.js │ │ ├── openhab.js │ │ └── users.js │ │ ├── routes │ │ ├── api.js │ │ ├── events.js │ │ ├── items.js │ │ ├── notifications.js │ │ └── users.js │ │ └── user.js ├── ohc_simulator_docker.js ├── openhabconsole.js ├── openhabimitator.js └── qunit │ ├── requesttracker │ └── index.js │ └── system │ ├── index.js │ └── mongoconnect.js ├── userpassword.js └── views ├── account.ejs ├── accountdelete.ejs ├── alerts.ejs ├── applications.ejs ├── devices.ejs ├── docs ├── documentation.ejs ├── ifttt.ejs ├── notifications.ejs └── persistence.ejs ├── enroll.ejs ├── events.ejs ├── footer.ejs ├── header.ejs ├── index.ejs ├── invitations.ejs ├── items.ejs ├── itemsdelete.ejs ├── login.ejs ├── lostpassword.ejs ├── lostpasswordreset.ejs ├── notifications.ejs ├── oauth2dialog.ejs ├── staff ├── invitations.ejs ├── oauthclients.ejs ├── staff.ejs └── stats.ejs └── users.ejs /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | deployment 3 | docs 4 | logs 5 | test 6 | Dockerfile 7 | config*.json 8 | .* 9 | *.log 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directories 7 | node_modules/ 8 | 9 | # Optional npm cache directory 10 | .npm 11 | 12 | # Output of 'npm pack' 13 | *.tgz 14 | 15 | # Development environment settings directories 16 | .idea 17 | .project 18 | /openhab-cloud.iml 19 | 20 | # currently used config.json 21 | /config.json 22 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18-alpine 2 | 3 | RUN apk add --no-cache tzdata gettext 4 | 5 | RUN addgroup -S openhabcloud && \ 6 | adduser -H -S -G openhabcloud openhabcloud 7 | 8 | # Add proper timezone 9 | ARG TZ=Europe/Berlin 10 | RUN ln -s /usr/share/zoneinfo/${TZ} /etc/localtime && \ 11 | echo "${TZ}" > /etc/timezone 12 | 13 | WORKDIR /opt/openhabcloud 14 | 15 | # Install node modules 16 | COPY package.json package-lock.json ./ 17 | RUN apk add --no-cache --virtual .build-deps build-base python3 && \ 18 | npm install && npm rebuild bcrypt --build-from-source && \ 19 | apk del .build-deps 20 | 21 | # Prepare source tree 22 | RUN chown openhabcloud:openhabcloud . 23 | RUN mkdir logs && chown openhabcloud:openhabcloud logs 24 | COPY --chown=openhabcloud:openhabcloud . . 25 | 26 | USER openhabcloud 27 | EXPOSE 3000 28 | CMD ["./run-app.sh"] 29 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | grunt.initConfig({ 4 | express: { 5 | test: { 6 | options: { 7 | script: 'app.js', 8 | output: ".*express server listening on port 3000.*", 9 | node_env: 'development', 10 | logs: { 11 | out: '/dev/null' 12 | } 13 | } 14 | } 15 | }, 16 | 'qunit-node': { 17 | options: { 18 | noglobals: true, 19 | setup: function (QUnit) { 20 | // a separate function to report test failures 21 | QUnit.on('testEnd', function (test) { 22 | if (test.status !== 'failed') { 23 | return; 24 | } 25 | grunt.log.writeln(('not ok ' + test.fullName.join(' > ')).red); 26 | test.errors.forEach(function (error) { 27 | grunt.log.writeln(error.message); 28 | }); 29 | }); 30 | } 31 | }, 32 | test: { 33 | src: 'tests/qunit/**/*.js' 34 | } 35 | }, 36 | mochaTest: { 37 | test: { 38 | options: { 39 | reporter: 'spec' 40 | }, 41 | src: ['tests/mocha/**/*.js'] 42 | } 43 | } 44 | }); 45 | 46 | grunt.loadNpmTasks('grunt-express-server'); 47 | grunt.loadNpmTasks('grunt-qunit-node'); 48 | grunt.loadNpmTasks('grunt-mocha-test'); 49 | 50 | grunt.registerTask('mocha', ['express', 'mochaTest']) 51 | grunt.registerTask('default', ['qunit-node', 'mocha']); 52 | 53 | }; -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | This content is produced and maintained by the openHAB project. 2 | 3 | * Project home: https://www.openhab.org 4 | 5 | == Declared Project Licenses 6 | 7 | This program and the accompanying materials are made available under the terms 8 | of the Eclipse Public License 2.0 which is available at 9 | https://www.eclipse.org/legal/epl-2.0/. 10 | 11 | == Source Code 12 | 13 | https://github.com/openhab/openhab-cloud 14 | -------------------------------------------------------------------------------- /config-development.json: -------------------------------------------------------------------------------- 1 | { 2 | "system": { 3 | "host": "", 4 | "listenIp": "0.0.0.0", 5 | "port": "443", 6 | "protocol": "https", 7 | "logger" : { 8 | "dir": "./logs", 9 | "maxFiles" : "7d", 10 | "level" : "debug", 11 | "morganOption" : "dev" 12 | }, 13 | "healthEndpoint" : { 14 | "enabled" : true 15 | } 16 | }, 17 | "express":{ 18 | "key" : "some express key" 19 | }, 20 | "mongodb": { 21 | "hosts": ["127.0.0.1"], 22 | "db": "openhab" 23 | }, 24 | "redis": { 25 | "host": "127.0.0.1", 26 | "port": "6379", 27 | "password": "secret" 28 | }, 29 | "mailer": { 30 | "host" : "somehost", 31 | "port": 465, 32 | "secureConnection": true, 33 | "user": "someuser", 34 | "password": "somepass", 35 | "from": "" 36 | }, 37 | "gcm" : { 38 | "senderId": "1234567890", 39 | "serviceFile" : "serviceAccountKey.json" 40 | }, 41 | "apn" : { 42 | "team": "PB1234567", 43 | "keyId": "BLABLA1", 44 | "host": "api.development.push.apple.com", 45 | "defaultTopic": "es.spaphone.openhab", 46 | "signingKey": "certs/aps/AuthKey.p8" 47 | }, 48 | "ifttt" : { 49 | "iftttChannelKey" : "key", 50 | "iftttTestToken" : "token" 51 | }, 52 | "legal": { 53 | "terms" : "", 54 | "policy": "" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /config-production.json: -------------------------------------------------------------------------------- 1 | { 2 | "system": { 3 | "host": "", 4 | "listenIp": "0.0.0.0", 5 | "port": "443", 6 | "protocol": "https", 7 | "logger" : { 8 | "dir": "./logs", 9 | "maxFiles" : "7d", 10 | "level" : "debug", 11 | "morganOption" : null 12 | }, 13 | "subDomainCookies": false, 14 | "muteNotifications": false, 15 | "healthEndpoint" : { 16 | "enabled" : false 17 | } 18 | }, 19 | "express":{ 20 | "key" : "some express key" 21 | }, 22 | "apn" : { 23 | "team": "PB1234567", 24 | "keyId": "BLABLA1", 25 | "defaultTopic": "es.spaphone.openhab", 26 | "signingKey": "certs/aps/AuthKey.p8" 27 | }, 28 | "gcm" : { 29 | "senderId": "1234567890", 30 | "serviceFile" : "serviceAccountKey.json" 31 | }, 32 | "ifttt" : { 33 | "iftttChannelKey" : "key", 34 | "iftttTestToken" : "token" 35 | }, 36 | "mail": { 37 | "host" : "smtp", 38 | "port" : 465, 39 | "user" : "foo@bar.com", 40 | "pass" : "password" 41 | }, 42 | "mongodb": { 43 | "hosts": ["127.0.0.1"], 44 | "db": "openhab", 45 | "user": "", 46 | "password": "" 47 | }, 48 | "redis": { 49 | "host": "127.0.0.1", 50 | "port": "6379", 51 | "password": "password" 52 | }, 53 | "mailer": { 54 | "host" : "smtp", 55 | "port": 465, 56 | "secureConnection": true, 57 | "user": "foo@bar.com", 58 | "password": "password", 59 | "from": "openHAB Cloud " 60 | }, 61 | "legal": { 62 | "terms" : "", 63 | "policy": "" 64 | }, 65 | "registration_enabled": false 66 | } 67 | -------------------------------------------------------------------------------- /date_util.js: -------------------------------------------------------------------------------- 1 | var { DateTime } = require('luxon'); 2 | 3 | module.exports = function (date, timezone) { 4 | /** 5 | * Convert a Javascript Date into node-time wrapper with the appropriate timezone. 6 | * @param date {Date} Javascript Date object or ISO String 7 | * @param timezone {String} Olson timezone for this date (e.g. 'America/New_York') 8 | * @return luxon object with the appropriate timezone 9 | */ 10 | if(typeof date === 'string'){ 11 | return DateTime.fromISO(date).setZone(timezone || 'UTC') 12 | } else { 13 | return DateTime.fromJSDate(date).setZone(timezone || 'UTC') 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /deployment/docker-compose/.env: -------------------------------------------------------------------------------- 1 | COMPOSE_PROJECT_NAME=openhab-cloud 2 | 3 | # Used to obtain TLS certificate from letsencrypt 4 | DOMAIN_NAME= 5 | EMAIL= 6 | 7 | # IMPORTANT - Choose a random secret string 8 | EXPRESS_KEY= 9 | -------------------------------------------------------------------------------- /deployment/docker-compose/config.json.template: -------------------------------------------------------------------------------- 1 | { 2 | "system": { 3 | "host": "${DOMAIN_NAME}", 4 | "port": "443", 5 | "protocol": "https", 6 | "logger" : { 7 | "type": "console" 8 | }, 9 | "subDomainCookies": false, 10 | "healthEndpoint" : { 11 | "enabled" : false 12 | } 13 | }, 14 | "express":{ 15 | "key" : "${EXPRESS_KEY}" 16 | }, 17 | "apn" : { 18 | "gateway": "gateway.push.apple.com", 19 | "cert": "certs/aps/aps_production_cert.pem", 20 | "key": "certs/aps/aps_production_key.pem", 21 | "passphrase": "passphrase" 22 | }, 23 | "gcm" : { 24 | "jid": "something@gcm.googleapis.com", 25 | "password": "password" 26 | }, 27 | "ifttt" : { 28 | "iftttChannelKey" : "key", 29 | "iftttTestToken" : "token" 30 | }, 31 | "mongodb": { 32 | "hosts": ["mongodb"], 33 | "db": "openhab" 34 | }, 35 | "redis": { 36 | "host": "redis", 37 | "port": "6379", 38 | "password": "123_openHAB" 39 | }, 40 | "mailer": { 41 | "host" : "smtp", 42 | "port": 465, 43 | "secureConnection": true, 44 | "user": "my@openhab.org", 45 | "password": "123_openHAB", 46 | "from": "My openHAB " 47 | }, 48 | "legal": { 49 | "terms" : "", 50 | "policy": "" 51 | }, 52 | "registration_enabled": false 53 | } 54 | -------------------------------------------------------------------------------- /deployment/docker-compose/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | app: 5 | image: openhab/openhab-cloud:latest 6 | build: 7 | context: ../.. 8 | # Uncomment to customize timezone 9 | #args: 10 | # TZ: America/Los_Angeles 11 | volumes: 12 | - ./config.json.template:/opt/openhabcloud/config.json.template 13 | depends_on: 14 | - mongodb 15 | - redis 16 | restart: always 17 | environment: 18 | - DOMAIN_NAME 19 | - EXPRESS_KEY 20 | labels: 21 | - "traefik.enable=true" 22 | - "traefik.frontend.rule=Host:${DOMAIN_NAME}" 23 | - "traefik.port=3000" 24 | - "traefik.protocol=http" 25 | 26 | mongodb: 27 | image: mongo:4 28 | volumes: 29 | - mongo-data:/data/db 30 | restart: always 31 | 32 | redis: 33 | image: bitnami/redis:latest 34 | environment: 35 | - REDIS_PASSWORD=123_openHAB 36 | restart: always 37 | 38 | traefik: 39 | image: traefik:1.7 40 | ports: 41 | - "443:443" 42 | - "80:80" 43 | - "8080:8080" 44 | volumes: 45 | - ./traefik.toml:/etc/traefik/traefik.toml:ro 46 | - /var/run/docker.sock:/var/run/docker.sock 47 | - traefik-data:/data 48 | command: 49 | - "--acme.email=${EMAIL}" 50 | 51 | volumes: 52 | mongo-data: 53 | traefik-data: 54 | -------------------------------------------------------------------------------- /deployment/docker-compose/traefik.toml: -------------------------------------------------------------------------------- 1 | debug = false 2 | 3 | logLevel = "INFO" 4 | defaultEntryPoints = ["https","http"] 5 | 6 | [entryPoints] 7 | [entryPoints.http] 8 | address = ":80" 9 | [entryPoints.http.redirect] 10 | entryPoint = "https" 11 | [entryPoints.https] 12 | address = ":443" 13 | [entryPoints.https.tls] 14 | 15 | [retry] 16 | 17 | [api] 18 | 19 | [docker] 20 | endpoint = "unix:///var/run/docker.sock" 21 | watch = true 22 | exposedByDefault = false 23 | 24 | [acme] 25 | # use staging server during testing 26 | #caServer = "https://acme-staging-v02.api.letsencrypt.org/directory" 27 | storage = "/data/acme.json" 28 | entryPoint = "https" 29 | onHostRule = true 30 | [acme.httpChallenge] 31 | entryPoint = "http" 32 | -------------------------------------------------------------------------------- /deployment/kubernetes/kubernetes-deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 4 | # Copyright (c) 2010-2019 Contributors to the openHAB project 5 | # 6 | # See the NOTICE file(s) distributed with this work for additional 7 | # information. 8 | # 9 | # This program and the accompanying materials are made available under the 10 | # terms of the Eclipse Public License 2.0 which is available at 11 | # http://www.eclipse.org/legal/epl-2.0 12 | # 13 | # SPDX-License-Identifier: EPL-2.0 14 | # 15 | 16 | # Contributors: 17 | # Mehmet Arziman (home-iX) - initial contribution 18 | 19 | set -e 20 | 21 | KUBERNETES_NAMESPACE=openhab-cloud 22 | KUBERNETES_ACCOUNT=openhabcloud 23 | 24 | 25 | echo DEPLOYING OPENHAB-CLOUD TO KUBERNETES 26 | 27 | # Creating the openHAB-cloud namespace 28 | 29 | kubectl create namespace $KUBERNETES_NAMESPACE 30 | 31 | # Creating a service account in the namespace 32 | 33 | kubectl create serviceaccount $KUBERNETES_ACCOUNT --namespace $KUBERNETES_NAMESPACE 34 | 35 | 36 | ### Create openHAB-cloud from template 37 | 38 | echo Creating openHAB-cloud from template ... 39 | 40 | kubectl create -f openhabcloud_ephemeral_k8_template.yml --namespace $KUBERNETES_NAMESPACE 41 | 42 | echo Creating openHAB-cloud from template ... done! 43 | 44 | echo DEPLOYED OPENHAB-CLOUD TO KUBERNETES 45 | -------------------------------------------------------------------------------- /deployment/kubernetes/kubernetes-undeploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 4 | # Copyright (c) 2010-2019 Contributors to the openHAB project 5 | # 6 | # See the NOTICE file(s) distributed with this work for additional 7 | # information. 8 | # 9 | # This program and the accompanying materials are made available under the 10 | # terms of the Eclipse Public License 2.0 which is available at 11 | # http://www.eclipse.org/legal/epl-2.0 12 | # 13 | # SPDX-License-Identifier: EPL-2.0 14 | # 15 | 16 | # Contributors: 17 | # Mehmet Arziman (home-iX) - initial contribution 18 | 19 | set -e 20 | 21 | KUBERNETES_NAMESPACE=openhab-cloud 22 | 23 | echo UNDEPLOYING OPENHAB-CLOUD FROM KUBERNETES 24 | 25 | # Deleting openHAB-cloud namespace and implicitly all services, deployments etc. 26 | kubectl delete namespace $KUBERNETES_NAMESPACE 27 | 28 | echo UNDEPLOYED OPENHAB-CLOUD FROM KUBERNETES 29 | -------------------------------------------------------------------------------- /deployment/openshift/openshift-deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 4 | # Copyright (c) 2010-2019 Contributors to the openHAB project 5 | # 6 | # See the NOTICE file(s) distributed with this work for additional 7 | # information. 8 | # 9 | # This program and the accompanying materials are made available under the 10 | # terms of the Eclipse Public License 2.0 which is available at 11 | # http://www.eclipse.org/legal/epl-2.0 12 | # 13 | # SPDX-License-Identifier: EPL-2.0 14 | # 15 | 16 | # Contributors: 17 | # Mehmet Arziman (home-iX) - initial contribution 18 | 19 | set -e 20 | 21 | export OPENSHIFT_HOST=${OPENSHIFT_HOST:='localhost:8443'} 22 | export OPENSHIFT_USER=${OPENSHIFT_USER:='admin'} 23 | export OPENSHIFT_PASS=${OPENSHIFT_PASS:='admin'} 24 | export OPENSHIFT_LOGIN_OPTS=${OPENSHIFT_LOGIN_OPTS:=''} 25 | export OPENSHIFT_PROJECT_NAME=${OPENSHIFT_PROJECT_NAME:='openhab-cloud'} 26 | 27 | ### Login into OpenShift 28 | 29 | oc login ${OPENSHIFT_HOST} --username=${OPENSHIFT_USER} --password=${OPENSHIFT_PASS} ${OPENSHIFT_LOGIN_OPTS} 30 | 31 | ### Create openHAB-cloud project 32 | 33 | oc new-project "${OPENSHIFT_PROJECT_NAME}" --description="openHAB Cloud Service" --display-name="openHAB Cloud" 34 | 35 | ### Create openHAB-cloud from template 36 | 37 | echo Creating openHAB-cloud from template ... 38 | 39 | oc create -f openhabcloud_ephemeral_os_template.yml -n "${OPENSHIFT_PROJECT_NAME}" 40 | 41 | echo Creating openHAB-cloud from template ... done! 42 | -------------------------------------------------------------------------------- /deployment/openshift/openshift-undeploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 4 | # Copyright (c) 2010-2019 Contributors to the openHAB project 5 | # 6 | # See the NOTICE file(s) distributed with this work for additional 7 | # information. 8 | # 9 | # This program and the accompanying materials are made available under the 10 | # terms of the Eclipse Public License 2.0 which is available at 11 | # http://www.eclipse.org/legal/epl-2.0 12 | # 13 | # SPDX-License-Identifier: EPL-2.0 14 | # 15 | 16 | # Contributors: 17 | # Mehmet Arziman (home-iX) - initial contribution 18 | 19 | set -e 20 | 21 | OPENSHIFT_PROJECT_NAME=openhab-cloud 22 | 23 | echo UNDEPLOYING OPENHAB-CLOUD FROM OPENSHIFT 24 | 25 | # Deleting openHAB-cloud project and implicitly all services, deployments etc. 26 | oc delete project $OPENSHIFT_PROJECT_NAME 27 | 28 | echo UNDEPLOYED OPENHAB-CLOUD FROM OPENSHIFT 29 | -------------------------------------------------------------------------------- /docs/AWS_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_1.png -------------------------------------------------------------------------------- /docs/AWS_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_10.png -------------------------------------------------------------------------------- /docs/AWS_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_11.png -------------------------------------------------------------------------------- /docs/AWS_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_12.png -------------------------------------------------------------------------------- /docs/AWS_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_13.png -------------------------------------------------------------------------------- /docs/AWS_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_2.png -------------------------------------------------------------------------------- /docs/AWS_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_3.png -------------------------------------------------------------------------------- /docs/AWS_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_4.png -------------------------------------------------------------------------------- /docs/AWS_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_5.png -------------------------------------------------------------------------------- /docs/AWS_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_6.png -------------------------------------------------------------------------------- /docs/AWS_7.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_7.1.png -------------------------------------------------------------------------------- /docs/AWS_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_7.png -------------------------------------------------------------------------------- /docs/AWS_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_8.png -------------------------------------------------------------------------------- /docs/AWS_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/AWS_9.png -------------------------------------------------------------------------------- /docs/FunctionalArchitecture_openHAB-cloud_v1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/docs/FunctionalArchitecture_openHAB-cloud_v1.0.png -------------------------------------------------------------------------------- /etc/nginx-openhabcloud-lb-redirects.conf: -------------------------------------------------------------------------------- 1 | 2 | #if the proxy specified in our cookie is down, we will pick a new one 3 | location @proxy_down { 4 | proxy_pass http://proxyapp; 5 | proxy_redirect off; 6 | proxy_http_version 1.1; 7 | proxy_set_header Host $host; 8 | proxy_set_header X-Real-IP $remote_addr ; 9 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; 10 | proxy_set_header X-Forwarded-Proto https; 11 | proxy_intercept_errors on; 12 | recursive_error_pages on; 13 | error_page 307 = @handle_proxy; 14 | } 15 | 16 | #The cloud-director process will send back a 307 with the location of the 17 | #server to proxy to which this will follow and proxy the original request 18 | location @handle_proxy { 19 | set $proxy_server '$upstream_http_location'; 20 | proxy_pass $proxy_server$is_args$args; 21 | proxy_redirect off; 22 | proxy_http_version 1.1; 23 | proxy_set_header Host $host; 24 | proxy_set_header X-Real-IP $remote_addr ; 25 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; 26 | proxy_set_header X-Forwarded-Proto https; 27 | proxy_intercept_errors on; 28 | recursive_error_pages on; 29 | error_page 307 = @handle_proxy; 30 | } 31 | -------------------------------------------------------------------------------- /etc/nginx_openhabcloud.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen *:443; 3 | listen *:80; 4 | ssl on; 5 | ssl_certificate /etc/nginx/ssl/openhabcloud.crt; 6 | ssl_certificate_key /etc/nginx/ssl/openhabcloud.key; 7 | server_name your-openhab-cloud-host; 8 | 9 | if ( $scheme = "http" ) { 10 | rewrite ^/(.*)$ https://$host/$1 permanent; 11 | } 12 | 13 | charset utf-8; 14 | 15 | access_log /var/log/nginx/openhab-cloud.org-access.log; 16 | error_log /var/log/nginx/openhab-cloud.org-error.log; 17 | client_max_body_size 300m; 18 | 19 | 20 | location /css { 21 | alias /opt/openhabcloud/public/css; 22 | } 23 | location /js { 24 | alias /opt/openhabcloud/public/js; 25 | } 26 | location /img { 27 | alias /opt/openhabcloud/public/img; 28 | } 29 | location /bootstrap { 30 | alias /opt/openhabcloud/public/bootstrap; 31 | } 32 | location /font-icons { 33 | alias /opt/openhabcloud/public/font-icons; 34 | } 35 | location /fonts { 36 | alias /opt/openhabcloud/public/fonts; 37 | } 38 | location /js-plugin { 39 | alias /opt/openhabcloud/public/js-plugin; 40 | } 41 | location /downloads { 42 | alias /opt/openhabcloud/public/downloads; 43 | } 44 | location / { 45 | proxy_pass http://localhost:3000; 46 | proxy_redirect off; 47 | proxy_http_version 1.1; 48 | proxy_set_header Host $host; 49 | proxy_set_header Upgrade $http_upgrade; 50 | proxy_set_header Connection "upgrade"; 51 | proxy_set_header X-Real-IP $remote_addr ; 52 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; 53 | proxy_set_header X-Forwarded-Proto https; 54 | } 55 | 56 | #error_page 404 /404.html; 57 | 58 | # redirect server error pages to the static page /50x.html 59 | # 60 | error_page 500 502 503 504 /50x.html; 61 | location = /50x.html { 62 | root html; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /etc/openhabcloud-main@.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=node.js openhab cloud server 3 | 4 | [Service] 5 | User=openhabcloud 6 | Group=openhabcloud 7 | LimitNOFILE=300000 8 | Environment=NODE_ENV=production 9 | Environment=TASK=main 10 | Environment=PORT=%i 11 | Environment=HOST=127.0.0.1 12 | #Environment=DEBUG=oath2orize 13 | Restart=always 14 | RestartSec=10 # Restart service after 10 seconds if node service crashes 15 | StandardOutput=syslog # Output to syslog 16 | StandardError=syslog # Output to syslog 17 | SyslogIdentifier=openhabcloud 18 | WorkingDirectory=/home/openhabcloud/openhabcloud 19 | ExecStart=/home/openhabcloud/.nvm/versions/node/v7.5.0/bin/node --max-old-space-size=8192 /home/openhabcloud/openhabcloud/app.js 20 | [Install] 21 | WantedBy=multi-user.target 22 | -------------------------------------------------------------------------------- /etc/openhabcloud-web@.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=node.js openhab cloud server www process (no disconnect notices/socket management) 3 | 4 | [Service] 5 | User=openhabcloud 6 | Group=openhabcloud 7 | LimitNOFILE=300000 8 | Environment=NODE_ENV=production 9 | Environment=TASK=web 10 | Environment=PORT=%i 11 | Environment=HOST=127.0.0.1 12 | #Environment=DEBUG=oath2orize 13 | Restart=always 14 | RestartSec=10 # Restart service after 10 seconds if node service crashes 15 | StandardOutput=syslog # Output to syslog 16 | StandardError=syslog # Output to syslog 17 | SyslogIdentifier=openhabcloud 18 | WorkingDirectory=/home/openhabcloud/openhabcloud 19 | ExecStart=/home/openhabcloud/.nvm/versions/node/v7.5.0/bin/node --max-old-space-size=8192 /home/openhabcloud/openhabcloud/app.js 20 | [Install] 21 | WantedBy=multi-user.target 22 | -------------------------------------------------------------------------------- /etc/openhabcloud.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=node.js openhab cloud server 3 | 4 | [Service] 5 | User=openhabcloud 6 | Group=openhabcloud 7 | Environment=NODE_ENV=production 8 | #Environment=DEBUG=oath2orize 9 | Restart=always 10 | RestartSec=10 # Restart service after 10 seconds if node service crashes 11 | StandardOutput=syslog # Output to syslog 12 | StandardError=syslog # Output to syslog 13 | SyslogIdentifier=openhabcloud 14 | WorkingDirectory=/home/openhabcloud/openhabcloud 15 | ExecStart=/home/openhabcloud/.nvm/v0.10.48/bin/node /home/openhabcloud/openhabcloud/app.js 16 | [Install] 17 | WantedBy=multi-user.target 18 | -------------------------------------------------------------------------------- /mailer.js: -------------------------------------------------------------------------------- 1 | //This is an utility class to send e-mails to a user on behalf of openhab-cloud 2 | const path = require('path'), 3 | templatesDir = path.resolve(__dirname, '.', 'templates'), 4 | nodemailer = require('nodemailer'), 5 | logger = require('./logger.js'), 6 | app = require('./app'), 7 | productionEnv = process.env.NODE_ENV || 'dev'; 8 | 9 | const Email = require('email-templates'); 10 | 11 | if (productionEnv === 'production') { 12 | module.exports.sendEmail = function(email, subject, templateName, locals, cb) { 13 | let transport; 14 | try { 15 | let smtpConfig = { 16 | host : app.config.mailer.host, 17 | port : app.config.mailer.port, 18 | secure : app.config.mailer.secureConnection, // use SSL 19 | tls : { 20 | rejectUnauthorized : false 21 | } 22 | }; 23 | if(app.config.mailer.user){ 24 | smtpConfig.auth = { 25 | user : app.config.mailer.user, 26 | pass : app.config.mailer.password 27 | }; 28 | } 29 | transport = nodemailer.createTransport(smtpConfig); 30 | } catch (error) { 31 | logger.error('sendMail error occured during SMTP transport: ' + error ); 32 | } 33 | try { 34 | const message = { 35 | from : app.config.mailer.from, 36 | to : email, 37 | subject : subject, 38 | generateTextFromHTML : true 39 | }; 40 | const emailsender = new Email({ 41 | views : { 42 | root : templatesDir, 43 | options : { 44 | extension : 'ejs' 45 | } 46 | }, 47 | transport : transport 48 | }); 49 | 50 | emailsender.send({ 51 | template : templateName, 52 | message : message, 53 | locals : locals 54 | }); 55 | cb(null); 56 | } catch (error) { 57 | logger.error('sendMail error occured during sending: ' + error); 58 | } 59 | } 60 | } else { 61 | logger.info('Mailer will emulate sending in development environment'); 62 | module.exports.sendEmail = function(email, subject, templateName, locals, cb) { 63 | logger.info('Emulating sendEmail to ' + email + ' about ' + subject); 64 | cb(null); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /makeadmin.js: -------------------------------------------------------------------------------- 1 | // This is a small CLI utility to make a user member of staff 2 | 3 | var mongoose = require('mongoose'), 4 | logger = require('./logger.js'), 5 | config = require('./config.json'), 6 | User = require('./models/user'), 7 | system = require('./system'), 8 | MongoConnect = require('./system/mongoconnect'), 9 | mongoConnect; 10 | 11 | system.setConfiguration(config); 12 | mongoConnect = new MongoConnect(system); 13 | mongoConnect.connect(mongoose); 14 | 15 | username = process.argv[2]; 16 | 17 | if (!username) { 18 | console.log('Usage: node makeadmin.js '); 19 | process.exit(0); 20 | } 21 | 22 | User.findOne({username: username}, function(error, user) { 23 | if (!error && user) { 24 | console.log('Found ' + username + 'user, making him staff'); 25 | user.group = 'staff'; 26 | user.save(function(error) { 27 | process.exit(0); 28 | }); 29 | } else if (!user) { 30 | console.log('User ' + username + ' not found!'); 31 | process.exit(0); 32 | } else { 33 | console.log('Error: ' + error); 34 | process.exit(0); 35 | } 36 | }); 37 | -------------------------------------------------------------------------------- /makeinvites.js: -------------------------------------------------------------------------------- 1 | var config = require('./config.json'), 2 | mongoose = require('mongoose'), 3 | uuid = require('uuid'), 4 | mongooseTypes = require('mongoose-types'), 5 | Invitation = require('./models/invitation'), 6 | system = require('./system'), 7 | MongoConnect = require('./system/mongoconnect'), 8 | mongoConnect; 9 | 10 | system.setConfiguration(config); 11 | mongoConnect = new MongoConnect(system); 12 | mongoConnect.connect(mongoose); 13 | mongooseTypes.loadTypes(mongoose); 14 | 15 | console.log('Making 10 invitations!'); 16 | for (i=0; i<10; i++) { 17 | var invitationCode, 18 | invite; 19 | 20 | invitationCode = uuid.v1(); 21 | invite = new Invitation({code: invitationCode, email: 'openhab@openhab.org'}); 22 | console.log('New invitation code ' + invitationCode); 23 | invite.save(function (err, invitation) { 24 | console.log('callback'); 25 | if (err) { 26 | console.log('Error'); 27 | } else { 28 | console.log('Saved: ' + invitation); 29 | } 30 | }); 31 | } 32 | 33 | console.log('Complete!'); 34 | -------------------------------------------------------------------------------- /models/emailverification.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose') 2 | ,Schema = mongoose.Schema 3 | ,ObjectId = mongoose.SchemaTypes.ObjectId 4 | ,logger = require('../logger.js') 5 | ,uuid = require('uuid') 6 | ,mailer = require('../mailer'); 7 | 8 | var EmailVerificationSchema = new Schema({ 9 | code: String, 10 | email: String, 11 | user: {type: ObjectId, ref: 'User'}, 12 | used: {type: Boolean, default: false}, 13 | created: { type: Date, default: Date.now, expires: '30d'} 14 | }); 15 | 16 | // This is a static method to create and send a new invitation in one shot! 17 | 18 | EmailVerificationSchema.static('send', function(user, cb) { 19 | var emailVerification = new this; 20 | emailVerification.code = uuid.v1(); 21 | emailVerification.user = user.id; 22 | emailVerification.email = user.username; 23 | emailVerification.save(function(err, emailVerificationSaved) { 24 | if (err) { 25 | logger.error('Error: ' + err); 26 | cb(err, null); 27 | } else { 28 | var locals = { 29 | email: emailVerificationSaved.email, 30 | code: emailVerificationSaved.code 31 | }; 32 | mailer.sendEmail(emailVerificationSaved.email, 'My openHAB account activation', 'activation-email', locals, function(error) { 33 | if (error) { 34 | logger.error('Error: ' + error); 35 | cb(error, null); 36 | } else { 37 | cb(null, emailVerificationSaved); 38 | } 39 | }); 40 | } 41 | }); 42 | }); 43 | 44 | EmailVerificationSchema.method('resend', function (cb) { 45 | var locals = { 46 | email: this.email, 47 | code: this.code 48 | }; 49 | mailer.sendEmail(this.email, 'My openHAB account activation', 'activation-email', locals, function(error) { 50 | if (error) { 51 | logger.error('Error: ' + error); 52 | cb(error); 53 | } else { 54 | cb(null); 55 | } 56 | }); 57 | }); 58 | 59 | module.exports = mongoose.model('EmailVerification', EmailVerificationSchema); 60 | -------------------------------------------------------------------------------- /models/enrollment.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var EnrollmentSchema = new Schema({ 6 | email: String, 7 | platform: String, 8 | javaExp: String, 9 | description: String, 10 | created: { type: Date, default: Date.now }, 11 | invited: { type: Date } 12 | }); 13 | 14 | module.exports = mongoose.model('Enrollment', EnrollmentSchema); 15 | -------------------------------------------------------------------------------- /models/event.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | const goodColor = "#e0f0d5"; 6 | const badColor = "#f1dede"; 7 | const infoColor = "#daedf8"; 8 | 9 | var EventSchema = new Schema({ 10 | openhab: ObjectId, 11 | source: String, 12 | oldStatus: String, 13 | status: String, 14 | numericStatus: Number, 15 | oldNumericStatus: Number, 16 | color: String, 17 | when: {type: Date, default: Date.now, expires: '14d'} 18 | }, { 19 | versionKey: false, 20 | safe: { w: 0, j: false, wtimeout: 10000 }, 21 | validateBeforeSave: false, 22 | strict: false 23 | }); 24 | 25 | // Index for event list reads 26 | EventSchema.index({openhab: 1}); 27 | EventSchema.index({openhab: 1, when: 1}); 28 | EventSchema.index({openhab: 1, source: 1}); 29 | EventSchema.index({openhab: 1, source: 1, status:1}); 30 | EventSchema.index({openhab: 1, source: 1, numericStatus: 1, oldNumericStatus: 1}); 31 | 32 | // Returns #xxxxxx color code based on event color 33 | EventSchema.virtual('colorHex').get(function () { 34 | if (this.color == 'good') 35 | return goodColor; 36 | else if (this.color == 'bad') 37 | return badColor; 38 | else if (this.color == 'info') 39 | return infoColor; 40 | }); 41 | 42 | module.exports = mongoose.model('Event', EventSchema); 43 | -------------------------------------------------------------------------------- /models/invitation.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose') 2 | ,Schema = mongoose.Schema 3 | ,ObjectId = mongoose.SchemaTypes.ObjectId 4 | ,logger = require('../logger.js') 5 | ,uuid = require('uuid') 6 | ,mailer = require('../mailer'); 7 | 8 | var InvitationSchema = new Schema({ 9 | code: String, 10 | email: String, 11 | used: {type: Boolean, default: false}, 12 | lastNotified: {type: Date}, 13 | created: { type: Date, default: Date.now, expires: '30d' }, 14 | activated: { type: Date } 15 | }); 16 | 17 | // This is a static method to create and send a new invitation in one shot! 18 | 19 | InvitationSchema.static('send', function(email, cb) { 20 | var invite = new this(); 21 | invite.code = uuid.v1(); 22 | invite.email = email; 23 | invite.save(function(err, invitation) { 24 | if (err) { 25 | logger.error('Error: ' + err); 26 | cb(err, null); 27 | } else { 28 | var locals = { 29 | email: invite.email, 30 | invitationCode: invite.code 31 | }; 32 | mailer.sendEmail(invite.email, 'My openHAB invitation', 'invitation-email', locals, function(error) { 33 | if (error) { 34 | cb(error, null); 35 | } else { 36 | cb(null, invite); 37 | } 38 | }); 39 | } 40 | }); 41 | 42 | }); 43 | 44 | InvitationSchema.method('resend', function (cb) { 45 | var locals = { 46 | email: this.email, 47 | invitationCode: this.code 48 | }; 49 | mailer.sendEmail(this.email, 'My openHAB invitation', 'invitation-email', locals, function(error) { 50 | if (error) { 51 | cb(error); 52 | } else { 53 | cb(null); 54 | } 55 | }); 56 | }); 57 | 58 | module.exports = mongoose.model('Invitation', InvitationSchema); 59 | -------------------------------------------------------------------------------- /models/item.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var ItemSchema = new Schema({ 6 | openhab: ObjectId, // openHAB this item belongs to 7 | name: String, // Item name 8 | type: String, // Item type (Group, Switch, Number, etc) 9 | label: String, // Item label ("Dinner lights") 10 | groups: [ObjectId], // An array of ObjectIds of Group typed Items this Item belongs to 11 | icon: String, // icon name for this Item 12 | status: String, // Current Item status 13 | prev_status: String, // Previous status value 14 | last_update: Date, // Date/time of last Item status update 15 | last_change: Date, // Date/time of last Item change 16 | states: [Schema.Types.Mixed] // We cache last X (50?) states of the item in this array 17 | // in a form of {when: Date, value: String}, latest values first in array 18 | }, { 19 | versionKey: false, 20 | safe: { w: 0, j: false, wtimeout: 10000 }, 21 | validateBeforeSave: false, 22 | strict: false 23 | }); 24 | 25 | ItemSchema.index({openhab:1, name:1}, { unique: true }); 26 | 27 | module.exports = mongoose.model('Item', ItemSchema); 28 | -------------------------------------------------------------------------------- /models/lostpassword.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | 6 | var LostPasswordSchema = new Schema({ 7 | user: ObjectId, 8 | recoveryCode: String, 9 | used: { type: Boolean, default: false }, 10 | created: { type: Date, default: Date.now, expires: '30d' } 11 | }); 12 | 13 | LostPasswordSchema.index({user:1, created:1}); 14 | 15 | module.exports = mongoose.model('LostPassword', LostPasswordSchema); 16 | -------------------------------------------------------------------------------- /models/notification.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var NotificationSchema = new Schema({ 6 | user: {type: ObjectId, ref: 'User'}, 7 | message: String, 8 | icon: String, 9 | severity: String, 10 | acknowledged: Boolean, 11 | payload: { 12 | type: Schema.Types.Mixed, 13 | default: {} 14 | }, 15 | created: { type: Date, default: Date.now, expires: '30d' } 16 | }); 17 | 18 | NotificationSchema.index({user:1, created:1}); 19 | 20 | module.exports = mongoose.model('Notification', NotificationSchema); 21 | -------------------------------------------------------------------------------- /models/oauth2client.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var OAuth2ClientSchema = new Schema({ 6 | name: String, // Client name 7 | description: String, 8 | homeUrl: String, 9 | icon: String, 10 | clientId: String, // Client oauth2 id 11 | clientSecret: String, // Client oauth2 secret 12 | active: { type: Boolean, default: true}, // If this client is active? 13 | created: { type: Date, default: Date.now }, // When client was created 14 | last_change: Date // Date/time of last client change 15 | }); 16 | 17 | OAuth2ClientSchema.index({clientId:1}, { unique: true }); // to find client by client id 18 | 19 | module.exports = mongoose.model('OAuth2Client', OAuth2ClientSchema); 20 | -------------------------------------------------------------------------------- /models/oauth2code.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var OAuth2CodeSchema = new Schema({ 6 | user: ObjectId, // openhab-cloud user this code belongs to 7 | oAuthClient: ObjectId, // openhab-cloud OAuth2 Client this code was created for 8 | code: String, // code itself 9 | scope: [String], // code scope (what can be done with this code?) 10 | redirectURI: String, // redirect URI 11 | valid: { type: Boolean, default: true}, // Is this code is active? 12 | created: { type: Date, default: Date.now } // When code was created 13 | }); 14 | 15 | OAuth2CodeSchema.index({code: 1, oAuthClient:1}, { unique: false }); // to find code by code and client 16 | OAuth2CodeSchema.index({code: 1, oAuthClient:1, redirectURI:1}, { unique: false }); // to find token by token, client and URI 17 | OAuth2CodeSchema.index({user: 1}, { unique: false }); // to find token by user 18 | 19 | module.exports = mongoose.model('OAuth2Code', OAuth2CodeSchema); 20 | -------------------------------------------------------------------------------- /models/oauth2scope.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var OAuth2ScopeSchema = new Schema({ 6 | name: String, // name of the scope 7 | description: String, // description of what does this scope permits to do for user 8 | valid: { type: Boolean, default: true}, // Is this scope is active? 9 | created: { type: Date, default: Date.now } // When scope was created 10 | }); 11 | 12 | OAuth2ScopeSchema.index({name: 1}, { unique: true }); // to find token by token and client 13 | 14 | module.exports = mongoose.model('OAuth2Scope', OAuth2ScopeSchema); 15 | -------------------------------------------------------------------------------- /models/oauth2token.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | var ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var OAuth2TokenSchema = new Schema({ 6 | user: ObjectId, // openhab-cloud user this token belongs to 7 | oAuthClient: {type: ObjectId, ref: 'OAuth2Client'}, // openhab-cloud OAuth2 Client this token was created for 8 | token: String, // token 9 | scope: [String], // token scope (what can be done with this token?) 10 | valid: { type: Boolean, default: true}, // Is this token is active? 11 | created: { type: Date, default: Date.now } // When token was created 12 | }); 13 | 14 | OAuth2TokenSchema.index({token: 1, oAuthClient:1}, { unique: false }); // to find token by token and client 15 | OAuth2TokenSchema.index({user: 1}, { unique: false }); // to find token by user 16 | 17 | module.exports = mongoose.model('OAuth2Token', OAuth2TokenSchema); 18 | -------------------------------------------------------------------------------- /models/openhab.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema, 3 | ObjectId = mongoose.SchemaTypes.ObjectId; 4 | 5 | var OpenhabSchema = new Schema({ 6 | name: String, // A meaningfull name of openHAB 7 | uuid: { type: String, unique: true }, // openHAB generated UUID 8 | secret: String, // openHAB generated secret 9 | account: { type: ObjectId }, // An account openHAB belongs to 10 | last_online: { type: Date } // last seen this openHAB online 11 | }); 12 | 13 | // Index for lookups by uuid 14 | OpenhabSchema.index({ uuid: 1 }); 15 | // Index for lookups by owner 16 | OpenhabSchema.index({ account: 1 }); 17 | 18 | OpenhabSchema.methods.authenticate = function (openhabUuid, openhabSecret, callback) { 19 | this.model('Openhab').findOne({ uuid: openhabUuid, secret: openhabSecret }, function (error, openhab) { 20 | if (error) { 21 | callback(error, false); 22 | } else { 23 | if (openhab) { 24 | callback(null, true); 25 | } else { 26 | callback(null, false); 27 | } 28 | } 29 | }); 30 | } 31 | 32 | OpenhabSchema.statics.setLastOnline = function (id, callback) { 33 | this.model('Openhab').findOneAndUpdate( 34 | { _id: new mongoose.Types.ObjectId(id)}, 35 | { $set: { last_online: new Date() } }, 36 | callback); 37 | } 38 | 39 | module.exports = mongoose.model('Openhab', OpenhabSchema); 40 | -------------------------------------------------------------------------------- /models/useraccount.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema, 3 | bcrypt = require('bcrypt'), 4 | Openhab = require('./openhab'), 5 | Email = mongoose.SchemaTypes.Email, 6 | ObjectId = mongoose.SchemaTypes.ObjectId; 7 | 8 | var UserAccountSchema = new Schema({ 9 | modified: {type: Date}, 10 | registered: { type: Date } 11 | }); 12 | 13 | // Index for lookups by owner, type and uniq id 14 | UserAccountSchema.index({owner:1, deviceType:1, deviceId:1}); 15 | 16 | module.exports = mongoose.model('UserAccount', UserAccountSchema); 17 | -------------------------------------------------------------------------------- /models/userdevice.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | Schema = mongoose.Schema, 3 | bcrypt = require('bcrypt'), 4 | Openhab = require('./openhab'), 5 | Email = mongoose.SchemaTypes.Email, 6 | ObjectId = mongoose.SchemaTypes.ObjectId; 7 | 8 | var UserDeviceSchema = new Schema({ 9 | owner: {type: ObjectId, required: true}, 10 | androidRegistration: {type: String}, // Deprecated in favor of fcmRegistration 11 | iosDeviceToken: {type: String}, // will migrate to fcmRegistration in the future 12 | fcmRegistration : {type: String}, //Firebase Cloud Messaging registration token 13 | deviceType: {type: String}, 14 | deviceModel: {type: String}, 15 | deviceId: {type: String}, 16 | lastUpdate: { type: Date }, 17 | registered: { type: Date } 18 | }); 19 | 20 | // Index for lookups by owner, type and uniq id 21 | UserDeviceSchema.index({owner:1, deviceType:1, deviceId:1}); 22 | // Index for lookups by android registration 23 | UserDeviceSchema.index({androidRegistration:1}); 24 | // Index for lookups by ios device token 25 | UserDeviceSchema.index({iosDeviceToken:1}); 26 | // Index for lookups by FCM device token 27 | UserDeviceSchema.index({fcmRegistration:1}); 28 | 29 | module.exports = mongoose.model('UserDevice', UserDeviceSchema); 30 | -------------------------------------------------------------------------------- /notificationsender/aps-helper.js: -------------------------------------------------------------------------------- 1 | const { APNS, Notification, Errors } = require('apns2'), 2 | app = require('./../app'), 3 | logger = require('./../logger'), 4 | fs = require('fs'); 5 | let client = null; 6 | 7 | if (app.config.apn && app.config.apn.signingKey) { 8 | client = new APNS({ 9 | ...app.config.apn, 10 | signingKey: fs.readFileSync(`${app.config.apn.signingKey}`) 11 | }); 12 | client.on(Errors.error, (err) => { 13 | logger.error(`APN error ${err.reason} ${err.statusCode} ${err.notification.deviceToken}`) 14 | }) 15 | } 16 | 17 | module.exports.sendAppleNotification = function (deviceToken, message, payload) { 18 | logger.debug(`aps-helper sending ${message} to device ${deviceToken}`) 19 | const notification = new Notification(deviceToken, { 20 | aps: { 21 | badge: 0, 22 | sound: { name: 'default' }, 23 | alert: { body: message } 24 | }, 25 | ...(payload) 26 | }) 27 | if (client) { 28 | client.send(notification).catch(err => { 29 | logger.error(`APN error ${err.reason} ${err.statusCode} ${err.notification.deviceToken}`) 30 | }); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /public/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /public/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /public/downloads/org.openhab.io.myopenhab-1.3.0-SNAPSHOT.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/downloads/org.openhab.io.myopenhab-1.3.0-SNAPSHOT.jar -------------------------------------------------------------------------------- /public/font-icons/custom-icons/BCk-safari-pc/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Font license info 2 | 3 | 4 | ## Font Awesome 5 | 6 | Copyright (C) 2012 by Dave Gandy 7 | 8 | Author: Dave Gandy 9 | License: CC BY 3.0 (http://creativecommons.org/licenses/by/3.0/) 10 | Homepage: http://fortawesome.github.com/Font-Awesome/ 11 | 12 | 13 | ## Web Symbols 14 | 15 | Copyright (c) 2011 by Just Be Nice studio. All rights reserved. 16 | 17 | Author: Just Be Nice studio 18 | License: SIL (http://scripts.sil.org/OFL) 19 | Homepage: http://www.justbenicestudio.com/studio/websymbols/ 20 | 21 | 22 | ## Entypo 23 | 24 | Copyright (C) 2012 by Daniel Bruce 25 | 26 | Author: Daniel Buce 27 | License: SIL (http://scripts.sil.org/OFL) 28 | Homepage: http://www.entypo.com 29 | 30 | 31 | ## Typicons 32 | 33 | (c) Stephen Hutchings 2012 34 | 35 | Author: Stephen Hutchings 36 | License: CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/) 37 | Homepage: http://typicons.com/ 38 | 39 | 40 | ## Brandico 41 | 42 | (C) 2012 by Vitaly Puzrin 43 | 44 | Author: Crowdsourced, for Fontello project 45 | License: SIL (http://scripts.sil.org/OFL) 46 | Homepage: 47 | 48 | 49 | -------------------------------------------------------------------------------- /public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.eot -------------------------------------------------------------------------------- /public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.ttf -------------------------------------------------------------------------------- /public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.woff -------------------------------------------------------------------------------- /public/font-icons/custom-icons/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Font license info 2 | 3 | 4 | ## Font Awesome 5 | 6 | Copyright (C) 2012 by Dave Gandy 7 | 8 | Author: Dave Gandy 9 | License: CC BY 3.0 (http://creativecommons.org/licenses/by/3.0/) 10 | Homepage: http://fortawesome.github.com/Font-Awesome/ 11 | 12 | 13 | ## Web Symbols 14 | 15 | Copyright (c) 2011 by Just Be Nice studio. All rights reserved. 16 | 17 | Author: Just Be Nice studio 18 | License: SIL (http://scripts.sil.org/OFL) 19 | Homepage: http://www.justbenicestudio.com/studio/websymbols/ 20 | 21 | 22 | ## Entypo 23 | 24 | Copyright (C) 2012 by Daniel Bruce 25 | 26 | Author: Daniel Buce 27 | License: SIL (http://scripts.sil.org/OFL) 28 | Homepage: http://www.entypo.com 29 | 30 | 31 | ## Typicons 32 | 33 | (c) Stephen Hutchings 2012 34 | 35 | Author: Stephen Hutchings 36 | License: CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/) 37 | Homepage: http://typicons.com/ 38 | 39 | 40 | ## Brandico 41 | 42 | (C) 2012 by Vitaly Puzrin 43 | 44 | Author: Crowdsourced, for Fontello project 45 | License: SIL (http://scripts.sil.org/OFL) 46 | Homepage: 47 | 48 | 49 | -------------------------------------------------------------------------------- /public/font-icons/custom-icons/README.txt: -------------------------------------------------------------------------------- 1 | This webfont is generated by http://fontello.com open source project. 2 | 3 | 4 | ================================================================================ 5 | Please, note, that you should obey original font licences, used to make this 6 | webfont pack. Details available in LICENSE.txt file. 7 | 8 | - Usually, it's enougth to publish content of LICENSE.txt file somewhere on your 9 | site in "About" section. 10 | 11 | - If your project is open-source, usually, it will be ok to make LICENSE.txt 12 | file publically available in your repository. 13 | 14 | - Fonts, used in Fontello, don't require to make clickable links on your site. 15 | But any kind of additional authors crediting is welcome. 16 | ================================================================================ 17 | 18 | 19 | Attention for server setup (IE users and others) 20 | ------------------------------------------------ 21 | 22 | You MUST setup server to reply with proper `mime-types` for font files. In other 23 | case, some browsers will fail to show fonts. 24 | 25 | Usually, `apache` already has necessary settings, but `nginx` and other 26 | webservers should be tuned. Here is list of mime types for our file extentions: 27 | 28 | - `application/vnd.ms-fontobject` - eot 29 | - `application/x-font-woff` - woff 30 | - `application/x-font-ttf` - ttf 31 | - `image/svg+xml` - svg 32 | 33 | 34 | Comments on archive content 35 | --------------------------- 36 | 37 | - /font/* - fonts in different formats 38 | 39 | - /css/* - different kinds of css, for all situations. Should be ok with 40 | twitter bootstrap. Also, you can skip style and assign icon classes 41 | directly to text elements 42 | 43 | - demo.html - demo file, to show your webfont content 44 | 45 | - LICENSE.txt - license info about source fonts, used to build your one. 46 | 47 | - config.json - keeps your settings. You can import it back to fontello anytime, 48 | to continue your work 49 | -------------------------------------------------------------------------------- /public/font-icons/custom-icons/font/custom-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/font-icons/custom-icons/font/custom-icons.eot -------------------------------------------------------------------------------- /public/font-icons/custom-icons/font/custom-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/font-icons/custom-icons/font/custom-icons.ttf -------------------------------------------------------------------------------- /public/font-icons/custom-icons/font/custom-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/font-icons/custom-icons/font/custom-icons.woff -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/img/Sans-titre-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/Sans-titre-2.png -------------------------------------------------------------------------------- /public/img/apps/google-play-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/apps/google-play-badge.png -------------------------------------------------------------------------------- /public/img/apps/openhab-iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/apps/openhab-iphone.png -------------------------------------------------------------------------------- /public/img/apps/openhab-iphone.pxm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/apps/openhab-iphone.pxm -------------------------------------------------------------------------------- /public/img/big-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/big-logo.png -------------------------------------------------------------------------------- /public/img/demo/dash1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/demo/dash1.png -------------------------------------------------------------------------------- /public/img/demo/dash2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/demo/dash2.png -------------------------------------------------------------------------------- /public/img/demo/dash3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/demo/dash3.png -------------------------------------------------------------------------------- /public/img/designer-rules.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/designer-rules.png -------------------------------------------------------------------------------- /public/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/favicon.ico -------------------------------------------------------------------------------- /public/img/features.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/features.png -------------------------------------------------------------------------------- /public/img/icon-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/icon-map.png -------------------------------------------------------------------------------- /public/img/icons/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/icons/ajax-loader.gif -------------------------------------------------------------------------------- /public/img/icons/main-nav-hoverstate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/icons/main-nav-hoverstate.png -------------------------------------------------------------------------------- /public/img/icons/main-nav-normalstate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/icons/main-nav-normalstate.png -------------------------------------------------------------------------------- /public/img/img-404.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/img-404.jpg -------------------------------------------------------------------------------- /public/img/img-fullwidth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/img-fullwidth.jpg -------------------------------------------------------------------------------- /public/img/map-trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/map-trigger.png -------------------------------------------------------------------------------- /public/img/oauth2/alexa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/oauth2/alexa.png -------------------------------------------------------------------------------- /public/img/oauth2/google-assistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/oauth2/google-assistant.png -------------------------------------------------------------------------------- /public/img/oauth2/ifttt-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/oauth2/ifttt-icon.png -------------------------------------------------------------------------------- /public/img/oauth2/instagram-icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/oauth2/instagram-icon.jpg -------------------------------------------------------------------------------- /public/img/oauth2/twitter-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/oauth2/twitter-icon.png -------------------------------------------------------------------------------- /public/img/openhab-automation-rules.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/openhab-automation-rules.jpg -------------------------------------------------------------------------------- /public/img/openhab-graphs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/openhab-graphs.jpg -------------------------------------------------------------------------------- /public/img/openhab-logo-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/openhab-logo-small.png -------------------------------------------------------------------------------- /public/img/openhab-logo-square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/openhab-logo-square.png -------------------------------------------------------------------------------- /public/img/openhab-logo-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/openhab-logo-top.png -------------------------------------------------------------------------------- /public/img/openhab-raspberry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/openhab-raspberry.jpg -------------------------------------------------------------------------------- /public/img/rs-arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/rs-arrows.png -------------------------------------------------------------------------------- /public/img/slider/rs/thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slider/rs/thumb.png -------------------------------------------------------------------------------- /public/img/slides/accordionswitch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/accordionswitch.png -------------------------------------------------------------------------------- /public/img/slides/badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/badge.png -------------------------------------------------------------------------------- /public/img/slides/bg-floor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/bg-floor.jpg -------------------------------------------------------------------------------- /public/img/slides/bgtile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/bgtile.jpg -------------------------------------------------------------------------------- /public/img/slides/bullets_boxed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/bullets_boxed.png -------------------------------------------------------------------------------- /public/img/slides/bullets_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/bullets_round.png -------------------------------------------------------------------------------- /public/img/slides/bullets_square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/bullets_square.png -------------------------------------------------------------------------------- /public/img/slides/burger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/burger.png -------------------------------------------------------------------------------- /public/img/slides/buynow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/buynow.png -------------------------------------------------------------------------------- /public/img/slides/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/check.png -------------------------------------------------------------------------------- /public/img/slides/coke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/coke.png -------------------------------------------------------------------------------- /public/img/slides/coloredbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/coloredbg.png -------------------------------------------------------------------------------- /public/img/slides/company1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/company1.png -------------------------------------------------------------------------------- /public/img/slides/company2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/company2.png -------------------------------------------------------------------------------- /public/img/slides/company3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/company3.png -------------------------------------------------------------------------------- /public/img/slides/dragnotch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/dragnotch.png -------------------------------------------------------------------------------- /public/img/slides/dragsliderbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/dragsliderbg.png -------------------------------------------------------------------------------- /public/img/slides/dude1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/dude1.png -------------------------------------------------------------------------------- /public/img/slides/dude2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/dude2.png -------------------------------------------------------------------------------- /public/img/slides/floor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/floor.png -------------------------------------------------------------------------------- /public/img/slides/girl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/girl1.png -------------------------------------------------------------------------------- /public/img/slides/glare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/glare.png -------------------------------------------------------------------------------- /public/img/slides/glare2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/glare2.png -------------------------------------------------------------------------------- /public/img/slides/image1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/image1.jpg -------------------------------------------------------------------------------- /public/img/slides/image16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/image16.jpg -------------------------------------------------------------------------------- /public/img/slides/image17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/image17.jpg -------------------------------------------------------------------------------- /public/img/slides/image18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/image18.jpg -------------------------------------------------------------------------------- /public/img/slides/image20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/image20.jpg -------------------------------------------------------------------------------- /public/img/slides/image21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/image21.jpg -------------------------------------------------------------------------------- /public/img/slides/image22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/image22.jpg -------------------------------------------------------------------------------- /public/img/slides/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/logo.png -------------------------------------------------------------------------------- /public/img/slides/mainBg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/mainBg.png -------------------------------------------------------------------------------- /public/img/slides/minishadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/minishadow.png -------------------------------------------------------------------------------- /public/img/slides/minishadow2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/minishadow2.png -------------------------------------------------------------------------------- /public/img/slides/minishadow3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/minishadow3.png -------------------------------------------------------------------------------- /public/img/slides/preview1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/preview1.png -------------------------------------------------------------------------------- /public/img/slides/preview2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/preview2.png -------------------------------------------------------------------------------- /public/img/slides/preview3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/preview3.png -------------------------------------------------------------------------------- /public/img/slides/radio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/radio.png -------------------------------------------------------------------------------- /public/img/slides/selectpreview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/selectpreview.png -------------------------------------------------------------------------------- /public/img/slides/shadow3_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/shadow3_large.png -------------------------------------------------------------------------------- /public/img/slides/sliderconfigheadline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/sliderconfigheadline.png -------------------------------------------------------------------------------- /public/img/slides/space.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/space.jpg -------------------------------------------------------------------------------- /public/img/slides/strawberries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/strawberries.png -------------------------------------------------------------------------------- /public/img/slides/thumb1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/thumb1.jpg -------------------------------------------------------------------------------- /public/img/slides/thumb2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/thumb2.jpg -------------------------------------------------------------------------------- /public/img/slides/thumb3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/thumb3.jpg -------------------------------------------------------------------------------- /public/img/slides/thumb4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/thumb4.jpg -------------------------------------------------------------------------------- /public/img/slides/transition_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_bg.png -------------------------------------------------------------------------------- /public/img/slides/transition_boxes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_boxes.png -------------------------------------------------------------------------------- /public/img/slides/transition_curtainone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_curtainone.png -------------------------------------------------------------------------------- /public/img/slides/transition_curtainthree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_curtainthree.png -------------------------------------------------------------------------------- /public/img/slides/transition_curtaintwo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_curtaintwo.png -------------------------------------------------------------------------------- /public/img/slides/transition_fade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_fade.png -------------------------------------------------------------------------------- /public/img/slides/transition_mixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_mixed.png -------------------------------------------------------------------------------- /public/img/slides/transition_slidedown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slidedown.png -------------------------------------------------------------------------------- /public/img/slides/transition_slideleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slideleft.png -------------------------------------------------------------------------------- /public/img/slides/transition_slideright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slideright.png -------------------------------------------------------------------------------- /public/img/slides/transition_slideup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slideup.png -------------------------------------------------------------------------------- /public/img/slides/transition_slotfadehorizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slotfadehorizontal.png -------------------------------------------------------------------------------- /public/img/slides/transition_slotfadevertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slotfadevertical.png -------------------------------------------------------------------------------- /public/img/slides/transition_slotslidehorizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slotslidehorizontal.png -------------------------------------------------------------------------------- /public/img/slides/transition_slotslidevertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slotslidevertical.png -------------------------------------------------------------------------------- /public/img/slides/transition_slotzoomhorizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slotzoomhorizontal.png -------------------------------------------------------------------------------- /public/img/slides/transition_slotzoomvertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transition_slotzoomvertical.png -------------------------------------------------------------------------------- /public/img/slides/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/transparent.png -------------------------------------------------------------------------------- /public/img/slides/wideimage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/wideimage.jpg -------------------------------------------------------------------------------- /public/img/slides/wideimage2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/slides/wideimage2.jpg -------------------------------------------------------------------------------- /public/img/subtle-noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/subtle-noise.png -------------------------------------------------------------------------------- /public/img/textures/Little-Neko-_0003_BOKEY-blue-green-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko-_0003_BOKEY-blue-green-light.jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko-_0008_BOKEY-blue5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko-_0008_BOKEY-blue5.jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko-_0017_BOKEY-orange8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko-_0017_BOKEY-orange8.jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko-_0026_BOKEY-light7- (2).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko-_0026_BOKEY-light7- (2).jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko-_0026_BOKEY-light7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko-_0026_BOKEY-light7.jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko_0000_BLUR1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko_0000_BLUR1.jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko_0003_woody4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko_0003_woody4.jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko_0007_tree8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko_0007_tree8.jpg -------------------------------------------------------------------------------- /public/img/textures/Little-Neko_pixel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/Little-Neko_pixel.jpg -------------------------------------------------------------------------------- /public/img/textures/bg-footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/bg-footer.png -------------------------------------------------------------------------------- /public/img/textures/bg-texture-grey-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/bg-texture-grey-dark.png -------------------------------------------------------------------------------- /public/img/textures/bg-texture-grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/bg-texture-grey.png -------------------------------------------------------------------------------- /public/img/textures/bg-texture-light-grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/bg-texture-light-grey.png -------------------------------------------------------------------------------- /public/img/textures/bg-texture-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/bg-texture-orange.png -------------------------------------------------------------------------------- /public/img/textures/bg-texture-video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/bg-texture-video.png -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko-_0003_BOKEY-blue-green-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko-_0003_BOKEY-blue-green-light.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko-_0008_BOKEY-blue5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko-_0008_BOKEY-blue5.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko-_0017_BOKEY-orange8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko-_0017_BOKEY-orange8.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko-_0026_BOKEY-light7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko-_0026_BOKEY-light7.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko_0000_BLUR1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko_0000_BLUR1.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko_0003_woody4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko_0003_woody4.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko_0007_tree8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko_0007_tree8.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/Little-Neko_pixel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/Little-Neko_pixel.jpg -------------------------------------------------------------------------------- /public/img/textures/full-size/texture-pixel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/full-size/texture-pixel.png -------------------------------------------------------------------------------- /public/img/textures/texture-pixel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/img/textures/texture-pixel.png -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/assets/img/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/ajax-contact-extend/assets/img/ajax-loader.gif -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/assets/img/error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/ajax-contact-extend/assets/img/error.gif -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/assets/img/success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/ajax-contact-extend/assets/img/success.gif -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/assets/img/verify/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/ajax-contact-extend/assets/img/verify/1.png -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/assets/img/verify/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/ajax-contact-extend/assets/img/verify/2.png -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/assets/img/verify/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/ajax-contact-extend/assets/img/verify/3.png -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/assets/js/jquery.jigowatt.js: -------------------------------------------------------------------------------- 1 | jQuery(document).ready(function() { 2 | 3 | $('#contactform').submit(function() { 4 | 5 | var action = $(this).attr('action'); 6 | var values = $(this).serialize(); 7 | 8 | $('#submit').attr('disabled', 'disabled').after(''); 9 | 10 | $("#message").slideUp(750, function() { 11 | 12 | $('#message').hide(); 13 | 14 | $.post(action, values, function(data) { 15 | 16 | $('#message').html(data); 17 | 18 | $('#message').slideDown('slow'); 19 | 20 | $('#contactform img.loader').fadeOut('fast', function() { 21 | $(this).remove() 22 | }); 23 | $('#submit').removeAttr('disabled'); 24 | if (data.match('success') != null) $('#contactform').slideUp('slow'); 25 | 26 | }); 27 | 28 | }); 29 | 30 | return false; 31 | 32 | }); 33 | 34 | }); -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/classes/image.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Send Direct Messages on Twitter

6 | 7 | 8 |
9 | Direct message:
10 |
11 | 12 |
13 | 14 | 37 | 38 | -------------------------------------------------------------------------------- /public/js-plugin/ajax-contact-extend/classes/twitter/EpiTwitter.php: -------------------------------------------------------------------------------- 1 | apiUrl . '/' . preg_replace('/[A-Z]|[0-9]+/e', "'/'.strtolower('\\0')", $parts) . '.json'; 16 | if(!empty($params)) 17 | $args = array_shift($params); 18 | 19 | return new EpiTwitterJson(call_user_func(array($this, 'httpRequest'), $method, $url, $args)); 20 | } 21 | 22 | public function __construct($consumerKey = null, $consumerSecret = null, $oauthToken = null, $oauthTokenSecret = null) 23 | { 24 | parent::__construct($consumerKey, $consumerSecret, self::EPITWITTER_SIGNATURE_METHOD); 25 | $this->setToken($oauthToken, $oauthTokenSecret); 26 | } 27 | } 28 | 29 | class EpiTwitterJson 30 | { 31 | private $resp; 32 | 33 | public function __construct($resp) 34 | { 35 | $this->resp = $resp; 36 | } 37 | 38 | public function __get($name) 39 | { 40 | $this->responseText = $this->resp->data; 41 | $this->response = (array)json_decode($this->responseText, 1); 42 | foreach($this->response as $k => $v) 43 | { 44 | $this->$k = $v; 45 | } 46 | 47 | return $this->$name; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /public/js-plugin/bootstrap-select/bootstrap-select.css: -------------------------------------------------------------------------------- 1 | .clearfix:after { 2 | visibility: hidden; 3 | display: block; 4 | font-size: 0; 5 | content: " "; 6 | clear: both; 7 | height: 0; 8 | } 9 | .bootstrap-select.btn-group, .bootstrap-select.btn-group[class*="span"] { 10 | float:none; 11 | display: inline-block; 12 | margin-bottom: 10px; 13 | margin-left:0; 14 | } 15 | .bootstrap-select {width: 220px;} 16 | .bootstrap-select .btn {width: 220px;} 17 | .bootstrap-select .btn:focus { 18 | outline: thin dotted #333333 !important; 19 | outline: 5px auto -webkit-focus-ring-color !important; 20 | outline-offset: -2px; 21 | } 22 | .bootstrap-select.btn-group .btn .filter-option { 23 | overflow:hidden; 24 | position:absolute; 25 | left:12px; 26 | right:25px; 27 | text-align:left; 28 | } 29 | .bootstrap-select.btn-group .btn .caret { 30 | position:absolute; 31 | right:12px; 32 | } 33 | .bootstrap-select.btn-group .disabled, .bootstrap-select.btn-group .dropdown-menu li.disabled > a {cursor: not-allowed;} 34 | .bootstrap-select.btn-group[class*="span"] .btn { 35 | width:100%; 36 | } 37 | .bootstrap-select.btn-group .dropdown-menu { 38 | min-width:100%; 39 | -moz-box-sizing:border-box; 40 | -webkit-box-sizing:border-box; 41 | box-sizing:border-box; 42 | } 43 | .bootstrap-select.btn-group .dropdown-menu dt { 44 | display:block; 45 | padding:3px 20px; 46 | cursor:default; 47 | } 48 | .bootstrap-select.btn-group .dropdown-menu li > a.opt {padding-left:35px;} 49 | .bootstrap-select.btn-group .dropdown-menu .optgroup-div {border-top:1px solid #e5e5e5;} 50 | .bootstrap-select.btn-group .dropdown-menu li > a {cursor: pointer;} -------------------------------------------------------------------------------- /public/js-plugin/bootstrap-select/bootstrap-select.min.css: -------------------------------------------------------------------------------- 1 | .clearfix:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.bootstrap-select.btn-group,.bootstrap-select.btn-group[class*="span"]{float:none;display:inline-block;margin-bottom:10px;margin-left:0}.bootstrap-select{width:220px}.bootstrap-select .btn{width:220px}.bootstrap-select .btn:focus{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.btn-group .btn .filter-option{overflow:hidden;position:absolute;left:12px;right:25px;text-align:left}.bootstrap-select.btn-group .btn .caret{position:absolute;right:12px}.bootstrap-select.btn-group .disabled,.bootstrap-select.btn-group .dropdown-menu li.disabled>a{cursor:not-allowed}.bootstrap-select.btn-group[class*="span"] .btn{width:100%}.bootstrap-select.btn-group .dropdown-menu{min-width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .dropdown-menu dt{display:block;padding:3px 20px;cursor:default}.bootstrap-select.btn-group .dropdown-menu li>a.opt{padding-left:35px}.bootstrap-select.btn-group .dropdown-menu .optgroup-div{border-top:1px solid #e5e5e5}.bootstrap-select.btn-group .dropdown-menu li>a{cursor:pointer} -------------------------------------------------------------------------------- /public/js-plugin/bootstrap-select/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "title": "jQuery", 4 | "description": "JavaScript library for DOM operations", 5 | "version": "2.0.0pre", 6 | "homepage": "http://jquery.com", 7 | "author": { 8 | "name": "Silvio Moreto", 9 | "url": "https://github.com/silviomoreto/" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git://github.com/antonellopasella/bootstrap-select.git" 14 | }, 15 | "licenses": [ 16 | { 17 | "type": "Custom", 18 | "url": "https://github.com/silviomoreto/bootstrap-select/blob/master/README.md#copyright-and-license" 19 | } 20 | ], 21 | "dependencies": { 22 | "jquery": "1.8" 23 | }, 24 | "keywords": [] 25 | } 26 | -------------------------------------------------------------------------------- /public/js-plugin/camera/images/_notes/dwsync.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/js-plugin/camera/images/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/blank.gif -------------------------------------------------------------------------------- /public/js-plugin/camera/images/camera-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/camera-loader.gif -------------------------------------------------------------------------------- /public/js-plugin/camera/images/camera_skins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/camera_skins.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/_notes/dwsync.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay1.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay10.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay2.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay3.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay4.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay5.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay6.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay7.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay8.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/patterns/overlay9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/patterns/overlay9.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/_notes/dwsync.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/big_bunny_fake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/big_bunny_fake.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/bridge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/bridge.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/leaf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/leaf.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/road.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/road.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/sea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/sea.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/shelter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/shelter.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/_notes/dwsync.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/big_bunny_fake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/big_bunny_fake.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/bridge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/bridge.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/header_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/header_bg.png -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/leaf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/leaf.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/road.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/road.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/sea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/sea.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/shelter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/shelter.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/thumbs/tree.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/thumbs/tree.jpg -------------------------------------------------------------------------------- /public/js-plugin/camera/images/slides/tree.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/camera/images/slides/tree.jpg -------------------------------------------------------------------------------- /public/js-plugin/flexslider/images/bg_direction_nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/flexslider/images/bg_direction_nav.png -------------------------------------------------------------------------------- /public/js-plugin/flexslider/themes/himalaya-flexslider-theme.css: -------------------------------------------------------------------------------- 1 | /* 2 | Document : himalaya-flexslider-theme.css 3 | Created on : 3 sept. 2012, 14:42:03 4 | Author : shaylash 5 | Description: Flexslider himalaya theme. 6 | */ 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/js-plugin/flexslider/themes/slider-overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/flexslider/themes/slider-overlay.png -------------------------------------------------------------------------------- /public/js-plugin/hoverdir/css/style.css: -------------------------------------------------------------------------------- 1 | .da-thumbs { 2 | position: relative; 3 | } 4 | 5 | .da-thumbs article { 6 | position: relative; 7 | margin-bottom:1px; 8 | } 9 | 10 | .da-thumbs article a, 11 | .da-thumbs article a img { 12 | display: block; 13 | position: relative; 14 | } 15 | 16 | .da-thumbs article a { 17 | overflow: hidden; 18 | } 19 | .da-thumbs article a div { 20 | position: absolute; 21 | width: 100%; 22 | height: 100%; 23 | text-align: center; 24 | /* background-color: black;*/ 25 | } 26 | 27 | .da-thumbs article a div span{ 28 | /*margin-top:24%;*/ 29 | } 30 | 31 | /* 32 | .da-thumbs article.masoneryBloc a div{ 33 | width: 91%; 34 | height: 55%; 35 | margin: 10px; 36 | background-color: rgba(255, 255, 255, 0.5); (this is the semi transparent color of your overlay that you can change to what you want) 37 | } 38 | */ 39 | 40 | .da-thumbs article a div{ 41 | /* padding-top:10%; */ 42 | } 43 | 44 | .da-thumbs article a div.da-animate { 45 | -webkit-transition: all 0.3s ease; 46 | -moz-transition: all 0.3s ease-in-out; 47 | -o-transition: all 0.3s ease-in-out; 48 | -ms-transition: all 0.3s ease-in-out; 49 | transition: all 0.3s ease-in-out; 50 | } 51 | /* Initial state classes: */ 52 | .da-slideFromTop { 53 | left: 0px; 54 | top: -100%; 55 | } 56 | .da-slideFromBottom { 57 | left: 0px; 58 | top: 100%; 59 | } 60 | .da-slideFromLeft { 61 | top: 0px; 62 | left: -100%; 63 | } 64 | .da-slideFromRight { 65 | top: 0px; 66 | left: 100%; 67 | } 68 | /* Final state classes: */ 69 | .da-slideTop { 70 | top: 0px; 71 | } 72 | .da-slideLeft { 73 | left: 0px; 74 | } 75 | .da-thumbs li a div span { 76 | display: block; 77 | padding: 10px 0; 78 | margin: 40px 20px 20px 20px; 79 | text-transform: uppercase; 80 | font-weight: normal; 81 | color: rgba(255,255,255,0.9); 82 | text-shadow: 1px 1px 1px rgba(0,0,0,0.2); 83 | border-bottom: 1px solid rgba(255,255,255,0.5); 84 | box-shadow: 0 1px 0 rgba(0,0,0,0.1), 0 -10px 0 rgba(255,255,255,0.3); 85 | } -------------------------------------------------------------------------------- /public/js-plugin/jquery.sharrre-1.3.4/README.md: -------------------------------------------------------------------------------- 1 | jQuery Sharrre Plugin 2 | === 3 | 4 | Make your sharing widget! 5 | Sharrre is a jQuery plugin that allows you to create nice widgets sharing for Facebook, Twitter, Google Plus (with PHP script) and more. 6 | More information on [Sharrre] (http://sharrre.com/#demos) 7 | 8 | Usage 9 | === 10 | 11 | $('#sharrre').sharrre({ 12 | share: { 13 | googlePlus: true, 14 | facebook: true, 15 | twitter: true 16 | }, 17 | url: 'http://sharrre.com' 18 | }); 19 | 20 | Example 21 | === 22 | 23 |
24 | $(document).ready(function(){ 25 | $('#demo1').sharrre({ 26 | share: { 27 | googlePlus: true, 28 | facebook: true, 29 | twitter: true, 30 | delicious: true 31 | }, 32 | buttons: { 33 | googlePlus: {size: 'tall'}, 34 | facebook: {layout: 'box_count'}, 35 | twitter: {count: 'vertical'}, 36 | delicious: {size: 'tall'} 37 | }, 38 | hover: function(api, options){ 39 | $(api.element).find('.buttons').show(); 40 | }, 41 | hide: function(api, options){ 42 | $(api.element).find('.buttons').hide(); 43 | } 44 | }); 45 | }); 46 | 47 | See example on [official website] (http://sharrre.com/#demos) 48 | 49 | 50 | Dependencies 51 | === 52 | 53 | jQuery 1.7 54 | 55 | Author 56 | === 57 | 58 | - [Julien Hany](http://hany.fr) 59 | - [Twitter (@_JulienH)](http://twitter.com/_JulienH) 60 | - [Google+](http://plus.google.com/111637545317893682325) 61 | -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/1.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/2.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/3.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/4.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/5.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/6.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/high.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/high.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/huge.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/huge.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/fullscreen/wide.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/fullscreen/wide.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/btnNext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/btnNext.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/btnPrevious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/btnPrevious.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/contentPattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/contentPattern.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/default_thumbnail.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/default_thumbnail.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/loader.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/sprite.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/btnNext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/btnNext.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/btnPrevious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/btnPrevious.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/contentPattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/contentPattern.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/default_thumbnail.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/default_thumbnail.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/loader.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/sprite.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/default/default_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/default/default_thumb.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/default/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/default/loader.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_next.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_prev.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_x.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_y.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_y.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/btnNext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/btnNext.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/btnPrevious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/btnPrevious.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternBottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternBottom.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternLeft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternLeft.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternRight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternRight.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternTop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternTop.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/default_thumbnail.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/default_thumbnail.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/loader.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/facebook/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/facebook/sprite.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/btnNext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/btnNext.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/btnPrevious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/btnPrevious.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/default_thumbnail.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/default_thumbnail.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/loader.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/sprite.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_square/btnNext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_square/btnNext.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_square/btnPrevious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_square/btnPrevious.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_square/default_thumbnail.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_square/default_thumbnail.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_square/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_square/loader.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/prettyPhoto/light_square/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/prettyPhoto/light_square/sprite.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/thumbnails/flash-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/thumbnails/flash-logo.png -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/thumbnails/quicktime-logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/thumbnails/quicktime-logo.gif -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/thumbnails/t_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/thumbnails/t_1.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/thumbnails/t_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/thumbnails/t_2.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/thumbnails/t_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/thumbnails/t_3.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/thumbnails/t_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/thumbnails/t_4.jpg -------------------------------------------------------------------------------- /public/js-plugin/pretty-photo/images/thumbnails/t_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/pretty-photo/images/thumbnails/t_5.jpg -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrow_large_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrow_large_left.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrow_large_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrow_large_right.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrow_left.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrow_left2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrow_left2.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrow_right.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrow_right2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrow_right2.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrowleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrowleft.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrowright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrowright.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/arrows.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/arrows.psd -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/black50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/black50.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/boxed_bgtile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/boxed_bgtile.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/bullet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/bullet.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/bullet_boxed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/bullet_boxed.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/bullets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/bullets.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/bullets.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/bullets.psd -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/bullets2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/bullets2.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/coloredbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/coloredbg.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/grain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/grain.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/large_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/large_left.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/large_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/large_right.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/loader.gif -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/loader2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/loader2.gif -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/navigdots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/navigdots.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/navigdots_bgtile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/navigdots_bgtile.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/shadow1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/shadow1.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/shadow2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/shadow2.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/shadow3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/shadow3.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/small_arrows.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/small_arrows.psd -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/small_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/small_left.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/small_left_boxed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/small_left_boxed.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/small_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/small_right.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/small_right_boxed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/small_right_boxed.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/timer.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/timerdot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/timerdot.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/assets/white50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/assets/white50.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/images/decor_inside.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/images/decor_inside.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/images/decor_inside_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/images/decor_inside_white.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/images/decor_testimonial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/images/decor_testimonial.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/images/gradient/g30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/images/gradient/g30.png -------------------------------------------------------------------------------- /public/js-plugin/rs-plugin/images/gradient/g40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/rs-plugin/images/gradient/g40.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/bg-sequence.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/bg-sequence.jpg -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/bt-next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/bt-next.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/bt-prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/bt-prev.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/model1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/model1.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/model2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/model2.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/model3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/model3.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/pause-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/pause-icon.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/sequence-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/sequence-logo.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/tn-model1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/tn-model1.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/tn-model2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/tn-model2.png -------------------------------------------------------------------------------- /public/js-plugin/sequence/images/tn-model3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openhab/openhab-cloud/6e00cc6157f7585e26cfd77f8d72df9f1adea5f8/public/js-plugin/sequence/images/tn-model3.png -------------------------------------------------------------------------------- /public/js/styleswitcher.js: -------------------------------------------------------------------------------- 1 | function setActiveStyleSheet(title) { 2 | var i, a, main; 3 | for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { 4 | if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { 5 | a.disabled = true; 6 | if(a.getAttribute("title") == title) a.disabled = false; 7 | } 8 | } 9 | } 10 | 11 | function getActiveStyleSheet() { 12 | var i, a; 13 | for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { 14 | if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title"); 15 | } 16 | return null; 17 | } 18 | 19 | function getPreferredStyleSheet() { 20 | var i, a; 21 | for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { 22 | if(a.getAttribute("rel").indexOf("style") != -1 23 | && a.getAttribute("rel").indexOf("alt") == -1 24 | && a.getAttribute("title") 25 | ) return a.getAttribute("title"); 26 | } 27 | return null; 28 | } 29 | 30 | function createCookie(name,value,days) { 31 | if (days) { 32 | var date = new Date(); 33 | date.setTime(date.getTime()+(days*24*60*60*1000)); 34 | var expires = "; expires="+date.toGMTString(); 35 | } 36 | else expires = ""; 37 | document.cookie = name+"="+value+expires+"; path=/"; 38 | } 39 | 40 | function readCookie(name) { 41 | var nameEQ = name + "="; 42 | var ca = document.cookie.split(';'); 43 | for(var i=0;i < ca.length;i++) { 44 | var c = ca[i]; 45 | while (c.charAt(0)==' ') c = c.substring(1,c.length); 46 | if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 47 | } 48 | return null; 49 | } 50 | 51 | window.onload = function(e) { 52 | var cookie = readCookie("style"); 53 | var title = cookie ? cookie : getPreferredStyleSheet(); 54 | setActiveStyleSheet(title); 55 | } 56 | 57 | window.onunload = function(e) { 58 | var title = getActiveStyleSheet(); 59 | createCookie("style", title, 365); 60 | } 61 | 62 | var cookie = readCookie("style"); 63 | var title = cookie ? cookie : getPreferredStyleSheet(); 64 | setActiveStyleSheet(title); 65 | -------------------------------------------------------------------------------- /public/stylesheets/style.less: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } -------------------------------------------------------------------------------- /redis-helper.js: -------------------------------------------------------------------------------- 1 | // This module handles shared redis client for all 2 | 3 | var app = require('./app.js'), 4 | logger = require('./logger.js'), 5 | redis = require('redis'), 6 | redisClient; 7 | 8 | logger.info('Connecting to Redis at ' + app.config.redis.host + ':' + app.config.redis.port); 9 | 10 | redisClient = redis.createClient(app.config.redis.port, app.config.redis.host); 11 | 12 | if (typeof app.config.redis.password !== 'undefined') { 13 | redisClient.auth(app.config.redis.password, function(error, data) { 14 | if (error) { 15 | logger.error(error); 16 | } else { 17 | logger.info('Redis connect response: ' + data); 18 | } 19 | }); 20 | } 21 | 22 | redisClient.on('ready', function () { 23 | logger.info('Redis is ready'); 24 | }); 25 | 26 | redisClient.on('end', function () { 27 | logger.error('Redis error: connection is closed'); 28 | }); 29 | 30 | redisClient.on('error', function (error) { 31 | logger.error('Redis error: ' + error); 32 | }); 33 | 34 | module.exports = redisClient; 35 | -------------------------------------------------------------------------------- /routes/applications.js: -------------------------------------------------------------------------------- 1 | var logger = require('../logger'); 2 | var mongoose = require('mongoose'); 3 | var OAuth2Token = require('../models/oauth2token'); 4 | 5 | exports.applicationsget = function(req, res) { 6 | OAuth2Token.find({user: req.user.id}) 7 | .populate('oAuthClient') 8 | .exec(function(error, oauth2tokens) { 9 | if (!error && oauth2tokens) { 10 | res.render('applications', { oauth2tokens: oauth2tokens, 11 | title: "Applications", user: req.user, 12 | errormessages:req.flash('error'), infomessages:req.flash('info') }); 13 | } else { 14 | res.render('applications', { oauth2tokens: oauth2tokens, 15 | title: "Applications", user: req.user, 16 | errormessages:req.flash('error'), infomessages:req.flash('info') }); 17 | } 18 | }); 19 | } 20 | 21 | exports.applicationsdelete = function(req, res) { 22 | logger.info("deleting application " + req.params.id); 23 | var deleteId = mongoose.Types.ObjectId(req.params.id); 24 | OAuth2Token.findOne({user: req.user.id, _id: deleteId}, function(error, oauth2token) { 25 | if (!error && oauth2token) { 26 | // logger.info("found device"); 27 | oauth2token.remove(); 28 | } 29 | res.redirect('/applications'); 30 | }); 31 | }; 32 | -------------------------------------------------------------------------------- /routes/health.js: -------------------------------------------------------------------------------- 1 | var system = require('../system'); 2 | 3 | var mongoose = require('mongoose'); 4 | 5 | const Errors = { 6 | DBERROR: 'DBERROR' 7 | } 8 | 9 | exports.gethealth = function (req, res) { 10 | const isHealthEndpointEnabled = system.isHealthEndpointEnabled(); 11 | if (!isHealthEndpointEnabled) { 12 | return res.status(404).send("not found"); 13 | } else { 14 | const mongoose_state = mongoose.connection.readyState 15 | var errors = collectErrors(); 16 | if (errors.length == 0) { 17 | return res.status(200).json({ 18 | status: "OK", 19 | mongoose: mongoose_state 20 | }); 21 | } else { 22 | return res.status(500).json({ 23 | status: "Not OK", 24 | mongoose: mongoose_state, 25 | errors: errors 26 | }); 27 | } 28 | 29 | function collectErrors() { 30 | var errors = []; 31 | switch (mongoose_state) { 32 | case 0: 33 | errors.push({ 34 | error: Errors.DBERROR, 35 | message: "mongodb disconnected" 36 | }); 37 | break; 38 | case 2: 39 | errors.push({ 40 | error: Errors.DBERROR, 41 | message: "mongodb connecting" 42 | }); 43 | break; 44 | case 3: 45 | errors.push({ 46 | error: Errors.DBERROR, 47 | message: "mongodb disconnecting" 48 | }); 49 | break; 50 | }; 51 | return errors; 52 | } 53 | } 54 | }; 55 | -------------------------------------------------------------------------------- /routes/homepage.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET home page. 4 | */ 5 | exports.index = function(req, res){ 6 | errormessages = req.flash('error'); 7 | infomessages = req.flash('info'); 8 | res.render('index', {title: "Home", user: req.user, errormessages: errormessages, 9 | infomessages: infomessages}); 10 | }; 11 | 12 | exports.docs = function(req, res) { 13 | errormessages = req.flash('error'); 14 | infomessages = req.flash('info'); 15 | res.render('docs/documentation', {title: "Docs", user: req.user, errormessages: errormessages, 16 | infomessages: infomessages}); 17 | }; 18 | 19 | exports.docsnotifications = function(req, res) { 20 | errormessages = req.flash('error'); 21 | infomessages = req.flash('info'); 22 | res.render('docs/notifications', {title: "Docs - Notifications", user: req.user, errormessages: errormessages, 23 | infomessages: infomessages}); 24 | }; 25 | 26 | exports.docspersistence = function(req, res) { 27 | errormessages = req.flash('error'); 28 | infomessages = req.flash('info'); 29 | res.render('docs/persistence', {title: "Docs - Persistence", user: req.user, errormessages: errormessages, 30 | infomessages: infomessages}); 31 | }; 32 | 33 | exports.docsifttt = function(req, res) { 34 | errormessages = req.flash('error'); 35 | infomessages = req.flash('info'); 36 | res.render('docs/ifttt', {title: "Docs - IFTTT", user: req.user, errormessages: errormessages, 37 | infomessages: infomessages}); 38 | }; 39 | -------------------------------------------------------------------------------- /routes/invitations.js: -------------------------------------------------------------------------------- 1 | var User = require('../models/user'); 2 | var Openhab = require('../models/openhab'); 3 | var Invitation = require('../models/invitation'); 4 | var form = require('express-form'), 5 | field = form.field; 6 | 7 | exports.invitationsget = function(req, res) { 8 | req.user.openhab(function(error, openhab) { 9 | res.render('invitations', { title: "Invitations", user: req.user, openhab: openhab, 10 | errormessages:req.flash('error'), infomessages:req.flash('info') }); 11 | }); 12 | } 13 | 14 | exports.invitationspostvalidate = form( 15 | field("email", "E-Mail").trim().isEmail().required() 16 | ); 17 | 18 | exports.invitationspost = function(req, res) { 19 | if (!req.form.isValid) { 20 | req.user.openhab(function(error, openhab) { 21 | res.redirect('/invitations'); 22 | }); 23 | } else { 24 | Invitation.send(req.form.email, function(error, invite) { 25 | if (!error && invite) { 26 | req.flash('info', 'Invitation sent!'); 27 | res.redirect('/invitations'); 28 | } else { 29 | req.flash('error', 'There was an error while processing your request'); 30 | res.redirect('/invitations'); 31 | } 32 | }); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /routes/items.js: -------------------------------------------------------------------------------- 1 | var User = require('../models/user'); 2 | var Openhab = require('../models/openhab'); 3 | var Item = require('../models/item'); 4 | 5 | exports.itemsget = function(req, res) { 6 | switch (req.query.sort) { 7 | default: 8 | case "name": 9 | var sortValue = {name: 'asc'}; 10 | break; 11 | case "last_update": 12 | var sortValue = {last_update: 'desc'}; 13 | break; 14 | case "status": 15 | var sortValue = {status: 'asc'}; 16 | break; 17 | } 18 | req.user.openhab(function(error, openhab) { 19 | if (!error && openhab != null) { 20 | Item.find({openhab: openhab}) 21 | .sort(sortValue) 22 | .lean() 23 | .exec(function(error, items) { 24 | res.render('items', { items: items, 25 | title: "Items", user: req.user, openhab: openhab, 26 | errormessages:req.flash('error'), infomessages:req.flash('info') }); 27 | }); 28 | } else { 29 | 30 | } 31 | }); 32 | } 33 | -------------------------------------------------------------------------------- /routes/notifications.js: -------------------------------------------------------------------------------- 1 | var User = require('../models/user'); 2 | var Openhab = require('../models/openhab'); 3 | var Notification = require('../models/notification'); 4 | var logger = require('../logger'); 5 | 6 | exports.notificationsget = function(req, res) { 7 | var perPage = 20, 8 | page = req.query.page > 0 ? parseInt(req.query.page) : 0; 9 | req.user.openhab(function(error, openhab) { 10 | if (!error && openhab != null) { 11 | var filter = {user: req.user.id}; 12 | Notification.find(filter) 13 | .limit(perPage) 14 | .skip(perPage * page) 15 | .sort({created: 'desc'}) 16 | .lean() 17 | .exec(function(error, notifications) { 18 | Notification.count().exec(function (err, count) { 19 | res.render('notifications', { notifications: notifications, pages: count / perPage, page: page, 20 | title: "Notifications", user: req.user, openhab: openhab, 21 | errormessages:req.flash('error'), infomessages:req.flash('info') }); 22 | }); 23 | }); 24 | } else { 25 | 26 | } 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /routes/setTimezone.js: -------------------------------------------------------------------------------- 1 | module.exports = function (req, res) { 2 | req.session.timezone = req.query['tz']; 3 | res.send(200, 'Timezone set'); 4 | }; 5 | -------------------------------------------------------------------------------- /routes/user.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET users listing. 4 | */ 5 | 6 | exports.list = function(req, res){ 7 | res.send("respond with a resource"); 8 | }; -------------------------------------------------------------------------------- /run-app.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | 3 | # If config.json.template exists, expand it and overwrite config.json. 4 | # This gives us a chance to customize configs through runtime environment. 5 | if [ -f config.json.template ]; then 6 | envsubst < config.json.template > config.json 7 | fi 8 | 9 | exec node app.js 10 | -------------------------------------------------------------------------------- /scripts/deleteDuplicateUserDevices.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'), 2 | logger = require('../logger.js'), 3 | config = require('../config.json'), 4 | UserDevice = require('../models/userdevice'), 5 | system = require('../system'), 6 | MongoConnect = require('../system/mongoconnect'); 7 | 8 | system.setConfiguration(config); 9 | 10 | const mongoConnect = new MongoConnect(system); 11 | mongoConnect.connect(mongoose); 12 | 13 | logger.info('Looking for all registered devices...'); 14 | function deleteDuplicateUserDevices(err, devices) { 15 | if (err) { 16 | logger.error('Could not load all devices to fix duplicates.', err); 17 | } 18 | 19 | logger.info('Found ' + devices.length + ' devices...'); 20 | const alreadyRegisteredDeviceId = []; 21 | const alreadyRegisteredAndroidRegistration = []; 22 | const alreadyRegisteredIOSToken = []; 23 | devices.forEach(function(device) { 24 | if ( 25 | !alreadyRegisteredDeviceId.includes(device.deviceId) && 26 | !alreadyRegisteredAndroidRegistration.includes(device.androidRegistration) && 27 | !alreadyRegisteredIOSToken.includes(device.iosDeviceToken) 28 | ) { 29 | alreadyRegisteredDeviceId.push(device.deviceId); 30 | alreadyRegisteredAndroidRegistration.push(device.androidRegistration); 31 | alreadyRegisteredIOSToken.push(device.iosDeviceToken); 32 | return; 33 | } 34 | 35 | logger.info('Remove duplicated device with deviceId ' + device.deviceId + ' and ID ' + device.id); 36 | device.remove(); 37 | }); 38 | 39 | if (alreadyRegisteredDeviceId.length === devices.length) { 40 | logger.info('No duplicated devices found.'); 41 | } else { 42 | logger.info('All duplicated devices should be removed now.'); 43 | } 44 | 45 | process.exit(0); 46 | } 47 | 48 | UserDevice.find({}, deleteDuplicateUserDevices); 49 | -------------------------------------------------------------------------------- /system/mongoconnect.js: -------------------------------------------------------------------------------- 1 | var logger = require('../logger.js'); 2 | 3 | /** 4 | * @param {System} system 5 | * @constructor 6 | */ 7 | function MongoConnect(system) { 8 | this.system = system; 9 | } 10 | 11 | /** 12 | * Takes the mongoose object and tries to connect it with the configured database of the system object provided to the 13 | * constructor of this object. 14 | * 15 | * The optional callback parameter can be used to pass a callback to the mongoose.connect function. 16 | * 17 | * @param mongoose 18 | * @param callback 19 | */ 20 | MongoConnect.prototype.connect = function (mongoose, callback) { 21 | if (typeof callback !== 'function') { 22 | callback = this.defaultCallback; 23 | } 24 | logger.info('Trying to connect to mongodb at: ' + this.system.getDbHostsString()); 25 | mongoose.connect(this.getMongoUri(), callback); 26 | }; 27 | 28 | /** 29 | * The callback used in #connect, if no callback was provided. 30 | * 31 | * @param error 32 | * @private 33 | */ 34 | MongoConnect.prototype.defaultCallback = function (error) { 35 | if (error) { 36 | logger.error('Error while connecting from openHAB-cloud to mongodb: ' + error); 37 | logger.error('Stopping openHAB-cloud due to error with mongodb'); 38 | process.exit(1); 39 | } 40 | 41 | logger.info('Successfully connected to mongodb'); 42 | }; 43 | 44 | /** 45 | * Returns the connection string to use to connect to mongodb. 46 | * 47 | * @return {string} 48 | * @private 49 | */ 50 | MongoConnect.prototype.getMongoUri = function () { 51 | var mongoUri = 'mongodb://'; 52 | 53 | if (this.system.hasDbCredentials()) 54 | mongoUri += this.system.getDbUser() + ':' + this.system.getDbPass() + '@'; 55 | 56 | mongoUri += this.system.getDbHostsString(); 57 | 58 | return mongoUri + '/' + this.system.getDbName(); 59 | }; 60 | 61 | module.exports = MongoConnect; 62 | -------------------------------------------------------------------------------- /templates/activation-email/html.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Hello <%= email %>!

7 |

8 | Thank you for registering for openHAB Cloud service, a cloud companion for your awesome openHAB! 9 |

10 |

11 | Just one more step... 12 |

13 | Click on this link to verify your e-mail address and activate your account! 14 |

15 |

Best regards, 16 | openHAB Cloud team! 17 |

18 | 19 | 20 | -------------------------------------------------------------------------------- /templates/enroll-email/html.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Hello openHAB team!

7 |

8 |

A new user just enrolled to participate in early beta for openHAB Cloud!

9 |

10 |

11 | User's e-mail is <%=email%>
12 | User's operating system is <%=platform%>
13 | User's experience in Java is <%=java%>
14 | Here is how user describes his openHAB setup:
15 | <%=description%> 16 |

17 |

18 |

Best regards, 19 | openHAB Cloud enrollment system! 20 |

21 | 22 | -------------------------------------------------------------------------------- /templates/invitation-inactive/html.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Hello <%= email %>!

7 |

8 | You recently requested access to openHAB Cloud beta testing and were granted an invitation to join. Unfortunately we 9 | didn't hear from you since then and you didn't activate your invitation. We would be more then happy to help you 10 | with your beta participation. If you decided not to join, we are eager to know the reason! 11 |

12 |

Best regards, 13 | openHAB Cloud team! 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /templates/lostpassword-email/html.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Hello <%=email%>!

7 |

8 | We received a request to reset the password for your openHAB Cloud account. 9 | If you don't want to change your password, please ignore this email. 10 |

11 |

12 | If you want to reset your password, please click on the following link 13 | (or copy and paste it into your web browser): 14 |

15 |

16 | <%=resetUrl%> 17 |

18 |

19 | The link takes you to a secure web page where you can set a new password of your choosing. 20 | The link will expire in 24 hours. 21 |

22 |

23 |

Best regards, 24 | openHAB Cloud enrollment system! 25 |

26 | 27 | 28 | -------------------------------------------------------------------------------- /templates/openhaboffline/html.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Hello <%= email %>!

7 |

8 | We didn't hear anything from your openHAB for more then 3 days and we are worried if everything is fine with 9 | your openHAB installation? If you recently did upgrade your openHAB you could have accidentally deleted 10 | uuid and secret files, so your openHAB produced new ones and you need to update this information on the 11 | openHAB Cloud "My Account" page. 12 |

13 |

Best regards, 14 | openHAB Cloud team! 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/lib.js: -------------------------------------------------------------------------------- 1 | var cheerio = require('cheerio'); 2 | 3 | exports.extractCsrfToken = function(res) { 4 | var $ = cheerio.load(res.text); 5 | return $('[name=_csrf]').val(); 6 | } -------------------------------------------------------------------------------- /tests/mocha/integration/applications.js: -------------------------------------------------------------------------------- 1 | var supertest = require('supertest'); 2 | var should = require('should'); 3 | var session = require('supertest-session'); 4 | var lib = require('../../lib'); 5 | //variable to connect without session 6 | var ohCloud = supertest.agent('http://localhost:3000'); 7 | var testSession; 8 | describe('Applications', function () { 9 | before(function (done) { 10 | testSession = session('http://localhost:3000'); 11 | testSession 12 | .get('/login') 13 | .set('Cookie', []) 14 | .end(function (err, res) { 15 | testSession.post('/login') 16 | .send({ 17 | _csrf: lib.extractCsrfToken(res), 18 | username: 'test@test.com', 19 | password: '1234ASD' 20 | }) 21 | .end(function (err) { 22 | testSession 23 | .get('/setTimezone?tz=America/New_York') 24 | .end( 25 | function (err) { 26 | if (err) return done(err); 27 | return done(); 28 | }); 29 | }); 30 | 31 | }); 32 | }); 33 | it('Open Applications page with correct credentials', function (done) { 34 | testSession.get('/applications') 35 | .expect(200) 36 | .end(function (err, res) { 37 | var containedItem = res.text.indexOf('

Applications

'); 38 | res.text.should.containedItem; 39 | done(err); 40 | }); 41 | }); 42 | 43 | it('Redirect to login page if not loggined', function (done) { 44 | ohCloud.get('/applications') 45 | .expect(302) 46 | .expect('Location', '/login') 47 | .end(function (err, res) { 48 | done(err); 49 | }); 50 | }); 51 | }); -------------------------------------------------------------------------------- /tests/mocha/integration/devices.js: -------------------------------------------------------------------------------- 1 | var supertest = require('supertest'); 2 | var should = require('should'); 3 | var session = require('supertest-session'); 4 | var lib = require('../../lib'); 5 | //variable to connect without session 6 | var ohCloud = supertest.agent('http://localhost:3000'); 7 | var testSession; 8 | describe('Devices ', function () { 9 | before(function (done) { 10 | testSession = session('http://localhost:3000'); 11 | testSession 12 | .get('/login') 13 | .set('Cookie', []) 14 | .end(function (err, res) { 15 | testSession.post('/login') 16 | .send({ 17 | _csrf: lib.extractCsrfToken(res), 18 | username: 'test@test.com', 19 | password: '1234ASD' 20 | }) 21 | .end(function (err) { 22 | testSession 23 | .get('/setTimezone?tz=America/New_York') 24 | .end( 25 | function (err) { 26 | if (err) return done(err); 27 | return done(); 28 | }); 29 | }); 30 | 31 | }); 32 | }); 33 | it('Open Devices page with correct credentials', function (done) { 34 | testSession.get('/devices') 35 | .expect(200) 36 | .end(function (err, res) { 37 | var containedItem = res.text.indexOf('

Devices

'); 38 | res.text.should.containedItem; 39 | done(err); 40 | }); 41 | }); 42 | 43 | it('Redirect to login page if not loggined', function (done) { 44 | ohCloud.get('/devices') 45 | .expect(302) 46 | .expect('Location', '/login') 47 | .end(function (err, res) { 48 | done(err); 49 | }); 50 | }); 51 | }); -------------------------------------------------------------------------------- /tests/mocha/integration/event.js: -------------------------------------------------------------------------------- 1 | var session = require('supertest-session'); 2 | var supertest = require('supertest'); 3 | var should = require('should'); 4 | var lib = require('../../lib'); 5 | //variable to connect without session 6 | var ohCloud = supertest.agent('http://localhost:3000'); 7 | var testSession; 8 | describe('Events', function () { 9 | 10 | before(function (done) { 11 | testSession = session('http://localhost:3000'); 12 | testSession 13 | .get('/login') 14 | .set('Cookie', []) 15 | .end(function (err, res) { 16 | testSession.post('/login') 17 | .send({ 18 | _csrf: lib.extractCsrfToken(res), 19 | username: 'mordarulit@mail.ru', 20 | password: 'rewas123' 21 | }) 22 | .end(function (err) { 23 | testSession 24 | .get('/setTimezone?tz=America/New_York') 25 | .end( 26 | function (err) { 27 | if (err) return done(err); 28 | return done(); 29 | }); 30 | }); 31 | 32 | }); 33 | }); 34 | it('Open events page with correct credentials', function (done) { 35 | testSession.get('/events') 36 | .expect(200) 37 | .end(function (err, res) { 38 | var containedItem = res.text.indexOf('

Events

') > -1; 39 | res.text.should.containedItem; 40 | done(err); 41 | }); 42 | }); 43 | 44 | it('Redirect to login page if not loggined', function (done) { 45 | ohCloud.get('/devices') 46 | .expect(302) 47 | .expect('Location', '/login') 48 | .end(function (err, res) { 49 | done(err); 50 | }); 51 | }); 52 | 53 | }); -------------------------------------------------------------------------------- /tests/mocha/integration/items.js: -------------------------------------------------------------------------------- 1 | var should = require('should'); 2 | var supertest = require('supertest'); 3 | var session = require('supertest-session'); 4 | var lib = require('../../lib'); 5 | //variable to connect without session 6 | var ohCloud = supertest.agent('http://localhost:3000'); 7 | var testSession; 8 | describe('Items ', function () { 9 | before(function (done) { 10 | testSession = session('http://localhost:3000'); 11 | testSession 12 | .get('/login') 13 | .set('Cookie', []) 14 | .end(function (err, res) { 15 | testSession.post('/login') 16 | .send({ 17 | _csrf: lib.extractCsrfToken(res), 18 | username: 'test@test.com', 19 | password: '1234ASD' 20 | }) 21 | .end(function (err) { 22 | testSession 23 | .get('/setTimezone?tz=America/New_York') 24 | .end( 25 | function (err) { 26 | if (err) return done(err); 27 | return done(); 28 | }); 29 | }); 30 | 31 | }); 32 | }); 33 | it('Open Items page with correct credentials', function (done) { 34 | testSession.get('/items') 35 | .expect(200) 36 | .end(function (err, res) { 37 | var containedItem = res.text.indexOf('

Items

'); 38 | res.text.should.containedItem; 39 | done(err); 40 | }); 41 | }); 42 | 43 | it('Redirect to login page if not loggined', function (done) { 44 | ohCloud.get('/items') 45 | .expect(302) 46 | .expect('Location', '/login') 47 | .end(function (err, res) { 48 | done(err); 49 | }); 50 | }); 51 | }); -------------------------------------------------------------------------------- /tests/mocha/integration/login.js: -------------------------------------------------------------------------------- 1 | var supertest = require('supertest'); 2 | var should = require('should'); 3 | var lib = require('../../lib'); 4 | var user = require('../../../models/user'); 5 | 6 | var ohCloud = supertest.agent('http://localhost:3000'); 7 | 8 | describe('Test login', function() { 9 | 10 | it('redirect to login for false credentials', function(done) { 11 | ohCloud 12 | .get('/login') 13 | .expect(200) 14 | .set('cookie', []) 15 | .end(function(err, res) { 16 | ohCloud 17 | .post('/login') 18 | .set('cookie', res.headers['set-cookie']) 19 | .send({ 20 | _csrf: lib.extractCsrfToken(res), 21 | username: 'test', 22 | password: 'test_false' 23 | }) 24 | .expect(302) 25 | .expect('Location', '/login') 26 | .end(function(err) { 27 | done(err); 28 | }); 29 | }); 30 | }); 31 | 32 | it('redirects to home for correct credentials', function(done) { 33 | ohCloud 34 | .get('/login') 35 | .expect(200) 36 | .set('cookie', []) 37 | .end(function(err, res) { 38 | ohCloud 39 | .post('/login') 40 | .set('cookie', res.headers['set-cookie']) 41 | .send({ 42 | _csrf: lib.extractCsrfToken(res), 43 | username: 'test', 44 | password: '123' 45 | }) 46 | .expect(302) 47 | .expect('Location', '/') 48 | .end(function(err) { 49 | done(err); 50 | }); 51 | }); 52 | }) 53 | }); -------------------------------------------------------------------------------- /tests/mocha/integration/mainpage.js: -------------------------------------------------------------------------------- 1 | var supertest = require('supertest'); 2 | var should = require('should'); 3 | 4 | var ohCloud = supertest.agent('http://localhost:3000'); 5 | 6 | describe('Test main page of openHAB-cloud', function(){ 7 | it('should return home page', function(done) { 8 | ohCloud 9 | .get('/') 10 | .expect('Content-type', /html/) 11 | .set('Cookie', []) 12 | .expect(200) 13 | .end(function(err) { 14 | done(err); 15 | }); 16 | }); 17 | 18 | it('should contain a login section', function(done) { 19 | ohCloud 20 | .get('/') 21 | .set('Cookie', []) 22 | .expect(200) 23 | .end(function(err, res) { 24 | res.text.should.match(/action="\/login"/); 25 | done(err) 26 | }) 27 | }); 28 | }); -------------------------------------------------------------------------------- /tests/mocha/integration/notification.js: -------------------------------------------------------------------------------- 1 | var should = require('should'); 2 | var session = require('supertest-session'); 3 | var lib = require('../../lib'); 4 | //variable to connect without session 5 | var supertest = require('supertest'); 6 | var ohCloud = supertest.agent('http://localhost:3000'); 7 | var testSession; 8 | describe('Notifications ', function () { 9 | before(function (done) { 10 | testSession = session('http://localhost:3000'); 11 | testSession 12 | .get('/login') 13 | .set('Cookie', []) 14 | .end(function (err, res) { 15 | testSession.post('/login') 16 | .send({ 17 | _csrf: lib.extractCsrfToken(res), 18 | username: 'test@test.com', 19 | password: '1234ASD' 20 | }) 21 | .end(function (err) { 22 | testSession 23 | .get('/setTimezone?tz=America/New_York') 24 | .end( 25 | function (err) { 26 | if (err) return done(err); 27 | return done(); 28 | }); 29 | }); 30 | 31 | }); 32 | }); 33 | it('Open Notifications page with correct credentials', function (done) { 34 | testSession.get('/notifications') 35 | .expect(200) 36 | .end(function (err, res) { 37 | var containedItem = (res.text.indexOf('

Notifications

') > -1); 38 | res.text.should.containedItem; 39 | done(err); 40 | }); 41 | }); 42 | 43 | it('Redirect to login page if not loggined', function (done) { 44 | ohCloud.get('/notifications') 45 | .expect(302) 46 | .expect('Location', '/login') 47 | .end(function (err, res) { 48 | done(err); 49 | }); 50 | }); 51 | }); -------------------------------------------------------------------------------- /tests/mocha/login.js: -------------------------------------------------------------------------------- 1 | var supertest = require('supertest'); 2 | var should = require('should'); 3 | var lib = require('../lib'); 4 | var user = require('../../models/user'); 5 | 6 | var ohCloud = supertest.agent('http://localhost:3000'); 7 | 8 | describe('Test login', function() { 9 | before('create necessary user', function (done) { 10 | user.register('test', '123', done); 11 | }); 12 | 13 | it('redirect to login for false credentials', function(done) { 14 | ohCloud 15 | .get('/login') 16 | .expect(200) 17 | .set('cookie', []) 18 | .end(function(err, res) { 19 | ohCloud 20 | .post('/login') 21 | .set('cookie', res.headers['set-cookie']) 22 | .send({ 23 | _csrf: lib.extractCsrfToken(res), 24 | username: 'test', 25 | password: 'test_false' 26 | }) 27 | .expect(302) 28 | .expect('Location', '/login') 29 | .end(function(err) { 30 | done(err); 31 | }); 32 | }); 33 | }); 34 | 35 | it('redirects to home for correct credentials', function(done) { 36 | ohCloud 37 | .get('/login') 38 | .expect(200) 39 | .set('cookie', []) 40 | .end(function(err, res) { 41 | ohCloud 42 | .post('/login') 43 | .set('cookie', res.headers['set-cookie']) 44 | .send({ 45 | _csrf: lib.extractCsrfToken(res), 46 | username: 'test', 47 | password: '123' 48 | }) 49 | .expect(302) 50 | .expect('Location', '/') 51 | .end(function(err) { 52 | done(err); 53 | }); 54 | }); 55 | }) 56 | }); -------------------------------------------------------------------------------- /tests/mocha/mainpage.js: -------------------------------------------------------------------------------- 1 | var supertest = require('supertest'); 2 | var should = require('should'); 3 | 4 | var ohCloud = supertest.agent('http://localhost:3000'); 5 | 6 | describe('Test main page of openHAB-cloud', function(){ 7 | it('should return home page', function(done) { 8 | ohCloud 9 | .get('/') 10 | .expect('Content-type', /html/) 11 | .set('Cookie', []) 12 | .expect(200) 13 | .end(function(err) { 14 | done(err); 15 | }); 16 | }); 17 | 18 | it('should contain a login section', function(done) { 19 | ohCloud 20 | .get('/') 21 | .set('Cookie', []) 22 | .expect(200) 23 | .end(function(err, res) { 24 | res.text.should.match(/action="\/login"/); 25 | done(err) 26 | }) 27 | }); 28 | }); -------------------------------------------------------------------------------- /tests/mocha/unit/models/emailVerification.js: -------------------------------------------------------------------------------- 1 | /* 2 | Openhab model is hard depend on the application structure. 3 | When we are loading model, the whole application start. 4 | */ -------------------------------------------------------------------------------- /tests/mocha/unit/models/invitation.js: -------------------------------------------------------------------------------- 1 | /* 2 | TODO: 3 | Invitation model is hard depend on the application structure. 4 | When we are loading model, the whole application start. 5 | */ -------------------------------------------------------------------------------- /tests/mocha/unit/models/openhab.js: -------------------------------------------------------------------------------- 1 | const openhab = require("../../../../models/openhab"); 2 | const sinon = require("sinon"); 3 | const sinonMongoose = require('sinon-mongoose'); 4 | const chai = require('chai'); 5 | 6 | 7 | 8 | describe('Unit test for openhab methods', function () { 9 | 10 | var openHabMock; 11 | 12 | beforeEach(function () { 13 | openHabMock = sinon.mock(openhab); 14 | openHabMock.expects('findOne') 15 | .chain('exec') 16 | .yields(null, ohStub); 17 | }); 18 | 19 | afterEach(function () { 20 | openHabMock.restore(); 21 | }); 22 | 23 | // describe('Register openhab', function () { 24 | // it('Correct registration', function (done) { 25 | // openhab.authenticate('uuid', 'secret', function (error) { 26 | // openHabMock.verify(); 27 | // done(); 28 | // }); 29 | // })}) 30 | }); 31 | -------------------------------------------------------------------------------- /tests/mocha/unit/routes/api.js: -------------------------------------------------------------------------------- 1 | const notificationsModel = require("../../../../models/notification"); 2 | const userModel = require("../../../../models/user"); 3 | const openhabModel = require("../../../../models/openhab"); 4 | const apiRoute = require("../../../../routes/api"); 5 | const sinon = require("sinon"); 6 | const mockReq = require('sinon-express-mock').mockReq; 7 | const mockRes = require('sinon-express-mock').mockRes; 8 | require('sinon-mongoose'); 9 | const chai = require('chai'); 10 | 11 | 12 | describe('Unit API routes', function () { 13 | 14 | describe('Get Notifications', function () { 15 | 16 | var notificationMock; 17 | 18 | notificationStub = new notificationsModel({ 19 | user: 1, 20 | message: "Message", 21 | icon: "Icon", 22 | severity: "Severity" 23 | }); 24 | 25 | 26 | it('Expect json with correct data', function () { 27 | var res = mockRes(); 28 | var body = {}; 29 | body.params = {limit: 20, skip: 0}; 30 | body.user = {id: 1}; 31 | var req = mockReq(body); 32 | notificationMock = sinon.mock(notificationsModel); 33 | notificationMock 34 | .expects('find') 35 | .chain('exec') 36 | .yields(null, [notificationStub]); 37 | apiRoute.notificationsget(req, res); 38 | notificationMock.verify(); 39 | }); 40 | 41 | it('Expect 500 if error data', function () { 42 | var res = mockRes(); 43 | var body = {}; 44 | body.params = {limit: 20, skip: 0}; 45 | body.user = {id: 1}; 46 | var req = mockReq(body); 47 | notificationMock = sinon.mock(notificationsModel); 48 | notificationMock 49 | .expects('find') 50 | .chain('exec') 51 | .yields("error", ""); 52 | apiRoute.notificationsget(req, res); 53 | notificationMock.verify(); 54 | }); 55 | }); 56 | }); 57 | 58 | -------------------------------------------------------------------------------- /tests/mocha/unit/routes/notifications.js: -------------------------------------------------------------------------------- 1 | const notificationsModel = require("../../../../models/notification"); 2 | const userModel = require("../../../../models/user"); 3 | const openhabModel = require("../../../../models/openhab"); 4 | const notificationsRoute = require("../../../../routes/notifications"); 5 | const sinon = require("sinon"); 6 | require('sinon-mongoose'); 7 | const chai = require('chai'); 8 | 9 | 10 | describe('Unit test notifications routes', function () { 11 | 12 | describe('Get notifications', function () { 13 | 14 | var notificationMock; 15 | var userMock; 16 | var openhabMock; 17 | 18 | beforeEach(function () { 19 | notificationMock = sinon.mock(notificationsModel); 20 | notificationMock 21 | .expects('find') 22 | .chain('exec') 23 | .yields(null, notificationMock); 24 | 25 | openhabMock = sinon.mock(openhabModel) 26 | .expects('findOne') 27 | .yields(null, "OPENHAB"); 28 | userMock = sinon.mock(userModel); 29 | userMock.openhab = openhabMock; 30 | }); 31 | 32 | afterEach(function () { 33 | openhabMock.restore(); 34 | notificationMock.restore(); 35 | userMock.restore(); 36 | }); 37 | 38 | it('expect correct page with notifications', function (done) { 39 | var req,res; 40 | var req = res = {}; 41 | req.params = {'page' : 20}; 42 | req.user = userMock; 43 | notificationsRoute.notificationsget(req, res); 44 | notificationMock.verify(); 45 | done(); 46 | }); 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /tests/mocha/unit/routes/users.js: -------------------------------------------------------------------------------- 1 | const userModel = require("../../../../models/user"); 2 | const userAccountModel = require("../../../../models/useraccount"); 3 | const openhabModel = require("../../../../models/openhab"); 4 | const usersRoute = require("../../../../routes/users"); 5 | const sinon = require("sinon"); 6 | require('sinon-mongoose'); 7 | const chai = require('chai'); 8 | const mockReq = require ('sinon-express-mock').mockReq; 9 | const mockRes = require ('sinon-express-mock').mockRes; 10 | 11 | 12 | describe('Unit test Users routes', function () { 13 | describe('Get Staff', function () { 14 | var userMock; 15 | var openhabMock; 16 | 17 | beforeEach(function () { 18 | userMock = sinon.mock(userModel); 19 | openhabMock = sinon.mock(openhabModel); 20 | }); 21 | 22 | afterEach(function () { 23 | openhabMock.restore(); 24 | userMock.restore(); 25 | 26 | }); 27 | 28 | 29 | it('expect correct page with users', function (done) { 30 | var res = mockRes(); 31 | var body = {}; 32 | body.user = {}; 33 | body.user.account = sinon.mock(userAccountModel); 34 | var req = mockReq(body); 35 | var userMockFindExpectation = userMock 36 | .expects('find') 37 | .yields(null, [new userModel({login: "login", password: 'other_password'})]); 38 | usersRoute.usersget(req, res); 39 | userMockFindExpectation.verify(); 40 | done(); 41 | }); 42 | 43 | it('expect correct users add get', function (done) { 44 | var res = mockRes(); 45 | var body = {}; 46 | body.user = {}; 47 | body.user.account = sinon.mock(userAccountModel); 48 | var req = mockReq(body); 49 | var userMockFindExpectation = userMock 50 | .expects('find') 51 | .yields(null, [new userModel({login: "login", password: 'other_password'})]); 52 | usersRoute.usersaddget(req, res); 53 | userMockFindExpectation.verify(); 54 | done(); 55 | }); 56 | }); 57 | }); 58 | 59 | -------------------------------------------------------------------------------- /tests/mocha/unit/user.js: -------------------------------------------------------------------------------- 1 | const user = require("../../../models/user"); 2 | const account = require("../../../models/useraccount"); 3 | const userRoute = require("../../../routes/user"); 4 | const sinon = require("sinon"); 5 | const sinonMongoose = require('sinon-mongoose'); 6 | const chai = require('chai'); 7 | var mongoose = require('mongoose'); 8 | 9 | 10 | describe('Unit test user static methods', function () { 11 | describe('Create users', function () { 12 | it('expect error when register user without database', function (done) { 13 | var userMock = sinon.mock(user); 14 | var login = 'login'; 15 | var password = 'password'; 16 | var role = 'role'; 17 | var account = sinon.mock(account); 18 | user.registerToAccount(login, password, role, account, function (error) { 19 | chai.expect(error).not.to.be.null; 20 | userMock.verify(); 21 | done(); 22 | }); 23 | }); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /tests/ohc_simulator_docker.js: -------------------------------------------------------------------------------- 1 | const compose = require('docker-compose'); 2 | var path = require('path'); 3 | 4 | compose.upAll({cwd: path.join('deployment', 'docker'), log: true}) 5 | .then(function (done) { 6 | console.log("Docker runned "); 7 | setTimeout(waitDocker, 10000); 8 | }, function (err) { 9 | console.log("Cannot run docker", err) 10 | } 11 | ); 12 | 13 | 14 | function waitDocker() { 15 | console.log("Wait Docker loading..."); 16 | } -------------------------------------------------------------------------------- /tests/openhabconsole.js: -------------------------------------------------------------------------------- 1 | var io = require('socket.io-client'); 2 | var mongoose = require('mongoose') 3 | , logger = require('../logger.js'); 4 | var Openhab = require('../models/openhab'); 5 | 6 | if (process.argv.length < 4) { 7 | logger.error("Usage: openhabconsole.js uuid secret [base url]"); 8 | process.exit(); 9 | } 10 | 11 | var uuid = process.argv[2]; 12 | var secret = process.argv[3]; 13 | if (process.argv[4]) { 14 | var baseUrl = process.argv[4]; 15 | } else { 16 | var baseUrl = "https://openhab-cloud.org/"; 17 | } 18 | 19 | logger.info("Connecting to openHAB-cloud as " + uuid + '/' + secret + ' at ' + baseUrl); 20 | 21 | var sio = io.connect(baseUrl, {query: "uuid=" + uuid + 22 | "&secret=" + secret}); 23 | 24 | sio.on('connect', function() { 25 | logger.info("Socket.io connected"); 26 | }); 27 | 28 | sio.on('disconnect', function() { 29 | logger.info("Socket.io disconnected"); 30 | }); 31 | 32 | sio.on('error', function(error) { 33 | logger.error("Socket.io error: " + error); 34 | process.exit(); 35 | }); 36 | 37 | sio.on('notification', function(data) { 38 | logger.info("Notification: ", data); 39 | }); 40 | 41 | sio.on('lognotification', function(data) { 42 | logger.info("Log notification: ", data); 43 | }); 44 | 45 | sio.on('broadcastnotification', function(data) { 46 | logger.info("Broadcast notification: ", data); 47 | }); 48 | 49 | sio.on('itemupdate', function(data) { 50 | logger.info("Item update: ", data); 51 | }); 52 | 53 | sio.on('request', function(data) { 54 | logger.info("Request: ", data); 55 | }); 56 | 57 | sio.on('responseHeader', function(data) { 58 | logger.info("Response header: ", data); 59 | }); 60 | 61 | sio.on('responseFinished', function(data) { 62 | logger.info("Response finished: ", data); 63 | }); 64 | 65 | sio.on('command', function(data) { 66 | logger.info("Command: ", data); 67 | }); 68 | -------------------------------------------------------------------------------- /tests/qunit/requesttracker/index.js: -------------------------------------------------------------------------------- 1 | var rt = require('../../../requesttracker'); 2 | 3 | QUnit.module("RequestTracker"); 4 | 5 | QUnit.test('Acquiring request ID twice returns not equal IDs', function (assert) { 6 | var tracker = new rt(), 7 | id1 = tracker.acquireRequestId(), 8 | id2 = tracker.acquireRequestId(); 9 | 10 | assert.notEqual(id1, id2); 11 | }); 12 | 13 | QUnit.test('Adding request without ID generates a new request ID', function (assert) { 14 | var tracker = new rt(), 15 | request = {}, 16 | nextId = tracker.acquireRequestId(), 17 | requestId = tracker.add(request); 18 | 19 | assert.notEqual(nextId, requestId); 20 | assert.equal(tracker.get(requestId), request); 21 | }); 22 | 23 | QUnit.test('Adding request with ID', function (assert) { 24 | var tracker = new rt(), 25 | request = {}, 26 | nextId = tracker.acquireRequestId(), 27 | requestId = tracker.add(request, nextId); 28 | 29 | assert.equal(nextId, requestId); 30 | assert.equal(tracker.get(nextId), request); 31 | }); 32 | 33 | QUnit.test('#has', function (assert) { 34 | var tracker = new rt(), 35 | requestId = tracker.acquireRequestId(); 36 | 37 | assert.notOk(tracker.has(1234)); 38 | assert.notOk(tracker.has(requestId)); 39 | 40 | tracker.add({}, requestId); 41 | 42 | assert.ok(tracker.has(requestId)); 43 | }); -------------------------------------------------------------------------------- /tests/qunit/system/mongoconnect.js: -------------------------------------------------------------------------------- 1 | var system = require('../../../system'), 2 | globalExampleConfig = { 3 | system: { 4 | host: 'localhost', 5 | port: '1000', 6 | protocol: 'http' 7 | }, 8 | mongodb: { 9 | user: 'test', 10 | password: 'test', 11 | hosts: 'localhost:1234', 12 | db: 'test' 13 | } 14 | }, 15 | MongoConnect = require('../../../system/mongoconnect'); 16 | 17 | QUnit.module('MongoConnect'); 18 | 19 | QUnit.test('Own callback is run', function (assert) { 20 | assert.expect(1); 21 | system.setConfiguration(globalExampleConfig); 22 | 23 | var done = assert.async(), 24 | mongoConnect = new MongoConnect(system), 25 | mongoose = require('mongoose'); 26 | 27 | // mock the connect method, we actually do not want to test this 28 | mongoose.connect = function (uri, callback) { 29 | callback('Connection failed'); 30 | }; 31 | 32 | mongoConnect.connect(mongoose, function (error) { 33 | // checks, if there IS an error 34 | assert.ok(error); 35 | done(); 36 | }); 37 | }); -------------------------------------------------------------------------------- /views/accountdelete.ejs: -------------------------------------------------------------------------------- 1 | <% section = 'account' %> 2 | <%- include ('header.ejs') %> 3 |
4 |
5 |
6 |
7 |

Delete My Account

8 | 9 |
10 |
11 |
12 |
13 |
14 |
15 | <%- include ('alerts.ejs') %> 16 |
17 |
18 |

Warning! You are going to delete your account! All data will be completely erased!

19 |
20 |

21 | Deleting account will erase all openHAB, device, notification and event data. 22 | This can't be undone! 23 |

24 |
25 | 26 | 27 |
28 |
29 |
30 |
31 |
32 | <%- include ('footer.ejs') %> 33 | -------------------------------------------------------------------------------- /views/alerts.ejs: -------------------------------------------------------------------------------- 1 | <% if (errormessages.length > 0) { %> 2 |
3 |
4 |
5 | 6 | <% if(errormessages.length === 1) { %> 7 | <%= errormessages %> 8 | <% } else { %> 9 |
    10 | <% errormessages.forEach(function(err) { %> 11 |
  • <%= err %>
  • 12 | <% }) %> 13 |
14 | <% } %> 15 |
16 |
17 |
18 | <% } %> 19 | <% if (infomessages.length > 0) { %> 20 |
21 |
22 |
23 | 24 | <%= infomessages %> 25 |
26 |
27 |
28 | <% } %> 29 | -------------------------------------------------------------------------------- /views/invitations.ejs: -------------------------------------------------------------------------------- 1 | <%- include ('header.ejs') %> 2 | 3 |
4 |
5 |
6 |
7 |

Invitation

8 | 9 |
10 |
11 |
12 |
13 |
14 | <%- include ('alerts.ejs') %> 15 |
16 |
17 |
18 |

Invite your friends to openHAB Cloud!

19 |
20 |
21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 |
29 |
30 | 31 | <%- include ('footer.ejs') %> 32 | -------------------------------------------------------------------------------- /views/itemsdelete.ejs: -------------------------------------------------------------------------------- 1 | <% section = 'account' %> 2 | <%- include ('header.ejs') %> 3 |
4 |
5 |
6 |
7 |

Delete My Account

8 | 9 |
10 |
11 |
12 |
13 |
14 |
15 | <%- include ('alerts.ejs') %> 16 |
17 |
18 |

Warning! You are going to delete your items and event data! All items and event data will be completely erased!

19 |
20 |

21 | Deleting items and event data will clean up all items and related events. 22 |

23 |
24 | 25 | 26 |
27 |
28 |
29 |
30 |
31 | <%- include ('footer.ejs') %> 32 | -------------------------------------------------------------------------------- /views/lostpassword.ejs: -------------------------------------------------------------------------------- 1 | <% section = 'login' %> 2 | <%- include ('header.ejs') %> 3 | 4 |
5 |
6 |
7 |
8 |

Lost my password

9 | 10 |
11 |
12 |
13 |
14 |
15 | <%- include ('alerts.ejs') %> 16 |
17 |
18 |
19 |

Reset my password

20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 | 29 | 30 |
31 | 32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | 40 | <%- include ('footer.ejs') %> 41 | -------------------------------------------------------------------------------- /views/lostpasswordreset.ejs: -------------------------------------------------------------------------------- 1 | <% section = 'login' %> 2 | <%- include ('header.ejs') %> 3 | 4 |
5 |
6 |
7 |
8 |

Lost my password

9 | 10 |
11 |
12 |
13 |
14 |
15 | <%- include ('alerts.ejs') %> 16 |
17 |
18 |
19 |

Set your new password

20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | 35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | 43 | <%- include ('footer.ejs') %> 44 | --------------------------------------------------------------------------------