feat: check for updates
This commit is contained in:
		@@ -5,7 +5,7 @@
 | 
				
			|||||||
        .admin-header
 | 
					        .admin-header
 | 
				
			||||||
          img(src='/svg/icon-rest-api.svg', alt='API', style='width: 80px;')
 | 
					          img(src='/svg/icon-rest-api.svg', alt='API', style='width: 80px;')
 | 
				
			||||||
          .admin-header-title
 | 
					          .admin-header-title
 | 
				
			||||||
            .headline.blue--text.text--darken-2 API
 | 
					            .headline.blue--text.text--darken-2 API Access
 | 
				
			||||||
            .subheading.grey--text Manage keys to access the API #[v-chip(label, color='primary', small).white--text coming soon]
 | 
					            .subheading.grey--text Manage keys to access the API #[v-chip(label, color='primary', small).white--text coming soon]
 | 
				
			||||||
          v-spacer
 | 
					          v-spacer
 | 
				
			||||||
          v-btn(outline, color='grey', large, @click='refresh', disabled)
 | 
					          v-btn(outline, color='grey', large, @click='refresh', disabled)
 | 
				
			||||||
@@ -58,7 +58,7 @@
 | 
				
			|||||||
                td {{ props.item.updatedOn }}
 | 
					                td {{ props.item.updatedOn }}
 | 
				
			||||||
                td: v-btn(icon): v-icon.grey--text.text--darken-1 more_horiz
 | 
					                td: v-btn(icon): v-icon.grey--text.text--darken-1 more_horiz
 | 
				
			||||||
            template(slot='no-data')
 | 
					            template(slot='no-data')
 | 
				
			||||||
              v-alert.mt-3(icon='info', :value='true', outline, color='info') No API have been generated yet.
 | 
					              v-alert.mt-3(icon='info', :value='true', outline, color='info') No API keys have been generated yet.
 | 
				
			||||||
          .text-xs-center.py-2
 | 
					          .text-xs-center.py-2
 | 
				
			||||||
            v-pagination(v-model='pagination.page', :length='pages')
 | 
					            v-pagination(v-model='pagination.page', :length='pages')
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,11 +46,10 @@
 | 
				
			|||||||
          dark
 | 
					          dark
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
          v-btn(fab, absolute, right, top, small, light, to='system', v-if='hasPermission(`manage:system`)')
 | 
					          v-btn(fab, absolute, right, top, small, light, to='system', v-if='hasPermission(`manage:system`)')
 | 
				
			||||||
            v-icon(v-if='isLatestVersion', color='teal') build
 | 
					            v-icon(:color='isLatestVersion ? `teal` : `red darken-4`') build
 | 
				
			||||||
            v-icon(v-else, color='red darken-4') get_app
 | 
					 | 
				
			||||||
          v-card-text
 | 
					          v-card-text
 | 
				
			||||||
            v-icon.dashboard-icon blur_on
 | 
					            v-icon.dashboard-icon blur_on
 | 
				
			||||||
            .subheading Wiki.js {{info.currentVersion}} BETA
 | 
					            .subheading Wiki.js {{info.currentVersion}}
 | 
				
			||||||
            .body-2(v-if='isLatestVersion') You are running the latest version.
 | 
					            .body-2(v-if='isLatestVersion') You are running the latest version.
 | 
				
			||||||
            .body-2(v-else) A new version is available: {{info.latestVersion}}
 | 
					            .body-2(v-else) A new version is available: {{info.latestVersion}}
 | 
				
			||||||
      v-flex(xs12)
 | 
					      v-flex(xs12)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -182,6 +182,10 @@
 | 
				
			|||||||
              strong Path Is Exactly...
 | 
					              strong Path Is Exactly...
 | 
				
			||||||
              em.caption.pl-1 (highest)
 | 
					              em.caption.pl-1 (highest)
 | 
				
			||||||
        .body-1.pl-3.pt-2 When 2 rules have the same path specificity AND the same match type, #[strong.red--text DENY] will always override an #[strong.green--text ALLOW] rule.
 | 
					        .body-1.pl-3.pt-2 When 2 rules have the same path specificity AND the same match type, #[strong.red--text DENY] will always override an #[strong.green--text ALLOW] rule.
 | 
				
			||||||
 | 
					        v-divider.mt-3
 | 
				
			||||||
 | 
					        v-subheader.pl-0 Regular Expressions
 | 
				
			||||||
 | 
					        span Expressions that are deemed unsafe or could result in exponential time processing will be rejected upon saving.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "wiki",
 | 
					  "name": "wiki",
 | 
				
			||||||
  "version": "2.0.0",
 | 
					  "version": "2.0.0-beta.1",
 | 
				
			||||||
 | 
					  "releaseDate": "2019-01-01T01:01:01.000Z",
 | 
				
			||||||
  "description": "A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown",
 | 
					  "description": "A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown",
 | 
				
			||||||
  "main": "wiki.js",
 | 
					  "main": "wiki.js",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,6 +66,10 @@ jobs:
 | 
				
			|||||||
    onInit: true
 | 
					    onInit: true
 | 
				
			||||||
    cron: '0 0 * * *'
 | 
					    cron: '0 0 * * *'
 | 
				
			||||||
    concurrency: 0
 | 
					    concurrency: 0
 | 
				
			||||||
 | 
					  syncGraphUpdates:
 | 
				
			||||||
 | 
					    onInit: true
 | 
				
			||||||
 | 
					    cron: '0 0 * * *'
 | 
				
			||||||
 | 
					    concurrency: 0
 | 
				
			||||||
  syncStorage:
 | 
					  syncStorage:
 | 
				
			||||||
    onInit: false
 | 
					    onInit: false
 | 
				
			||||||
    cron: false
 | 
					    cron: false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,9 +52,12 @@ module.exports = {
 | 
				
			|||||||
      appconfig.port = process.env.PORT || 80
 | 
					      appconfig.port = process.env.PORT || 80
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const packageInfo = require(path.join(WIKI.ROOTPATH, 'package.json'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    WIKI.config = appconfig
 | 
					    WIKI.config = appconfig
 | 
				
			||||||
    WIKI.data = appdata
 | 
					    WIKI.data = appdata
 | 
				
			||||||
    WIKI.version = require(path.join(WIKI.ROOTPATH, 'package.json')).version
 | 
					    WIKI.version = packageInfo.version
 | 
				
			||||||
 | 
					    WIKI.releaseDate = packageInfo.releaseDate
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,12 +25,11 @@ module.exports = {
 | 
				
			|||||||
    red.on('message', (channel, msg) => {
 | 
					    red.on('message', (channel, msg) => {
 | 
				
			||||||
      WIKI.events.emit(channel, msg)
 | 
					      WIKI.events.emit(channel, msg)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    red.subscribe('localization', (err, count) => {
 | 
					    red.subscribe('localization', 'updates', (err, count) => {
 | 
				
			||||||
      if (err) {
 | 
					      if (err) {
 | 
				
			||||||
        WIKI.logger.error(err)
 | 
					        WIKI.logger.error(err)
 | 
				
			||||||
        process.exit(1)
 | 
					        process.exit(1)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      WIKI.logger.info('Redis Subscriber connection: [ OK ]')
 | 
					 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    return red
 | 
					    return red
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,25 @@ const Promise = require('bluebird')
 | 
				
			|||||||
/* global WIKI */
 | 
					/* global WIKI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
 | 
					  updates: {
 | 
				
			||||||
 | 
					    channel: 'BETA',
 | 
				
			||||||
 | 
					    version: WIKI.version,
 | 
				
			||||||
 | 
					    releaseDate: WIKI.releaseDate,
 | 
				
			||||||
 | 
					    minimumVersionRequired: '2.0.0-beta.0',
 | 
				
			||||||
 | 
					    minimumNodeRequired: '10.12.0'
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  init() {
 | 
				
			||||||
 | 
					    // Listen for updates events
 | 
				
			||||||
 | 
					    WIKI.events.on('updates', (infoRaw) => {
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        this.updates = JSON.parse(infoRaw)
 | 
				
			||||||
 | 
					      } catch (err) {
 | 
				
			||||||
 | 
					        WIKI.logger.warn('Failed to parse updates info.')
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return this
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Upgrade from WIKI.js 1.x - MongoDB database
 | 
					   * Upgrade from WIKI.js 1.x - MongoDB database
 | 
				
			||||||
   *
 | 
					   *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,7 +75,7 @@ module.exports = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    async update(obj, args) {
 | 
					    async update(obj, args) {
 | 
				
			||||||
      if(_.some(args.pageRules, pr => {
 | 
					      if(_.some(args.pageRules, pr => {
 | 
				
			||||||
        return pr.match !== 'REGEX' || safeRegex(pr.path)
 | 
					        return pr.match === 'REGEX' && !safeRegex(pr.path)
 | 
				
			||||||
      })) {
 | 
					      })) {
 | 
				
			||||||
        throw new gql.GraphQLError('Some Page Rules contains unsafe or exponential time regex.')
 | 
					        throw new gql.GraphQLError('Some Page Rules contains unsafe or exponential time regex.')
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ const os = require('os')
 | 
				
			|||||||
const filesize = require('filesize')
 | 
					const filesize = require('filesize')
 | 
				
			||||||
const path = require('path')
 | 
					const path = require('path')
 | 
				
			||||||
const fs = require('fs-extra')
 | 
					const fs = require('fs-extra')
 | 
				
			||||||
 | 
					const moment = require('moment')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* global WIKI */
 | 
					/* global WIKI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -62,10 +63,10 @@ module.exports = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    latestVersion() {
 | 
					    latestVersion() {
 | 
				
			||||||
      return '2.0.0' // TODO
 | 
					      return WIKI.system.updates.version
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    latestVersionReleaseDate() {
 | 
					    latestVersionReleaseDate() {
 | 
				
			||||||
      return new Date() // TODO
 | 
					      return moment.utc(WIKI.system.updates.releaseDate)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async operatingSystem() {
 | 
					    async operatingSystem() {
 | 
				
			||||||
      let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}`
 | 
					      let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}`
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										45
									
								
								server/jobs/sync-graph-updates.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								server/jobs/sync-graph-updates.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					require('../core/worker')
 | 
				
			||||||
 | 
					const _ = require('lodash')
 | 
				
			||||||
 | 
					const { createApolloFetch } = require('apollo-fetch')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* global WIKI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WIKI.redis = require('../core/redis').init()
 | 
				
			||||||
 | 
					WIKI.models = require('../core/db').init()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = async (job) => {
 | 
				
			||||||
 | 
					  WIKI.logger.info(`Fetching latest updates from Graph endpoint...`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    await WIKI.configSvc.loadFromDb()
 | 
				
			||||||
 | 
					    const apollo = createApolloFetch({
 | 
				
			||||||
 | 
					      uri: WIKI.config.graphEndpoint
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const resp = await apollo({
 | 
				
			||||||
 | 
					      query: `query ($channel: ReleaseChannel!, $version: String!) {
 | 
				
			||||||
 | 
					        releases {
 | 
				
			||||||
 | 
					          checkForUpdates(channel: $channel, version: $version) {
 | 
				
			||||||
 | 
					            channel
 | 
				
			||||||
 | 
					            version
 | 
				
			||||||
 | 
					            releaseDate
 | 
				
			||||||
 | 
					            minimumVersionRequired
 | 
				
			||||||
 | 
					            minimumNodeRequired
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }`,
 | 
				
			||||||
 | 
					      variables: {
 | 
				
			||||||
 | 
					        channel: 'BETA', // TODO
 | 
				
			||||||
 | 
					        version: WIKI.version
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    const info = _.get(resp, 'data.releases.checkForUpdates', {})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await WIKI.redis.publish('updates', JSON.stringify(info))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    WIKI.logger.info(`Fetching latest updates from Graph endpoint: [ COMPLETED ]`)
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    WIKI.logger.error(`Fetching latest updates from Graph endpoint: [ FAILED ]`)
 | 
				
			||||||
 | 
					    WIKI.logger.error(err.message)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -20,6 +20,7 @@ module.exports = async () => {
 | 
				
			|||||||
  WIKI.auth = require('./core/auth').init()
 | 
					  WIKI.auth = require('./core/auth').init()
 | 
				
			||||||
  WIKI.lang = require('./core/localization').init()
 | 
					  WIKI.lang = require('./core/localization').init()
 | 
				
			||||||
  WIKI.mail = require('./core/mail').init()
 | 
					  WIKI.mail = require('./core/mail').init()
 | 
				
			||||||
 | 
					  WIKI.system = require('./core/system').init()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // ----------------------------------------
 | 
					  // ----------------------------------------
 | 
				
			||||||
  // Load middlewares
 | 
					  // Load middlewares
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,10 @@ block body
 | 
				
			|||||||
          img.animated.fadeIn(src='/svg/icon-delete-shield.svg', alt='Unauthorized')
 | 
					          img.animated.fadeIn(src='/svg/icon-delete-shield.svg', alt='Unauthorized')
 | 
				
			||||||
          .headline= t('unauthorized.title')
 | 
					          .headline= t('unauthorized.title')
 | 
				
			||||||
          .subheading.mt-3= t('unauthorized.action.' + action)
 | 
					          .subheading.mt-3= t('unauthorized.action.' + action)
 | 
				
			||||||
          v-btn.mt-5(color='red lighten-4', href='javascript:window.history.go(-1);', large, outline)
 | 
					          .mt-5
 | 
				
			||||||
            v-icon(left) arrow_back
 | 
					            v-btn(color='red lighten-4', href='javascript:window.history.go(-1);', large, outline)
 | 
				
			||||||
            span= t('unauthorized.goback')
 | 
					              v-icon(left) arrow_back
 | 
				
			||||||
 | 
					              span= t('unauthorized.goback')
 | 
				
			||||||
 | 
					            v-btn(color='red lighten-4', href='/login', large, outline)
 | 
				
			||||||
 | 
					              v-icon(left) person_outline
 | 
				
			||||||
 | 
					              span= t('unauthorized.login')
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user